✔️ 요구사항
- 회원 목록 조회 / 회원별 조회
- 등록 / 수정 / 삭제
⭐️ 리소스 식별을 우선으로 하자 !!
리소스란 무엇일까? 회원을 조회해야할 때 "회원 조회"가 리소스일까? 바로 회원이라는 개념 자체가 리소스가 된다.
그렇다면, 리소스를 어떻게 식별하는 것이 좋을까?
회원을 등록/수정/조회를 모두 배제하고 회원이라는 리소스만 식별하자 ➡️ **회원 리소스를 URI에 매핑
URI는 리소스만 식별하도록 하자. 리소스를 리소스
(회원)와 행위
(조회, 등록, 삭제, 변경)로 분리하자.
그 런 데,
회원 목록 조회를 제외한 조회 / 등록 / 수정 / 삭제 모~두 /members/{id}/
가 되지 않는가? 이렇게되면 뭐가 뭔지 어떻게 구분하지? (여기서 계층 구조상 상위를 컬렉션으로 보고 복수단어(members) 사용을 권장한다.)
자, HTTP 메소드 종류부터 알아보자.
GET
: 리소스 조회
POST
: 요청 데이터 처리, 주로 등록
PUT
: 리소스를 대체, 해당 리소스가 없을 때 생성
PATCH
: 리소스 부분 변경
DELETE
: 리소스 삭제📌 기타 메소드
HEAD
: GET과 동일. But, 메시지 부분 제외 상태 줄과 헤더만 반환
OPTIONS
: 대상 리소스에 대한 통신 가능 옵션(메소드)을 설명(주로 CORS에서 사용)
CONNECT
: 대상 자원으로 식별되는 서버에 대한 터널 설정
TRACE
: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트 수행
📌 POST 정리 → post는 서버에 큰 변화가 일어나는 경우 사용
1. 새 리소스 생성(등록)
: 서버가 아직 식별하지 않은 새 리소스 생성2. 요청 데이터 처리
: 단순히 데이터를 생성, 변경을 넘어 프로세스를 처리해야 하는 경우 사용 (ex. 결제 완료 - 배달 시작 - 배달 완료 이런식으로 버튼을 누르면 post로 정보가 넘어가는, 즉 프로세스의 상태가 변경되는 경우)
POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음3. 다른 메소드로 처리하기 애매한 경우
: (JSON으로 조회 데이터를 넘거야 하는데 GET 메소드를 사용하기 어려운 경우)
애매할 땐 POST를 쓰자 !!
(사실, POST는 모든 것을 할 수 있다. But, 조회할 땐 캐싱을 해야하기 때문에 GET이 더 유리함.)
: 폴더에 파일을 집어넣는 행위를 생각하면 됨. ➡️ 이미 그 파일이 없으면 새로 집어넣고, 파일이 있으면 덮어버리는
: 리소스 부분 변경
: 리소스 제거
1.
안전
(Safe Methods)
2.멱등
(Idempotent Methods)
3.캐시가능
(Cacheable Methods)
: 한 번 호출하든 두 번 호출하든 100번 호출하든 같은 결과 ➡️ f(f(x)) = f(x)
📌 멱등 메소드
📌 멱등의 활용
그렇다면 중복 요청 도중 다른 곳에서 리소스가 변경되면,,😬
(GET으로 값이 20인 놈을 불렀는데 다른 사람이 PUT으로 값을 30으로 바꾸어 버린다면 난 결국 30을 얻겠지 ,,?)
이런 외부 요인으로 인해 리소스가 도중 변경되는 것까진 고려하지 않는다.
GET
, HEAD
, POST
, PATCH
는 캐시 가능GET
, HEAD
정도만 캐시로 사용POST
, PATCH
는 본문 내용까지 캐시 키로 고려해야 하는데 구현이 쉽지 않기 때문)