
모든 개발자를 위한 HTTP 웹 기본 지식 강의 수강 후, 정리한 글입니다.
좋은 URI는 리소스를 잘 식별할 수 있는 URI
/members/members/{id}/members/{id}/members/{id}/members/{id}계층 구조상 상위를 collection으로 보고 member 대신 members로 복수단어를 사용하는 것이 좋다.
동사형 URI
POST /orders/{orderId}/start-delivery
설계한 URI는 리소스 식별에만 이용한다.
그러면 여기서 "회원 조회, 등록, 수정, 삭제 URI가 동일한데, 어떻게 구분하지?🤔" 라는 고민을 해야한다.
이는 HTTP Method로 행위를 구분한다.
주요 메서드
GET: 리소스 조회POST: 요청 데이터 처리, 등록PUT: 리소스 대체, 해당 리소스가 없으면 생성PATCH: 리소스 부분 변경DELETE: 리소스 삭제기타 메서드
HEAD: GET과 동일하지만, 메시지 부분을 제외하고 상태 줄과 헤더만 반환OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)클라이언트가 서버에 /members/100을 조회하는 요청을 보내면, 서버는 해당 데이터를 찾아 클라이언트에 응답 데이터를 보내준다.


클라이언트가 서버로 데이터와 함께 /members로 회원 리소스 생성 요청을 보내면, 서버는 받은 데이터를 처리하여 신규 리소스 /members/100을 생성한다.

그리고 서버는 클라이언트에 신규 리소스 생성에 대한 201 응답을 보내준다.

POST 예시
① HTML FORM에 입력한 정보로 회원가입, 주문 등
② 게시판 글쓰기, 댓글 달기
③ 신규 주문 생성
④ 한 문서 끝에 내용 추가
다른 메서드로 처리하기 애매한 경우에 POST 사용
JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드는 조회할 때에만 서버에서 캐싱을 하기 때문에 지원이 안되는 서버가 있다.
클라이언트가 서버에 /members/100으로 데이터 수정 요청을 보내면, 서버는 요청 받은 데이터로 리소스를 대체한다.

/members/100 리소스에 대해 username과 age가 있다. username 필드없이 age 필드만 수정 요청을 보내면, 리소스가 대체되어 username필드는 삭제되고 age 필드만 남는다.

/members/100 리소스가 없는 경우라면, 신규 리소스를 생성한다.

PUT과 달리, age 필드만 수정할 때에는 username 필드없이 수정할 수 있다.
주의할 점은 PATCH를 지원하지 않는 서버가 간혹 있다. 그럴 때에는 POST를 사용하자!
DELETE로 삭제 요청하여 /members/100 리소스를 제거할 수 있다.

호출해도 리소스를 변경하지 않는 속성으로, GET은 안전하고 이외 메서드는 안전하지 않다.
계속 호출해서 로그 같은 게 쌓여서 장애가 발생하는 경우는 고려하지 않고, 해당 리소스만 고려한다.
처럼 한 번 호출하든, 100번 호출하든 결과가 항상 같은 속성이다.
멱등 메서드
GET: 같은 결과 조회된다.PUT: 결과를 대체하기 때문에 여러 번 요청해도 최종 결과는 같다.DELETE: 결과를 삭제하기 때문에 같은 요청을 여러 번 해도 삭제된 결과는 같다.주의!
POST 메서드는 멱등이 아니다. 두 번 호출하면 같은 결제가 중복해서 발생할 수 있기 때문이다.
예시
그러면 여기서 "재요청 중간에 다른 곳에서 리소스를 변경해버리는 경우는 멱등이 유지되지 않는 게 아닌가?🤔" 라는 생각이 든다. 멱등 속성은 외부 요인으로 중간에 리소스가 변경되는 것은 고려하지 않는다.
캐시 메서드
GETHEADPOSTPATCHGET, HEAD 정도만 url만 캐시로 잡아 사용한다.POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않은 문제가 있다.