참고
- 멱등성에 대한 Stackoverflow 답변 👍
- 티스토리에서 찾은 어느 블로그
PUT
과 PATCH
메서드는 기존에 존재하던 자원에 업데이트를 실시한다. 둘 다 업데이트를 실시하기 때문에, 혼용해서 API를 구축하게 되기 쉽다.
그러나 이 둘은 엄연히 다르다. 지금부터 그 차이를 알아볼 것이다.
그 전에, 둘의 정확한 정의를 알아봐야겠다.
The HTTP PUT request method creates a new resource or replaces a representation of the target resource with the request payload.
HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체합니다.
The HTTP PATCH request method applies partial modifications to a resource.
HTTP PATCH 메소드는 리소스의 부분적인 수정을 할 때에 사용됩니다.
아래의 예시는 다음의 세 부분으로 구성되어 있다. PUT
과 PATCH
의 차이를 나타내려 하였다.
1) update 방식의 차이
2) 요청한 URI에 자원이 존재하지 않을 때
3) 멱등성의 관점
아래와 같은 리소스가 있다고 가정해보자.
id balance name 1 100 민석 2 20 민찬 3 -120 민종
이중 id === 1
인 사람에게 PUT
요청을 두 종류로 보낼 것이다.
1.
PUT /customers?id=1 { name : 민돌 balance : 0 }
2.
PUT /customers?id=1 { name : 민돌 }
전자는 자원의 모든 상태를 새로운 값을 대입하여 보낸 요청이고,
후자는 일부만 새로운 값을 보낸 요청이다.
이 둘의 결과는 다음과 같은 차이를 보인다.
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
1.
id balance name 1 0 민돌 2 20 민찬 3 -120 민종 2.
id balance name 1 null 민돌 2 20 민찬 3 -120 민종 즉, 보내지 않은 값은 null로 대체된다. 다시 말해서, PUT의 정의처럼 대상 리소스를 나타내는 데이터를 대체한다.
PUT에서 사용했던 예시와 같은 예시를 사용할 것이다. 요청 또한 아래와 같이 두 개가 있다.
1.
PATCH /customers?id=1 { name : 민돌 balance : 0 }
2.
PATCH /customers?id=1 { name : 민돌 }
이 둘의 결과는 다음과 같은 차이를 보인다.
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
1.
id balance name 1 0 민돌 2 20 민찬 3 -120 민종 2.
id balance name 1 100 민돌 2 20 민찬 3 -120 민종 즉, 보내지 않은 값은 그대로 유지되고 있다.
새로운 자원을 생성한다.
예시에서
PUT /customers?id=4 { name : 갑수 balance : 99999 }
라는 요청을 보내면, 결과는 다음과 같다.
id balance name 1 100 민돌 2 20 민찬 3 -120 민종 4 99999 갑수
새로운 자원을 생성하지 않는다.
예시에서
PATCH /customers?id=4 { name : 갑수 balance : 99999 }
라는 요청을 보내면, 결과는 다음과 같다. (서버는 오류를 응답에 보낸다.)
id balance name 1 100 민돌 2 20 민찬 3 -120 민종
An HTTP method is idempotent if an identical request can be made once or several times in a row with the same effect while leaving the server in the same state.
동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다.
이를 이렇게도 표현할 수 있다.
f(f(x)) = f(x) for any value x
즉, 서버로 요청을 여러번 날리는 행위와 한 번 날리는 행위가 같은 결과를 내면 멱등성이 있다고 할 수 있겠다.
MDN 문서 등을 보면
PUT은 멱등성을 가지지만, PATCH는 멱등성을 가지지 않는다고 한다. 그런데 위에 작성한 예시들에서 PUT
과 PATCH
는 모두 멱등성이 있는 것 '처럼' 작동하는 문제가 있다.
다시 한 번 올라가서 살펴보면 PATCH 요청 또한 아무리 날려도 같은 값을 리턴하리라는 것을 알 수 있다.
그렇다면 PATCH는 왜 멱등성을 가지지 않는다고 한 것일까?
여기의 답변을 참고하여 다시 한번 위의 예시를 갖고 와야겠다.
id balance name 1 100 민석 2 20 민찬 3 -120 민종
이 글에서 위 리소스는 /customers
URI를 통해 접근하는 것으로 가정하였다.
그렇다면 PUT
과 PATCH
요청을 /customers
자체에 보내는 경우를 가정하면?
아래의 요청을 두 번 보낼 것이다.
PATCH /customers
{
name : 갑수
balance : 99999
}
id balance name 1 100 민돌 2 20 민찬 3 -120 민종 4 99999 갑수
id balance name 1 100 민돌 2 20 민찬 3 -120 민종 4 99999 갑수 5 99999 갑수
안녕하세요. 블로그 잘봤습니다. 궁금한게 있어서 여쭤보려고 합니다. Patch는 새로운 자원을 생성할 수 없다고 했는데 맨아래에서 멱등성에 예시를 들 때, 새로운 자원이 생성되었는데 혹시 예시를 보여주기 위해서 일까요?