'모든 개발자를 위한 HTTP 웹 기본 지식' 수업을 듣고 정리한 내용입니다.
요구사항 : 회원 정보 관리 API를 만들어라
- 회원 목록 조회 /read-member-list
- 회원 조회 /read-member-by-id
- 회원 등록 /create-member
- 회원 수정 /update-member
- 회원 삭제 /delete-member
URI 설계, 리소스 식별
- 리소스 : 회원이라는 개념 자체, 미네랄을 캐라 (미네랄이 리소스)
(1) 리소스를 어떻게 식별할까?- 회원을 등록하고 수정하고 조회하는 것을 모두 배제
- 회원이라는 리소스만 식별하면 된다. -> 회원 리소스를 URI에 매핑
ARI URI 설계
- 요구사항을
API
로 만들어볼 때 단순하게 생각하면 이와 같이 설계할 수 있다.- 다만, 현재 요구사항을 통해 URI 설계는 매우 좋지 않다. 중요한 것은 리소스 식별이다.
- URI는 리소스만 식별한다.
- 리소스와 해당 리소스를 대상으로 하는 행위를 분리한다.
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
리소스는 명사, 행위 동사 (미네랄을 캐라)
행위는 어떻게 구분할까?
✏️ 참고
계층 구조상 상위를 컬렉션으로 보고 복수단어를 사용하는 것을 권장한다.
행위를 구분하려면 HTTP 메서드를 이용하면 된다❗️
HTTP 메서드 종류
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
HTTP 메서드 종류 - 기타 메서드
- HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
서버에 전달해서 도착하면, 응답 데이터가 전달된다.
1. 새 리소스 생성(등록)
2. 요청 데이터 처리
POST
의 결과로 새로운 리소스가 생성되지 않을 수도 있다.POST /orders/{orderId}/start-delivery
: 컨트롤 URI (리소스로 생성) 3. 다른 메서드로 처리하기 어려운 경우
JSON
으로 조회 데이터를 넘겨야 하는데 GET
메서드를 사용하기 어려운 경우'와 같이 애매한 경우 POST
를 사용한다.데이터를 넘겨야할 때 많이 사용한다.
POST는 모든 것을 할 수 있다. (메세지 외부로 보낼 때)
- 변경, 프로세스 진행, 어쩔 수 없는 경우 사용
GET은 데이터 조회할 때 유리하다.
- 데이터 조회할 때 사용
[1] 리소스가 있다면 대체한다.
[2] 클라이언트가 리소스를 식별한다.
POST
와의 큰 차이점이다.POST
는 /members
이런 식으로 접근하지만, PUT
은 /members/100
와 같이 location을 지정해주어야 한다.
리소스가 있는 경우 vs 리소스가 없는 경우
(a) 있는 경우
(b) 없는 경우
주의
현재 json
이때,
이와 같이 PUT
한다면
username 필드가 삭제된다.
리소스를 수정하려고 PUT
을 이용하려고 하였지만, 전체를 덮어 버리기에 다른 것을 사용해야 한다.
리소스를 부분 변경한다.
리소스 제거
PATCH
를 지원하지 않는 서버에서는 POST
를 사용하면 된다.
GET
(조회만 하기 때문에 리소스가 변경되지 않는다.)POST
, PUT
, DELETE
, PATCH
f(f(x)) = f(x)
몇 번을 호출하든 결과가 똑같다❗️
멱등 메서드
GET
: 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.PUT
: 결과를 대체한다. 따라서 같은 요청을 여러 번 해도 최종 결과는 같다.DELETE
: 결과를 삭제한다. 같은 요청을 여러 번해도 삭제된 결과는 똑같다.POST
: 멱등이 아니다. 두 번 호출하면 같은 결제가 중복해서 발생하기에 에러가 발생할 수 있다.활용
멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지는 않는다.
GET
, HEAD
, POST
, PATCH
는 캐시 가능하다.GET
, HEAD
정도만 캐시로 사용한다. (실무에서는 GET
만 사용, POST
, PATCH
는 본문 내용까지 캐시 키로 고려해야하는데 구현이 쉽지 않다.)
🔔 정리
(1) 리소스는 명사, 행위는 동사
(2) HTTP 메서드
GET
: 리소스 조회POST
: 새 리소스 등록, 요청 데이터 처리, 다른 메소드로 처리하기 어려운 경우도 사용PUT
: 리소스를 대체PATCH
: 리소스를 부분적으로 변경DELETE
: 리소스를 제거(3) HTTP 메서드의 속성
- 안전 : 호출해도 리소스가 변경되지 않는다.
- 멱등 : 메서드를 여러 번 호출해도 결과가 항상 똑같다.
- 캐시 가능 : 응답 결과 리소스를 캐시해서 사용해도 되는지 검토할 때 사용한다.