학창 시절에 멱등 함수를 들어본 기억이 있을 것이다. 원래 수학이나 전산학에서 등장하는 단어인데, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.
위키피디아에서는 다음과 같이 정의하고 있다.
어떤 단항연산(또는 함수)은 어느 값에라도 두 번 적용되었을 때, 한 번 적용했을 때와 같은 결과를 주는 경우, 즉 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의 경우도 멱등성이 보장되지 않을 수 있다. (운이 좋으면 결과가 동일할 수도 있다.)
결론적으로 멱등성이 보장되지 않는 메소드는 로직단에서 중복 검사를 통해 사용자 피해를 예방하는 방어코드를 추가해주는 것이 좋다.
또한 서버-클라이언트간 통신에 이상이 있어서 재요청을 해야하는 자동 복구 메커니즘에서 멱등을 보장하는 메소드와 아닌 것을 구분할 수 있어야 한다.
큰 도움이 됐습니다