0Pricing
R Academy · 강의

GET 및 POST 엔드포인트 만들기

경로 매개변수, 쿼리 문자열 및 요청 본문 구문 분석을 처리합니다.

GET 및 POST 엔드포인트 만들기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Plumber란 무엇입니까

plumber는 특수 주석을 사용하여 일반 R 함수를 HTTP API 엔드포인트로 변환합니다. 함수에 #* @get /path 주석을 작성하면 Plumber가 해당 함수를 호출하는 GET 라우트를 만들고 결과를 JSON으로 반환합니다.

install.packages('plumber')로 설치하십시오.

첫 번째 GET 엔드포인트

기본적인 Plumber API는 파일(예: api.R)에 작성합니다. 함수에 #* @get을 주석으로 작성한 뒤 경로를 지정하십시오. Plumber는 함수의 반환값을 자동으로 JSON으로 직렬화합니다.

# api.R
# library(plumber)
#
# #* Return a greeting
# #* @get /hello
# function() {
#   list(message = 'Hello from Plumber!')
# }
#
# Start with:
# pr <- plumb('api.R')
# pr$run(port = 8000)

형식 힌트를 사용하는 경로 매개변수

꺾쇠괄호 구문을 사용하여 경로의 가변 구간을 삽입합니다: /users/<id:int>. Plumber는 해당 구간을 파싱하여 형식이 지정된 인수로 함수에 전달합니다. 지원되는 형식에는 int, dbl, chr이 있습니다.

# #* Get a user by ID
# #* @get /users/<id:int>
# function(id) {
#   # id is already an integer
#   list(
#     user_id = id,
#     name    = paste('User', id)
#   )
# }
#
# GET /users/42  =>  {"user_id":42, "name":"User 42"}

#* @param을 사용하는 쿼리 매개변수

#* @param name Description으로 쿼리 매개변수를 문서화합니다. 매개변수 이름은 함수 인수 이름과 일치해야 합니다. Plumber가 쿼리 문자열에서 자동으로 읽으므로 직접 파싱할 필요가 없습니다.

# #* Search users by name
# #* @param name The name to search for
# #* @param limit Maximum results to return
# #* @get /users/search
# function(name = '', limit = '10') {
#   limit <- as.integer(limit)
#   # query string: /users/search?name=Alice&limit=5
#   list(query = name, max = limit)
# }

POST 엔드포인트 만들기

요청 본문을 받는 엔드포인트에는 #* @post /path를 사용합니다. 특수 req 인수를 통해 원시 요청 객체에 접근할 수 있습니다. 함수 인수의 이름이 req이면 Plumber가 이를 자동으로 전달합니다.

# #* Create a new user
# #* @post /users
# function(req) {
#   body <- jsonlite::fromJSON(req$postBody)
#   # body$name, body$email are now available
#   list(
#     status  = 'created',
#     user_id = sample(1000:9999, 1),
#     name    = body$name
#   )
# }

요청 본문 파싱

req$postBody에는 POST 본문에서 받은 원시 JSON 문자열이 들어 있습니다. jsonlite::fromJSON(req$postBody)로 파싱하여 이름이 지정된 R 목록을 얻으십시오. 처리하기 전에 항상 필수 필드를 검증하십시오.

# #* @post /orders
# function(req, res) {
#   body <- jsonlite::fromJSON(req$postBody)
#   if (is.null(body$product_id)) {
#     res$status <- 400L
#     return(list(error = 'product_id is required'))
#   }
#   list(
#     order_id   = as.integer(Sys.time()),
#     product_id = body$product_id,
#     quantity   = body$quantity %||% 1
#   )
# }

res$status를 사용하는 HTTP 상태 코드

res 인수(Plumber가 자동으로 주입하기도 함)를 사용하면 HTTP 응답 상태 코드를 설정할 수 있습니다. 반환하기 전에 설정하십시오: res$status <- 404L. 일반적인 코드는 다음과 같습니다:

  • 200 — OK(기본값)
  • 201 — 생성됨
  • 400 — 잘못된 요청
  • 404 — 찾을 수 없음
  • 500 — 내부 서버 오류
# #* @get /items/<id:int>
# function(id, res) {
#   items <- list(
#     list(id=1, name='Widget'),
#     list(id=2, name='Gadget')
#   )
#   found <- Filter(function(x) x$id == id, items)
#   if (length(found) == 0) {
#     res$status <- 404L
#     return(list(error = paste('Item', id, 'not found')))
#   }
#   found[[1]]
# }

