주요 HTTP Method인 GET / POST / PUT / PATCH / DELETE 는 각 메서드의 동작 과정 뿐 아니라
메서드의 속성 또한 알 필요가 없다. 왜냐하면 어떠한 HTTP 메서드로 서버에 요청했느냐에 따라 API 설계나
복구 메커니즘 캐시 최적화 등, 설계 로직이 달라질 수 있기 때문이다.
HTTP 메서드의 속성으로는 안전,멱등,캐시 가능이 있다. 이들을 하나씩 살펴보도록 하자.
HTTP 메소드의 안정성은 보안 취약성을 말하지 않는다.
호출해도 리소스가 변경되지 않는 성질을 말한다.
GET 메서드는 단순히 데이터를 조회하는 기능을 수행하기 때문에 리소스를 변경 및 수정 하지 않아 안전한
HTTP 메소드이다.
반면 POST PUT PATCH DELETE 메서드들은 호출할 경우 데이터에 변경이 발생, 서버에서 삭제되기 때문에
안전하지 않은 HTTP 메서드이다.
메서드 속성의 두 번째는 멱등이다.
멱등의 사전적 정의는 다음과 같다.
연산을 여러번 적용하더라도 결괏값이 달라지지 않는 일
멱등이란 한 번을 호출하든 여러 번을 호출하든 그 결과가 같음을 의미한다.
즉 , 동일한 요청을 한 번 보내나 여러 번 연속으로 보내나 같은 효과를 가지고, 서버의 상태도 동일하게 남을 때 해당 HTTP 메서드가 멱등성을 가진다고 말할 수 있다.
여기서 말하는 호출을 실행한 결과는 응답 상태 코드가 아닌 서버의 상태다. 예를 들어 똑같은 요청을 했을 때
응답하는 상태코드가 다르더라도 서버의 상태가 같다면 멱등성이 있다고 판단한다.
HTTP 스펙 명시에 따르면 GET,PUT,DELETE 는 멱등성을 가지도록, POST,PATCH는 멱등성을 가지지 않도록 구현한다.
GET은 데이터를 조회하는 메서드로 한 번을 조회하거나 여러 번을 조회하거나 같은 결과가 조회된다. 따라서,안전과 멱등을 동시에 만족하는 메서드이다.PUT은 Body에 담아 보낸 데이터로 리소스를 완전히 대체하는 메서드다. 따라서, 여러 번 메서드를 실행한다고 하더라도 항상 새로운 리소스로 대체되기 때문에 멱등 속성을 만족한다.DELETE는 리소스를 삭제한는 메서드다. 그래서 결과는 항상 같다. 리소스가 삭제되어 존재하지 않는 결과는 항상 동일하기 때문이다. 그래서 DELETE는 멱등 속성을 만족한다.그렇다면 POST와 PATCH는?
POST는 멱등을 만족하지 않는다.
만약, POST가 결제 요청 기능을 수행하는 경우, POST 메서드가 여러 번 실행되면 여러 번 결제가 요청된다.
게시물을 포스팅하는 기능을 수행할 때는, 같은 게시물이 여러번 포스팅 된다.
즉, 한 번 수행되었을 때와 여러 번 수행되었을 때의 결과가 달라 멱등하지 않다.
PATCH는 멱등하거나 멱등하지 않도록 설계될 수 있다.
만약, {name:"Kim"} 이라는 데이터를 Body 에 담아 PATCH 로 요청할 경우, 기존 리소스의 name 컬럼을 단순히 "Kim" 으로 변경하는 기능을 수행하기 때문에 이러한 경우는 멱등하다고 볼 수 있다.
하지만, {"operation" : "add", "age" : 10} 과 같이 요청 시마다 age 컬럼에 10 을 더해주는 식으로 설계하게 될 경우에는 age 컬럼이 누적되어 증가하기 때문에 멱등 속성을 만족하지 않는다.
HTTP 의 멱등성을 알고 있으면 어떤 메서드를 사용할 지 선택할 수 있다. 아는게 힘이다.
출처
https://inpa.tistory.com/entry/HTTP-%F0%9F%8C%90-%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-HTTP%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C%EC%9A%94