WEB

[WEB] HTTP 메서드 특성

steadyMan 2022. 4. 11. 01:45

REST API는 리소스와 리소스의 대한 행위를 분리한 URI를 설계하는데

이 때 리소스의 대한 행위는 HTTP 메서드를 통해 분리됩니다. 그렇다면 각 메서드를 통해 기대되는 행위(HTTP 스펙)는 어떨까요   

HTTP Method 마다 기대되는 처리에 대해 학습한 내용을 정리합니다. 

HTTP 주요 메서드

  • GET : 단순 리소스 조회 
  • POST : 요청 데이터를 처리(비즈니스 로직)하며 주로 데이터의 등록에 사용
  • PUT : 리소스를 대체한다 해당 리소스가 없으면 생성하고 있다면 수정한다.(오라클의 MERGE처럼 동작) -데이터 부분수정X
  • PATCH : 리소스의 부분 변경(UPDATE) - 필드 전체가 아닌 필드 부분 수정
  • DELETE : 리소스 삭제 

GET

리소스를 서버로 부터 조회할때 사용하며 서버에 전달하고자 하는 데이터를 쿼리파라미터를 통해 전달한다. 

ex) /new?q=보안&type=post

POST

요청 데이터 처리하는 목적으로 사용한다. 메세지 바디를 통하여 서버에 데이터를 전달하고 

서버는 요청 데이터를 처리(비즈니스 로직)한다.   

  - 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행 

주로 신규 리소스 등록, 여러 로직이 수행되는 프로세스 처리에 사용하며  결과 리턴시

생성된 자원의 위치(Location)를 함께 전송한다. 

  - POST의 결과로 새로운 리소스(결과)가 생성되지 않을 수도 있다.

다른 메서드로 처리가 애매한 경우 POST메서드를 사용하여 처리한다. 

 

요청 데이터 처리는 처리가 필요한 어떠한 형태든 포함된다. 

ex) 배달 주문 접수, 게시판 글쓰기, 기존 데이터 변경(UPDATE)... 

PUT

리소스를 대체!

리소스가 있으면 대체하고 없으면 생성한다. 

리소스를 대체하려면 클라이언트가 리소스 위치(PK)를 알고 URI 지정해야 하므로

POST메서드와 이 부분에서 차이점이 있다. 

ex)  PUT orders/100 HTTP/1.1

      Content-Type : application/json  

      {"address": "서울시", "status" : "Y"}

위처럼 요청이 왔을 때 100번 리소스가 없다면 생성될 것이고 있다면 전송된 데이터로 변경처리가 된다.

 

주의점!

리소스가 완전히 대체되기 때문에 만약 100번 리소스가 존재하고 데이터가

{"address": "서울시"}의 형태로 왔다면 status필드의 데이터는 삭제된다.

데이터의 부분변경이 필요하다면? 

PATCH 메소드를 사용하자!

DELETE

요청받은 리소스를 제거한다. 

ex) DELETE /order/100 HTTP/1.1

서버는 요청을 받고 100번 리소스를 삭제한다. 

HTTP 메서드의 속성 

안전 

호출해도 리소스를 변경하지 않는다 오로지 해당 리소스만 고려하며 부가적인 사항들은 고려대상이 아니다.

ex) GET, HEAD

 

멱등

호출의 횟수와 무관하게 결과가 똑같아야 한다. 

GET : 한 번 이든 두 번 조회하는 같은 결과가 조회된다. 

PUT : 결과를 대체하기 때문에 여러 번 요청해도 결과는 같다. 

DELETE : 같은 삭제요청을 여러번 해도 삭제된 결과는 같다. 

POST : 멱등하지 않다. 등록 요청을 여러번 보내면 중복이 발생할 수 있다. 

 

정리

HTTP API를 설계하고 구현할 때에 HTTP 스펙을 준수하여 그에 맞게 로직을 작성하는게 좋은 API라 할 수 있겠다!