본문 바로가기

공부 정리

HTTP Method for Restful Services

반응형

개요

 


REST(Representational State Transfer) 란 웹 서비스를 개발하는 아키텍쳐 스타일입니다. REST 사용의 가장 큰 장점은 인터넷 HTTP를 사용하는 사람들에게 친숙한 구성을 사용해 REST 기반으로 상호작용하는 것입니다.

REST에서 가장 까다로운 작업 중 하나는 올바른 HTTP 메서드 선택입니다. 대부분 개발자은 GET, POST, PUT, DELETE 등의 메서드를 압니다. 그러나 이따금 잘못 사용합니다.

 

각 HTTP Method의 특징, 안전한 메서드(Safe methods), 멱등성 메서드(Idempotent Methods)을 알아보겠습니다.

 

 

안전한 메서드(Safe methods)란?


안전한 메서드(Safe methods)는 서버에 있는 자원들을 변경시키지 않는 HTTP 메서드입니다. 예를 들어, URL 자원에 GET 요청을 한다고 해도, 자원을 결코 변경시키지 않습니다. 안전한 메서드는 캐쉬가 가능하고 자원에 어떠한 영향 없이 미리 가져올 수 있습니다.

 

 

멱등성 메서드(Idempotent Methods)이란?


멱등성이 메서드(Idempotent Methods)란 여러번의 호출에도 안전한 메서드입니다. 예를 들어, 얼마나 많은 호출을 하든지 상관없이 결과에 영향이 없습니다. 호출할 때마다 서버에 있는 자원을 변경하여도, 결과는 항상 똑같습니다.

 

 

GET


GET /users/464

GET 메서드는 자원을 검색합니다(검색만 하고 변경을 하지 않습니다.)

 

GET 메서드는 안전한 메서드이며, 멱등성 메서드입니다.

 

 

POST


POST /users

POST 메서드는 entity를 생성합니다. 만약 요청이 성공적으로 끝나면, 요청에 응답 일부로 새롭게 생성된 자원의 id가 반환됩니다. 위의 요청으로 새로운 user를 생성합니다

 

POST 메서드는 안전한 메서드가 아니고, 멱등성 메서드가 아닙니다. 요청을 호출할 때마다 매번 새로운 자원을 생성하기 때문입니다

 

 

PUT


PUT /users/464

PUT 메서드는 POST와 비슷하지만, 존재하는 자원들을 수정합니다. 존재하는 자원의 id를 요청에 포함할 수 있습니다. 예를 들어, 위의 요청으로 서버에 있는 id 464인 user를 수정합니다.

 

PUT 메서드는 멱등성 메서드인데 자원을 전부 수정합니다. 만약에 자원이 없다면, 새로운 자원을 생성합니다

 

 

PATCH


PATCH 메서드는 자원의 일부분을 변경합니다. PUT과 달리 멱등성 메서드가 아닙니다. 여러번의 동일한 요청을 하면 다른 결과가 나올 수도 있습니다. 그러나, PATCH 요청을 마치 멱등성이 가능한 것처럼 만들 수 있습니다. 서버가 PATCH를 지원한다면, 응답에 Accept-Patch 헤더가 있습니다.

 

 

DELETE


DELETE /users/464

DELETE 메서드는 서버에 자원을 제거합니다. 자원이 삭제되기 위해서 id 가 필요합니다

예를 들어, 위의 요청은 id 464 user를 삭제합니다.

 

 

멱등성

 

  • 왜 PUT 메서드는 멱등성 메서드인데, PATCH 메서드는 멱등성이 아닐까요?

 왜냐하면, PUT은 자원의 "모든" 내용을 변경시키므로 여러 번 호출에도 결과 같습니다.(심지어 주어진 id에 해당하는 엔티티가 없다면 새로 생성합니다.) PATCH는 일부 내용을 "변경"시키는 목적인데, 경우에 따라서 동일한 요청으로 일부 내용을 계속 증가시키거나 감소시킬 수 있기 때문입니다.

 

예시는 아래 인프런 질문 게시판에 예시가 잘 나와있습니다.

https://www.inflearn.com/questions/110644

 

PUT VS PATCH


요청에 따른 결과 차이를 코드로 확인해보겠습니다.

 

아래는 PUT 메서드를 통해서 id 464 user가 요청하는 name, email으로 수정됩니다.

PUT /users/464
{
 name :"Akshay Kumar",
 email : "abc@abc.com" //only email has changed
}

 

 

아래는 PUT 메서드를 통해서 요청하는 email러 수정되고, name이 null로 수정됩니다.

PUT /users/464
{
 email : "abc@abc.com" //only email has changed
}

 

왜냐하면, PUT 요청은 모든 데이터를 보내서 "모든" 내용을 수정해야 하기 때문입니다. 따라서, 아무 내용도 없는 name은 null이 됩니다. 따라서 PATCH를 사용해야, email만 변경되고 name은 기존 값 그대로 유지됩니다.

 

개발자들이 PATCH보다는 PUT을 많이 사용합니다. PATCH는 REST 세계에 비교적 최근에 등장했으며, 사용에 제약이 많기 때문에 일부 API에서는 PATCH 사용이 제한됩니다. 각 메서드의 탄생을 알고 싶다면 다음 링크를 참고하세요. PUT (RFC 2616)  PATCH (RFC 5789)

 

 

참고

https://medium.com/@kumaraksi/using-http-methods-for-restful-services-e6671cf70d4d

반응형

'공부 정리' 카테고리의 다른 글

ConcurrentHashMap vs Hashtable vs Synchronized Map  (0) 2022.10.15
equals() 와 hashCode()는 왜 재정의 해야 할까?  (0) 2022.10.14
대칭키 vs 비대칭키  (0) 2022.09.05
TLS/SSL  (0) 2022.09.05
CORS란 무엇인가?  (0) 2022.08.05