본문 바로가기

Programming/HTTP

[김영한/HTTP 웹 기본 지식] HTTP 메서드

HTTP API

 

API URI 설계 시 리소스 식별이 중요 + 계층구조 활용

 

리소스 - 해당 리소스를 대상으로 하는 행위를 분리

ex) 리소스 : 회원 / 행위 : 조회, 등록, 삭제, 변경

 

ex) API URI

회원 목록 조회 /members
회원 조회 /members/{id}
회원 등록 /members/{id}
회원 수정 /members/{id}
회원 삭제 /members/{id}

 

※ 계층 구조 상 상위 => 컬렉션 => 복수 단어

 

 

 

HTTP 메서드

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

 

+)

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

 

 

 

  • GET : 리소스 조회

서버에 전달할 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해 전달
메시지 바디 사용 가능은 하나, 지원하지 않는 곳이 많아 권장 X

 

 

클라이언트 => 쿼리에 100 담아 100번 회원 정보 조회 요청하는 메시지 전달

서버 => 해당 요청 확인 후 DB에서 100번 회원 정보 찾아와 응답 메시지에 담고 전달

 

 

 

  • POST : 요청 데이터 처리

메시지 바디를 통해 서버로 요청 데이터 전달
서버 => 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능 수행
주로 신규 리소스 등록, 프로세스 처리

 

 

 

새로운 리소스 등록 시

클라이언트 => 메시지 바디에 등록할 데이터 담아 서버로 전송

서버 => 해당 데이터 DB에 저장, 신규 리소스 식별자 생성 

        =>클라이언트에 HTTP 상태코드, 리소스 식별자 등 담긴 응답 메시지 회신

 

 

  • 정리

요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없음

 

1. 새 리소스 생성(등록) 
서버가 아직 식별하지 않은 새 리소스 생성 

ex) 신규 주문 생성


2. 요청 데이터 처리
단순 데이터 생성/변경을 넘어서 프로세스를 처리해야 하는 경우
ex) 주문 -> 결제완료 -> 배달시작 -> 배달완료 : POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음

ex) POST /orders/{orderId}/start-delivery (컨트롤 URI)


3. 다른 메서드로 처리하기 애매한 경우
ex) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우

 

4. 기타

데이터 블록을 데이터 처리 프로세스에 제공  ex) HTML FORM에 입력한 정보로 회원 가입, 주문 등
게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시  ex) 게시글, 댓글 등록
기존 자원에 데이터 추가  ex) 한 문서 끝에 내용 추가하기

 

 

 

  • PUT : 리소스 대체

리소스 있으면 대체(덮어씌움) / 없으면 생성
★클라이언트가 리소스 식별 => 클라이언트가 리소스 위치를 인지하고 URI 지정

cf. POST : /members => 몇번째 회원인지 알 수 없음

 

 

필드 하나 비우고 PUT 요청 시 => 해당 필드 삭제된 채로 대체됨

 

 

 

  • PATCH : 리소스 부분 수정

 

 

필드 하나 비운 채 요청 전송하면 입력한 필드만 부분 수정함

 

PATCH 지원 안 되는 경우가 아주 가끔 있음 => 이때 POST 사용하기

 

 

 

  • DELETE : 리소스 제거

 

 

 

 

 

HTTP 메서드의 속성

 

 

  • 안전(Safe Methods)

호출해도 리소스를 변경하지 않음

ex) GET


Q: 그래도 계속 호출해서, 로그 같은게 쌓여서 장애가 발생하면요?
A: 안전은 해당 리소스만 고려한다. 그런 부분까지 고려하지 않는다

 

 

 

  • 멱등(Idempotent Methods)

f(f(x)) = f(x)


한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같음

 

 

  • 멱등 메서드

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

 

 

Q: 재요청 중간에 다른 곳에서 리소스를 변경하면?
사용자1: GET -> username:A, age:20
사용자2: PUT -> username:A, age:30
사용자1: GET -> username:A, age:30 (사용자2의 영향으로 바뀐 데이터 조회)
A: 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 고려 X

 

 

  • 활용

자동 복구 메커니즘

=> 서버가 TIMEOUT 등으로 정상 응답을 못 줬을 때, 클라이언트가 같은 요청을 다시 해도 되는가?

 

 

 

  • 캐시 가능 (Cacheable Methods)

응답 결과 리소스를 캐시해서 사용해도 되는가?

 

GET, HEAD, POST, PATCH 캐시가능 => 실제로는 GET, HEAD 정도만 캐시로 사용
POST, PATCH => 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음