PUT, PATCH는 리소스의 업데이트를 의미한다.
PUT 메서드는 요청한 URI에 payload에 있는 자원으로 대체하는 메서드이다.
대체는 대상을 저장하기도 하고 변경하기도 한다는 것을 의미한다.
아래는 리소스에 PUT 요청을 보내는 예시다.
id | balance | name |
---|---|---|
1 | 100 | 민석 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
아래 두개의 요청에 대해 PUT은 다른 결과를 보인다.
1. 요청
PUT /customers?id=1
{
name : 민돌
balance : 0
}
2. 요청
PUT /customers?id=1
{
name : 민돌
}
id | balance | name |
---|---|---|
1 | 0 | 민돌 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
id | balance | name |
---|---|---|
1 | null | 민돌 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
PUT 요청 시 보내지 않은 값은 null로 대체된다.
PUT의 정의처럼 대상 리소스를 나타내는 데이터를 대체한다.
PATCH 메서드는 자원의 부분 수정을 할 때 사용한다.
id | balance | name |
---|---|---|
1 | 100 | 민석 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
아래 두 개의 요청을 PATCH로 보내면 다른 결과를 보낸다.
1. 요청
PUT /customers?id=1
{
name : 민돌
balance : 0
}
2. 요청
PUT /customers?id=1
{
name : 민돌
}
id | balance | name |
---|---|---|
1 | 0 | 민돌 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
id | balance | name |
---|---|---|
1 | 100 | 민돌 |
2 | 20 | 민찬 |
3 | -120 | 민종 |
PATCH 요청 시 보내지 않은 값은 그대로 유지한다.
PATCH 메소드는 멱등성을 보장해주지 않는다.
PATCH 메소드는 구현 방법에 따라서 PUT 메소드처럼 멱등성이 보장될 수도 있고, 혹은 보장되지 않을 수도 있다.
PATCH 메소드는 PUT 메소드처럼 리소스를 대체하는 행위가 아니기 때문에 요청을 어떤 방식으로 사용하는지에 제한이 없다.
PATCH 메소드는 단지 리소스의 일부를 수정한다는 의미를 가진다.
다음 처럼 PATCH 요청을 보내면 멱등성이 보장된다.
// 기존 리소스
{
id: 1,
name: 'evan',
age: 30,
}
PATCH 요청
PATCH users/1
{ age: 31 }
요청 결과
// 새로운 리소스
{
id: 1,
name: 'evan',
age: 31, // 변경됨
}
위 PATCH 요청은 여러 번 수행해도 age는 31 값을 가진다.
다음과 같은 경우 PATCH 메소드가 멱등성 보장이 안될 수 있다.
PATCH users/1
{
$increase: 'age',
value: 1,
}
위 요청은 age 필드의 값을 1 증가시킨다.
이 경우 API가 호출될 때마다 age는 1씩 증가하기 때문에 멱등성을 보장하지 않는다.