PUT is idempotent, PATCH isn't

  • PATCH {HTTP}
  • Use of PUT vs PATCH methods in REST API real life scenarios {SOF}
  • What is idempotent? 멱등성이란?
    • 수학용어에서 온 멱등성은 모든 \(x\)에 대하여 \(f(f(x)) = f(x)\) 를 만족하는 함수 \(f\)를 멱등함수라고 부른다. 그러니까 자연수를 예로 들면 곱하기 1 같은건 몇번을 x에 적용해도 계속 같은 값이 나오잖아.
  • PUT이 멱등인 이유

    • PUT은 멱등이다. 유저 필드를 변경하기 때문이다. 만약 같은 필드로 여러번 PUT 요청을 보낸다면 당연하게도 계속 같은 값으로 변경될 것이다.
    • 예를 들어 /users/<id> URI에게 다음과 같은 PUT 요청을 보낸다고 가정하자.
    PUT /users/1
    [{"username": "asdf", "email": "test@example.com"}]
    
    • 해당 요청을 수백 번 보낸다고 할지라도 우리가 id:1 유저의 상태, 데이터베이스 전체 상태가 변하지 않는다는 사실은 잘 알 수 있다.
    • PATCH가 멱등이 아닌 이유
    • PATCH는 겉으로 보기엔 단지 엔티티의 필드 일부를 변경하는 것처럼 보인다. 하지만 그것은 틀렸습니다. 다음 답변을 보면 PATCH 메서드 인자의 필드에 op: add를 넣어 /users 리소스에 별도의 명령을 주입하는 것을 볼 수 있다. 따라서 같은 메서드를 여러번 호출하게 되면 이전과 다른 상태를 가지게 될 것이고, 이는 멱등규칙을 어기게 된다.
    • 물론 이 방식은 완전히 RESTful 하지 않지만 (op의 의도를 파악할 수 없음) RESTful API란 무엇인가 -- web, resources, osi 7layers 내용을 따르면 충분히 REST한 api를 설계할 수 있음을 알 수 있다.