이름이 지정된 목록을 JSON으로 반환하기

Plumber는 jsonlite를 사용하여 R 반환값을 JSON으로 직렬화합니다. 이름이 지정된 목록은 JSON 객체가 되고, 이름이 지정되지 않은 목록은 JSON 배열이 됩니다. 구조화된 응답에는 이름이 지정된 목록을 반환하십시오.

# Named list => JSON object
# list(id=1, name='Alice')  => {"id":1, "name":"Alice"}
#
# Unnamed list => JSON array
# list(1, 2, 3)  =>  [1, 2, 3]
#
# Nested structures work too:
# list(
#   user   = list(id=1, name='Alice'),
#   orders = list(list(id=101), list(id=102))
# )
# => {"user":{"id":1,"name":"Alice"}, "orders":[{"id":101},{"id":102}]}

Plumber 라우터 객체

plumb('api.R')로 주석이 달린 R 파일을 로드하면 Plumber 라우터 객체가 생성됩니다. pr$run(port = 8000)을 호출하여 서버를 시작하십시오. 운영 환경에서는 일반적으로 pr_run(pr, host='0.0.0.0', port=8000)을 호출합니다.

# Standard plumber startup in api_start.R:
# library(plumber)
# pr <- plumb('api.R')
# pr$run(port = 8000, host = '0.0.0.0')
#
# Or with pipe style:
# plumb('api.R') |> pr_run(port = 8000)
#
# Test with:
# curl http://localhost:8000/hello

여러 HTTP 메서드 처리

각각 주석이 달린 함수를 별도로 작성하면 하나의 경로에서 여러 메서드를 지원할 수 있습니다. Plumber는 사용된 HTTP 메서드에 따라 요청을 올바른 함수로 전달합니다.

# #* List all products
# #* @get /products
# function() {
#   list(products = list(list(id=1, name='Widget')))
# }
#
# #* Create a product
# #* @post /products
# function(req) {
#   body <- jsonlite::fromJSON(req$postBody)
#   list(created = TRUE, name = body$name)
# }

API 엔드포인트 테스트

서버가 실행 중일 때 터미널에서 curl을 사용하거나 R에서 httr2를 사용하여 엔드포인트를 테스트할 수 있습니다. httr2를 사용하면 API 코드와 함께 재현 가능한 테스트를 작성할 수 있습니다.

# From terminal:
# curl http://localhost:8000/users/42
# curl -X POST http://localhost:8000/users \
#      -H 'Content-Type: application/json' \
#      -d '{"name":"Alice","email":"alice@example.com"}'
#
# From R:
# library(httr2)
# resp <- request('http://localhost:8000/users/42') |> req_perform()
# resp_body_json(resp)

빠른 확인: 경로 매개변수

Plumber가 정수로 파싱하도록 id라는 이름의 경로 매개변수를 어떻게 선언합니까?

GET 및 POST 엔드포인트 복습

Plumber로 REST 엔드포인트 구축하기:

  • #* @get /path는 GET 경로를 만들고, #* @post /path는 POST 경로를 만듭니다.
  • 경로 매개변수에는 <name:type> 구문(int, dbl, chr)을 사용합니다.
  • 쿼리 매개변수는 일치하는 함수 인수로 자동 파싱됩니다.
  • POST 본문은 jsonlite::fromJSON(req$postBody)를 통해 사용할 수 있습니다.
  • 200이 아닌 HTTP 응답에는 res$status를 설정합니다.
  • 이름이 지정된 목록을 반환하면 자동으로 JSON 객체로 직렬화됩니다.

자주 묻는 질문

“GET 및 POST 엔드포인트 만들기” 강의는 무료인가요?

네 — “GET 및 POST 엔드포인트 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“GET 및 POST 엔드포인트 만들기”에서 뭘 배우나요?

경로 매개변수, 쿼리 문자열 및 요청 본문 구문 분석을 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“GET 및 POST 엔드포인트 만들기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Plumber와 REST 입문
  2. GET 및 POST 엔드포인트 만들기
  3. 인증과 API 보안
  4. Plumber API를 운영 환경에 배포하기
← R Academy(으)로 돌아가기