도도한 개발자
[HTTP] HTTP Request Methods (GET, POST, PATCH, DELETE) 본문
[HTTP] HTTP Request Methods (GET, POST, PATCH, DELETE)
Kiara Kim 2023. 5. 8. 15:20HTTP 메소드 종류와 특징
HTTP 메소드의 종류는 총 9가지가 있다. 이 중 5가지 메서드(GET, POST, PUT, PATCH, DELETE)를 주로 사용하지만, 이번 장바구니 미션에서 사용한 메서드는 4가지였다. 각각의 이름과 특징에 대해 알아보자.
GET Method
리소스 조회 - 데이터를 요청하는데 사용된다.

서버에 전달하고 싶은 데이터는 쿼리 파라미터 등을 통해서 전달한다.
쿼리 문자열은 "q=hello"와 "hl=ko"처럼 이름/값 쌍으로 GET 요청의 URL로 전송된다.
일반적으로 리소스의 위치를 URL에서 쿼리로 표현하기 때문에 RequestBody가 없다.
POST Method
요청 데이터 처리 - 요청된 자원을 생성하기 위해 사용되는 메소드이다.

POST로 서버에 보내진 데이터는 HTTP request의 RequestBody에 저장된다.
요청 데이터를 어떻게 처리한다는 뜻일까?
HTTP 스펙에는 POST 메소드에 대해 '대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청합니다' 라고 적혀있다.
다음과 같은 예시가 있고,
- HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스 제공
- 게시판 글쓰기, 댓글 달기
- 서버가 아직 식별하지 않은 새 리소스 생성(신규 주문, 회원 생성)
- 기존 자원에 데이터 추가
특정 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 한다.
- 새 리소스 생성(등록)
- 요청 데이터 처리(결제완료 -> 배달시작 -> 배달완료처럼 단순히 값 변경이 아닌 프로세스의 상태가 변경)
- post의 결과로 새로운 리소스가 생성되지 않을 수도 있음
- /orders/{orderId}/start-delivery (배달 시작. 컨트롤 URI)
- 다른 메소드로 처리하기 애매한 경우
- JSON으로 조회 데이터를 넘겨야 하는데, GET 메소드를 사용하기 어려운 경우
- 사실 POST로는 모든 걸 할 수 있기 때문에, 애매하면 POST를 사용한다.
- 조회할 때는 GET으로 하면 캐싱이 수월하다.
즉, CRUD에서 C를 POST로 처리하고, RUD를 제외한 모든 것을 POST로 처리하면 된다.
PATCH Method
리소스 부분 변경

요청된 자원을 수정하기 위해 사용되는 메소드라는 점에서 PUT과 같지만,
해당 자원 전체를 수정하는 PUT과는 다르게 PATCH는 해당 자원의 일부 부분을 수정한다.
예) 기존 데이터가
{
"name": kiara,
"age": 40
}
일 때
{
"age": 50
}
을 PATCH로 보내면
{
"name": kiara,
"age": 50
}
와 같이 age만 변경된다.
만약 서버가 PATCH를 지원하지 않는다면 POST를 쓰면 된다.
DELETE Method
리소스 제거

특정 회원의 생성 Location("/members/100")을 DELETE로 보낸다면 서버에선 해당 회원정보를 삭제한다.
클라이언트에서 서버의 자원을 삭제할 수 있도록 허가하는 것은 매우 위험하다.
그러므로 현실적으로는 사용될 일이 거의 없고, 대부분의 서버는 이 메소드를 비활성화 시킨다.
HTTP 메서드의 속성
HTTP 메서드의 속성으로는 크게 세 가지가 있다.
- 안전 safe methods
- 멱등 idempotent methods
- 캐시가능 cacheable methods
안전
리소스를 변경하지 않는다.
- GET 안전
- POST, PUT, PATCH, DELETE 안전하지 않음
반복적인 호출로 인해 로그가 쌓여 장애가 발생해도 안전한걸까?
'안전'은 리소스만 고려하므로 장애는 고려하지 않는다.
멱등
같은 요청을 몇번하든 결과는 항상 똑같다.
- GET: 계속 조회해도 리소스는 변하지 않음. ( 멱등 )
- PUT: 결과를 대체한다. 따라서 같은 요청을 여러 번해도 최종결과는 같다. ( 멱등 )
- DELETE: 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 같다. ( 멱등 )
단, POST는 멱등이 아니다. 두 번 호출하면 같은 리소스가 중복해서 생성되기 때문이다.
멱등이라는 개념은 왜 있는 걸까?
-> 자동복구 메커니즘.
'서버가 타임아웃 등으로 정상 응답을 주지 못할 때 클라이언트가 같은 요청을 다시해도 되는가?' 의 판단 근거가 된다.
즉 GET, PUT, DELETE 등은 다시 요청해도 되지만 POST는 안된다.
재요청 중간에 다른 곳에서 리소스를 변경할 경우엔?
외부요인으로 중간에 리소스가 변경되는 것까지는 멱등 여부를 판단하는 데 고려하지 않는다.
캐시가능
'응답 결과 리소스를 캐시해서 사용해도 되는가?' 에 관한 속성
GET, HEAD, POST, PATCH 는 캐시가 가능하나, 실제로는 GET, HEAD정도만 캐시로 사용한다.
POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않다고 한다.