Hello

http 메소드 멱등성 본문

카테고리 없음

http 메소드 멱등성

nari0_0 2022. 8. 1. 17:58
728x90

멱등성 == f(f(x)) = f(x)

멱등성은 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 합니다. 

 

http 메소드가 멱등한지 구분할 때 실제 서버의 백엔드 상태만 보며, 각 요청에서 반환하는 응답 코드는 다를 수 있습니다.

  • 멱등성 메서드 : GET, HEAD, PUT, DELETE, OPTIONS, TRACE
  • 비 멱등성 메서드 : POST, PATCH, CONNECT

자주 사용하는 메서드의 멱등성을 아래 정리하고자 한다. (GET, PUT, DELETE, POST, PATCH)

GET

GET 메서드는 멱등성을 가집니다. 여러 번 연속해서 호출 했을 때 조회 데이터의 값이 바뀔 수는 있으나, 서버 상태가 변화하지 않습니다. 클라이언트가 받는 응답은 동일합니다.

GET /board/1 HTTP/1.1
GET /board/1 HTTP/1.1
GET /board/1 HTTP/1.1

PUT

PUT 메서드는 멱등성을 가집니다. PUT은 한 번을 보내도, 여러 번 연속으로 보내도 동일한 데이터를 계속 덮어쓰기 때문에 같은 효과를 보입니다. 즉, 부수 효과가 없습니다.

PUT /board/1 HTTP/1.1 -> update a row
PUT /board/1 HTTP/1.1 -> update a row
PUT /board/1 HTTP/1.1 -> update a row

DELETE

DELETE 메서드는 멱등성을 가집니다. 처음 호출 했을 때 해당 리소스를 삭제하고 200을 반환 합니다. 그 후에 호출 하게 되면 해당 리소스가 삭제된 상태 이기 때문에 404를 반환 합니다. 해당 리소스가 삭제된 상태 이기 때문에 응답 값이 달라 질 수 있지만, 서버의 상태가 변하지 않습니다.

상태 코드는 응답마다 달라질 수 있지만 서버에 해당 리소스가 삭제된 것은 변하지 않습니다. 

(삭제하는 행위가 중요한 것이 아니라 삭제된 상태가 포인트)

DELETE /board/1 HTTP/1.1   -> return 200 if idX exists
DELETE /board/1 HTTP/1.1   -> return 404 as it just got deleted
DELETE /board/1 HTTP/1.1   -> return 404

POST

POST 메서드는 멱등성을 갖지 않습니다. 새로운 리소스를 생성하는 역할을 한다. post를 여러 번 호출할 경우, 열이 계속 추가되어 서버에 변경사항을 만듭니다.

POST /board HTTP/1.1
POST /board HTTP/1.1   -> add a 2nd row
POST /board HTTP/1.1   -> add a 3rd row

PATCH

PATCH 메서드는 멱등성을 가질 수도 있고 갖지 않을 수도 있습니다.리소스의 부분적인 수정을 할 때에 사용하며, 동일한 patch 요청이 다른 결과를 반환 할 수도 있습니다. 

put과 동일한 방식으로 사용한다면 patch는 멱등성을 가질 수 있습니다.

 

아래 객체가 서버에 존재해 있고

{"path": "/a/b/c", value : "abc"}

아래 데이터를 갖고 patch 3번 호출 하게 되면 value가 abchello, abchellohello, abchellohellohello 가 된다.

동일한 엔드포인트에 대해 동일한 patch 호출했으나 반환되는 결과가 다르고, 서버의 값이 변경됩니다. patch가 f(x)이면 f(f(x))는 f(x)와 같지 않아 이 예시는 멱등하지 않습니다.

{ "op": "add", "path": "/a/b/c", "value": "hello"}
// abchello
{ "op": "add", "path": "/a/b/c", "value": "hello"}
// abchellohello
{ "op": "add", "path": "/a/b/c", "value": "hello"}
// abchellohellohelllo

 

patch가 멱등하지 않은 내용이 스택 오버플로우에 정리가 잘 되어있어 공부하는데 큰 도움이 되었다.

 

참조 :

https://developer.mozilla.org/ko/docs/Glossary/Idempotent

https://datatracker.ietf.org/doc/html/rfc5789

https://datatracker.ietf.org/doc/html/rfc6902#section-3

https://stackoverflow.com/questions/28459418/use-of-put-vs-patch-methods-in-rest-api-real-life-scenarios/39338329#39338329

728x90