[ 기술 스터디 ] PUT과 PATCH 차이

김민석·2021년 6월 21일
18

기술 스터디

목록 보기
5/18

참고

PUTPATCH 메서드는 기존에 존재하던 자원에 업데이트를 실시한다. 둘 다 업데이트를 실시하기 때문에, 혼용해서 API를 구축하게 되기 쉽다.
그러나 이 둘은 엄연히 다르다. 지금부터 그 차이를 알아볼 것이다.
그 전에, 둘의 정확한 정의를 알아봐야겠다.

PUT과 PATCH의 정의

PUT :

The HTTP PUT request method creates a new resource or replaces a representation of the target resource with the request payload.

HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체합니다.

PATCH :

The HTTP PATCH request method applies partial modifications to a resource.

HTTP PATCH 메소드는 리소스의 부분적인 수정을 할 때에 사용됩니다.


정의를 보면 차이가 뚜렷하게 보이지 않는다. 아래의 예시와 함께하는 설명들을 읽으면 명확해질 것이다.

아래의 예시는 다음의 세 부분으로 구성되어 있다. PUTPATCH의 차이를 나타내려 하였다.

1) update 방식의 차이
2) 요청한 URI에 자원이 존재하지 않을 때
3) 멱등성의 관점


코드 예시

update 방식 관점

PUT

아래와 같은 리소스가 있다고 가정해보자.

idbalancename
1100민석
220민찬
3-120민종

이중 id === 1인 사람에게 PUT 요청을 두 종류로 보낼 것이다.

1.

PUT /customers?id=1
{
	name : 민돌
        balance : 0
}

2.

PUT /customers?id=1
{
	name : 민돌
}

전자는 자원의 모든 상태를 새로운 값을 대입하여 보낸 요청이고,
후자는 일부만 새로운 값을 보낸 요청이다.

이 둘의 결과는 다음과 같은 차이를 보인다.
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

1.

idbalancename
10민돌
220민찬
3-120민종

2.

idbalancename
1null민돌
220민찬
3-120민종

즉, 보내지 않은 값은 null로 대체된다. 다시 말해서, PUT의 정의처럼 대상 리소스를 나타내는 데이터를 대체한다.



PATCH

PUT에서 사용했던 예시와 같은 예시를 사용할 것이다. 요청 또한 아래와 같이 두 개가 있다.

1.

PATCH /customers?id=1
{
	name : 민돌
        balance : 0
}

2.

PATCH /customers?id=1
{
	name : 민돌
}

이 둘의 결과는 다음과 같은 차이를 보인다.
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

1.

idbalancename
10민돌
220민찬
3-120민종

2.

idbalancename
1100민돌
220민찬
3-120민종

즉, 보내지 않은 값은 그대로 유지되고 있다.



요청한 URI에 자원이 존재하지 않을 때

PUT

새로운 자원을 생성한다.

예시에서

PUT /customers?id=4
{
	name : 갑수
        balance : 99999
}

라는 요청을 보내면, 결과는 다음과 같다.

idbalancename
1100민돌
220민찬
3-120민종
499999갑수

PATCH

새로운 자원을 생성하지 않는다.

예시에서

PATCH /customers?id=4
{
	name : 갑수
        balance : 99999
}

라는 요청을 보내면, 결과는 다음과 같다. (서버는 오류를 응답에 보낸다.)

idbalancename
1100민돌
220민찬
3-120민종

멱등성 관점

멱등성의 정의

An HTTP method is idempotent if an identical request can be made once or several times in a row with the same effect while leaving the server in the same state.

동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다.

이를 이렇게도 표현할 수 있다.

f(f(x)) = f(x) for any value x

즉, 서버로 요청을 여러번 날리는 행위와 한 번 날리는 행위가 같은 결과를 내면 멱등성이 있다고 할 수 있겠다.


지금까지 예시들의 문제

MDN 문서 등을 보면
PUT은 멱등성을 가지지만, PATCH는 멱등성을 가지지 않는다고 한다. 그런데 위에 작성한 예시들에서 PUTPATCH는 모두 멱등성이 있는 것 '처럼' 작동하는 문제가 있다.

다시 한 번 올라가서 살펴보면 PATCH 요청 또한 아무리 날려도 같은 값을 리턴하리라는 것을 알 수 있다.

그렇다면 PATCH는 왜 멱등성을 가지지 않는다고 한 것일까?
여기의 답변을 참고하여 다시 한번 위의 예시를 갖고 와야겠다.

idbalancename
1100민석
220민찬
3-120민종

이 글에서 위 리소스는 /customers URI를 통해 접근하는 것으로 가정하였다.

그렇다면 PUTPATCH 요청을 /customers 자체에 보내는 경우를 가정하면?


멱등성을 가지지 못하는 PATCH 예시 :

아래의 요청을 두 번 보낼 것이다.

PATCH /customers
{

	name : 갑수
        balance : 99999

}

첫 번째

idbalancename
1100민돌
220민찬
3-120민종
499999갑수

두 번째

idbalancename
1100민돌
220민찬
3-120민종
499999갑수
599999갑수

1개의 댓글

comment-user-thumbnail
2024년 3월 13일

안녕하세요. 블로그 잘봤습니다. 궁금한게 있어서 여쭤보려고 합니다. Patch는 새로운 자원을 생성할 수 없다고 했는데 맨아래에서 멱등성에 예시를 들 때, 새로운 자원이 생성되었는데 혹시 예시를 보여주기 위해서 일까요?

답글 달기