http POST 메소드에서 DELETE, PUT 사용해도 될까?, 멱등성이란?
http POST 메소드에서 DELETE, PUT 사용해도 될까?
http 멱등성(idempotency)
- 멱등성이란 연산을 여러번 적용해도 결과는 한번 적용했을때와 같은 성질을 말한다.
- 대표적인 예로 절댓값이 존재한다.
- 절댓값 -3은 절댓값-3의 절댓값과 같은 값을 가진다. => |-3| == ||-3||
- 절댓값연산을 한번 이상 적용해도 한번 적용한 값과 항상 같다.
안전한 메소드
- 안전한 메소드란 서버의 상태를 변화시키지 않는 메소드를 말한다.
GET
HEAD
OPTIONS
와 같이 조회에 사용되는 메소드가 이에 해당한다.
- 모든 안전한 메소드는 멱등성을 만족하지만, 이 역은 성립하지 않는다.
REST
- http POST 메소드에서 POST에 관한 요청이나 DELETE에 관한 요청을 수행해도 사실 문제없이 작동한다.
- REST에서 자주 등장하는 4가지 메소드가 있으며 이는
GET
POST
PUT
DELETE
가 존재한다.
- 이중에서
POST
를 제외한 나머지는 멱등성 (idempotency)이 보장되어야 한다.
GET
: GET요청은 DB를 읽을때 사용하며 이를 반복해서 실행해도 서버의 상태가 변하지 않는다. 따라서 결과가 달라지지도 않으며, 이는 멱등성을 보장하며 또한 안전한 메소드이다.
PUT
: PUT요청을 반복해서 실행하면 처음 한번을 제외하고는 나머지는 항상 같은 결과가 나온다. 이는 멱등성을 보장하지만 안전한 메소드는 아니다.
DELETE
: DELETE요청도 마찬가지로 해당 데이터가 존재 하거나 하지 않거나 두가지 경우 모두 처음을 제외하고 나머지 반복은 항상 같은 결과가 나타난다. 이는 멱등성을 보장하지만 안전한 메소드는 아니다.
POST
: POST요청을 반복해서 실행한다면 데이터들은 반복해서 추가된다(같은 내용이지만 다른 데이터). 이는 멱등성을 보장하지 않으며 또한 안전한 메소드도 아니다.
- POST 메소드를 통해 어떠한 정보를 수정한다고 가정해보자.
- POST 메소드는 멱등성을 만족하지 않으므로, 해당 메소드를 반복해서 수행한한다면 다른 결과를 초래할 수 있다.
- 예를들어 위의 요청이 시간초과로 인해 문제가 발생했다면 해당 정보는 실제로 수정 되었는가? 아니라면, 이 문제는 해당 요청을 서버로 보낼때 발생했는가? 클라이언트로 응답할때 발생했는가? 같은 요청을 재수행해도 DB는 안전한가? 등등 많은 질문이 생길수 있다.
- 하지만 멱등성을 만족하는 메소드를 사용함으로 인해, 우리는 위 질문들에 대한 답변을 하지 않아도 되며 안전하게 요청을 재시작해 올바른 응답을 받을 수 있다.
- 따라서, 위와 같은 문제들을 고민하지 않기 위해 멱등성을 따르는 메소드를 사용하며 더 안전하게 RESTful한 코드를 완성시킬 수 있다.
References