기록방
10장 : REST API와 JSON 본문
길벗 IT도서에서 주관하는 코딩 자율학습단 8기 : Spring Boot 파트에 참여한 기록입니다 [ 목록 ]
10.1 REST API와 JSON의 등장 배경
- REST API(Repersentational State Transfer API)
- 서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식
- HTTP 요청에 대한 응답으로 서버의 자원을 반환
- 서버에서 보내는 응답이 특정 기기에 종속되지 않도록 모든 기기에서 통용될 수 있는 데이터를 반환
- 화면(view)이 아닌 데이터(data)를 전송
- 응답 데이터는 JSON(JavaScript Object Notation)을 사용
- JSON 데이터는 키(key)와 값(value)으로 구성된 정렬되지 않은 속성(property)의 집합
- 키는 문자열이므로 항상 큰따옴표(””)로 감싸고, 값은 문자열인 경우에만 큰따옴표(””)로 감쌈
{
"name" : "망고",
"breeds" : "골든리트리버",
"age" : 2
}
10.2 REST API 동작 살펴보기
10.2.1 {JSON} Placeholder 사이트 둘러보기
- {JSON} Placeholder 사이트(https://jsonplaceholder.typicode.com)에 접속
- 가짜 API를 사용해 무료로 각종 테스트를 할 수 있는 서비스
- 사용 방법 : 아래
Run script
실행
- 제공하는 자원
- HTTP 메서드와 URL 경로
- Guide의 CRUD 예시 확인하기
- fetch의 메서드가 기본적으로
GET
이라 생략 가능 PUT
: 기존 데이터를 전부 새 내용으로 변경. 기존 데이터가 없다면 새로 생성PATCH
: 기존 데이터 중에서 일부만 새 내용으로 변경
- fetch의 메서드가 기본적으로
10.2.2 Talend API Tester 설치하기
- Talend API Tester 확장 프로그램 설치
10.2.3 GET 요청하고 응답받기
- 전체 데이터 조회
GET https://jsonplaceholder.typicode.com/posts
- 단일 데이터 조회
GET https://jsonplaceholder.typicode.com/posts/1
- 데이터 조회 실패하기
GET https://jsonplaceholder.typicode.com/posts/101
- HTTP 상태 코드
- 1XX(정보) : 요청이 수신 돼 처리 중입니다.
- 2XX(성공) : 요청이 정상적으로 처리됐습니다.
- 3XX(리다이렉션 메시지) : 요청을 완료하려면추가 행동이 필요합니다.
- 4XX(클라이언트 요청 오류) : 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없습니다.
- 5XX(서버 응답 오류) : 서버 내부에 에러가 발생해 클라이언트 요청에 대해 적절히 수행하지 못했습니다.
- HTTP 요청 메시지와 응답 메시지
GET /posts/101 HTTP/1.1
Host: jsonplaceholder.typicode.com
HTTP/1.1 404
date: Sat, 22 Jun 2024 18:16:49 GMT
content-type: application/json; charset=utf-8
content-length: 2
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719080209&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=HnPGSEDlBIwkN1kG64JmXpfrmp%2BDUr0Qmby9olZiOGw%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719080209&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=HnPGSEDlBIwkN1kG64JmXpfrmp%2BDUr0Qmby9olZiOGw%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719080263
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: max-age=43200
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
via: 1.1 vegur
cf-cache-status: EXPIRED
priority: u=1,i
server: cloudflare
cf-ray: 897e3b490b8f7d8f-LAX
alt-svc: h3=":443"; ma=86400
{}
- HTTP 메시지는 시작 라인(start line), 헤더(header), 빈 라인(blank line), 본문(body)으로 구성
- 시작 라인 : HTTP 요청 또는 응답 내용. 항상 한 줄
- 헤더 : HTTP 전송에 필요한 부가 정보(metadata)
- 빈 라인 : 헤더의 끝을 알리는 빈 줄로, 헤더가 모두 전송되었음을 알림
- 본문 : 실제 전송하는 데이터
- 시작 라인과 헤더
GET /posts/101 HTTP/1.1
Host: jsonplaceholder.typicode.com
- 시작 라인 : 요청의 종류(GET), URL 경로(/post/101), 사용하는 HTTP 버전(HTTP/1.1)
- 헤더 : 호스트 주소
- 응답 메시지
HTTP/1.1 404
date: Sat, 22 Jun 2024 18:16:49 GMT
content-type: application/json; charset=utf-8
content-length: 2
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719080209&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=HnPGSEDlBIwkN1kG64JmXpfrmp%2BDUr0Qmby9olZiOGw%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719080209&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=HnPGSEDlBIwkN1kG64JmXpfrmp%2BDUr0Qmby9olZiOGw%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719080263
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: max-age=43200
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
via: 1.1 vegur
cf-cache-status: EXPIRED
priority: u=1,i
server: cloudflare
cf-ray: 897e3b490b8f7d8f-LAX
alt-svc: h3=":443"; ma=86400
{}
- 응답 메시지 시작 라인 : HTTP 버전(HTTP/1.1), 상태 코드(404)
- 응답 메시지 헤더 : 응답 날짜(date), 응답 데이터 형식(content-type)
- 응답 메시지 헤더 아래 한 줄 띄고 본문 : 404 에러 나서 본문은 비어 있음({})
10.2.4 POST 요청하고 응답받기
- 데이터 생성하기
POST https://jsonplaceholder.typicode.com/posts
{
"title" : "오늘은 왠지",
"body" : "치킨을 먹고 싶어라!"
}
POST /posts HTTP/1.1
Content-Length: 76
Content-Type: application/json
Host: jsonplaceholder.typicode.com
{
"title" : "오늘은 왠지",
"body" : "치킨을 먹고 싶어라!"
}
HTTP/1.1 201
date: Sat, 22 Jun 2024 18:30:07 GMT
content-type: application/json; charset=utf-8
content-length: 87
location: https://jsonplaceholder.typicode.com/posts/101
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719081007&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=QBPzItjkS8LtDZUMzB4YDOHZ1O1hzzIlmDD2l8cmYEg%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719081007&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=QBPzItjkS8LtDZUMzB4YDOHZ1O1hzzIlmDD2l8cmYEg%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719081043
vary: Origin, X-HTTP-Method-Override, Accept-Encoding
access-control-allow-credentials: true
cache-control: no-cache
pragma: no-cache
expires: -1
access-control-expose-headers: Location
x-content-type-options: nosniff
etag: W/"57-vctLgHSa5/ZEW3s79veQsfkMIuM"
via: 1.1 vegur
cf-cache-status: DYNAMIC
priority: u=1,i
server: cloudflare
cf-ray: 897e4ec4eed5520e-LAX
alt-svc: h3=":443"; ma=86400
{
"title": "오늘은 왠지",
"body": "치킨을 먹고 싶어라!",
"id": 101
}
- JSON 형식이 틀린 데이터 생성하기 : json key에 큰따옴표 빠짐
POST https://jsonplaceholder.typicode.com/posts
{
title : "오늘은 왠지",
body : "치킨을 먹고 싶어라!"
}
POST /posts HTTP/1.1
Content-Length: 72
Content-Type: application/json
Host: jsonplaceholder.typicode.com
{
title : "오늘은 왠지",
body : "치킨을 먹고 싶어라!"
}
HTTP/1.1 500
date: Sat, 22 Jun 2024 18:33:34 GMT
content-type: text/html; charset=utf-8
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719081214&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=H25wVwsSKYzaOgIUoYEtlXUUf56R0ANDBU%2BYoz2uYKg%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719081214&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=H25wVwsSKYzaOgIUoYEtlXUUf56R0ANDBU%2BYoz2uYKg%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719081223
vary: Origin, X-HTTP-Method-Override, Accept-Encoding
access-control-allow-credentials: true
cache-control: no-cache
pragma: no-cache
expires: -1
via: 1.1 vegur
cf-cache-status: DYNAMIC
priority: u=1,i
server: cloudflare
cf-ray: 897e53d80ca92a8c-LAX
alt-svc: h3=":443"; ma=86400
SyntaxError: Unexpected token t in JSON at position 4
at JSON.parse (<anonymous>)
at parse (/app/node_modules/body-parser/lib/types/json.js:89:19)
at /app/node_modules/body-parser/lib/read.js:121:18
at invokeCallback (/app/node_modules/body-parser/node_modules/raw-body/index.js:224:16)
at done (/app/node_modules/body-parser/node_modules/raw-body/index.js:213:7)
at IncomingMessage.onEnd (/app/node_modules/body-parser/node_modules/raw-body/index.js:273:7)
at IncomingMessage.emit (node:events:525:35)
at endReadableNT (node:internal/streams/readable:1358:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
10.2.5 PATCH 요청하고 응답받기
- 데이터 수정하기
PATCH https://jsonplaceholder.typicode.com/posts/1
{
"title" : "abcdef",
"body" : "123456"
}
10.2.6 DELETE 요청하고 응답받기
- 데이터 삭제하기
DELETE https://jsonplaceholder.typicode.com/posts/10
DELETE /posts/10 HTTP/1.1
Host: jsonplaceholder.typicode.com
HTTP/1.1 200
date: Sat, 22 Jun 2024 18:37:19 GMT
content-type: application/json; charset=utf-8
content-length: 2
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719081439&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=hvRTNVeqMKpIOp%2BRa4uRX3nEuARlNC2ncwOlr3n26uc%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719081439&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=hvRTNVeqMKpIOp%2BRa4uRX3nEuARlNC2ncwOlr3n26uc%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719081463
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: no-cache
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
via: 1.1 vegur
cf-cache-status: DYNAMIC
priority: u=1,i
server: cloudflare
cf-ray: 897e5951aa9a6a2b-LAX
alt-svc: h3=":443"; ma=86400
{}
🚀 1분 퀴즈
- 다음 빈칸에 들어갈 HTTP 응답 코드 번호 대를 골라 쓰세요.
- ( 4XX ) : 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없다.
- ( 2XX ) : 요청이 정상적으로 처리됐다.
- ( 5XX ) : 서버 내부에 에러가 발생해 클라이언트의 요청에 대한 적절한 수행을 하는 데 실패했다.
- ( 3XX ) : 요청을 완료하려 추가 행동이 필요하다.
- ( 1XX ) : 요청이 수신 돼 처리 중이다.
✅ 셀프 체크
- id가 10번인 사용자의 오늘 할 일(todos)을 생성, 조회, 수정, 삭제하는 HTTP 요청 메시지를 작성하세요.
- 오늘 할 일(todos)의 json 데이터는 다음과 같이 구성
- userId(사용자 아이디)
- id(오늘 할 일 아이디)
- title(오늘 할 일 제목)
- completed(완료 여부)
- 사용자 아이디는 1~10번까지 있음
- 각 userId(사용자 아이디)당 id(오늘 할 일 아이디)는 20개씩 배정, id 번호는 이어서 관리
- userId 1번의 id : 1~20
- userId 2번의 id : 21~40
- userId 3번의 id : 41~60
- userId 10번의 id : 181~200
- 오늘 할 일(todos)의 json 데이터는 다음과 같이 구성
1. 오늘 할 일 생성 : 10번 사용자의 오늘 할 일을 생성하되, title은 “맛집 탐방하기”로 설정하세요.
POST /todos HTTP/1.1
Content-Length: 77
Content-Type: application/json
Host: jsonplaceholder.typicode.com
{
"userId" : 10,
"title" : "맛집 탐방하기",
"completed" : false
}
2. 오늘 할 일 조회 : 10번 사용자의 오늘 할 일 전체를 조회하세요.
GET /users/10/todos HTTP/1.1
Host: jsonplaceholder.typicode.com
HTTP/1.1 200
date: Sat, 22 Jun 2024 18:58:02 GMT
content-type: application/json; charset=utf-8
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719082682&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=fvjhJ0OP3e5yE9sL65r2TFFifsZyGJ7Z%2BvLo8aUCPBU%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719082682&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=fvjhJ0OP3e5yE9sL65r2TFFifsZyGJ7Z%2BvLo8aUCPBU%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719082723
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: max-age=43200
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"94b-Xf3KAbsgAZYN4iY133g5Nn+yLLE"
content-encoding: gzip
via: 1.1 vegur
cf-cache-status: MISS
priority: u=1,i
server: cloudflare
cf-ray: 897e77ad4a922ab3-LAX
alt-svc: h3=":443"; ma=86400
[
{
"userId": 10,
"id": 181,
"title": "ut cupiditate sequi aliquam fuga maiores",
"completed": false
},
{
"userId": 10,
"id": 182,
"title": "inventore saepe cumque et aut illum enim",
"completed": true
},
// ~~~~~~
{
"userId": 10,
"id": 199,
"title": "numquam repellendus a magnam",
"completed": true
},
{
"userId": 10,
"id": 200,
"title": "ipsam aperiam voluptates qui",
"completed": false
}
]
3. 오늘 할 일 수정 : 10번 사용자의 오늘 할 일 중 id 200번의 title을 “멋지게 숨쉬기”로 수정하세요.
PATCH /todos/200 HTTP/1.1
Content-Length: 76
Content-Type: application/json
Host: jsonplaceholder.typicode.com
{
"userId" : 10,
"title" : "멋지게 숨쉬기",
"completed" : true
}
HTTP/1.1 200
date: Sat, 22 Jun 2024 18:59:52 GMT
content-type: application/json; charset=utf-8
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719082792&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=ZkiHYL1e4jG3gJHPxYR7M9D%2FF%2Fe6rZCSYr4gxPsNYLc%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719082792&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=ZkiHYL1e4jG3gJHPxYR7M9D%2FF%2Fe6rZCSYr4gxPsNYLc%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719082843
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: no-cache
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"56-4LNDg0YeE/XjFgpASDin9gse2sc"
via: 1.1 vegur
cf-cache-status: DYNAMIC
priority: u=1,i
server: cloudflare
cf-ray: 897e7a5b3ccc7bfb-LAX
content-encoding: zstd
alt-svc: h3=":443"; ma=86400
{
"userId": 10,
"id": 200,
"title": "멋지게 숨쉬기",
"completed": true
}
4. 오늘 할 일 삭제 : 10번 사용자의 오늘 할 일 중 id 200번 데이터를 삭제하세요.
DELETE /todos/200 HTTP/1.1
Host: jsonplaceholder.typicode.com
HTTP/1.1 200
date: Sat, 22 Jun 2024 19:00:44 GMT
content-type: application/json; charset=utf-8
content-length: 2
report-to: {"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1719082844&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=e53dH1CXx7BeBWPMV4xzTEVzNtC4We4ZoowIwwBMQJ4%3D"}]}
reporting-endpoints: heroku-nel=https://nel.heroku.com/reports?ts=1719082844&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=e53dH1CXx7BeBWPMV4xzTEVzNtC4We4ZoowIwwBMQJ4%3D
nel: {"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1719082903
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: no-cache
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
via: 1.1 vegur
cf-cache-status: DYNAMIC
priority: u=1,i
server: cloudflare
cf-ray: 897e7ba39f66840a-LAX
alt-svc: h3=":443"; ma=86400
{}
🏓 더 알아볼 내용
1. REST API란
REST API는 Representational State Transfer의 약자로, 분산 네트워크 상에서 자원(리소스)을 표현하고 그 상태를 전송하는 아키텍처 스타일입니다. REST API의 특징은 아래와 같습니다.
- 자원(Resources)
- REST에서는 모든 자원을 고유한 식별자(URI)를 통해 표현합니다. 웹의 자원은 각각의 URI로 식별되며(예: /tasks , /books , /users), 이러한 자원은 서버에 의해 관리됩니다.
- 표현(Representation)
- 자원의 상태는 다양한 표현으로 나타낼 수 있습니다. 주로 JSON 또는 XML
형식의 데이터를 사용하여 자원의 표현을 전송합니다. 클라이언트는 이러한 표현을 통해 서버와 상호 작용합니다.
- 자원의 상태는 다양한 표현으로 나타낼 수 있습니다. 주로 JSON 또는 XML
- 상태 전이(Stateless)
- REST는 상태를 유지하지 않는(stateless) 특징을 가지고 있습니다. 각 요청은 모든 필요한 정보를 포함하고 있어야 하며, 서버는 요청을 처리하기 위해 필요한 정보 만을 이용합니다. 세션 상태는 서버에 저장되지 않고 클라이언트에 의해 유지되어야 합니다.
- 인터페이스 일관성(Uniform Interface)
- REST는 일관된 인터페이스를 제공합니다. 자원에 대한 표준화된 인터페이스로서, CRUD(Create, Read, Update, Delete) 연산을 통해 자원을 조작합니다. 이로써 서버와 클라이언트 간의 상호 운용성을 높입니다.
위의 4가지 특징(혹은 self-descriptive, HATEOAS)을 엄격하게 지키는 API를 보고 RESTful API라고 합니다.
1) 자원 식별
REST API의 좋은 예와 나쁜 예
API | 좋은 예 | 나쁜 예 |
글 조회 | GET /post/{id} | GET /get/posts/{id} |
글 생성 | POST /posts | POST /posts/create |
글삭제 | DELETE /posts/{id} | DELETE /posts/delete/{id} |
위 표의 나쁜 예를 보면 이미 HTTP 메서드로 자원에 대한 행동(GET, POST, DELETE)을 정의했음에도 불구하고 URI로 또 한 번 행동을 나타냅니다. 이는 적절하지 않습니다.
2) 표현
REST API는 데이터를 JSON 형식으로 표시합니다.
{
"postId": 1,
"title": "RESTful API",
"content": "RESTful API에 대한 간단한 설명입니다.",
"author": "John"
}
3) 상태 전이
REST API는 서버가 클라이언트의 상태를 저장하지 않습니다. HTTP 메서드를 통해 클라이언트와 서버 간의 상태 전이를 일으켜 통신을 효과적으로 할 수 있도록 합니다.
4) 인터페이스 일관성
REST API는 일관된 인터페이스를 제공하기 위해 HTTP 메서드와 URI를 일관성 있게 사용합니다. 예를 들어 게시물을 생성하기 위해서는 POST /posts를 사용하며, 게시물을 업데이트하기 위해서는 PUT /posts/{postId}를 사용합니다. 만약 POST /posts/create나 PUT /posts/update/{postId}로 쓴다면 올바르지 않겠죠.
2. HTTP 메서드
REST에서 자원에 대한 행위는 HTTP 메서드를 통해서 나타낸다고 했습니다. 그렇기 때문에 HTTP 메서드는 매우 중요합니다.
HTTP 메서드에는 총 9개의 메서드가 존재합니다.
- GET
- HEAD
- POST
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
이중에서 주로 사용되는 메서드는 다음의 5가지입니다.
- GET, POST, PUT, DELETE, PATCH
특히 PUT과 PATCH의 차이는 면접에서도 단골 질문으로 나오니 꼭 알아두세요.
- PUT : 데이터 전체를 수정
- PATCH : 데이터의 일부만 수정
또 하나 짚고 싶은 메서드는 HEAD입니다. HEAD는 GET과 같지만 ResponseBody, 즉 응답 데이터가 없습니다. 그럼 대체 왜 필요한 걸까요? HEAD는 GET과 다르게 응답 데이터가 없기 때문에 가볍고 전송이 빠릅니다. 그래서 주로 서버의 상태를 확인하는 용도로도 쓰이곤 합니다.
@RequestMapping("/")
@RestController
@RequiredArgsConstructor
public class Test {
@RequestMapping(value = "/ping", method = RequestMethod.HEAD)
public void ping() {
}
}
서버가 정상적으로 동작 중일 경우 http://localhost:8080/ping에 HEAD 요청을 보낸다면 아무런 응답 없이 200을 응답합니다. 만약 서버가 죽었거나 올바르게 동작하지 않는다면 200을 응답하지 않겠죠(500번대 에러 혹은 타임아웃 혹은 실패). 이런 용도로 사용이 가능한 재미있는 메서드입니다.
'FrameWork > Spring' 카테고리의 다른 글
12장 : 서비스 계층과 트랜잭션 (0) | 2024.07.09 |
---|---|
11장 : HTTP와 REST 컨트롤러 (0) | 2024.07.06 |
9장 : CRUD와 SQL 쿼리 종합 (0) | 2024.06.22 |
8장 : 게시글 삭제하기: Delet (0) | 2024.06.21 |
7장 : 게시글 수정하기: Update (0) | 2024.03.29 |