본문 바로가기
CS/HTTP

[HTTP] PUT과 PATCH의 차이

by Hyeri.dev 2024. 4. 21.

🧑‍💻 PUT과 PATCH의 차이점에 대해 설명해주세요.

RESTful API한 HTTP 메서드에 대한 차이점을 묻는 질문은 면접에서 매번 나올만큼 단골질문이다. 나 역시 기술 면접을 대비하여 GET-POST의 차이나 PUT-PATCH의 차이에 대한 공부를 했었으나, 단순하게 두 메서드의 역할 정도로만 기억하고 있었다. 

 

그 중 PUT-PATCH의 차이에 대한 질문이 나왔을 때 PUT은 전체 데이터를 수정하고, PATCH는 부분적인 데이터를 수정한다고 대답했고 면접관께서는 그 차이도 맞는 말이지만 정확하게 PUT은 body가 있고, PATCH는 body가 없는 것이 특징이라고 하셨다.

 

🤔 PATCH에는 body과 없다고요?!

면접관님의 지적에 꽤나 큰 충격을 받았다. 여태까지 PATCH 메서드를 사용할 때에는 항상 body과 포함되어 있었기 때문이다.

 

내가 알고 있는 PUT과 PATCH의 차이점은 아래와 같다.

PUT PATCH
전체 수정 부분 수정
새로운 값으로 교체하는 형태 새로운 값으로 수정하는 형태
Entity의 모든 값을 포함해야 한다. 요청 메세지에 포함된 값만 수정한다.

 

즉, PUT은 몇 가지의 값을 변경하기 위해 전체의 값을 새로 가져와야 하기 때문에 불필요한 리소스가 사용되어지기 때문에 부분 수정을 하기 위해서는 PATCH가 더 성능적으로 좋다고 알고 있었다.

 

내가 알고 있는 부분들이 틀린 지식은 아니었다. 

 

PATCH는 body를 가질 수 있다. 그럼 왜 면접관님은 PATCH는 body를 포함하지 않는다고 말씀하셨을까? 

☝️멱등성

멱등성이란?
같은 요청을 여러 번 수행해도 결과가 동일하게 유지되는 성질.

 

PUT은 멱등성을 가지지만 PATCH는 멱등성을 가지지 않는다. 두 메서드의 차이를 정확하게 이해하면 왜 멱등성을 가지고 가지지 않는지에 대해 알 수 있을 것이다.

Entity : Person(name, age, email)

PUT Method : 전체 수정 
{
	"name" : "hyeri",
	"age" : 20,
	"email" : hyeri.dev@gmail.com
}

 

PUT은 전체 수정이며, 새로운 값으로 전체 리소스를 교체한다. 항상 전체에 대한 데이터를 보내기 때문에 값이 달라질 수 없다. 

Entity : Person(name, age, email)

PATCH Method : 부분 수정 
// 아래와 같이 보내다가 실수로
{
	"name" : "helly"
}

// 이처럼 요청을 보내면 값이 달라진다.
{
	"name" : "helly",
	"age" : 0
}

 

반면 PATCH는 부분 수정이므로 일부분의 데이터를 보낼 수 있는데 중간에 새로운 데이터가 들어가게 되었을 때 전혀 다른결과값이 나올 수 있다. 이 때문에 PATCH는 멱등성을 가지지 않았다고 하는 것이다.

 

PATCH  VS PUT, 당신의 선택은?

PATCH에 Body를 사용하면 안된다고 한 면접관의 의미를 이제는 이해했다. 그렇다면 어떻게 수정할 데이터의 값을 넘겨줘야 하는 거지? 

 

바로 Query String을 사용한다.

 

하지만 이 방법은 일반적이지 않고 RESTful API의 방식이 아니다. 수정해야 할 값이 많을 때면 불필요하게 URL이 길어질 수도 있다. 

 

PATCH의 멱등성 문제가 존재하기는 하나 Body를 사용하지 않고 Query String으로 데이터를 전달 받는다는 의견에는 동의할 수 없어졌다. 게시판의 경우 내용 자체를 Query String으로 어떻게 전달한단 말인가?? 또한 수정하려 하지 않는 데이터를 받아 결과값이 달라질 수 있는 문제는 내부로직에서 충분히 처리할 수 있다.

 

그렇다고 일부분 데이터를 수정하는데 전체 리소스를 변경하는 PUT을 사용하는 것은 불필요한 리소스를 낭비할 수 있다.

 

어떤 Method를 사용할 지 결정하는 것은 개개인의 문제이며 RESTful API는 단순 규약에 불과하기 때문에 반드시 이렇게 사용해야 한다! 는 아니다. 하지만 전세계적으로 사용하는 공통된 규약이기에 향후 유지보수를 위해 정확한 사용과 이해가 필요하다는 것을 느꼈다.