2023. 2. 28. 18:59ㆍComputer Science/Network
✅ 아래 내용들에 대해서 알아보자
- HTTP 메소드 안정성
- HTTP 메소드 멱등성
- HTTP 메소드 캐시성
안전성(Safe)
HTTP 메서드의 안정성이란 호출해도 리소스가 변경되지 않는 성질을 말한다.
예를 들면, GET 메서드는 단순히 데이터를 조회하는 기능을 수행하기 때문에 리소스를 변경 및 수정하지 않으니 안전성 있는 HTTP 메서드이다. 반면에 POST/PUT/PATCH/DELETE는 데이터 변경/삭제 요청을 하므로 안정성이 없는 HTTP 메소드이다.
즉, HTTP 메서드의 안정성이란 리소스를 수정/삭제하지 않고 데이터의 일관성을 유지하는 성질을 의미한다.
메소드 | 안정성 |
GET | O |
POST | X |
PUT | X |
PATCH | X |
DELETE | X |
멱등성(Idempotent)
위키백과에서 정의하는 멱등은 아래와 같다.
HTTP의 멱등성은 요청을 한번 보내든 여러 번 보내든 항상 같은 결과를 나타내는 성질을 말한다.
즉, 동일한 요청을 한번 보낸 것과 여러 번 연속 보낸 것이 같은 효과를 가지고, 서버의 상태도 동일하게 남을 때 해당 HTTP 메서드가 멱등성을 가진다고 말한다.
HTTP 메소드 안정성과 혼동이 올 수 있는데
- HTTP 메서드 안전성이 한번을 호출하든 여러 번을 호출하든 리소스에 수정이 발생하지 않는 속성이고
- HTTP 메소드 멱등성은 리소스에 수정이 발생한다고 하더라도 메서드를 여러 번 실행한 결과가 한 번 실행한 결과와 같다면 만족한다는 속성
HTTP 스펙에 의하면 GET, PUT, DELETE는 멱등성을 가지도록 구현해야 하며, POST와 PATCH는 멱등성을 가지지 않도록 구현해야 한다.
메소드 | 멱등성 |
GET | O |
POST | X |
PUT | O |
PATCH | X |
DELETE | O |
GET의 멱등성
GET은 데이터를 1번 혹은 N번 조회하든 같은 결과가 조회되어야 하며, 안전과 멱등을 동시에 만족하는 메서드이다.
멱등성을 만족하는 게시글 조회(GET) API 설계
- GET /post/1 요청
- 서버에서 id값이 1인 게시글 조회
- 해당 게시글 데이터 응답
위 과정의 경우 여러 번 보내더라도 항상 같은 결과가 조회되고 멱등성을 보장하는 GET API 설계이다.
멱등성을 만족하지 않는 게시글 조회(GET) API 설계
- GET /post/1 요청
- 서버에서 id값이 1인 게시글 조회
- 게시글 조회 시 조회수 1씩 증가
- 해당 게시글 데이터 응답
위 과정의 경우 GET 요청을 여러 번 보낼 경우 해당 게시글이 1씩 증가하면서 데이터 값이 매번 바뀌게 된다.
멱등성을 보장하지 않는 GET API가 되고, 개발자가 HTTP 스펙에 부합하지 않게 API를 설계한 경우이다.
따라서, 멱등성 있게 API를 설계하기 위해서는, 조회수를 증가시키는 PATCH API를 따로 만들어 분리하는 것이 적합하다.
DELETE의 멱등성
DELETE를 처음 요청 하면, 서버에서 해당 리소스는 삭제된다. 이후 DELETE를 여러 번 요청하더라도 해당 리소스는 이미 삭제된 상태일 것이고 서버의 상태는 변하지 않는다.
멱등성을 만족하는 게시글 삭제(DELETE) API 설계
- DELETE /post/1 요청
- 서버에서 id값이 1인 게시글 삭제
위 과정의 경우 여러 번 삭제를 하더라도 해당 리소스는 이미 삭제된 상태라 서버의 상태가 변하지 않는다. 멱등성을 만족함
멱등성을 만족하지 않는 게시글 삭제(DELETE) API 설계
- GET /post/1 요청
- 서버에서 id값이 1인 게시글 조회
- 게시글 조회 시 조회수 1씩 증가
- 해당 게시글 데이터 응답
캐시 가능(Cacheable)
메소드 | 안정성 |
GET | O |
POST | X |
PUT | X |
PATCH | X |
DELETE | X |
HTTP 메서드에 대해서 전체적으로 정리한 표를 참고하자
'Computer Science > Network' 카테고리의 다른 글
HTTP 프로토콜 (0) | 2023.02.27 |
---|---|
URI, URL ,URN 뭐가 다를까? (0) | 2023.02.27 |
TCP/IP (0) | 2022.05.05 |
Http 상태 코드 정리 (0) | 2022.04.10 |