지금까지 PUT 과 PATCH의 구분이
Request Body에 대상 resource의 모든 항목을 다 넣어서 보내면 PUT, 일부만 보내면 PATCH 라고 생각하고 있었는데,
명확하게 알면 좋을 것 같아서 찾아봤다.
현재는 해당 entity 필드중 일부만 수정하는 api도 PUT method를 사용하고 있는데, PATCH를 사용해야 되지 않나? 하는 고민에 빠졌기 때문이다.
MDN에서 정의하는 PUT 과 PATCH 는 다음과 같다.
PUT
request payload의 값으로 새로운 resource를 만들거나, 해당 resource의 값을 변경한다.
PUT과 POST의 차이점은, PUT은 여러번 보내도 문제 없는 요청이고 POST 는 여러번 보내면 문제가 발생할수도 있다는 점이다.
PUT은 complete representation of a resource 이다.
PUT은 항상 idempotent 하다 = 해당 요청을 여러번 반복해도, 해당 resource가 동일한 상태로 변경된다.
PATCH
patch는 대상 resource의 일부분만 변경한다.
PATCH는 idempotent 하지 않다.
해당 서버가 PATCH method를 허용하는지의 여부는 Allow, Access-Control-Allow-Headers, Accept-Patch 헤더를 보면 알 수 있다.
그런데 내가 헷갈리는건 member엔티티가 다음과 같은 필드를 가지고 있다고 하자.
data class Member (
val id: Int,
val name: String,
val age: Int,
val email: String,
val address: String,
)
다음의 경우에는 PUT 과 PATCH 중 무엇이 맞을까?
request body에는 항상 name, age, email 만 들어가고, 해당 값으로 resource를 업데이트 하고 싶다.
<request body>
name: David
age: 35
email: david@email.com
request body에는 name, age, email이 들어갈수도 있고 안들어갈수도 있고, 핸들러에서 해당 항목이 비어 있다면 null 값으로 처리한다. 넘겨준 값에 대해서만 resource를 업데이트 하고 싶다.
<request body>
age: 35
<request body>
name: Tom
age: 22
<request body>
email: Tom@email.com
request body에는 member 의 모든 항목값이 들어간다. 그리고 해당 값으로 resource의 모든 값들이 업데이트 된다.
<Request Body>
id = tom243
name = Tom
age = 33
email = Tom@email.com
address = Tom's Address
partial update의 정의가 reqeust body에 들어가는 항목이 partial 해도 된다는것인지,
request body에 들어가는 항목에는 대상 resource의 모든 필드가 명시되어야 하지만, 해당 값이 null일 때 그대로 null을 넣을지, null일때는 업데이트 하지 않는건지 헷갈린다.
이제 baeldung 에서 설명하는 PUT과 PATCH 를 보자.
PUT
클라이언트는 PUT을 이용하여 resource의 entity를 set up 할 수 있다.
set up 은 두 가지 중 하나이다.
- entity가 존재하지 않는다면 새로운 entity 를 추가한다.
- entity가 존재한다면, entitiy 값을 업데이트 한다.
PUT method는 request payload로 전달받은 값을 그대로 entity에 반영한다.
그렇기에 request는 항상 entire entity를 포함하고 있어야 한다. 일부 fields만을 가지고 있으면 안된다.
PATCH
PATCH는 entity의 partial modification을 가능하게 한다.
PUT으로 업데이트한 결과는 항상 entity를 동일한 상태로 만든다
그러나 PATCH는 일부만을 업데이트 하기 때문에 이를 수행한 entity는 동일한 결과가 아닐 수도 있게 된다.
이렇기 때문에 PUT이 PATCH보다 fault-tolerant 하다.
느낌은 알겠지만 아직 명확하지 않다.
RFC문서에서 명시한 http methods는 다음과 같다.
PUT
Replace all current representataions of the target resource with the request content
all implementation details behind the resource interface are intentionally hidden by the server.
resource interface에 대해서는 server에서 알아서 구현하는 것이다. 라고 정의하고 있다.
PUT 과 PATCH 의 다른점은 ...
server processes the enclosed entity to modify the resource
서버가 resource를 modify하는 방식에 있어서의 차이이다.
음,, 아직도 명확하지 않아서 여러 웹싸이트 들의 의견을 찾아봤다.
FreeCodeCamp에서는
당신이 그 중 일부만을 업데이트 하고 싶더라도, PUT은 entity의 전체 fields를 request payload에 다 명시해서 보내줘야 한다.
라 한다.
스택오버플로우에서는
전체를 바꾸는거는 PUT, 일부만 바꾸는거면 PATCH를 써라.
등등,,, 을 보면서
그래도 리소스를 업데이트 할때는 PUT 아니면 PATCH 를 쓰는건 맞는거지 하는중
여기서는 부분 업데이트의 경우에는 PUT이 아닌 POST를 쓰는것이 HTTP 스펙에 더 맞는다고 한다.
https://repo.yona.io/doortts/blog/issue/12
우와 너무~ 헷갈려서 나머지는 다음 포스트에서 알아보도록 하자.
참조
PUT - https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT
PATCH - https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH
PUT과 PATCH 간단한 예시 - https://www.baeldung.com/http-put-patch-difference-spring
PUT vs PATCH - https://www.baeldung.com/cs/http-put-vs-patch
RFC Method Definitions - https://www.rfc-editor.org/rfc/rfc9110.html#name-method-definitions
RFC PATCH methods - https://www.rfc-editor.org/rfc/inline-errata/rfc5789.html
FreeCodeCamp - https://www.freecodecamp.org/news/http-request-methods-explained/
'개발 > 개발괴발' 카테고리의 다른 글
[mysql] mysql의 json 칼럼 업데이트 (0) | 2023.09.02 |
---|---|
[HTTP] 그래서 PUT 이랑 PATCH 는 뭐가 다른건가요 - (2) (0) | 2022.10.05 |
[JPA] 엔티티 값을 수정했는데 save를 안해도 되나요 (0) | 2022.09.27 |
모바일에서 로컬호스트 보기 (0) | 2021.10.31 |
벼락치기 자바스크립트 공부하기 (0) | 2020.11.09 |