API URI 설계
회원을 등록하고 수정하고 조회하는 게 리소스가 아니다.
- 예) 회원 정보를 불러와라 -> 회원 정보가 리소스
- 즉 회원이라는 개념 자체가 리소스이다.
그렇다면 리소스는 어떻게 식별해야 할까?
- 회원을 등록, 수정 조회하는 것을 모두 배제
- 회원이라는 리소스만 식별하면 된다 -> 회원 리소스를 URI에 매핑
리소스 식별, URI 계층 구조 활용
- 회원 목록 조회 /members (계층 구조상 상위를 컬렉션으로 보고 복수단어 사용을 권장한다)
- 회원 조회 /members{id} -> 무슨 행위인지 어떻게 구분하지?
- 회원 등록 /members{id} -> 무슨 행위인지 어떻게 구분하지?
- 회원 수정 /members{id} -> 무슨 행위인지 어떻게 구분하지?
- 회원 삭제 /members{id} -> 무슨 행위인지 어떻게 구분하지?
리소스와 행위를 분리
가장 중요한 것은 리소스를 식별하는 것이다.
- URI는 리소스만 식별 (행위는 식별하지 않는다.)
- 리소스와 해당 리소스를 대상으로 하는 행위를 분리
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
- 리소스는 명사, 행위는 동사
그렇다면 행위(메서드)는 어떻게 구분하는가?
HTTP 메서드 종류
주요 메서드
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경 (PUT은 리소스 전체를 대체하는 것이라면, PATCH는 리소스의 일부만을 대체하는 것이다.)
- DELETE : 리소스 삭제
기타 메서드
- HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환한다. (시작라인, 헤더)
- OPTIONS : 대상 리소스에 대한 통신 가능 메서드를 주로 설명 (주로 CORS에서 사용)
- CONNECT : 대상 리소스로 식별되는 서버에 대한 터널 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트 수행
기타 메서드는 주로 HEAD와 OPTIONS만 사용한다.
OPTIONS는 서버한테 해당 API를 사용해도 되는지 물어보는 사전 요청이다.
GET
- 리소스 조회
- 서버에 전달하고 싶은 데이터는 query를 통해서 전달
- 메시지 바디를 통해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.
예시
클라이언트가 서버에 100번째 사용자 정보 GET 메서드를 요청했다.
서버는 100번째 사용자 정보를 JSON 형태의 메시지로 생성하여 응답한다.
POST
- 요청 데이터 처리
- 메시지 바디를 통해 서버로 요청 데이터 전달 -> 서버는 요청 데이터 처리
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
- 주로 전달된 데이터로 신규 리소스 등록뿐만 아니라 프로세스 처리에 사용
예시
클라이언트가 특정 URI에 POST 요청을 보낸다.
서버에서는 사전에 해당 URI에 POST 요청이 올 시 특정 프로세스를 처리하도록 설정한다.
예) 수신 데이터 등록
서버에서 요청에 대한 작업이 끝나면 등록된 데이터뿐만 아니라 데이터의 URI도 함께 보낸다.
요청 데이터를 어떻게 처리한다는 뜻일까?
예를 들어 POST는 다음과 같은 기능에 사용된다.
- HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공
- HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
- 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
- 게시판 글쓰기, 댓글 달기
- 서버가 아직 식별하지 않은 새 리소스 생성
- 신규 주문 생성
- 기존 리소스에 데이터 추가
- 한 문서 끝에 내용 추가하기
정리 : URI에 POST 요청이 올 때 요청 데이터를 어떻게 처리할지 리소스마다 각각 정해야 한다.
정리
1. 새 리소스 생성( 등록 )
- 서버가 식별하지 않은 새 리소스 생성
2. 요청 데이터 처리
- 단순 데이터 생성, 변경을 넘어 프로세스를 처리해야 하는 경우
- 주문에서 결제완료 -> 배달시작 -> 배달완료처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- POST의 결과로 새로운 리소스가 생성되지 않을 수 있다. ( 상태 변경 )
- POST /orders/{orderId}/start-deliever ( 컨트롤 URI )
3. 다른 메서드로 처리하기 애매한 경우
- JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드 사용이 어려운 경우
- GET에서 메시지 body를 허용하지 않는 서버에서 메시지 body를 넘겨야 하는 경우
PUT
- 리소스를 대체
- 리소스가 있으면 대체
- 리소스가 없으면 생성
- 쉽게 이야기하면 폴더로 파일을 옮기는 경우 만약 중복된 파일이 있으면 덮어쓰게 되고, 없으면 새로 생성되는 개념인 것이다.
- 중요! 클라이언트가 리소스를 식별
- 클라이언트가 리소스의 위치를 알고 URI 지정
- POST에서는 리소스의 위치를 서버에서 지정하였다.
- PUT은 클라이언트에서 리소스를 어디에 등록할지 직접 지정한다.
- 클라이언트가 리소스의 위치를 알고 URI 지정
예시
이미 리소스가 있는 경우 리소스를 대체한다.
리소스가 없는 경우 새로운 리소스를 생성한다.
주의! - PUT은 리소스를 완전히 대체한다.
만약 특정 필드를 누락시킨 상태로 PUT 요청을 보내게 되면 완전히 대체되기 때문에 누락된 필드는 삭제된다.
PUT은 리소스를 수정하는 것이 아니라 리소스를 대체하는 것이다.
특정 필드만 수정하려면 PATCH를 사용해야 한다.
PATCH
- 리소스 부분 변경
PUT을 이용한 요청에서 필드 누락 시 해당 필드는 삭제되었다.
PATCH를 이용하면 요청한 필드에 대해서만 변경이 이루어진다.
DELETE
- 리소스 제거
요청에 따라 서버에서 100번째 리소스를 제거했다.
HTTP 메서드의 속성
- 안전
- 멱등
- 캐시 가능
안전
- 호출해도 리소스를 변경하지 않는다. ( 변경되지 않는 것만 안전 )
- Q : 그래도 계속 호출해서 로그가 쌓여 장애가 발생하면요?
- A : 여기서 안전은 리소스가 변화하는지에 대해서만 고려한다.
멱등
- f(f(x)) = f(x)
- 한 번 호출하던 두 번 호출하던 100번 호출하던 결과가 똑같다.
- 멱등 메서드
- GET : 한번 조회하던, 두 번 조회하던 같은 결과가 조회된다.
- PUT : 결과를 대체한다. 같은 요청을 여러 번 해도 최종 결과는 같다.
- DELETE : 결과를 삭제한다. 같은 요청을 여러 번 해도 삭제된 결과는 똑같다.
- POST : 멱등이 아니다. 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다.
활용
- 자동 복구 메커니즘
- 서버가 TIMEOUT 등으로 정상 응답을 못주었을 때, 클라이언트가 같은 요청을 다시 해도 되는가?
- 같은 요청을 여러 번 보내도 결과가 똑같으니까 자동 재시도(복구) 가능!
- Q : 재요청 중간에 다른 곳에서 리소스를 변경해 버리면?
- A : 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지 고려하지 않는다
캐시가능
- 응답 결과 리소스를 캐시 해서 사용해도 되는가?
- GET, HEAD, POST, PATCH 캐시 가능
- 실제로는 GET, HEAD 정도만 캐시로 사용한다.
- POST, PATCH는 메시지 바디까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않기 때문
출처 : https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
'CS' 카테고리의 다른 글
HTTP 메서드 활용 (0) | 2025.04.03 |
---|---|
[ 프로그래머스,bfs ] 네트워크.python (0) | 2025.04.03 |
HTTP에 대해 (0) | 2025.04.02 |
URI와 웹 브라우저 요청 흐름 (0) | 2025.04.02 |
인터넷 네트워크에 대해서 (0) | 2025.04.01 |