처음에 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에 대해 간략하게 정리해보자.

🙈 RESTful API란?

자원을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.

간략하게 말한다면, 위와 같은 스타일을 따르는 API라고 볼 수 있다.

RESTful API에 대해 자세히 말하고자 한다면, 이 페이지로는 모자를 거 같고, 이번 주제가 아니기에 다음에 자세히 다뤄보기로 하겠다.

이제 본래 주제인 RESTful한 세계에서의 POST와 PUT의 차이를 살펴보자.

🔑POST vs 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 }

예시를 들며 설명했던 내용을 다시 정리해보면,

  • POST
    • POST는 리소스의 생성을 담당한다.
    • POST는 요청 시 마다, 새로운 리소스가 생성된다.
  • PUT
    • PUT은 리소스의 생성과 수정을 담당한다.
    • PUT은 요청 시 마다, 같은 리소스를 반환한다
    • 물론, 리소스 안에 속성은 변경될 수 있다.

이를 어려운 말로 이야기하면, PUT은 멱등하다고 말할 수 있고, POST는 멱등하지 않다라고 말한다.

👀그렇다면 PATCH와 PUT은?

PATCH도 수정을 담당하는 메서드라는데, PUT도 수정에 사용되는 거라고 한다. 그렇다면 이 둘은 어떻게 다른 것인가?

PATCH는 수정만 담당하며 리소스의 일부분만 수정할 때 사용하고, PUT은 리소스의 모든 속성을 수정하기 위해 사용한다.

⚰️끝맺으며..

여기까지 RESTful API에서 POST와 PUT이 어떻게 다른지 알아보았고, 추가적으로 PATCH까지 간략하게 살펴보았다. 물론 이 차이가 RESTful API에만 적용되는 것이 아니고, HTTP에서도 적용되는 것을 잊으않았으면 한다. 예를 들어 RESTful API를 통해 설명한 것 뿐이다.

참고 : 1ambda.github.io/javascripts/rest-api-put-vs-post/

Map과 VO

이전까지 사용자의 페이지에서 DB로 전달하거나, DB에서 불러온 데이터를 페이지에 뿌려주기 위해 VO(Value Object)를 사용하였다. 요즘 jsp로 만든 오래된 웹을 분석하고 있는데 VO대신 Map을 이용하여 처리하고 있었다. Map을 쓰는 것과 VO를 쓰는 것 어떤 점이 다른지 살펴보고자 한다.


VO

내가 이전부터 써왔던 VO부터 살펴보자. VO를 쓰면 데이터의 의미를 파악하기 쉽다. 학생정보를 저장하는 프로그램을 만든다고 한다면, 입력받은 학생정보는 VO객체로 만들어져 데이터를 전달할 것이다. StudentVO라는 VO는 변수명만 봐도 그 의미를 확실하게 전달할 수 있고, VO안의 들어갈 데이터의 이름(변수 명)들도 명시하고 있기에 어떤 데이터가 들어있는지도 파악하기 쉽다.
하지만 이렇게 VO를 정의하고 변수명을 정하고 약속하는데 시간이 적지 않게 소요될 수 있기에 작은 프로젝트를 빠르게 구현하기에는 부적합할 수 있다. 하지만 대규모 프로젝트나 끊임없이 업무 정의가 바뀌어가는 프프로젝트에서는 명확한 의미를 보여줌으로써 유지보수하기 쉽게 만들어 줄 것이다.

Map

Map으로 학생정보를 저장하는 프로그램을 만든다면, Map에 학생정보를 저장하고 전달할 것이다. Map에 들어가는 Key는 VO의 변수와 다르게 구현할 때마다 손쉽게 다르게 정의될 수 있다. 이는 작은 프로젝트를 빠르게 구현할 때, 새로운 요구사항을 빠르게 반영할 때 장점이 될 수 있다. 하지만 구현 시 마다 정의함으로 정해져있는 VO객체보다는 의미파악에 있어서 혼돈이 있을 수 있다.

경험

실제로 현재 Map으로 데이터를 전달하는 코드를 분석하면서 Map에 담겨있는 데이터를 제대로 파악하기 힘들어하고 있다. 이것이 크게는 전체 업무 프로세스를 파악하기 힘든 지경에까지 이르러 유지보수에 큰 어려움을 주고 있다. VO를 이용하여 구현하였다면 VO 클래스 안에 모여있는 변수를 파악하면 되었기에 의미 파악하기 쉬웠을 것으로 생각된다.

하지만 프로그래밍에서 가장 좋은 정답은 없고 상황에 맞는 것을 선택하는 것이 중요한 것 같다. 간단하고 유지보수가 앞으로 없을 프로그램에서는 Map을 이용해 빠르게 구현하고, 유지보수가 꾸준히 필요하고 복잡한 프로그램에서는 VO를 통해 데이터의 가시성을 확보하는 것이 필요하다.

자바스크립트를 주석처리하는 이유


홈페이지 코드를 분석하다가 다음과 같이 전체가 주석처리 되어 있는 경우를 만나기도 한다.

<script type="text/javascript"> <!-- function sum1(){     ...... } function sum2(){     ...... } --> </script>

왜 이렇게 주석처리를 해놓는지 궁금했는데, 이번에 알게 되었다.

요즘은 왠만한 웹브라우저들은 js 엔진을 가지고 있지만, 옛날에는 js엔진을 가지고 있지 않은 웹브라우저도 있었다고 한다.

js엔진을 가지고 있지 않은 웹브라우저에서는 자바스크립트 코드를 만나면 오류가 나게 된다. 이를 방지하기 위해 HTML 주석태그로 주석처리하여 js엔진이 없으면 주석으로 인식하여 오류가 나지 않게 하는 것이다.

지금은 왠만한 브라우저들은 js엔진을 갖추고 있기에 이런식으로 처리할 필요는 없다.

+ Recent posts