리소스와 행위를 분리하라
- URI는 리소스만 식별해야 한다.
- 조회, 등록, 삭제, 변경과 같이 리소스를 대상으로 하는 행위는 분리해야 한다.
HTTP 메서드 종류
- GET: 리소스 조회
- POST: 요청 데이터 처리
- PUT: 리소스를 대체, 없으면 생성
- PATCH: 리소스의 부분적인 변경
- DELETE: 리소스 삭제
기타 메서드
- HEAD: GET에서 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 메서드를 반환
1) GET
- 리소스의 조회
- 서버에 전달하고 싶은 데이터는 쿼리 파라미터, 쿼리 스트링으로 전달한다.
2) POST
- 메시지 바디를 통해 서버로 요청 데이터 전달
- 서버는 요청 데이터를 처리한다.
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용한다.
- POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청한다.
- POST는 새로운 리소스의 생성
- 단순한 데이터 생성을 넘어 어떠한 프로세스를 처리해야할 경우
- 새로운 리소스가 생성되지 않을 수도 있다.
- 리소스와 행위를 분리하기 어려울 경우, /orders/{orderId}/start-delivery 와 같이 컨트롤URI를 추가할 수도 있다.
- 다른 메서드로 처리하기 애매한 경우
- JSON 으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
- 애매하면 POST
3) PUT
- 리소스의 대체
- 있으면 대체
- 없으면 생성
- 클라이언트가 리소스를 식별한다.
- 클라이언트가 리소스의 위치를 정확히 알고 URI를 지정한다.
4) PATCH
- 리소스의 부분 변경
5) DELETE
- 리소스 제거
HTTP 메서드의 속성
1) 안전(Safe)
- 여러번 호출해도 리소스를 변경하지 않는 것
- 안전한 메서드로는 GET, HEAD, OPIONS, TRACE가 있다.
- 안전은 리소스만 고려한다. 로그가 쌓여 서버에 영향을 미치는건 고려하지 않는다.
2) 멱등(Idempotent)
- 여러번 호출해도 결과가 항상 같은 것
- GET: 여러번 호출해도 같은 결과가 조회된다.
- PUT: 결과를 대체한다. 따라서 여러번 호출해도 최종 결과는 같다.
- DELETE: 결과를 삭제한다. 여러번 호출해도 삭제된 결과는 같다.
- POST는 멱등이 아니다. 여러번 호출하면 자원에 대한 처리가 중복해서 발생할 수 있다.
- 활용
- 자동 복구 메커니즘
- 멱등한 메서드는 여러번 호출해도 결과가 같다. 따라서 서버로부터 정상 응답이 반환되지 않았을 때, 같은 요청을 다시 전달할 수 있다.
- 재요청 중간에 다른 곳에서 리소스를 변경하는 것과 같이 외부 요인으로 중간에 리소스가 변경되는 것은 고려하지 않는다.
3) 캐시가능(Cacheable)
- 응답 결과 리소스를 캐시해서 사용해도 되는가?
- GET, HEAD, POST, PATCH 캐시가능
- 실제로는 GET, HEAD 정도만 캐시로 사용한다.
- POST, PATCH는 본문 내용까지 캐시 키로 고려해야 한다. 구현이 쉽지 않다.
HTTP 메서드 활용
클라이언트에서 서버로 데이터 전송
- 쿼리 파라미터를 통한 데이터 전송
- GET
- 주로 정렬 필터(검색어)
- 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원 가입, 정보 변경, 상품 주문
1) 정적 데이터 조회
- 이미지, 정적 텍스트 문서
- 리소스 경로로 단순하게 조회 가능
2) 동적 데이터 조회
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
- GET은 쿼리 파라미터를 사용해서 데이터를 전달
- 서버는 쿼리 파라미터를 기반으로 필터, 정렬을 통해 결과를 동적으로 생성한다.
3) HTML Form 데이터 전송
- POST면 메시지 바디에 넣고, GET이면 쿼리 파라미터로 전달된다.
- 회원을 조회하는 경우는 상관없으나, 회원을 저장하는 등의 리소스의 변경이 발생하는 곳에는 사용하면 안 된다.
- 바이트로 되어있는 파일도 함께 전송해야 하는 경우 multipart/form-data 라는 메시지 형식을 사용해야 한다.
- 여러 컨텐트 타입에 대한 데이터를 전송할 수 있다. 주로 바이너리 데이터를 전송할 때 사용한다.
4) HTTP API 데이터 전송
- 백엔드 시스템 통신
- 앱 클라이언트와 통신
- 웹 클라이언트와 통신
- html form을 사용하지 않는 거의 모든 상황에서 사용한다.
HTTP API 설계 예시
회원 관리 시스템
- 회원 목록 /members -> GET
- 회원 등록 /members -> POST
- 회원 조회 /members/{id} -> GET
- 회원 수정 /members/{id} -> PATCH, PUT, POST
- 회원 삭제 /members/{id} -> DELETE
POST - 신규 자원 등록 특징
- 클라이언트는 등록될 리소스의 URI를 모른다.
- 서버가 새로 등록된 리소스의 URI를 생성해준다.
- 이러한 형식을 컬렉션(Collection)이라 한다.
- 서버가 관리하는 리소스 디렉토리
- 그리고 서버가 리소스의 URI를 생성하고 관리하는 것
- 여기서 컬렉션은 /members 이다.
- POST로 신규 데이터를 등록한다는 것은 클라이언트가 서버에 요청을 하는 것
파일 관리 시스템
- 파일 목록 /files -> GET
- 파일 조회 /files/{filename} -> GET
- 파일 등록 /files/{filename} ->PUT
- 파일 삭제 /files/{filename} ->DELETE
- 파일 대량 등록 /files -> POST
PUT - 신규 자원 등록 특징
- 파일을 등록시 PUT을 가지고 신규 자원을 등록하고 있다.
- 클라이언트가 리소스 URI를 알고 있어야 한다.
- 클라이언트가 직접 리소스의 URI를 지정한다.
- 이러한 형식을 스토어(Store)라 한다.
- 클라이언트가 관리하는 리소스 저장소
- 클라이언트가 리소스의 URI를 알고 관리
- 여기서 스토어는 /files 이다.
대부분은 POST 기반의 컬렉션을 사용하게 된다.
HTML FROM 사용
- form 은 GET과 POST만 사용할 수 있다. 이에 따라 제약이 발생한다.
- 컨트롤 URI
- 제약을 해결하기 위해 동사로 된 리소스 경로를 사용한다.(/new, /edit, /delete)
- HTTP 메서드로 해결하기 애매한 경우 사용한다.
'공부방' 카테고리의 다른 글
[TIL 06/20] IoC, DI, ApplicationContext (0) | 2023.06.20 |
---|---|
[TIL 06/19] (0) | 2023.06.19 |
[인프런] URI와 웹 브라우저 요청 흐름 (0) | 2023.03.28 |
[인프런] 네트워크 기본 (0) | 2023.03.28 |
[인프런] HTTP란 무엇인가 (0) | 2023.03.25 |