이번 글에서는 HTTP 주요 메서드의 종류와 그 속성에 대해 알아보고자 한다.
HTTP 메서드 종류
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
GET
GET은 단순히 리소스를 조회하는 데 사용하는 메서드이다.
POST
1. 새 리소스 생성(등록)
- 서버가 아직 식별하지 않은 새 리소스를 생성할 때 사용
2. 요청 데이터 처리
- 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
- 예) 주문에서 결제완료 → 배달시작 →배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- 그러므로 POST의 결과로 새로운 리소스가 생성되지 않을 수도 있다.
- 예) POST /orders/{orderId}/start-delivery (컨트롤 URI)
- 컨트롤 URI란?
- 보통 URI에는 리소스만 포함되도록 하는 게 이상적인 원칙이나 HTML FORM과 같은 제약이나, HTTP 메서드로 해결하기 애매한 경우에 동사로 된 리소스 경로를 사용하기도 한다. 예를 들어 위에 예시를 보면 배달시작을 의미하는 start-delivery가 이에 해당된다. 이를 컨트롤 URI 라고 일컫는다.
- 최대한 리소스만 포함되도록 하는 이상적인 원칙을 따르되, 어쩔 수 없을 때만 사용하자
3. 다른 메서드로 처리하기 애매한 경우
- 예) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
- → 애매하면 POST를 사용하자!
PUT
- 리소스가 없으면 생성
- 리소스가 있으면 !완전히! 대체
- 쉽게 이야기해서 덮어버린다.
- 클라이언트가 리소스의 위치를 알고 URI를 지정해야 하는게 POST와의 차이점이다.
- body에 username 필드가 없다.
- 완전히 대체한다.
PATCH
- 리소스의 부분을 변경한다.
- 위의 그림을 보면 PUT은 완전히 대체해 버렸지만 PATCH는 서버의 "age" : 20 을 "age" : 50 으로 변경한다.
- 당연히 "username" : "young" 은 그대로이다.
Delete
리소스를 제거한다.
HTTP 메서드의 속성
- 안전(Safe Methods)
- 멱등(Idempotent Methods)
- 캐시가능(Cacheable Methods)
안전 (Safe)
호출해도 리소스를 변경하지 않는다.
- 물론 트래픽이 몰려 수많은 GET 요청에 의해 서버가 터지게 되면 '안전성'이라는 특성에 부합되지 않는다고 생각할 수 있다.
- 여기서 말하는 안정성은, 리소스를 수정 / 삭제 하지 않으므로 데이터의 일관성 유지에 있어 안전하다는 의미이다.
- 즉, 안전은 해당 리소스만 고려하지, 전체적인 시스템 장애와 같은 그런 부분까지는 고려하지 않는다.
- 위에 언급한 HTTP 메서드 중 GET 만 해당된다.
멱등 (Idempotent)
위키백과에 보면 멱등이란 "연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다." 라고 나타나있다.
우리는 여기서 "연산"을 "요청"이란 개념으로 접근하면 된다.
즉, 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다.
멱등 메서드
- GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
- PUT : 결과를 대체한다. 따라서 같은 요청을 여러 번 해도 최종 결과는 같다.
- DELETE : 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
- POST : 멱등이 아니다! 예를 들어 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다.
쉽게 말해 멱등의 판단 기준은 자동 복구 메커니즘을 떠올리면 된다.
- 서버가 TIMEOUT 등으로 정상 응답을 주지 못하였을 때, 클라이언트가 같은 요청을 다시 해도 되는가?\
만약 재요청 중간에 다른 곳에서 리소스를 변경해 버리면?
- 사용자 1 : GET → username : A, age : 20
- 사용자 2 : PUT → username : A, age : 30
- 사용자 1 : GET → username : A, age : 30 → 사용자 2의 영향으로 바뀐 데이터 조회
→ 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지 않는다.
❗여기서 잠깐, 왜 PUT은 멱등이면서 PATCH는 멱등이 아닐까?
PATCH 메소드에 수정할 리소스의 일부분만 담아서 보내는 경우에는 멱등성이 보장된다.
한번 요청을 보낸후 같은 요청을 여러번 하더라도 변경된 같은 결과가 나오기 때문이다.
그러나 PATCH의 또다른 특징으로는 HTTP 스펙상 구현 방법에 제한이 없다는 것이다.
그렇기 때문에 위처럼 꼭 데이터를 또다른 데이터로 '대체' 하도록 구성할 필요는 없다.
예를들어 PATCH의 동작을 '증가'를 통한 변경이라고 하면 상황이 달라진다.
{"operation" : "add", "age" : 10}
위의 예시의 경우 동일한 요청을 여러번 보내면, 매 요청마다 age가 10씩 증가하도록 PATCH api를 설계 하였다. 이럴경우 동일한 요청을 여러번 하면 할수록 age의 값이 계속 달라질테니, 멱등성을 가지지 않는 것이다.
즉 PATCH는 멱등으로 설계할 수도 있지만, 멱등이 아니게도 설계할 수 있다.
캐시가능 (Cacheable)
응답 결과 리소스를 캐시해서 사용해도 되는가?
캐시(Cache)란?
- 클라이언트가 서버에 한 번 요청했던 데이터에 대해 매 요청마다 다시 전송할 필요가 없도록 브라우저가 임시적으로 데이터를 보관하고 있는 장소이다. 즉, 캐싱이 가능한 HTTP 메서드는 빠르게 결과값을 받을 수 있다는 소리이다.
GET, POST, PATCH는 캐시가 가능하다. 그렇지만 실제로는 GET만 캐시로 사용한다.
POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않다.
이상으로 HTTP 메서드와 속성에 관한 글을 마치겠다.
느낀 점☞
API 통신하는 코드를 작성할 때 HTTP 메서드 작성은 정말 단순히 했었다. 조회하는 건 GET, 무언가를 새로 생성하거나 작성하는 건 POST. 별다른 고민 없이 해왔었다. 심지어 PUT, PATCH는 잘 모를뿐더러 잘 사용하지도 않았다. 그러나 이번에 HTTP 메서드와 그 속성에 관해 공부를 하면서 HTTP 메서드를 고르는 것은 올바른 기준 하에 많은 생각을 하며 골라야 하는 거고 그래야 내가 성장할 수 있다는 것을 알게 되었다. 문맥상(?) 이럴 땐 POST 지. 이런 식으로 메서드를 작성해 왔던 내가 너무나 잘못하고 있구나라는 걸 다시 한번 깨닫게 되었고 나에게는 정말로 유익한 공부였고 재밌었다.
출처 / 참고 : 모든 개발자를 위한 HTTP 웹 기본 지식(인프런) - 김영한 강사님,
'HTTP' 카테고리의 다른 글
HTTP 특징 - 무상태 프로트콜(Stateless) (0) | 2023.08.13 |
---|---|
인터넷 네트워크 - 인터넷 통신, IP, TCP, UDP, PORT, DNS (0) | 2023.08.12 |