HTTP 메소드란?
- 클라이언트가 서버에 요청할 때 사용하는 동작을 명시하는 코드
- 클라이언트가 지정하는 서버가 수행해야 할 동작에 대한 방식
GET
- 역할
- 서버로부터 특정 리소스를 요청하는 메소드
- 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다.
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.
- 특징
- 안전성
- 리소스 상태를 변경하지 않는다.
- 멱등성
- 같은 요청을 반복해도 결과가 동일하다.
- 캐싱 가능
- 응답 결과를 캐싱하여 재사용할 수 있다.
- 요청 본문
- 없다.
- 정확하게는 서버에서 지원하지 않는다면 없다.
- 응답 본문
- 요청된 리소스의 데이터
- 안전성
POST
- 역할
- 서버에 새로운 리소스를 생성하거나 기존 리소스에 데이터를 추가한다.
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
- JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우에 대신 사용하기도 한다.
- 특징
- 안전성
- 리소스 상태를 변경할 수 있다.
- 멱등성
- 일반적으로 멱등하지 않는다.
- 같은 요청을 반복하면 리소스가 중복 생성될 수 있다.
- 캐싱 가능
- 일반적으로 캐싱 불가능하다.
- 요청 본문
- 추가할 데이터
- 응답 본문
- 생성된 리소스 정보 또는 성공/실패 메시지
- 안전성
PUT
- 역할
- 서버에 존재하는 리소스를 전체적으로 변경하거나 새 리소스를 생성한다.
- 기존 리소스가 있으면 기존 리소스 대신에 신규 리소스로 완전히 교체한다. (= 덮어쓰기)
- 기존 리소스가 없으면 신규 리소스를 생성한다.
- 특징
- 안전성
- 리소스 상태를 변경한다.
- 멱등성
- 멱등성을 지향하지만, 특정 상황에서는 멱등하지 않을 수 있다.
- 캐싱 가능
- 일반적으로 캐싱 불가능하다.
- 요청 본문
- 변경할 리소스의 전체 데이터
- 응답 본문
- 변경된 리소스 정보 또는 성공/실패 메시지
- 안전성
PATCH
- 역할
- 서버에 존재하는 리소스의 일부를 변경한다.
- 특징
- 안전성
- 리소스 상태를 변경한다.
- 멱등성
- 멱등성을 지향하지만, 특정 상황에서는 멱등하지 않을 수 있다.
- 캐싱 가능
- 일반적으로 캐싱 불가능하다.
- 요청 본문
- 변경할 리소스의 일부 데이터
- 응답 본문
- 변경된 리소스 정보 또는 성공/실패 메시지
- 안전성
DELETE
- 역할
- 서버에 존재하는 리소스를 삭제한다.
- 특징
- 안전성
- 리소스 상태를 변경한다.
- 멱등성
- 멱등성을 지향하지만, 특정 상황에서는 멱등하지 않을 수 있다.
- 캐싱 가능
- 일반적으로 캐싱 불가능하다.
- 요청 본문
- 없음
- 응답 본문
- 삭제 성공/실패 메시지
- 안전성
그 외 메소드
- OPTIONS
- 서버가 지원하는 HTTP 메소드를 확인한다.
- HEAD
- GET 메소드와 동일한 역할을 한다.
- 응답 메시지에 본문은 포함되지 않는다.
- CONNECT
- 서버와 클라이언트 사이에 터널을 연결한다.
- TRACE
- 요청 메시지를 따라서 서버에서 클라이언트까지 전달하는 경로를 추적한다.
HTTP 메서드의 속성
- 안전 (Safe Methods)
- 호출해도 리소스를 변경하지 않는다.
- 안전은 해당 리소스만 고려한다.
- 로그같은게 쌓여서 장애가 발생하는 경우 등의 예외 사항은 고려하지 않는다.
- 멱등 (Idempotent Methods)
- 몇 번을 호출해도 결과가 동일하다.
- 예시
- GET
- 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
- PUT
- 결과를 대체한다.
- 같은 요청을 여러번 해도 최종 결과는 같다.
- DELETE
- 결과를 삭제한다.
- 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
- POST
- 멱등이 아니다.
- 여러 번 호출하면 같은 결제가 중복해서 발생할 수 있다.
- GET
- 캐시 가능 (Cacheable Methods)
- 응답 결과 리소스를 캐시해서 사용해도 되는지에 대한 여부
- GET, HEAD, POST, PATCH가 캐시를 사용해도 된다.
- 실제로는 GET, HEAD 정도만 캐시로 사용한다.
- POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현하기가 쉽지 않다.
HTTP API 설계
- API의 주체가 되는 대상을 리소스로 정의하고, 해당 리소스를 기준으로 정의한다.
- 만약 회원에 대한 CRUD를 실행하는 API를 각각 만들게 된다면 해당 API들의 리소스는 회원이 된다.
- API URI를 설계할 때는 리소스를 기준으로 작성한다.
- 회원 : members, 이벤트 : events, …
- 계층 구조상 상위를 컬렉션으로 보고 복수형을 사용하는 것을 권장한다.
- 회원일 경우 member가 아닌 members를 사용하는 것을 권장한다.
- 리소스와 행위을 분리한다.
- 리소스는 명사, 행위는 동사
- 예시
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
- URI 설계 개념
- 문서 (document)
- 단일 개념 (파일 하나, 객체 인스턴스, 데이터베이스 row)
- 예시 :
/members/100
,/files/star.jpg
- 컬렉션 (collection)
- 서버가 관리하는 리소스 디렉터리
- 서버가 리소스의 URI를 생성하고 관리
- 예시 :
/members
- 스토어(store)
- 클라이언트가 관리하는 자원 저장소
- 클라이언트가 리소스의 URI를 알고 관리
- 예시 :
/files
- 컨트롤러(controller), 컨트롤 URI
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
- 동사를 직접 사용한다.
- 예시 :
/members/{id}/delete
- 문서 (document)