HTTP 메서드 종류 및 속성

HTTP 메서드 종류

HTTP 메서드란 클라이언트와 서버 사이에 이뤄지는 요청과 응답 데이터를 전송하는 방식입니다.

HTTP 메서드는 총 9가지가 있으며 주로 GET, POST, PUT, PATCH, DELETE를 사용합니다.

메서드 이름 설 명
GET 리스소 조회
POST 등록, 요청 데이터 처리 
PUT 리소스 덮어쓰기 (해당 리소스가 없으면 생성)
PATCH 리소스 부분 분경 (PUT은 전체 변경이지만, PATCH는 일부만 변경)
DELETE 리소스 삭제
HEAD GET과 동일하나 메시지 부분(Body)를 제외하고, 상태 줄과 헤더만 반환
OPTIONS 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용)
CONNECT 대상 자원으로 식별되는 서버에 대한 터널을 설정
TRACE 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

GET 메서드

리소스를 조회하는 메서드로 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달합니다.

메시지 바디를 사용해 데이터를 전달할 수도 있지만, 지원하지 않는 곳이 많아 권장하지 않습니다.

 

POST 메서드

요청 데이터를 처리하는 메서드로, 메시지 바디를 통해 서버로 요청 데이터를 전달하고 서버는 메시지 바디를 통해 들어온 데이터를 처리하여 응답합니다.

주로 신규 리소스를 등록하고, 프로세스 처리에 사용합니다.

만약 GET 메서드를 사용하는데, JSON으로 조회 데이터를 넘겨야하는 경우에는 POST를 사용합니다.

 

프로세스 처리

단순히 데이터를 생성하거나, 값을 변경하는 것을 넘어 프로세스의 상태가 변경되는 경우에 사용합니다. ( 시스템에 큰 변화가 생길 때)

이 때 POST의 결과로 새로운 리소스가 생성되지 않을 수도 있습니다.

 

 

PUT 메서드

리소스가 있다면 요청을 보낸 데이터로 완전히 덮어씌우고, 리소스가 없다면 새로 생성합니다.

POST와의 차이점으로는 클라이언트가 리소스의 위치를 알고 URI를 지정한다는 점입니다.

위 그림에서 POST 요청시에는 /users 까지만 지정을 했지만, PUT은 /users/10 으로 리소스의 위치까지 지정해 요청합니다.

PUT 사용 시 주의할 점

PUT은 기존 리소스를 완전히 대체하기 때문에 아래처럼 "country" 필드만을 변경하려고 요청을 보내면

기존 데이터를 날리고 요청한 데이터를 새로 덮어쓰기 때문에 "name"필드가 제거된 채로 요청받은 "country"필드만 존재하게 됩니다.

 

PATCH 메서드

PUT과 다르게 PATCH는 리소스의 부분을 변경합니다.

PATCH를 지원하지 않는 서버가 있을 수도 있는데 이 때는 POST를 사용합니다.

 

DELETE 메서드

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


HTTP 메서드의 속성

HTTP 메서드는 다음과 같이 3가지 속성이 있으며 속성별로 메서드를 구분할 수 있습니다.

  • Safe(안전)
  • Idempotent(멱등)
  • Cacheable(캐시가능)

 

Safe(안전)

Safe한 메서드는 "호출해도 리소스를 변경하지 않는다"는 특징을 갖습니다.

GET, HEAD, OPTIONS, TRACE 메서드는 호출하더라도 리소스를 변경하지 않기 때문에 안전한 리소스가 됩니다.

 

Idempotent(멱등)

멱등의 사전적 정의는 다음과 같습니다.

즉, 한 번 호출하든 여러번을 호출하든 결과는 똑같은 메서드가 멱등성을 갖습니다.

  • GET : 한 번 조회하든, 여러번 조회하든 같은 결과가 조회.
  • PUT : 결과를 대체하므로 같은 요청을 여러번 해도 최종 결과는 똑같다.
  • DELETE : 결과를 삭제. 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
  • POST : 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다. (멱등 X) 

단, 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않습니다.

 

Cacheable(캐시가능)

응답 결과를 서버에 캐싱해서 사용해도 되는 메소드를 의미합니다.

 

GET, HEAD, POST, PATCH가 캐시 가능하지만

POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하기 때문에 구현이 쉽지않습니다.

그래서 실제로는 GET, HEAD 정도만 캐시하여 사용합니다.