난 초보니까..? 회원 정보 관리 API를 만들어본다고 가정해보자.
- 회원 목록 조회 / read-member-list
- 회원 조회 / read-member-by-id
- 회원 등록 / create-member
- 회원 수정 / update-memeber
- 회원 삭제 / delete-member
이렇게 만들 것 같다.
그런데 이것은 좋은 방법이 아니다.
중요한 것은 "리소스 식별" 이다.
리소스라는 것은 뭘까?
회원을 등록하고 수정하는 것이 리소스가 아니다.
ex) 미네랄을 캐라 -> 미네랄이 리소스다.
즉, 회원이라는 개념 자체가 리소스다.
그렇기에 회원이라는 리소스만 식별하게 하면 된다.
그렇다면 다시 돌아가서 리소스 식별을 활용한다면
- 회원 목록 조회/members
- 회원 조회/members/{id}
- 회원 등록/members/{id}
- 회원 수정/members/{id}
- 회원 삭제/members/{id}
이렇게 된다. 근데 문제는 그러면 저 기능들을 어떻게 구분하느냐인 것이다.
리소스와 해당 리소스를 대상으로 하는 행위를 구분하면 된다.
그 행위(메소드)를 HTTP메소드가 담당하는 것이다.
HTTP의 메소드의 종류는 크게 5가지다.
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
- 그 외에도 HEAD, OPTIONS,CONNECT,TRACE 등이 있다.
* GET : 리소스 조회, 서버를 전달하고 싶은 데이터를 query를 통해 전달한다.
* POST : 요청 데이터 처리.
메세지 바디를 통해 서버로 요청 데이터를 전달한다.
POST 메소드는 대상 리소스가 가진 고유한 의미 체계에 따라 표현을 처리한다.
그렇기에, POST요청이 들어오면 요청 데이터를 어떻게 처리할 것인지 리소스마다 따로 정해야 한다.
정리)
1. 새 리소스 생성(등록) : 서버가 아직 식별하지 않은 새 리소스 생성
2. 요청 데이터 처리 : 프로세스를 처리해야하는 경우.
다른 메소드로 처리하기 애매한 경우 POST를 사용한다.
* PUT : 리소스를 대체
리소스가 있으면 대체하고 없으면 생성하고. 덮어쓰기 기능이다.
핵심인 부분은, 클라이언트가 리소스 위치를 알고 URI를 지정해야한다.
주의할 점은, 리소스를 완전히 대체한다.
* PATCH : 리소스 부분 변경
* DELETE : 리소스 제거
* HTTP 메소드의 속성
- 안전 (Safe Methods)
호출해도 리소스가 변경되지 않는다. 설령 계속 호출해서 로그가 쌓여서 장애가 생긴다면, 안전은 해당 리소스만 고려한다. - 멱등(Idempotent Methods)
f(x) = x; 즉, 한번 호출하든, 여러번 호출하든 최종 결과가 같다.
주의점은, POST는 멱등이 아니다. 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다. - 캐시가능(Cacheable Methods)
내 로컬 PC에 이미지 등의 큰 파일을 저장해놓을 수 있냐? 정도로만 지금 이해하자.
응답 결과 리소스를 캐시해서 사용해도 되는가? 에서, GET, HEAD 정도로만 캐시로 사용한다.
POST, PATCH 는 본문 내용까지 캐시 키로 고려해야하는데 구현이 쉽지 않다.
'스프링 강의 필기 > HTTP 웹 지식 정리' 카테고리의 다른 글
6) HTTP 상태코드 (0) | 2022.07.20 |
---|---|
5) HTTP 메서드 활용 (0) | 2022.07.19 |
3) HTTP 기본 (0) | 2022.07.16 |
2) URI과 웹 브라우저 요청 흐름 (0) | 2022.07.16 |
1) 인터넷 네트워크 (0) | 2022.07.16 |