PUT vs PATCH

bearMin·2024년 7월 20일

들어가면서

HTTP Method에 대해 조사를 하면서 PUT과 PATCH에 대해서 알게 되었다. 그러나 둘의 차이점에 대해서 명확하게 아는 느낌이 아니었다. 그냥 둘이 다르다고 하니까 그렇구나~ 하고 넘어간 느낌이라 조금 더 정확한 차이점에 대해서 공부하고 어떨 때 사용을 해야하는지에 대해서 알아보고자 한다.


PUT이란?

정의는?

Request Payload의 값으로 새로운 resource를 만들거나, 해당 resource의 값을 변경

말이 어렵지만 간단하게 얘기해서 기존에 존재하는 데이터를 클라이언트가 전달한 데이터로 수정하기 위해서 사용을 하게 된다.


PATCH란?

정의는?

대상 resource의 일부분만 변경

PUT은 전체 수정(덮어쓰기)인 반면에 PATCH는 부분적으로 수정이 가능하다.


PUT과 PATCH의 차이는?

  1. 수정의 방식

PUT은 전체 수정을 하는 반면에 PATCH는 부분적으로 수정을 하게 된다.


  1. 멱등성의 관점

멱등성의 관점에서 생각을 해보면 PUT은 멱등성이 있고 PATCH는 멱등성이 없다.

💡 멱등성이란?
연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 뜻한다. 
즉, Method를 계속해서 호출해도 결과가 동일하다는 뜻으로
GET, PUT, DELETE는 멱등하다고 볼 수 있지만 POST나 PATCH는 멱등하다고 볼 수 없다.

수정의 방식에 차이가 있다는 건 알겠지만 멱등의 관점에서 봤을 때 잘 이해가 되지 않는다. 어차피 여러 번 호출을 한다면 결과는 동일하다고 볼 수 있는 게 아닐까?


예를 들어보자면?

위의 질문에 대해서 예를 들어서 설명을 해보도록 하겠다.

{
		"name": "JANG",
		"age": 20
}

이라는 데이터가 있다고 할 때

{
		"age": 10
}

을 PUT과 PATCH로 각각 수정을 하게 된다면

PUT은

{
		"age": 10
}

이 되고

PATCH는

{
		"name": "JANG",
		"age": 10
}

이 될 것이다.


위에처럼 값이 있는 경우에는 PUT과 PATCH 모두 몇번을 반복해도 마찬가지로 결과가 동일하기 때문에 멱등하다고 할 수 있다.

그렇다면 여기서 의문인 사람들이 있을 것이다. PATCH는 멱등하지 않다면서 갑자기 멱등하다고..? 나 역시도 여기서 가장 많이 헷갈렸다..

결론부터 말하자면 PATCH는 멱등이게도 멱등이 아니게도 설계를 할 수 있다!


HTTP의 스펙상 구현 방법에 제한이 없기 때문에 데이터가 아닌 동작을 넣을 수도 있다는 뜻이다. 이게 무슨 말인지 예를 들어서 설명을 해보자면

{
		"operation": "add",
		"age": 10
}

과 같이 한 번 호출을 할 때마다 나이에 10씩 값을 더해주는 동작을 구현할 수 있다.

그렇다면 호출을 할때마다 age는 10, 20, 30 … 처럼 호출 시마다 값이 계속 변경이 된다.

따라서 모든 PATCH의 동작이 멱등한 것은 아니기 때문에 PATCH가 멱등하지 않다고 얘기를 하는 것이다!


정리하자면

PUT은 전체 수정이며 PATCH는 부분 수정이다!

PUT은 멱등하고 PATCH는 멱등하지 않다!

PATCH가 멱등하지 않은 이유는 동작을 지정하게 될 경우는 멱등하다고 할 수 없기 때문이다!

profile
소소한 공부기록

0개의 댓글