본문 바로가기
cs/컴퓨터 네트워크

HTTP 메서드(GET, POST, PUT, PATCH, DELETE)

by 장인이 2023. 1. 12.

0. 개요

 이번 게시물에서는 HTTP 메서드에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다.

(HTTP란?)

 

 

1. HTTP 메서드는 왜 나왔을까?

 HTTP 메서드는 왜 나왔을까? 이를 확인해 보기 위해 간단한 회원 정보 관리 API를 한번 설계해보자. 우선 다음과 같은 기능들의 API URI 설계를 해보자.

(URI란?).

 

- 회원 목록 조회 /read-member-list

- 회원 조회 /read-member-by-id

- 회원 등록 /create-member

- 회원 수정 /update-member

- 회원 삭제 /delete-member

 

 이것은 과연 좋은 URI 설계인가? 가독성이 좋기는 하지만, "어떤 개념과 관련된 내용"인지 인식하기 쉽지 않다. 가장 중요한 것은 리소스 식별이다.

 

- 리소스 식별

 회원을 등록, 수정, 조회하는 것이 리소스가 아니다! 예를 들어서 "잡몹을 잡아라"에서, "잡몹"이 바로 리소스이다. 그렇다면 이 리소스를 어떻게 하면 식별할 수 있을까? 바로, 나머지를 배제하고 회원이라는 리소스만 식별하면 된다.

 

- 회원 목록 조회 /members

- 회원 조회 /members/{id}

- 회원 등록 /members/{id}

- 회원 수정 /members/{id}

- 회원 삭제 /members/{id}

 

 그런데 이러면 생기는 당연한 문제점이 있다. 어떻게 구분해야 할까?

 

- 리소스와 행위를 분리

 URI로는 리소스만 식별하도록 하고, 행위는 HTTP 메서드를 통해 구분해 보자.

 

 

2. HTTP 메서드 종류

- 주요 메서드

- GET: 리소스 조회

- POST: 요청 데이터 처리, 주로 등록에 사용됨

- PUT: 리소스를 대체, 해당 리소스가 없다면 새로 생성

- PATCH: 리소스 부분 변경

- DELETE: 리소스 삭제

 

- 기타 메서드

- HEAD: GET과 동일하지만, 메시지 부분을 제외하고 상태줄과 헤더만 반환

- OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드) 설명

- CONNECT: 대상 자원으로 식별되는 서버에 대한 터널 설정

- TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

1) GET

 리소스를 조회하고 싶을때 호출하는 메서드이다. 서버에 전달하고 싶은 데이터는 query를 통해서 전달한다.

- query는 query string 혹은 query parameter라고도 불린다.

- key=value의 형태로 구성되어있으며, 시작은 ?, 값을 추가하고 싶으면 &를 붙이자.

 

 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많이 때문에 권장하지 않는다.

<GET 요청 흐름>

1) 먼저 클라이언트가 서버에게 /members/100으로 100번 유저를 찾는 GET 요청을 보낸다.

2) 그러면 서버에서 유저 정보를 조회한 후, 가공한다

  -> 예시는 json으로 가공하였으며, HTML 등 다른 방법으로도 가능하다.

3) 그 후 서버에서 응답 데이터를 구성해서 다시 클라이언트에 반환해준다.

 

2) POST

 요청 데이터 처리 사용하는 메서드이다. 메시지 바디를 통해 데이터를 전달하며, 주로 전달한 데이터로 신규 리소스를 등록하거나 프로세스 처리에 사용된다.

<POST 요청 흐름>

1) 클라이언트메시지 바디에 새로운 회원의 정보를 저장POST 요청을 한다.

  - > 예시는 json으로 가공하였으며, HTML Form 등 여러 방식을 지원한다.

2) 서버에서는 받은 데이터를 분석하여 데이터베이스에 신규 리소스를 등록한다. 이때, 신규 아이디를 생성한다.

3) 서버에서 회원이 생성된 경로를 헤더에, 정보를 메시지 바디에 담아 보내준다.

 

- 요청 데이터 처리가 무슨 뜻일까?

 POST 요청이 "신규 데이터를 등록해라" 라는 뜻으로 오해할 수 있는데, 사실 POST 메서드는 "대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청"한다 라고 한다... 이게 무슨말일까?

 즉, 정확히 정해진 것이 없이, POST 요청이 오면 요청 데이터를 처리하는 방법을 리소스마다 따로 정해야 한다. 방법들을 정리해보면 다음과 같다.

 

(1) 새 리소스 생성(등록)

- 말 그대로 새 리소스를 생성하는 것을 말한다.

 

(2) 요청 데이터 처리

