멱등성?

1

개념정리

목록 보기
1/10
post-thumbnail

아니 멱살 말고;;

위키백과에서 말하는 멱등성

멱등법칙 위키백과 링크

'연산을 여러번 적용하더라도 결과가 달라지지 않는 성질'을 의미한다고 한다.
위키백과에서는 그 설명 아래로는 전부 수학적인 개념을 설명하고 있다.
(수...수학이라고?)

내가 이해한 것

f(f(x))=f(x)f(f(x)) = f(x)

이면 멱등성을 가진다고 이해했다.

MDN에서 말하는 멱등성

MDN 멱등성 용어사전 링크

동일한 요청을 여러번 연속으로 보내도 같은 효과를 지니고, 서버의 상태도 동일할 때 멱등성을 가진다고 한다고 설명한다.
스레드 안전한 메서드도 멱등성을 가진다고 한다.

그런데, GET요청이 멱등성을 갖는다는건 알겠는데, PUT과 DELETE도 멱등성을 갖는다고 적혀있다.
(올바르게 구현한 경우 GET, HEAD, PUT, DELETE 메서드는 멱등성을 가지며, POST 메서드는 그렇지 않습니다.)
서버에 상태가 동일해야 된다며? 삭제하거나 변경하면 달라지는데 이게 무슨 소리야?!

PUT과 DELETE의 멱등성

MDN에 적혀있는 DELETE의 멱등성

DELETE /idX/delete HTTP/1.1 의 상태 코드는 응답마다 달라질 수 있지만, 그럼에도 멱등성을 가집니다.

DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404

내가 이해한 것

DELETE의 멱등성

위의 상황대로라면 DELETE를 계속 보낼 때 처음엔 200, 그 다음부터는 404만 받게 된다.

하나의 데이터에 대해서만 삭제를 일으키고 더 이상 똑같은 요청에 의해서는 다른 데이터의 변경을 일으키지 않는다.

PUT의 멱등성

PUT도 마찬가지로, 최초에 해당 인덱스를 변경시키긴 하지만 그 후에는 계속 동일한 상태로 남는다.
똑같은 요청만 보낸다면 다른 데이터에 대해서는 어떠한 변경도 일어나지 않는다.

만약 존재하지 않는 인덱스를 대상으로 PUT요청을 보냈다면 계속 404를 받을테고.

이해한 것 정리

똑같은 요청을 반복해서 연속적으로 보냈을 때, 첫번 째 요청 이후 다음 요청부터는 데이터에 변경을 주지 않으며, 동일한 응답을 받는다면 멱등성을 가진다고 말하는 것 같다.

그런 점에서 POST는 매번 요청마다 같은 응답을 받아도 전체 데이터에는 계속 추가가 일어나기 때문에 멱등성을 가지지 못한다고 하는것이라 이해했다.

HTTP명세에 적힌 멱등성

HTTP명세의 멱등성 부분 링크

4.2.2.  Idempotent Methods

   A request method is considered "idempotent" if the intended effect on
   the server of multiple identical requests with that method is the
   same as the effect for a single such request.  Of the request methods
   defined by this specification, PUT, DELETE, and safe request methods
   are idempotent.

멱등성을 갖는 메서드란 한번 요청했을 때랑 다량(multiple)으로 요청했을 때 같은 효과가 나는 것 이라고 하고, PUT, DELETE, 그리고 안전한 메서드가 멱등성을 가졌다고 한다.
(영어를 잘 못해서 잘못 읽었을지도 모른다.)

HTTP 공식문서에도 PUT이랑 DELETE의 언급이 있다니...

처음 알게된 입장에서 굉장히 의외였다.

f(f(f(x)))=f(f(x))f(f(f(x))) = f(f(x))
는 만족하는데

f(f(x))=f(x)f(f(x)) = f(x)
는 만족하지 못하는게 어떻게 멱등성이라고 말할 수 있지? 하고 말이다.

profile
지상 최강의 개발자 쥬니니

2개의 댓글

comment-user-thumbnail
2021년 4월 22일

response가 아닌 데이터(상태)를 생각해보세요.
f(f(x))=f(x) -> 1번 유저를 한번 지우거나 여러번 지워도 1번 유저가 없는 상태는 같습니다.

1개의 답글