HTTP 메서드의 멱등성(idempotence)이란 해당 메서드를 한 번 실행하든 여러 번 실행하든 결과가 동일하게 유지되는 특성을 말합니다. 다시 말해, 서버의 상태는 요청을 한 번만 수행한 경우와 여러 번 수행한 경우가 동일하게 보장됩니다.
HTTP 메서드 중에서 다음 메서드들은 멱등성을 가지고 있습니다:
GET: 서버의 자원을 요청합니다. 이 요청은 서버의 상태를 변경시키지 않아야 하므로 멱등성을 가집니다.
PUT: 서버의 특정 자원을 새로운 데이터로 업데이트합니다. 같은 데이터로 동일한 자원에 대해 이 작업을 여러 번 수행하더라도 최종 결과는 같으므로 멱등성을 가집니다.
DELETE: 서버의 특정 자원을 제거합니다. 같은 자원을 여러 번 삭제하려 해도, 첫 번째 삭제 이후에는 아무런 효과가 없으므로 멱등성을 가집니다.
HEAD: GET과 유사하지만, 실제 데이터 대신 헤더 정보만 반환합니다. 따라서 멱등성을 가집니다.
OPTIONS: 서버에서 사용 가능한 메서드 목록을 조회합니다. 이는 서버의 상태를 변경하지 않으므로 멱등성을 가집니다.
그러나, POST 메서드는 멱등성을 가지고 있지 않습니다. POST는 보통 새로운 리소스를 생성하거나, 서버의 상태를 변화시키는 데 사용되며, 이러한 작업은 여러 번 수행되면 서버의 상태도 그만큼 변하게 됩니다. 따라서 POST는 요청을 여러 번 보내면 서버의 상태가 다르게 변할 수 있으므로, 멱등성이 없습니다.
HTTP 메서드의 'PUT'과 'PATCH'는 모두 리소스를 업데이트하는 데 사용되지만, 사용 방식과 성질에서 몇 가지 중요한 차이점이 있습니다.
멱등성(Idempotence): PUT 메서드는 멱등(idempotent)입니다. 이는 PUT 요청을 한 번 보내는 것과 여러 번 보내는 것이 동일한 결과를 초래한다는 것을 의미합니다. 즉, 같은 요청을 반복적으로 보내도 서버의 최종 상태는 동일합니다. 반면에, PATCH 메서드는 일반적으로 멱등성을 가지지 않습니다. 즉, 동일한 PATCH 요청을 여러 번 보내면 다른 결과가 나올 수 있습니다.
전체 업데이트 vs 부분 업데이트: PUT 메서드는 대상 리소스의 전체를 업데이트합니다. 요청 본문에 전체 리소스 상태를 제공해야 하며, 제공되지 않은 필드는 없는 것으로 간주하고 삭제되거나 초기화될 수 있습니다. 반면에, PATCH 메서드는 리소스의 일부만 업데이트하는 데 사용됩니다. 요청 본문은 변경하려는 필드만 포함하며, 제공되지 않은 필드는 변경되지 않습니다.
1. PUT
메서드: 멱등성을 가짐.
예를 들어, 우리가 특정 유저의 정보를 갱신하는 PUT
요청을 다음과 같이 만들어보겠습니다.
PUT /users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "new_username",
"email": "new_email@example.com"
}
이 요청은 id
가 123
인 유저의 username
과 email
정보를 갱신하라는 의미입니다. 이 PUT
요청을 한 번 보내든, 두 번 보내든 결과는 동일합니다. 즉, username
과 email
이 갱신되어 new_username
과 new_email@example.com
으로 설정됩니다. 이 같은 상황에서는 PUT
메서드가 멱등성을 가지고 있음을 알 수 있습니다.
2. PATCH
메서드: 상황에 따라 멱등성을 가지지 않을 수 있음.
예를 들어, 유저의 방문 횟수를 증가시키는 PATCH
요청을 다음과 같이 만들어보겠습니다.
PATCH /users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"visitCount": "+1"
}
이 요청은 id
가 123
인 유저의 visitCount
를 1 증가시키라는 의미입니다. 이 요청을 한 번 보내면 visitCount
가 1 증가하지만, 같은 요청을 다시 보내면 visitCount
가 다시 1 증가합니다. 따라서 결과는 요청을 보낸 횟수에 따라 다르며, 이런 상황에서 PATCH
메서드는 멱등성을 가지지 않습니다.