🧑💻 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는 단순 규약에 불과하기 때문에 반드시 이렇게 사용해야 한다! 는 아니다. 하지만 전세계적으로 사용하는 공통된 규약이기에 향후 유지보수를 위해 정확한 사용과 이해가 필요하다는 것을 느꼈다.