🔎 목차
- HTTP 메서드 종류
- GET
- POST
- PUT
- PATCH
- DELETE
- HTTP 메서드 속성
📌 HTTP 메서드 종류
주요 메서드
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스 대체, 해당 리소스 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
기타 메서드
- HEAD : GET과 동일, 메시지 부분 제외하고 상태줄과 헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션
- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트 수행
📌 GET
- 리소스를 조회한다.
- 서버에 전달하는 데이터는 쿼리 파라미터, 쿼리 스트링을 이용한다.
- 메시지 바디를 통한 데이터 전달 가능하지만 지원하지 않는 곳이 많다.
동작 방식
-
클라이언트가 서버에게 GET으로 리소스 조회한다.
-
서버는 해당 리소스를 데이터베이스를 통해 조회한다.
-
조회한 데이터를 바탕으로 HTTP 응답 메시지를 만들어 보낸다.
📌 POST
- 요청 데이터를 처리한다.
- 클라이언트는 메시지 바디를 통해 요청 데이터를 보낸다.
- 주로 신규 리소스 등록에 이용한다.
동작 방식 - 신규 리소스 생성
-
클라이언트가 서버에게 메시지 전달한다.
-
서버는 신규 리소스 식별자를 생성하고 데이터베이스에 등록한다.
-
서버에서 응답 메시지를 작성해서 보낸다.
- Location 헤더 통해 자원이 생성된 경로를 보낸다.
추가 - POST가 하는 일
- 리소스 URI마다 POST 요청이 오면 요청 데이터 어떻게 처리할지 정한다.
- 데이터 처리는 새 리소스 등록도 있지만 프로세스 처리와 같은 많은 일을 할 수 있다. 이는 내부 프로세스에 따라 다르다.
- ex. 주문 -> 결제완료 -> 배달시작 -> 배달완료 처럼 프로세스 상태 변경
- ex. 리소스 조회하면서 메시지 바디를 담고 싶을 때
📌 PUT
- 리소스를 대체한다.
- 리소스가 있으면 완전히 바꾼다!
- 리소스를 변경하기 위해 리소스의 모든 데이터를 담아 보내야함!
- 리소스가 없으면 새로 생성한다.
- 클라이언트가 리소스를 식별하여 URI로 경로를 담아 보낸다.
동작 방식 - 리소스 있는 경우
-
클라이언트가 memebrs/100 의 나이를 바꾸기 위해 메시지 바디에 나이를 담아 보낸다.
-
서버는 해당 리소스의 데이터를 완전 바꾼다. 따라서 members/100에는 username이 사라진다.
동작 방식 - 리소스 없는 경우
-
클라이언트는 members/100 경로를 지정하여 데이터를 보낸다.
-
서버는 해당 URI 경로에 리소스를 생성한다.
📌 PATCH
- 리소스를 부분 변경한다.
- PATCH를 지원하지 않는 브라우저도 있다. 이는 POST로 해결할 수 있다.
동작 방식
-
위의 PUT 첫 번째 예제와 같이 나이만 변경하기 위해 다음과 같이 요청 메시지를 보낸다.
-
서버는 해당 데이터만 교체한다.
📌 DELETE
- 리소스를 제거한다.
- 클라이언트가 삭제할 리소스의 URI로 경로를 담아 요청한다.
동작 방식
-
클라이언트는 memebrs/100 삭제 요청을 보낸다.
-
서버는 해당 리소스를 데이터베이스에서 삭제한다.
📌 HTTP 메서드 속성
안전(safe)
- 안전은 호출해도 리소스를 변경하지 않는 것이다.
- GET, HEAD이 이에 해당한다.
멱등(Idempotent)
- 동일한 요청을 여러번 보내도 결과가 똑같다.
- GET, PUT, DELETE가 이에 해당한다.
- POST는 멱등하지 않다!
- ex. POST로 결제 요청 -> 2번 요청하면 2번 결제된다.!
- 자동 복구 매커니즘에 활용할 수 있다.
- 서버가 정상 응답을 주지 못하였을 때 같은 요청 보내도 되는지 판단 근거가 된다.
캐시 가능
- 응답 결과 리소스를 캐시하여 사용 가능한지 판단한다.
- GET, HEAD, POST, PATCH 캐시 가능하다.
- 실제 GET, HEAD 정도만 캐시로 이용한다.
- POST, PATCH는 본문 내용까지 캐시 키로 고려하기 쉽지 않기 때문이다.
출처
인프런 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의