처음에 HTTP 통신을 배울 때, POST와 GET의 차이를 배우게 된다. 그리고 그 두METHOD의 차이에 대한 질문이 신입사원 단골 기출 면접 문제로 인터넷 상에 널리 퍼져있다. 실제로 내가 2017년도에 신입사원으로 첫 직장들을 지원했을 때, POST와 GET의 차이에 대한 질문을 여러 번 받아보기도 하였다.
2017년도에서 3년정도 지나, RESTful API가 널리 쓰이고 있는 현재에서는 RESTful API에서 POST와 PUT의 차이가 이제는 그 주요 질문 항목에 들어 갈 수 있을 거 같다.
(2017년도만 해도, 나는 RESTful API의 개념 정도만 들어봤고, 실제는 써본 적이 없었다.)
(그리고 요즘 경력 개발자 채용 공고를 찾아보면, Back-end 개발자 기준으로 RESTful API 에 대한 항목이 대부분 기재되어 있는 것을 보면, RESTful API에 대한 역량이 필수적으로 자리메김한 거 같다.)
이런 이유로 HTTP세계를 넘어 RESTful한 세계에서의 POST와 PUT차이를 알아보고자 한다.
먼저 간단하게, 다들 알고 있는 RESTful API에 대해 간략하게 정리해보자.
자원을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
간략하게 말한다면, 위와 같은 스타일을 따르는 API라고 볼 수 있다.
*RESTful API에 대해 자세히 말하고자 한다면, 이 페이지로는 모자를 거 같고, 이번 주제가 아니기에 다음에 자세히 다뤄보기로 하겠다.
이제 본래 주제인 RESTful한 세계에서의 POST와 PUT의 차이를 살펴보자.
자원에 대한 행위를 나타내는 4가지 Method는 CRUD(Create/Read/Update/Delete)에 각각 매칭된다.
POST는 Create(생성), PUT은 Update(수정)에 매칭되는데, RESTful API는 자원에 대한 행위를 4가지 Method로 표한하니까, 자원에 대한 생성은 POST가 담당하고, 자원에 대한 수정은 PUT이 담당하는 것이다.
보통 이렇게 정의하지만, 나도 이런 정의만 보고 도대체 어떻게 다른지 감을 잡기 힘들었다. 여러분들은 이런 어려움이 없으면 하는 마음에 자세하게 예를 들어 설명해보겠다.
아래와 같은 URI가 있고, 해당 URI에 대해 POST와 PUT이 작동하는 예를 보자.
/student
POST 메소드로 뽀로로라는 이름을 가진 학생을 생성하기 위에 아래와 같이 요청하면, 고유 구분값인 id를 1로 설정되어 뽀로로라는 학생이 생성된다.
HttpRequest
POST /student
{
“name”: “뽀로로”,
“grade”: 1
}
HttpResponse
HTTP/1.1 200 OK
{
“id”: 1,
“name”: “뽀로로”,
“grade”: 1
}
그러면 이제, PUT을 통해 뽀로로의 grade를 2를 변경해보자. PUT은 리소스에 대한 수정이므로 특정 리소스를 구분하는 id값을 넣어줘야 한다.
HttpRequest
PUT /student/1
{
“grade”: 2
}
HttpResponse
HTTP/1.1 200 OK
{
“id”: 1,
“name”: “뽀로로”,
“grade”: 2
}
이는 POST와 PUT의 가장 기본적인 사용예제이고, 두 메서드의 차이를 조금 더 자세히 알아보기 위한 예제를 또 살펴보자.
POST 메서드로 뽀로로 학생을 생성해달라고 2번 요청하면 어떻게 될까?
POST /student
{
“name”: “뽀로로”,
“grade”: 1
}
id가 1과 2인 뽀로로가 두 개가 생겨버린다. POST는 리소스를 생성하기 위한 메서드로 요청한 횟수마다 새로운 리소스를 생성한다.
(물론 name을 unique key로 잡으면 같은 이름으로 생성하지 안되게 만들 수는 있다.)
HTTP/1.1 200 OK
{ “id”: 1, “name”: “뽀로로”, “grade”: 1 }
HTTP/1.1 200 OK
{ “id”: 2, “name”: “뽀로로”, “grade”: 1}
반대로 PUT으로 같은 요청을 두번 보내면 어떻게 될까?
PUT /student/3
{
“name”: ”에디”
“grade”: 2
}
2번 아니, 수백번 보내도 아래와 같이 같은 응답이 온다. id를 3을 가진 리소스는 없었으므로, 최소 한번은 생성되고, 그 후에는 생성되지 않는다.
HTTP/1.1 200 OK
{ “id”: ”3”, “name”: “에디”, “grade”: 2 }
예시를 들며 설명했던 내용을 다시 정리해보면,
이를 어려운 말로 이야기하면, PUT은 멱등하다고 말할 수 있고, POST는 멱등하지 않다라고 말한다.
PATCH도 수정을 담당하는 메서드라는데, PUT도 수정에 사용되는 거라고 한다. 그렇다면 이 둘은 어떻게 다른 것인가?
PATCH는 수정만 담당하며 리소스의 일부분만 수정할 때 사용하고, PUT은 리소스의 모든 속성을 수정하기 위해 사용한다.
여기까지 RESTful API에서 POST와 PUT이 어떻게 다른지 알아보았고, 추가적으로 PATCH까지 간략하게 살펴보았다. 물론 이 차이가 RESTful API에만 적용되는 것이 아니고, HTTP에서도 적용되는 것을 잊으않았으면 한다. 예를 들어 RESTful API를 통해 설명한 것 뿐이다.
참고 : 1ambda.github.io/javascripts/rest-api-put-vs-post/
감사합니다