멱등성이란, 수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 실행하더라도 결과가 달라지지 않는 성질을 의미합니다.
이 멱등성을 HTTP Method에 적용한다면 동일한 요청을 계속해서 보낸 결과가 같은 효과를 갖고 있다면 서버의 상태도 동일하게 남는다는 것을 의미합니다. 물론 다른 side effect가 존재해서는 안됩니다!
올바르게 구현된 REST API의 GET / PUT / DELETE 메서드에서는 멱등성이 보장됩니다.
GET
: 서버에 존재하는 리소스를 읽는 메서드이기 때문에 여러 번 실행해도 결과값은 변하지 않습니다. 때문에 GET Method는 멱등성이 보장됩니다.
PUT
: PUT의 경우, 서버에 존재하는 리소스를 요청에 담긴 내용대로 대체, 바꿔버리기 때문에 여러 번 수행되어도 결과 값은 변하지 않습니다. PUT도 멱등성이 보장됩니다.
DELETE
: 존재하는 데이터를 삭제한 결과를 삭제하더라도, 존재하지 않는 결과를 삭제하더라도 응답 코드는 다를 뿐, 서버 상태 자체는 변하지 않기 때문에 여러 번 수행되어도 결과 값이 같기 때문에 멱등성이 보장됩니다. (클라 입장에서 바라보면 약간 마음 아픔)
그렇다면 POST Method는 어떨까요?
POST의 경우, 메서드가 호출될 때마다 DB 등에 요청된 데이터가 추가될 것이고, 이는 멱등성을 위배합니다. 극단적으로 가입 버튼을 와다다 누르며 POST 요청을 계속해서 쏠 경우, 같은 정보를 갖고 있는 가입자가 계속해서 DB에 쌓이기 때문에, 이는 멱등성이 위배됩니다.
PATCH의 경우, 항상 멱등성을 보장한다고 할 수는 없습니다. 설계 방식에 따라서 달라지게 됩니다. PUT은 요청 데이터가 기존 데이터로 완전히 덮어씌워지지만, PATCH는 일부분을 수정할 때 사용하기 때문에 PUT과 동일한 방식으로 구현하게 될 경우 멱등성을 갖는다고 할 수 있다.
HTTP Method의 멱등성은 HTTP 스펙의 규약일 뿐이기 때문에 꼭 지켜야 할 것은 아니지만 권장한다!