Network

HTTP - HTTP 메서드

Cold Bean 2023. 7. 20. 18:18
728x90

API는 리소스를 기반으로 설계하자

  • 가장 중요한 것은 리소스를 식별할 수 있어야 하는 것
  • URI는 리소스만 식별해야 한다.
  • 리소스와 해당 리소스를 대상으로 하는 행위는 분리하자
    • 리소스: 회원
    • 행위: 조회, 등록, 삭제, 변경
  • 리소스는 명사, 행위는 동사
  • 행위는 HTTP 메서드로 구분한다.

 

HTTP 메서드 종류

주요 메서드

  • GET : 리소스 조회
  • POST : 요청 데이터 처리, 주로 등록에 사용
  • PUT : 리소스를 대체, 해당 리소스가 없으면 생성
  • PATCH : 리소스 부분 변경
  • DELETE : 리소스 삭제

 

기타 메서드

  • HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용)
  • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE : 대상 리소스에 대한 경로를 다라 메시지 루프백 테스트를 수행

 

GET

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.green-bin.tistory.com
  • 리소스 조회
  • 서버에 전달하고 싶은 데이터는 Query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달
  • 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장 X

 

POST

POST /members HTTP/1.1
Content-Type: application/json

{
	"username": "김찬빈",
    "age": 29
}
  • 요청 데이터 처리
  • 메시지 바디를 통해 서버로 요청 데이터를 전달
  • 서버는 요청 데이터를 처리
    • 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 이용
POST 메서드는 데이터를 생성할 때만 사용할까? 대답은 NO!
POST 메서드로 요청된 데이터는 어떻게 처리할지 리소스마다 따로 정리해야 한다. 즉, 정해진 것이 없다.
  • POST 사용하는 경우
    • 새 리소스 생성(등록)
      • 서버가 아직 식별하지 않은 새 리소스 생성
    • 요청 데이터 처리
      • 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
        • ex. 주문에서 결제완료 -> 배달 시작 -> 배달 완료처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되어야 하는 경우
      • POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음
        • ex. POST /orders/{orderId}/start-delivery (컨트롤 URI)
    • 다른 메서드로 처리하기 애매한 경우
      • ex. JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
      • 애매하면 POST를 사용하자
어찌보면 POST 메서드는 만능이다. 그렇다고 역할에 맞는 메서드로 처리할 수 있음에도 모든 요청을 POST 메서드로 요청을 보내는 것은 바람직하지 않다.
예를 들어 GET 메서드로 조회를 하는 경우 서버 응답을 캐싱할 수 있도록 허용하지만 POST 메서드는 캐싱이 불가능하다. 이렇게 되면 동일한 요청이 반복적으로 수행될 때 캐싱을 사용하지 못하기 때문에 서버의 부하가 발생할 수 있다.
이렇듯 왠만하면 각 메서드의 역할에 맞게 사용하는 것이 가장 좋다.

 

PUT

PUT /members/100 HTTP/1.1
Content-Type: application/json

{
	"username": "김찬빈",
    "age": 29
}
  • 리소스를 완전히 대체
    • 리소스가 있으면 대체
    • 리소스가 없으면 생성
    • 쉽게 말해 덮어씌기의 역할을 한다.
  • 클라이언트가 리소스를 알고 있다.
    • 클라이언트가 리소스 위치를 알고 URI를 지정
    • POST와 차이점

 

PATCH

PATCH /members/100 HTTP/1.1
Content-Type: application/json

{
	"age": 29
}
  • 리소스 부분 변경

 

DELETE

DELETE /members/100 HTTP/1.1
Host: www.green-bin.tistory.com
  • 리소스 제거

 

HTTP 메서드의 속성

HTTP 메소드 Request Body 있음 Response Body 있음 안전 멱등 캐시 가능
GET 아니요
HEAD 아니요 아니요
POST 아니요 아니요
PUT 아니요 아니요
DELETE 아니요 아니요 아니요
CONNECT 아니요 아니요 아니요
OPTIONS 선택 사항 아니요
TRACE 아니요 아니요
PATCH 아니요 아니요

출처: https://ko.wikipedia.org/wiki/HTTP

 

안전

  • 호출해도 리소스를 변경하지 않는다.

 

멱등

  • 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다.
  • 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지 않는다.
  • 멱등 메서드
    • GET : 여러번 조회하더라도 같은 결과가 조회된다.
    • PUT : 결과를 대체하기 때문에 같은 결과가 조회된다.
    • DELETE : 결과를 삭제하기 때문에 여러번 삭제해도 결과는 동일하다.
    • POST : 두 번 호출하면 문제가 생길 수 있다. (결제를 두 번 호출하면 돈이 두 번 나간다..)

 

캐시 가능

  • 응답 결과 리소스를 캐시해서 사용해도 되는가?
  • 캐시 가능 메서드
    • GET, HEAD, POST, PATCH
  • 실제로는 GET, HEAD 정도만 캐시로 사용
    • POST, PATCH는 본문 내용까지 캐시 키로 고려해야하기 때문에 구현이 쉽지 않음

 

참조

인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., [사진] 📣 확인해주세요!본 강의는 자바 스프링 완전 정복 시리즈의 세 번째 강의입니다. 우아한형제들 최연소 기술

www.inflearn.com

 

728x90