본문 바로가기

TIL(Today I Learned)

TIL-231023(PUT vs PATCH)

📝오늘 공부한 것

  • PUT vs PATCH 공부
  • 커리어톤 참여하기
  • 프로그래머스 문제풀기

📌 PUT & PATCH

프로젝트를 진행하면서 PUT을 사용해야할지 PATCH를 사용해야 하는지 헷갈릴 때가 많았다. 'PUT은 모든 필드를 보내야하고, PATCH는 부분만 보내면 될 때 사용한다.'라고 생각을 했었다.
정확하게 개념이 잡히지 않아 PUT과 PATCH에 대해서 공부를 해보고자 한다.

 

[ PUT ]

요청 payload를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체한다.

PUT 메서드는 request payload로 전달받은 값을 그대로 entity에 반영하기 때문에 request는 항상 전체 entity를 포함하고 있어야 한다(일부 필드만을 가지고 있으면 안된다.).

 

요청한 URI 아래에 자원이 존재하지 않는 경우

자원이 존재하지 않는 경우는 POST와 마찬가지로 새로운 자원으로써 저장하고 클라이언트에게 201(created)응답을 보내면 된다.

 

요청한 URI 아래에 자원이 존재하는 경우

payload에 담긴 정보를 이용해서 새로운 자원을 만들어 기존에 존재하던 자원을 대체한다. 그리고 해당 요청이 잘 적용되었다는 것을 클라이언트에게 200(ok) 또는 204(no content)를 이용해서 알려주면 된다.

 

PUT메서드를 사용하는 클라이언트는 해당 자원의 상태를 모두 알고 있다고 가정되어야 한다.

PUT메서드는 요청 경로에 자원이 존재하는 경우 해당 자원을 payload 정보와 교체하는 메서드이다.

즉, PUT 메서드를 사용할 때 전송하는 payload만으로 자원의 전체 상태를 나타낼 수 있어야 한다. 새로운 자원을 생성해야 하는 경우 완전한 상태의 자원을 저장해야 하고 새로운 자원으로 대체하는 경우 자원이 완전한 상태를 가지고 있어야 하기 때문이다.

만약 PUT의 정의대로 전달받은 payload가 기존 정보를 대체하도록 구현한 경우 payload 정보가 불완전한 상태로 전송된다면 일부 entity의 field값들은 null로 변경될 수 있다.

 

[ PATCH ]

리소스의 부분적인 수정을 적용하기 위한 HTTP메서드이다.

 

 

 

PUT : 리소스의 전체 교체, 리소스 교체 시 모든 필드 필요

(만약 전체가 아닌 일부만 전달할 경우, 전달한 필드 외 모두 null or 초기값 처리됨)

 

PATCH : 리소스의  부분 교체, 리소스 교체 시 일부 필드 필요

 

 

오늘의 공부 내용으로 보았을 때, 기존에 있던 자원을 완전히 대체하거나 새로 생성하는 것이 아닌, 수정하고 싶은 부분만 수정하는 경우에는 PUT 보다 PATCH 규약이 더 적절한 상황이라고 할 수 있다.
프로젝트에서는 마이페이지의 정보를 수정하고 싶을 때, entity에 정보가 없다면 새로운 자원을 생성하는 것이 아닌 오류를 받아야했다. 또, entity의 전체 필드가 아닌 일부 필드만 업데이트하는 기능이었다. 그래서 PUT 대신 PATCH를 선택하였던 것이 옳은 선택이었던 것 처럼 보인다.

 

 

 

References :

https://www.baeldung.com/http-put-patch-difference-spring

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

https://tecoble.techcourse.co.kr/post/2020-08-17-put-vs-patch/