HTTP Method
HTTP API를 만들어보자
- 회원 정보 관리 API를 만들어라 -> API URI를 설계하자!
- 회원 목록 조회 /read-member-list
- 회원 조회 /read-member-by-id
- 회원 등록 /create-member
- 회원 수정 /update-member
- 회원 삭제 /delete-member
- 회원 목록 조회 /read-member-list
이렇게 설계하는 것이 좋은 URI 설계일까?? (X)
-> URI 설계에서 가장 중요한 것은리소스 식별
!!
즉, URI는리소스 식별을 기준으로 설계
를 해야함
- API URI
- 여기서 리소스란?
- 회원 등록, 수정, 조회 하는 것이 리소스가 아님
회원
이라는 개념 자체가 바로 리소스 !- 즉, 회원이라는 리소스만 식별하면 됨 -> 회원 리소스를 URI에 매핑
- 리소스 식별, URI 계층 구조 활용
- 회원 목록 조회 /members
- 회원 조회 /members/{id}
- 회원 등록 /members/{id}
- 회원 수정 /members/{id}
- 회원 삭제 /members/{id}
- 회원 목록 조회 /members
- 여기서 리소스란?
이렇게 되면 4개가 다 같은 URI 구조를 갖는데 그럼 어떻게 구분 ?
만약, id=10번 회원으로 조회하면 다 똑같은데 ?
-> Method로 행위를 구분하자!
즉, 리소스와 해당 리소스를 대상으로 하는 행위를 분리하자 !
- 리소스는 회원, 행위는 조회 등록 삭제 변경
HTTP Method
- 주요 메서드
- GET: 리소스 조회 (리소스 달라)
- POST: 요청 데이터 처리, 주로 등록에 사용 (데이터를 줄테니 처리해줘)
- PUT: 리소스를 대체, 해당 리소스가 없으면 생성 (데이터를 보내는데, 지금 보내는 것으로 대체해줘 - 기존에 있다면 덮어써줘)
- PATCH: 리소스 부분 변경 (기존꺼 덮어쓰지 않고 수정하는 경우)
- DELETE: 리소스 삭제
- GET
- 리소스 조회
- 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음
GET /search?q=spring&hl=ko HTTP/1.1
Host: www.google.com
/members/100 GET 이렇게 서버가 받으면 내부 데이터베이스를 조회해서 JSON 파일을 작성하고 응답메시지를 만들어서 보냄
- POST
- 요청 데이터 처리
- 메시지 바디를 통해 서버로 요청 데이터 전달 (전달해줄테니 서버가 처리해달라)
- 서버는 요청 데이터를 처리
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "spring",
"age": 25
}
POST의 경우 서버와 미리 약속을 해놓음
너가 만약 POST /members로 그 데이터를 보내면 내가 그 데이터를 저장할거야, 어떤 프로세스에 쓸거야. 이런식으로 미리 약속을 해놓음
그래서 약속된 처리를 서버가 해주고 응답 메시지를 보내줌
- POST가 요청 데이터를 어떻게 처리한다는 뜻일까?
POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청
- 즉, 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없음
- POST 총 정리
- 새 리소스 생성(등록)
- 서버가 아직 식별하지 않은 새 리소스 생성
- 요청 데이터 처리
- 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
- ex) 결제완료 -> 배달시작 -> 배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- POST의 경과로 새로운 리소스가 생성되지 않을 수 있음
- ex) POST /orders/{orderId}/start-delivery (컨트롤 URI)
자원
만 URI로 설계해야 한다고 하지 않음?- 그것만으로 안되는 경우가 있음. 동사의 URI가 나올 수 있음 (이런 동사 URI를
컨트롤 URI
라고 함)
- 다른 메서드로 처리하기 애매한 경우
- JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우 (GET은 메시지 바디를 잘 사용하지 않으므로)
- 이런 경우에는 조회지만 POST 메소드로 써야함
- 새 리소스 생성(등록)
즉, POST는 메세지를 내부에 담아서 할 수 있는 모든 것이 가능함
하지만, 조회할 때는 GET을 쓰는 것이 유리 (서버끼리는 GET이 오면 캐싱을 한다는 약속이 있음, POST는 캐싱을 잘 하지 않음)조회는 GET을 쓰고 데이터가 변경, 프로세스가 진행되는 경우에는 POST, 그리고 정말 어쩔 수 없는 경우에는 POST 선택
- PUT
- 리소스를 대체
- 리소스가 있으면 대체 (덮어쓰기)
- 리소스가 없으면 생성
- 클라이언트가 리소스를 식별
- 클라이언트가 리소스 위치를 알고 URI를 지정해줌
- 이것이 POST와의 차이점
- 리소스를 대체
PUT /members HTTP/1.1
Content-Type: application/json
{
"username": "spring",
"age": 25
}
PUT은 수정할 때 사용하는 메서드가 아님.
리소스를완전히 대체
하기 때문 (갈아치우는 것)
- PATCH
- 리소스 부분 변경
- 수정하고 싶을 때 사용
- 만약, PATCH가 안되는 HTTP를 만났다 -> POST를 사용하면 됨
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age": 25
}
/members/100 이렇게 리소스 URI를 완전히 지정해주고 PATCH를 날리면 그 데이터의 "age" 부분만 업데이트 됨
- DELETE
- 리소스 제거
DELETE /members/100 HTTP/1.1
Host: localhost:8080
HTTP 메서드의 속성
- 안전 (Safe Methods)
- 호출해도 리소스를 변경하지 않는다는 것
- GET (+HEAD)는 리소스가 변경될 수 없으니까 안전, POST PUT PATCH 등은 호출되었을때 데이터가 변경되므로 안전하지 않음
- 그래도 만약 계속 호출해서 로그가 쌓여서 장애가 발생하면 ?
- 안전은 해당 리소스만 고려. 그냥 해당 리소스가 변하냐, 변하지 않냐만 생각
- 멱등 (Idempotent Methods)
- 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같음
- 멱등 메서드
- GET: 한 번 조회, 두번 조회 모두 같은 결과가 조회됨
- PUT: 결과를 대체하므로 같은 요청을 여러번 해도 최종 결과는 같음. PUT은 기존 것을 날리고 새로운 데이터로 완전히 대체하기 때문에 같은 요청 (동일한 메시지)로 계속 요청하면 같을 수 밖에 없음
- DELETE: 결과를 삭제함, 같은 요청을 여러번 해도 삭제된 결과는 같음
- POST
- 멱등이 아님! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있음
- 멱등의 활용
- 자동 복구 메커니즘
- 예를 들어, DELETE를 호출했는데 서버에서 응답이 없어. 잘되었는지 안되었는지 모르니까 DELETE를 재새도 해도 되겠지? 왜냐 -> 멱등하기 때문
- ex) 서버가 timeout 등으로 정상 응답을 못줬을 때, 클라이언트가 같은 요청을 다시 해도 되는가? 의 판단 근거
- 재요청 중간에 다른 곳에서 리소스를 변경해버린다면 ?
- 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지 고려하지 않음
- 캐시가능 (Cacheable Methods)
- 응답 결과 리소스를 캐시해서 사용해도 되는가 ?
- GET, HEAD, POST, PATCH 캐시가능
- 실제로는 GET, HEAD 정도만 캐시로 사용
- 캐시를 하려면 똑같은 데이터와 키가 맞아야 하는데 POST와 같이 바디에 데이터도 있는 경우 이런 것 까지 고려해서 넣는게 쉽지 않음
API URI 설계는
리소스 식별
을 기준으로 하자! 그리고 행위는Method
를 통해서 구분하자 !
HTTP Method에는GET, POST, PUT, PATCH, DELETE
등이 있음. HTTP 메소드의 속성에는 1. 호출해도 리소스를 변경하지 않는다는안전
과 2. 한 번의 호출과 100번의 호출의 결과가 같은지의멱등
과 3. 빠르게 데이터를 가져올 수 있는지에 대한캐시가능
이 있음
김영한 님의
모든 개발자를 위한 HTTP 웹 기본 지식
보고 작성한 내용입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
'BE > HTTP' 카테고리의 다른 글
[HTTP] 3. HTTP 기본 (1) | 2024.10.13 |
---|---|
[HTTP] 2. URI와 웹 브라우저 요청 흐름 (0) | 2024.10.13 |
[HTTP] 1. 인터넷 네트워크 (0) | 2024.10.13 |