공부하는 안경딸기
4. HTTP Method 본문
📑 목차
💜 1. HTTP API 만들기
💜 2. HTTP 메서드 - GET, POST
💜 3. HTTP 메서드 - PUT, PATCH, DELETE
💜 4. HTTP 메서드 속성
공부한 강의 링크 > 모든 개발자를 위한 HTTP 웹 기본 지식
HTTP API 만들기
요구사항 - 회원 정보 관리 API 만들기
- 회원 목록 조회
- 회원 조회
- 회원 등록
- 회원 수정
- 회원 삭제
API URI 설계
- 회원 목록 조회 /read-member-list
- 회원 조회 /read-member-by-id
- 회원 등록 /create-member
- 회원 수정 /update-member
- 회원 삭제 /delete-member
이게 좋은 URI 설계인가?
중요한 것은 리소스 식별
API URI 고민
리소스(resource)의 의미?
회원 등록, 수정, 조회는 리소스가 아님
회원이라는 개념 자체가 리소스
리소스를 어떻게 식별?
회원 등록, 수정, 조회 모두 배제
회원이라는 리소스만 식별 >> 회원 리소스를 URI에 매핑
API URI 설계 - 리소스 식별, URI 계층 구조 활용
- 회원 목록 조회 /members
- 회원 조회 /members/{id}
- 회원 등록 /members/{id}
- 회원 수정 /members/{id}
- 회원 삭제 /members/{id}
계층 구조상 상위를 컬렉션으로 보고 복수 단어 사용 권장(members)
/members/{id}만 4개... 어떻게 구분할까????
리소스와 행위를 분리
URI는 리소스만 식별
리소스와 해당 리소스를 대상으로 하는 행위를 분리
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
리소스는 명사, 행위는 동사
행위는 어떻게 구분할 것인가???
HTTP 메서드 - GET(줘), POST(처리해줘)
HTTP 메서드 종류 - 주요 메서드
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
HTTP 메서드 종류 - 기타 메서드
- HEAD : GET과 동일, 메시지 부분 제외하고, 상태 줄과 헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션을 설명(주로 CORS에서 사용)
- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트 수행
GET
리소스 조회
서버에 전달하고 싶은 데이터는 query를 통해 전달
리소스 조회1, 2 - 서버에 메시지 전달, 서버 도착
GET /members/100 HTTP/1.1 Host: localhost:8080 |
리소스 조회 3 - 응답(response) 데이터
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 34 { "username":"Na", "age":20 } |
POST
요청 데이터 처리
메시지 바디를 통해 서버로 요청 데이터 전달
서비는 요청 데이터를 처리
주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용
리소스 등록 1 - 메시지 전달
POST /members HTTP/1.1 Content-Type: application/json { "username":"Na", "age":20 } |
리소스 등록 2 - 서버에 신규 리소스 생성 (/members >> /members/100)
{ "username":"Na", "age":20 } |
리소스 등록 3 - 응답 데이터
HTTP/1.1 201 Created Content-Type: application/json Content-Length: 34 Location: /members/100 >> 신규 생성 자원의 저장 위치를 client한테 알려줌 { "username":"Na", "age":20 } |
요청 데이터를 어떻게 처리한다는 뜻일까?
- 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 >> 정해진 것이 없다.
POST 정리
- 새 리소스 생성(등록) : 서버가 아직 식별하지 않은 새 리소스 생성
- 요청 데이터 처리
- 단순 데이터 생성, 변경을 넘어 프로세스를 처리해야 하는 경우
- 단순이 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음
- 예시 - POST /orders/{orderId}/start-delivery/{컨트롤 URI}
- 다른 메서드로 처리하기 애매한 경우
- 그렇지만 조회에는 GET이 유용하다고...
HTTP 메서드 - PUT, PATCH, DELETE
PUT
리소스를 대체 (있으면 대체, 없으면 생성 >> 덮어버림)
클라이언트가 리소스를 식별
- 클라이언트가 리소스 위치를 알고 직접 URI 지정
- POST와의 차이점
리소스가 서버에 이미 있는 경우
PUT /members/100 HTTP/1.1 Content-Type: application/json { >> 이 리소스가 서버의 100번째에 이미 있다면 "username":"Ka", "age":40 } |
리소스가 대체됨
{ "username":"Ka", "age":40 } |
리소스가 없다면 당연히 새로 생성함
주의사항 >> PUT은 리소스를 완전히 대체함
/members/100 은 아래와 같음
{ "username":"Na", "age":20 } |
PUT /members/100 HTTP/1.1 Content-Type: application/json { "age":50 } |
PUT 이후 /members/100은 아래와 같음
{ "age":50 >> username 필드가 사라짐! } |
PATCH
리소스 부분 변경
(간혹 지원이 안 되는 경우가 있는데 이 경우에는 POST를 사용하기)
/members/100 은 아래와 같음
{ "username":"Na", "age":20 } |
PATCH /members/100 HTTP/1.1 Content-Type: application/json { "age":50 >> age 필드만 바꿀거임 } |
PATCH 이후 /members/100 은 아래와 같음
{ "username":"Na", "age":50 } |
DELETE
리소스 제거
DELETE /members/100 HTTP/1.1 Host: localhost:8080 |
HTTP 메서드 속성
안전(Safe Methods)
호출해도 리소스를 변경하지 않음
안전은 해당 리소스만 고려
멱등(Idempotent Methods)
f(f(x)) = f(x)
한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같음
멱등 메서드
- GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회됨
- PUT : 결과를 대체. 같은 요청을 여러 번 해도 최종 결과는 같음(덮어씀)
- DELETE : 결과를 삭제. 같은 요청 여러번 해도 삭제된 결과는 똑같음
- POST : 멱등 아님!!! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있음
활용
- 자동 복구 메커니즘
- 서버가 정상 응답을 주지 못한다면 클라이언트가 같은 요청을 다시 해도 되는가에 대한 판단 근거
- DELETE 했는데 서버에서 응답이 없다. 자동으로 DELETE를 또 요청해도 되는가? >> YES
재요청 중간에 다른 곳에서 리소스를 변경해버리면?
- 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않음
캐시 가능(Cacheable Methods) ⭐
응답 결과 리소스를 캐시해서 사용해도 되는가?
GET, HEAD, POST, PATCH 캐시 가능
실제로는 GET(URL을 key로 잡고 캐시로 사용), HEAD 정도만 캐시로 사용
(POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음)
'네트워크' 카테고리의 다른 글
5. HTTP 메소드 활용 (0) | 2021.08.20 |
---|---|
5. HTTP 요청 데이터 (0) | 2021.08.09 |
3. HTTP (0) | 2021.05.21 |
2. URI와 웹 브라우저 요청 흐름 (0) | 2021.05.18 |
1. 인터넷 네트워크 (0) | 2021.05.16 |