코드 저장소

공부에는 끝이 없다!

HTTP

HTTP - HTTP 메서드 (2)

VarcharC2K 2024. 1. 11. 17:01

PUT

put은 리소스를 대체하는 메서드이다.

다만 리소스가 없으면 생성하고, 리소스가 있으면 대체한다.

예를 들어, 우리가 파일을 저장할때 같은 이름이 없으면 생성하고, 없으면 덮어씌우는 것과 같은 동작이다.

 

PUT을 사용할 때 중요한 점이 있는데 클라이언트가 리소스를 식별한다는 것이다.

이게 무슨 말이냐면 이전에 POST 메시지를 살펴보자.

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

{
	"userId":"1",
    "username":"hong"
}

URI를 보면 뒤에 /{id}값이 없다. 이는 POST 메서드는 클라이언트가 리소스를 식별하는 것이 아니라 POST로 들어온 데이터를 서버가 처리하는 것이 주 목적이기 때문이다.

하지만 PUT의 경우는 클라이언트가 리소스를 식별하여야한다.

PUT /members/1 HTTP/1.1
Content-Type: application/json

{
	"userId":"1",
    "username":"Lee"
}

메시지를 보면 뒤에 아이디값이 있는 것을 확인할 수 있다.

즉, 클라이언트가 리소스 위치를 알고 URI를 지정한다는 점이 POST와의 차이점이며 그렇기 떄문에 있으면 대체하고 없으면 생성하는 것이 가능하다.

예를 들어, 위의 메시지를 보내게 되면 우리가 POST로 만들어 놓은 UserId 1번의 UserName이 "Hong"에서 "Lee"로 변경 될 것이다.

물론 1번의 값이 존재하지 않는다면 Lee라는 새로운 유저를 생성하게 될 것이다.

 

조금 더 자세하게 설명하자면 PUT은 리소스를 완전히 대체하는 개념이다.

예를 들어 회원 정보가 UserName과 phone 이라는 속성값으로 이루어져 있다고 생각해보자.

1번 ID값을 가진 회원의 정보를 생성/수정 한다면 Put은 다음과 같이 진행 될 것이다.

 

PUT /members/1 HTTP/1.1
Content-Type: application/json

{
    "username":"Lee",
    "phoneNumber":111-111-1111
}

 

그런데 여기서 userName을 누락하고 Put을 보낸다면 어떻게 될까?

PUT /members/1 HTTP/1.1
Content-Type: application/json

{
    "phoneNumber":111-111-1111
}

이런 경우 1번 회원의 username 필드가 아예 삭제되어 버린다.

즉, 이미 생성된 리소스에 대해서 완전히 대체하는 개념이기 때문에 기존 값을 날려버리게 되는 것이다.

그럼 만약 휴대폰 번호만 수정하고 싶은 경우는 어떻게 해야 할까?

이럴때 사용하는 것이 PATCH이다.


PATCH

patch는 리소스 부분을 변경하는 메서드이다.

당연히 클라이언트가 리소스 위치를 식별하고 있어야 하며 PUT과는 다르게 전달 받은 데이터로 수정만 진행한다.

예를 들어서 PUT 메서드를 통해 다음과 같은 회원 정보를 만들었다고 생각해보자.

PUT /members/1 HTTP/1.1
Content-Type: application/json

{
    "username":"Lee",
    "phoneNumber":111-111-1111
}

 

여기서 우리는 정보 수정을 통하여 휴대폰 번호만 변경하고자 한다.

그렇다면 PATCH 메시지는 다음과 같을 것이다.

PATCH /members/1 HTTP/1.1
Content-Type: application/json

{
    "phoneNumber":222-2222-2222
}

 

이렇게 하면 서버에서 메시지를 받아 해당 부분만 변경하게 된다.

 

다만, PATCH를 지원하지 않는 서버가 있는데 이런경우 POST로 진행해도 무방하다.

 


DELETE

Delete는 말 그대로 리소스를 제거하는 메서드이다.

메시지 형태는 다음과 같다.

DELETE /members/1 HTTP/1.1
Host: localhost:8080

 

당연히 따로 바디가 필요하지 않으며 서버가 메시지를 전달받으면 리소스를 제거한다.

 

'HTTP' 카테고리의 다른 글

HTTP - HTTP 메서드 활용하기  (0) 2024.01.12
HTTP - HTTP 메서드의 속성  (0) 2024.01.11
HTTP - HTTP 메서드  (0) 2024.01.10
HTTP - HTTP 기본  (1) 2024.01.09
HTTP - URI와 웹 브라우저 요청 흐름  (2) 2024.01.08