PATCH vs PUT 어떤 상황에서 이용하면 될까?

SeokHwan An·2023년 5월 8일
0

네트워크

목록 보기
2/3

이번 장바구니 미션에서 상품 update를 할 때 단순하게 Patch를 통해 상품의 상태를 수정했고 리뷰어로 부터 리소스 전체 정보를 넘겨 상품을 수정할 때 patch보다는 put을 이용하는 것이 사용목적에 알맞은 것 같다라는 리뷰를 받고 patch와 put에 대한 차이를 알아보려고 합니다.

Patch와 Put의 차이에 대해 알아보기에 앞서서 http method의 특성인 멱등성에 대해서 간단하게 설명하고자 합니다. 멱등성은 같은 요청을 여러번 보내더라도 결과가 동일한 것 즉, 서버에 미치는 영향이 동일한 것을 의미합니다. 멱등성이 http method에서 중요한 이유는 요청의 재시도 때문입니다. 기존의 요청이 실패를 하게 되면 요청의 재시도가 필요한데 멱등성이 지켜지는 http method는 조건없이 재요청을 보내도 되지만 그렇지 않은 메소드의 경우 멱등성을 고려해서 재요청을 보내야합니다.

PATCH

patch는 mdn web docs에 따르면 자원의 일부분을 수정하는 http method 입니다. 즉, CRUD 개념에서 update와 유사한 기능을 하는 메소드로 볼 수 있습니다. Patch에 대해 간단한 예시를 보겠습니다. 이번 미션에서 상품의 데이터가 존재했고 일부분을 수정한다는 가정하에 살펴보겠습니다.

idnameimage_urlprice
1연필이미지1000
2지우개이미지2000

다음과 같은 데이터가 존재할 때 여기서 연필의 가격을 1000에서 1500원으로 수정해야하는 상황이 온다면 다음과 같이 요청을 보낼 수 있습니다.

PATCH /products/1 HTTP/1.1
HOST : localhost:8080
...
body : {
	 price : 1500
}

요청의 결과로는 다음과 같이 반영이 됩니다.

idnameimage_urlprice
1연필이미지1500
2지우개이미지2000

데이터를 살펴보면 부분적으로 수정되는 것을 알 수 있습니다. 그러면 이와 같은 요청을 무수히 보내게 되면 어떤 결과를 가져올까요? 쉽게 예상할 수 있듯이 앞선 결과와 동일하게 나타나갈 것입니다. 우리는 이런 결과를 토대로 Patch는 멱등한 메소드라고 생각할 수 있겠지만 Patch는 멱등하지 않은 http method 입니다. 그 이유는 mdb web docs의 문서를 보면서 설명하겠습니다.

if an auto-incrementing counter field is an integral part of the resource, then a [PUT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) will naturally overwrite it (since it overwrites everything), but not necessarily so for PATCH.

문서에 나온 내용을 보면 요청을 보낼 시 자동으로 증가하는 필드가 있는 경우 PUT의 경우 전체 데이터를 덮어씌우지만 PATCH의 경우에는 일부만 수정하기에 같은 결과를 반환하지 못한다는 것을 알 수 있습니다.

이로써 우리는 Patch는 멱등하게 구성할 수도 있고 그렇지 않게 구성할 수 있다는 것을 알 수 있습니다.

PUT

PUT은 mdn web docs에 따르면 새로운 자원을 생성하거나 대상 리소스를 요청의 payload로 변경하는 http method입니다. PUT의 특징은 리소스의 전체를 수정한다는 것입니다. 예시를 통해 살펴보겠습니다. 아까와 같이 상품 데이터로 예시를 들겠습니다.

idnameimage_urlprice
1연필이미지1000
2지우개이미지2000

PATCH와 마찬가지로 연필의 price를 1000에서 1500으로 수정을 하는 요청을 PUT으로 보내게 되면 어떻게 되는지 알아보겠습니다.

PUT /products/1 HTTP/1.1
HOST : localhost:8080
...
body : {
	 price : 1500
}

이와 같이 PUT요청을 보내게 되면 다음과 같은 결과를 나타냅니다.

idnameimage_urlprice
1nullnull1500
2지우개이미지2000

여기서 알 수 있는 점은 PUT요청을 보낼 때에는 전체 정보를 넘겨주어야 한다는 것입니다. 그렇지 않으면 위의 결과와 같이 null로 변환되는 참사를 맞이할 수 있습니다. 따라서 PUT 요청을 보낼 때에는 다음과 같이 보내야 합니다.

PUT /products/1 HTTP/1.1
HOST : localhost:8080
...
body : {
	 name : 연필,
	 image_url : 이미지,
	 price : 1500
}

이렇게 요청을 보내게 된다면 우리가 원하는 결과를 얻을 수 있습니다.

idnameimage_urlprice
1연필이미지1500
2지우개이미지2000

PUT은 mdn web docs에 따르면 멱등한 메소드라고 정의되어 있습니다.

The difference between PUT and [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) is that PUT is idempotent: calling it once or several times successively has the same effect (that is no side effect), whereas successive identical [POST](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) requests may have additional effects, akin to placing an order several times.

PUT이 POST와 다르게 멱등한 이유는 자원의 정보를 명확하게 표기하기 때문입니다. POST의 경우 /products 로 요청을 보내기에 요청을 보낼 때마다 리소스가 계속늘어나게 되어 멱등성이 보장되지 않지만 PUT의 경우 /products/3 와 같이 특정 리소스를 지정하여 요청을 보내기에 없는 자원이라면 생성을 해주고 있는 자원이라면 수정을 해주기에 멱등하다고 할 수 있습니다.

결론

PATCH

  • 리소스의 일부분을 수정하는 http method로 요청이 리소스의 일부분만 넘어올 때 이용하는 것이 적절하다.
  • PATCH는 멱등하게 구성할 수도 있지만 그렇지 않을 수도 있다.

PUT

  • 리소스의 전체를 수정하는 http method로 요청이 리소스 전체 정보를 담아서 넘어올 때 이용하는 것이 적절하다.
  • PUT은 항상 멱등하다.

따라서 수정 요청이 리소스의 일부분이면 PATCH를 이용하고 리소스의 전체 정보이면 PUT을 이용하는 것이 http method를 올바르게 사용하는 것이라 볼 수 있다.

0개의 댓글