- 데이터 생성 혹은 변경과 같은 단순한 작업이 아닌, 프로세스를 처리해야 하는 경우이다. 

  - ex) 주문 시 결제 완료 -> 배달 시작 버튼을 누르면?

    -> 라이더에게 출발지와 목적지 주소 전달, 사용자에게 완료 메시지 전송, 예상 배달시간 계산 및 전송 등등.. 다양한 프로세스를 처리해야 한다.

- 위처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우를 뜻하며, 이 결과로 새로운 리소스가 생성되지 않을 수도 있다.

 

ex) POST /orders/{orderId}/start-delivery

- 위에서 URI 설계시 리소스 식별만 추가하라고 했지만, 이런 경우에는 한계가 생긴다. 따라서 어쩔수 없는 경우 동사를 넣어주어야 하는데, 이를 컨트롤 URI라고 한다.

 

(3) 다른 메서드로 처리하기 애매한 경우

- 예를 들어 값을 조회하고 싶지만, JSON으로 데이터를 넘겨야 할 경우GET 메서드 대신 POST를 사용한다.

- 따라서 뭔가 애매하면, POST 메서드를 사용하면 된다.

 

3) PUT

 리소스를 대체하는 메서드이다. 만일에 리소스가 있으면 대체하고, 없으면 새로운 리소스를 생성한다. 쉽게 말해서, 데이터를 덮어버린다고 생각하면 된다.

 POST와는 다르게 클라이언트가 리소스의 위치를 알고, URI를 지정해서 보내준다.

 

(1) 리소스가 있는 경우

<리소스 있을 시 PUT 요청 흐름>

  리소스가 있는 경우, 기존에 있던 리소스를 대체해서 서버에 저장하게 된다.

 

- 이때, 리소스를 완전히 대체하므로 주의해야 한다!

ex) { "age":50 } 데이터를 보낸다면? (username 생략)

  -> username 필드가 삭제된 체 { "age":50 }값만 저장됨

 

(2) 리소스 없는 경우

 리소스가 없다면, 신규 리소스를 생성한다.

 

4) PATCH

 PUT과 보내는 방식은 비슷하다. 그 대신 리소스를 완전히 대체하는 게 아닌, 전달 받은 값만 교체한다.

 

5) DELETE

 메서드 이름 그대로 리소스를 제거할 때 사용된다. 정보를 query로 전달하고, 서버에서 그에 해당하는 데이터를 삭제한다.

 

 

3. HTTP 메서드 속성

HTTP의 속성을 안전, 멱등, 캐시 가능으로 나눈다.

<HTTP 메서드 속성>

1) 안전(Safe)

- 호출해도 리소스를 변경하지 않는다.

  - GET은 조회만 하는 메서드 이므로 성립한다.

  - POST, PUT, DELETE은 안전하지 않다.

 

2) 멱등(Idempotent)

- 어떤 조작을 한번 호출하든, 여러번 호출하든 결과가 똑같아야 한다.

  - GET: 한번 조회하든, 여러번 조회하든 같은 내용을 조회한다.

  - PUT: 결과를 대체하는 메서드로, 여러번 요청해도 최종 결과는 같다.

  - DELETE: 삭제하는 메서드로, 여러번 요청해도 삭제된 결과는 같다.

  - POST: 멱등이 아니다, 여러번 호출하면 같은 결제가 중복해서 발생할 수 있다.

 

이런 개념이 왜 필요할까? 자동 복구 메커니즘에서 이를 활용할 수 있을 것이다.

- 서버가 TIMEOUT 등 이유로 정상 응답을 못준다면?

  -> 이때 클라이언트가 같은 요청을 다시 해도 되는지에 대한 판단의 근거가 된다.

 

3) 캐시가능(Cacheable)

- 응답 결과 리소스를 캐시해서 사용해도 되는지이다.

- GET, HEAD, POST, PATCH 가 캐시 가능하지만, 실제로는 GET, HEAD정도만 사용한다.

  -> 본문 내용까지 캐시 키로 만들기 쉽지 않기 때문이다.

(HTTP 캐시 관련 게시글)

 

 

4. 그래서 어떻게 사용해?

HTTP 메서드를 통해 API 설계를 하는 법은 아래 게시물을 참고 바란다.

https://imgzon.tistory.com/127

 


위 내용은 김영한 님의 인프런 강의 "모든 개발자를 위한 HTTP 웹 기본 지식"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

'cs > 컴퓨터 네트워크' 카테고리의 다른 글

HTTP 상태코드  (0) 2023.01.12
HTTP API 설계하는 법  (0) 2023.01.12
HTTP란?, HTTP 메시지  (0) 2023.01.12
URI, URL, URN란?  (0) 2023.01.11
IP, TCP, UDP, 포트, DNS 정리  (0) 2023.01.11

댓글