HTTP Method는 클라이언트가 서버의 리소스에 대해 어떤 동작을 원하는지를 나타냅니다.
GET은 리소스 조회, POST는 요청 데이터 처리 및 주로 리소스 생성, PUT과 PATCH는 리소스 수정, DELETE는 리소스 삭제에 사용됩니다.
또한 HTTP Method마다 멱등성의 차이가 있습니다.
GET, PUT, DELETE는 HTTP 의미상 멱등합니다. POST와 PATCH는 멱등성이 보장되지 않으며, 구현과 요청 내용에 따라 멱등하게 동작하도록 설계할 수 있습니다.
POST와PUT의 차이는 무엇인가요?
POST는 주로 서버에게 데이터 처리를 요청하거나 새로운 리소스를 생성할 때 사용하며, 일반적으로 서버가 생성된 리소스의 URI를 결정합니다.반면
PUT은 클라이언트가 대상 리소스의 URI를 명확하게 지정하고 해당 리소스를 요청 데이터로 전체 교체할 때 사용합니다.또한
PUT은 동일한 요청을 여러 번 수행해도 최종 리소스 상태가 같기 때문에 멱등하지만,POST는 동일한 요청으로 여러 리소스가 생성될 수 있어 일반적으로 멱등하지 않습니다.
PUT과PATCH의 차이는 무엇인가요?
PUT은 리소스 전체를 요청 데이터로 교체하는 용도이고,PATCH는 리소스의 일부만 수정하는 용도입니다.또한
PUT은 HTTP 명세상 멱등성이 보장되지만,PATCH는 멱등성이 보장되지 않습니다.다만
PATCH도 특정 필드를 특정 값으로 변경하도록 구현한다면 결과적으로 멱등하게 동작할 수 있습니다.
HTTP Method에서 멱등성이 왜 중요한가요?
네트워크 환경에서는 응답 유실이나 타임아웃 때문에 클라이언트가 동일한 요청을 재시도할 수 있기 때문입니다.
PUT,DELETE처럼 멱등한 요청은 동일한 요청을 여러 번 보내도 최종 리소스 상태가 같기 때문에 상대적으로 안전하게 재시도할 수 있습니다.반면
POST처럼 멱등하지 않은 요청은 재시도 과정에서 중복 생성이나 중복 결제와 같은 문제가 발생할 수 있어, 필요한 경우 Idempotency Key 등의 별도 중복 방지 방식을 사용할 수 있습니다.
GET요청으로 데이터를 수정하면 안 되나요?기술적으로 구현할 수는 있지만 HTTP 의미상 권장되지 않습니다.
GET은 서버의 리소스 상태를 변경하지 않는 Safe Method로 정의되어 있기 때문입니다.
GET요청이 상태를 변경하도록 구현하면 브라우저의 prefetch, crawler, cache와 같은 동작만으로 의도하지 않은 상태 변경이 발생할 수 있습니다.따라서 조회는
GET, 상태 변경은POST,PUT,PATCH,DELETE등의 적절한 Method를 사용하는 것이 좋습니다.
DELETE는 실제 데이터베이스의 데이터를 반드시 삭제해야 하나요?아닙니다. HTTP의
DELETE와 데이터베이스의DELETE연산을 반드시 1:1로 대응시킬 필요는 없습니다.
DELETEMethod는 해당 리소스를 제거하도록 요청한다는 HTTP 수준의 의미를 가집니다.따라서 실제 구현에서는 데이터를 물리적으로 삭제하는 Hard Delete뿐만 아니라
isDeleted = true또는status = DELETED처럼 처리하는 Soft Delete 방식도 사용할 수 있습니다.
PATCH는 멱등한가요?HTTP 명세상
PATCH는 멱등성이 보장되지 않습니다.하지만 실제 멱등성 여부는 요청을 어떻게 설계했는지에 따라 달라질 수 있습니다.
예를 들어
nickname을 "eojin"으로 변경한다는 요청은 여러 번 실행해도 최종 상태가 같기 때문에 멱등하게 동작할 수 있습니다.반면
point를 100 증가시킨다와 같은 요청은 호출할 때마다 상태가 달라지므로 멱등하지 않습니다.따라서
PATCH는 멱등하지 않다고 단정하기보다는 멱등성이 보장되지 않는다고 설명하는 것이 정확합니다.
DELETE는 멱등한데 두 번 호출하면 응답이 달라질 수 있지 않나요?멱등성은 응답이 동일한지를 의미하는 것이 아니라, 동일한 요청을 여러 번 수행했을 때 서버 리소스의 최종 상태가 동일한지를 의미합니다.
예를 들어 첫 번째
DELETE /members/1요청은 성공하여200또는204를 반환하고, 두 번째 요청은 이미 존재하지 않는 리소스이기 때문에404를 반환할 수도 있습니다.하지만 두 요청 이후의 최종 상태는 모두 해당 리소스가 존재하지 않는 상태이므로
DELETE는 멱등합니다.
Safe와 Idempotent의 차이는 무엇인가요?
Safe는 해당 요청이 서버 리소스의 상태를 변경하지 않는지를 나타내는 개념입니다.
GET,HEAD와 같은 Method가 Safe Method에 해당합니다.반면 Idempotent는 동일한 요청을 여러 번 수행했을 때 리소스의 최종 상태가 동일한지를 의미합니다.
따라서
DELETE는 리소스를 삭제하기 때문에 Safe하지 않지만, 여러 번 요청해도 최종적으로 리소스가 삭제된 상태라는 점은 같기 때문에 멱등합니다.