본문 바로가기

Infrastructure/Network

[HTTP] 메서드 - 2 (종류)

HTTP 메소드의 종류와 역할을 알아본다.

아래는 주요 메서드 목록과 간략한 설명이다.

  • GET: 리소스 조회
  • POST: 요청 데이터 처리, 주로 등록에 사용
  • PUT: 리소스를 대체, 해당 리소스가 없으면 생성
  • PATCH: 리소스 부분 변경
  • DELETE: 리소스 삭제

아래는 기타 메서드 목록과 간략한 설명이다.
기타 메서드들에 대해서는 간략하게만 알아보고 넘어간다.

  • HEAD: GET과 동일 하지만 메시지 부분을 제외하고 샹태 줄과 헤더만 반환
  • OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
  • CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

주요 메서드들에 대해서 하나씩 자세하게 살펴본다.

https://news.naver.com/main/read.nhn?mode=LSD&mid=shm

GET

  • 리소스를 조회할 때 사용한다.
  • 서버에 전달해야하는 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다.
  • 메시지 바디를 사용할 수 있지만 지원하지 않는 브라우저가 많아서 일반적으로 사용되지 않는다.

차량의 ID를 가지고 차량을 조회하는 요청과 응답 데이터를 살펴보자.

요청

GET /car/100 HTTP/1.1
Host: localhost:8080

응답

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 40

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

POST

  • POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청합니다.(공식 문서)
  • 요청 데이터를 처리한다.
  • 메시지 바디를 통해 서버로 요청 데이터를 전달한다.
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용한다.

새로운 차량을 등록하는 요청과 응답 데이터를 살펴보자.

요청

POST /car HTTP/1.1
Content-Type: application/json

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

응답

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 40
Location: /car/100

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

POST를 정리해보면 아래와 같다

  • 새 리소스 생성(등록)
    • 서버가 아직 식별하지 않은 새 리소스 생성
  • 요청 데이터 처리
    • 단순 데이터를 생성, 변경뿐만 아니라 프로세스를 처리해야 하는 경우
    • 요청 데이터를 따라 프로세스만 처리하고 새로운 리소스가 생성되지 않을 수도 있음
  • POST를 제외한 메서드로 처리하기 애매한 경우
    • JSON으로 조회 데이터를 넘겨야 하는데 GET 메서드를 사용하기 어려운 경우
    • 애매하면 POST를 사용하는 것을 추천

PUT

  • 리소스를 대체한다. (mysql의 on duplicate key update 라고 생각)
    • 리소스가 있으면 대체하고 없으면 생성한다.
  • 클라이언트가 이미 리소스의 위치를 알고 URL을 지정한다.
    • 필자는 이 글을 작성하기 전까지 등록은 POST, 수정은 PUT으로 사용했다. 이글을 읽는 여러분은 이런 실수를 하지않길 바란다.

리소스가 있는 경우와 리소스가 없는 경우의 요청과 응답 데이터를 살펴보자.

기존 리소스가 있는 경우


기존 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

요청

PUT /car/100 HTTP/1.1
Content-Type: application/json

{
    "manufacturer": "hyundai",
    "modelName": "avante"
}

수정된 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "avante"
}

기존 리소스가 없는 경우


기존 리소스 (/car/100)

null

요청

PUT /car/100 HTTP/1.1
Content-Type: application/json

{
    "manufacturer": "hyundai",
    "modelName": "avante"
}

신규 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "avante"
}

PUT의 가장 주의할 점은 기존의 리소스를 대체한다는 것이다.

다시 기존 리소스가 있는 상황에서 PUT으로 요청하는 상황을 살펴보자


기존 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "avante"
}

요청

PUT /car/100 HTTP/1.1
Content-Type: application/json

{
    "modelName": "sonata"
}

대체된 리소스 (/car/100)

{
    "modelName": "sonata"
}

대체된 리소스를 살펴보면 요청시 빠져있던 manufacturer 이 아예 사라진 것을 확인할 수 있다.

PATCH

  • 리소스의 일부분을 변경한다.

차량의 정보를 변경하는 과정을 살펴보자.


기존 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

요청

PATCH /car/100 HTTP/1.1
Content-Type: application/json

{
    "modelName": "avante"
}

일부 변경된 리소스 (/car/100)

    "manufacturer": "hyundai",
    "modelName": "avante"

PUT과는 다르게 요청보낸 부분만 수정된 것을 확인 할 수 있다.

DELETE

  • 리소스를 제거한다.

차량의 정보를 삭제하는 과정을 살펴보자.


기존 리소스 (/car/100)

{
    "manufacturer": "hyundai",
    "modelName": "sonata"
}

요청

DELETE /car/100 HTTP/1.1
Host: localhost:8080

삭제된 리소스 (/car/100)

null

이렇게 HTTP 주요 메서드들에 대해서 자세하게 살펴보았다.
다음장에서는 HTTP 메서드의 속성에 대해서 알아본다.

'Infrastructure > Network' 카테고리의 다른 글

[HTTP] 메서드 - 4 (활용)  (0) 2021.06.23
[HTTP] 메서드 - 3 (속성)  (0) 2021.06.23
[HTTP] 메서드 - 1 (API URI 설계)  (0) 2021.06.23
[HTTP] 메시지 구조  (0) 2021.06.23
[HTTP] 기본  (0) 2021.06.22