HTTP 메소드의 멱등(Idempotent)란?

냥린이·2022년 1월 29일
0

웹 개발

목록 보기
7/10

학창 시절에 멱등 함수를 들어본 기억이 있을 것이다. 원래 수학이나 전산학에서 등장하는 단어인데, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.

위키피디아에서는 다음과 같이 정의하고 있다.

어떤 단항연산(또는 함수)은 어느 값에라도 두 번 적용되었을 때, 한 번 적용했을 때와 같은 결과를 주는 경우, 즉 f(f(x)) ≡ f(x)인 경우 멱등법칙을 만족한다고 한다. ... 예를 들어, 절댓값 함수는 멱등법칙을 만족한다: abs(abs(x)) ≡ abs(x)

소프트웨어에서는 몇 번을 호출하던지 결과가 동일해야 한 경우를 멱등하다고 한다.

MS에서는 엘리베이터를 예시로 들고 있다. 엘리베이터 버튼을 몇 번 누르던지, 엘리베이터가 호출한 층으로 온다는 사실은 변하지 않는다.

그렇다면 HTTP의 메소드 중 get, put, delete, post 중 멱등 메소드는 무엇일까?

답은 post를 제외한 전부이다. get의 파라미터, put의 데이터, delete의 파라미터가 동일할 때 각 메소드는 멱등하게 기능한다.

  • get이 멱등하다는 것은 쉽게 알 수 있다. 다만 멱등은 트랜잭션이 lock되지 않아서 데이터가 변경되는 것 같은 외부 요인은 고려하지 않는다.

  • put도 동일한 데이터를 계속 덮어쓰기하는 결과이기 때문에 멱등하다.

  • delete의 경우 코드에 따라 에러를 출력할 수도 있겠지만, 데이터의 관점에서 봤을 때 삭제되었다는 사실이 변하지는 않는다.

  • 반면, post에서 리소스를 새로 생성하거나, 쿼리를 요청하는 경우 동일한 명령이 n번 발생되면 결과가 달라진다. 예를 들면 결제가 여러번 되거나, 게시글이 여러번 작성되는 것이다.

  • 추가로, 데이터를 일부만 수정하는 patch의 경우도 멱등성이 보장되지 않을 수 있다. (운이 좋으면 결과가 동일할 수도 있다.)

결론적으로 멱등성이 보장되지 않는 메소드는 로직단에서 중복 검사를 통해 사용자 피해를 예방하는 방어코드를 추가해주는 것이 좋다.

또한 서버-클라이언트간 통신에 이상이 있어서 재요청을 해야하는 자동 복구 메커니즘에서 멱등을 보장하는 메소드와 아닌 것을 구분할 수 있어야 한다.

profile
홀로서기 기록장

1개의 댓글

comment-user-thumbnail
2023년 11월 20일

큰 도움이 됐습니다

답글 달기