POST vs PUT

Newbie's Log 2015.02.08 19:31

얼마전에 어떤분께서 REST의 POST와 PUT의 차이점을 물어보았다. POST는 들어도 보고 사용도 해보았지만, PUT은 처음 들은 용어였다. 솔직히 POST와 PUT이 무엇인지 몰라서 잘 모르겠다고 대답하였다. 

그게 뭐냐고 되물었더니 다음과 같이 말했다.

POST와 PUT은 CRUD로직중 Create와 Update의 속성을 가진 http메소드 입니다.


위의 설명만으로는 조금 이해하기 어려웠다.  더 구체적인 설명을 찾기 위해 구글검색을 통해 알아보았다. 일단 POST와 PUT은 REST에서 사용되는 Method이다. REST에 대한 설명은 아주 자세히 많은 포스팅에 나와있었다. 

이번 포스팅에서는 POST와 PUT에 관련된 내용을 이야기 해 보겠다.


REST란 무엇일까? 

REST란, REpresentational State Transfer 의 약자로, 통신 규약이나 표준 또는 스펙이 아니라 분산 하이퍼미디어 시스템을 위한 www 같은 소프트웨어 아키텍처의 한 형식이며 네트워크 상에서 클라이언트와 서버 사이의 통신 방식이다. REST 라는 용어는 2000년 로이필딩(Roy Fielding) 박사의 논문에서 처음 소개되었다.

REST는 표준이 아니고, HTTP통신 모델만 지원한다. 하지만 플랫폼과 프로그래밍 언어에 독립적이고, 개발하기 단순하기 때문에 많이 사용되고 있다.

REST는 기본 HTTP 프로토콜의 메소드인 GET/PUT/POST/DELETE를 이용하여 서비스 제공자에게 서비스를 요청하는 방식이다. 서비스 제공자는 요청받은 서비스의 리소스를 다양한 형태(JSON, XML, RSS)로 반환해준다.

Method 

CRUD 

 Idempotent

POST

Update

No

GET

Read

Yes

PUT

Create

Yes

DELETE

Delete

Yes

<표 1. Method, CRUD, Idempotent>


위의 테이블에서도 볼 수 있듯이, POST는 생성, PUT은 업데이트를 할 수 있다.

하지만 언제 POST와 PUT을 사용하여야 할까?

두가지가 혼동된다면 크게 두가지를 생각하면 된다.

1) 멱등성 

2) 리소스 결정권

멱등성 (Idempotent)

Idempotent는 여러 번 수행을 해도 결과가 같은 경우를 의미한다. 예를 들면, a++는 Idempotent 하지 않다. (호출시마다 값이 증가 되기 때문에) 하지만, a=4와 같은 명령은 반복적으로 수행해도 Idempotent하다. (값이 같기 때문에)

POST 연산의 경우에는 리소스를 추가하는 연산이기 때문에, Idempotent하지 않지만 PUT은 반복 수행해도 Idempotent 하다. 

리소스 결정권

URI가 "서버"에 의해 결정되는가?   “클라이언트"에 의해 결정되는가?”의 두가지 물음에따라 POST 또는 PUT으로 결정된다.

 POST의 경우에는 클라이언트가 실제 저장해야할 리소스 위치를 모르므로 서버에서 처리 하도록 하게 한다. 

POST /articles HTTP/1.1 

<article>
    <title>blue stapler</title> 
    <price currency="eur">7.50</price> 
</article>
HTTP/1.1 201 Created Location: /articles/63636 

PUT을 사용하면 클라이언트가 이미 변경 대상 리소스의 위치를 알고 있어서, 특정 업데이트 대상 리소스를 갱신할 수 있다.

PUT /article/1234 HTTP/1.1 

<article>
    <title>red stapler</title>
    <price currency="eur">12.50</price>
</article>


결론

멱등성을 갖지 않고 리소스를 서버가 결정해주면 POST, 멱등성을 가지고 있으면서 리소스를 클라이언트가 결정하면 PUT이다. 헷갈릴 수 있는 주제이지만, 멱등성과 리소스 결정권만 잘 생각해 보면 POST와 PUT의 구분은 쉽게 할 수 있을 것 같다.


참고 자료:

http://ko.wikipedia.org/wiki/REST

http://www.slideshare.net/yjaeseok/soap-rest

http://gis.seoul.go.kr/GisWebDataStore/Gis_Edu/html/S1112/SGIS-HTML.jsp?sgis=1112&pgis=0203

http://www.devblog.kr/r/8y0gFPAvJ2Y8X93raWlrmu9ZEIWcsKEvfFjKV

http://blog.geekple.com/2012/11/26/http-put-post/

http://restcookbook.com/HTTP%20Methods/put-vs-post/

'Newbie's Log' 카테고리의 다른 글

크롬 브라우저로 MS Office 사용하기.  (0) 2015.02.25
Garbage Collection -part 1  (0) 2015.02.25
POST vs PUT  (0) 2015.02.08
Unity 3D 인터페이스3  (0) 2014.12.09
Unity 3D 인터페이스2  (0) 2014.12.08
Java와 JVM -4  (0) 2014.12.06
Posted by jjangAh