TIL- PUT과 PATCH 차이점
2024-06-04
2024-06-05
오늘의 학습 🌠
PUT과 PATCH
PUT 과 PATCH는 리소스를 업데이트 한다는 점에서 같은 역할을 하는 메서드처럼 보이지만 두 개의 요청에는 약간의 차이가 있습니다.
PUT
: 리소스의 모든 것을 업데이트PATCH
: 리소스의 일부를 업데이트
회원(member) | 1 |
---|---|
이름(name) | 영나이 |
나이(age) | 24 |
성별(gender) | W |
상기와 같은 회원이라는 리소스가 있을 때 다음과 같이 요청을 보내면
1
2
3
4
5
6
PUT /members/1
{
name : "이두유",
age : 4,
gender : "W"
}
회원(member) | 1 |
---|---|
이름(name) | 이두유 |
나이(age) | 4 |
성별(gender) | W |
상기의 표처럼 이름, 나이, 성별이 변화됩니다.
이번에는 나이, 성별을 빼고 요청을 보내겠습니다.
1
2
3
4
PUT /members/1
{
name : "이두유",
}
회원(member) | 1 |
---|---|
이름(name) | 이두유 |
나이(age) | |
성별(gender) |
이름의 값이 변경되고 나이와 성별은
null
값으로 변화됩니다.이번에는
PATCH
를 보겠습니다. 앞서 본 회원과 마찬가지로 다음과 같은 리소스가 존재합니다.
회원(member) | 1 |
---|---|
이름(name) | 영나이 |
나이(age) | 24 |
성별(gender) | W |
1
2
3
4
PATCH /members/1
{
name : "마루",
}
- 해당 요청을 보낸다면
회원(member) | 1 |
---|---|
이름(name) | 마루 |
나이(age) | 24 |
성별(gender) | W |
PATCH는 다음과 같이 요청에 포함되어 있는 부분(이름)만 변경이 됩니다.
결과적으로 클라이언트가 기존 리소스를 완전히 교체해야 하는 경우 PUT을 사용하고 부분 업데이트를 수행할 떄 PATCH를 사용합니다.
앞서 회원 리소스의 예시를 본 것처럼 단일 필드를 업데이트할 때 전체 리소스 표현을 보내는 것은 번거롭고 불필요한 비용이 들어갑니다!
이런한 경우는 PATCH를 사용하는 것을 권장합니다. 여기서 고려해야 할 중요한 측면은 멱등성입니다.
멱등성이란?
멱등성은 어떤 대상에 같은 연산을 여러번 적용해도 결과가 달라지지 않는 성질을 뜻합니다.
SW에서 몇 번을 호출하던지 결과가 동일해야 한 경우를 멱등하다고 합니다. 예시로 엘레베이터를 볼 수 있습니다. 엘레베이터 버튼을 몇 번 누르던지 엘레베이터가 호출한 층으로 온다는 사실은 변하지 않습니다.
또 다른 예로 어떠한 수에 1을 곱하는
x = x * 1
과 같은 함수는 어떠한 값에 100000번을 적용하든지 그 이상을 적용하던 항상 x를 반환하므로 이런 연산은 멱등성이 보장된다고 할 수 있습니다.하지만 1을 더하거나 빼는 함수라면 한 번 호출될 때마다 인자로 주어진 값을 계속 증가시키거나 감소시키므로 항상 같은 값을 반환하지 않습니다. 이런 연산은 멱등성을 보장하지 않는 예시입니다.
HTTP 메서드 또한 결국 어떤 자원을 쓰고 읽고 수정하고 지우는 CRUD의 의미를 가집니다.
HTTP 메서드에서의 멱등성
PUT 메서드는 요청에 담긴 리소스로 기존 리소스를 그대로 대체하므로 여러번 수행하여도 요청에 담긴 리소스가 변하지 않는 이상 연산 결과가 동일합니다.
PATCH 메서드는 구현 방법에 따라 멱등성이 보장될 수 있고 보장되지 않을 수 있습니다.
PATCH 메서드는 PUT 메서드처럼 리소스를 대체하는 행위가 아니기 때문에 요청을 어떤 방식으로 사용 하는지에 대한 제한이 딱히 없습니다. PATCH 메서드는 단지 리소스의 일부를 수정한다는 의미를 가지고 있습니다.
1
2
3
4
5
PATCH /members/1
{
$increase: 'age',
value: 1,
}
- 다음과 같은 요청을 할 때 $increase 필드의 값은 증가시키고 싶은 속성을 의미하고 value 필드의 값은 그 속성을 얼마나 증가시킬 것인지를 나타냅니다. 이 경우 API가 호출될 때마다 나이가 1씩 증가하기 때문에 멱등성을 보장하지 않습니다.
추가 🕤
숙련주차 팀 프로젝트를 진행하며 기능을 나눠서 개발하니 누가 작성하냐에 따라 PUT을 사용하기도 하고 PATCH를 사용하기도 했습니다..
튜터님께 피드백을 받고 API 명세서를 확인하니 과연 둘의 명확한 차이가 무엇일까 궁금해져서 해당 내용을 정리하게 되었습니다. 🎊 오늘도 끝~
🐱🏍— —🤸🏻♀️ ~~~ 야~호~