[HTTP 메서드] 2. HTTP POST 는 언제 사용되어야 하는가? 리소스 등록, 요청 데이터 처리를 하는 HTTP POST
POST 메서드
POST메서드는 리소스를 등록하거나, 요청 데이터를 처리하기 위해 사용된다.
시작라인과 헤더만을 가진 GET과는 달리(GET에는 바디도 있을 수 있지만 잘 사용되지 않는다) POST는 시작라인과 헤더 그리고 바디(Body)까지 모두 가지고 있기 때문에 바디를 통해 다양한 형태의 데이터를 넘기는 것이 가능하다. 이를 통해 바디의 데이터로 새로운 리소스를 등록하거나 처리되어야 하는 작업의 설정이 가능하다.
리소스 등록
예를 들어 우리가 kotlinworld.com에 html 형식의새로운 글을 등록한다고 해보자.
우리는 다음과 같은 HTTP 요청을 kotlinworld.com에 날린다.
POST /post HTTP/1.1
Host: kotlinworld.com
Content-Type: text/html
Content-Length: XX
<html>
<head>
<title>..</title>
</head>
<body>
..
</body>
</html>
먼저 메서드를 POST로 설정하였다. kotlinworld.com/post 경로에 리소스를 생성하며, 등록하는 리소스의 Content-Type은 text/html, 길이는 XX이다.
이걸 받은 서버는 신규 리소스 식별자를 생성한다. 예를 들어 순서대로 리소스가 등록되며 현재 99번까지 등록이 되었다고 해보자. 그러면 100번째 리소스인 위의 리소스는 kotlinworld.com/post/100의 식별자를 갖게 된다.
요청 데이터 처리
POST는 요청 데이터를 처리하기 위해 사용한다기 보다는, 애매할 경우 모두 POST로 처리한다.
예를들어 서버A로부터 조회한 JSON 데이터를 서버B에 쿼리로 날려야 할 때 데이터의 형식이 JSON이라고 해보자. 그러면 GET 메서드의 쿼리문에는 한 줄로만 들어가므로 해당 형식을 넣기가 어렵다. JSON을 한 줄로 바꾼 후 다시 JSON형태로 바꾸기 보다는 JSON 자체를 보내는 것이 낫다.
이러한 경우에는 POST를 사용한다. 바디에 쿼리해야 하는 JSON을 붙여서 보내면 서버에서 해당 JSON을 처리하여 얻은 리소스 조회 결과를 클라이언트에 반환한다.
물론 리소스 조회는 대부분 GET을 통해 처리하지만, GET을 통해 처리하기 애매한 경우에는 POST로 <그림2>와 같이 처리하기도 한다.
정리
POST의 기본 동작은 리소스 등록이지만, 애매한 동작들도 모두 POST로 처리한다.