오랜만에 포스팅한다. 몇달만에 다시 하려니 어색할 뿐이다. 그래도 다시 시작해야지.
RestAPI를 디자인 하다보면 고민하게 되는 부분이 있다.
PUT과 PATCH를 언제 어떻게 사용해야 좋을까 하는 점이다.
원론적으로 따지면 리소스를 부분 수정 할 땐 PATCH를 사용하고 리소스 전체를 교체할 때는 PUT을 사용한다.
사실 PUT만 사용하는 경우도 많고 리소스 일부 수정도 PUT을 사용하는 경우도 많다. 당장 내가 다니는 회사에서도 업데이트는 거의 PUT만 사용하는 것 같다.
하지만 규약 관점에서 보자면 PUT과 PATCH는 서로 다른 용도이다.
PUT은 '교체/대체(replace)'하는 메서드이다. 즉, 대상을 저장하기도 하고 변경하기도 한다. 자원이 없다면 생성하고 201(created) 응답을 보낸다. 이미 자원이 존재하는 경우 기존 자원을 대체하고 200(ok) 또는 204(no content) 응답을 보낸다.
PATCH는 리소스에 부분적인 수정을 적용하기 위한 메서드이다.존재하는 자원의 상태를 수정하는 개념이다.
여기에 멱등성을 한 스푼 더하면 차이점은 더욱 드러난다. PATCH는 멱등성을 지키지만, PUT은 멱등성을 지키지 못한다.
간단한 예시로 PATCH는 리소스를 교체하기 때문에 동일한 payload는 동일한 리소스를 보장한다. 하지만 PUT은 카운트 증가 처럼 기존에 존재하는 리소스 상태를 수정할 경우 멱등성을 보장하지 못한다.
payload가 카운트 + 1이라면 PUT을 요청할 때마다 리소스의 카운트가 1씩 증가한다는 뜻이다.
다시 돌아가서, FastAPI는 update에 무엇을 쓰라고 권고할까? 자유롭게 사용하라고 한다. PUT으로 리소스 일부 수정을 전달 해도 FastAPI는 어떠한 제한도 하지 않는다.
단지 PATCH를 통해 리소스의 부분수정을 구성할 경우 Pydantic을 설정할 때 기본값을 None으로 두고,
Item.model_dump(exclude_unset=True) 식으로 입력된 부분만 남겨서 사용하라고 한다.
Pydantic v1과 호환을 위해 .dict()를 사용하는 방식도 설명하지만 Pydantic v2를 사용할 수 있는 경우에는 .model_dump()을 사용해야 한다,
참고
PUT: https://www.rfc-editor.org/rfc/rfc9110.html#section-9.3.4
RFC 9110: HTTP Semantics
The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of
www.rfc-editor.org
PATCH: https://www.rfc-editor.org/rfc/rfc5789.html
RFC 5789: PATCH Method for HTTP
www.rfc-editor.org
PUT과 PATCH의 멱등성: https://www.rfc-editor.org/rfc/rfc9110.html#name-idempotent-methods
RFC 9110: HTTP Semantics
The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of
www.rfc-editor.org
FastAPI Body Updates: https://fastapi.tiangolo.com/tutorial/body-updates/
Body - Updates - FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
fastapi.tiangolo.com
'Python' 카테고리의 다른 글
FastAPI에서 MongoDB 연결하기 (0) | 2024.05.05 |
---|---|
Django의 DB모델링 (0) | 2023.07.02 |