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 |