시험기간이라 짧게 적겠다.
api를 설계하던 중 이런 생각이 들었다.
리소스의 기존 상태에 의존하는 patch 류의 api를 호출할 때, 클라이언트의 버전과 서버의 버전이 다르면 어떻게하지?
대충 그리자면 이런 상황이다. 몇 가지 해결책을 고민했었는데,
1. PUT 요청으로 리소스 자체를 덮어쓴다.
이 경우,, 리소스 크기가 클 경우 매우 비효율적일 수 있고, 클라이언트 측에 너무 많은 권한이 주어지는 문제가 있었다.
그래서 생각한게, JPA의 낙관적 락 처럼 버전 필드를 삽입하는 거였다. 이 버전이 다른 경우, 서버 측에서 거부하는 방식을 생각했다.
그리고 더 서칭을 하다 보니, HTTP에는 이러한 역할을 하는 헤더가 있었으니,
etag와 if-match 헤더였다.
리스폰스시 etag 헤더에 태그를 붙이고,
요청시 if-match 헤더에 이 태그를 넣어 요청을 보내면 된다.
만약 버전이 다를 경우 412 (Precondition Failed)로 거부하면된다.
동시성에 예민한, 이전의 상태가 영향을 미치는 API를 설계할 때 활용하면 좋을거 같다. 물론, 그것이 가능한 상황이라면, 최대한 stateless하게 설계하는게 가장 좋을 것이다.