일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 오블완
- @CreateDate
- RootGraph
- deserializer
- apatch poi
- 버전 문자열 비교
- spring boot
- Protecle
- https
- getEntityGraph
- EmbeddedId
- mysql =
- 티스토리챌린지
- @EntityListeners
- load order
- createEntityGraph
- 1*1000
- mysql equal null
- MYSQL
- 운동해서 광명찾자
- mysql not equal null
- pooled-lo
- yml
- MSSQL
- fractional seconds
- NamedEntityGraph
- sendFractionalSeconds
- +9:00
- getDateCellValue
- AuditingEntityListener
- Today
- Total
Hello
http 메소드 멱등성 본문
멱등성 == 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