< 질문 정리 >
Q. DELETE 메서드를 호출해 파일을 삭제한다고 가정했을 때, 2번째 호출의 응답을 어떻게 하는것이 코드 레벨에서 좋은 설계인가?
<가정>
- 클라이언트에서 파일 삭제를 요청, 서버에서 성공했으나 정상응답을 주지 못함
- 클라이언트는 정상 응답을 받지 못했으니 재요청을 함
재요청을 했을 때 서버는 2가지 방식으로 응답할 수 있을 것 같다.
1. 이미 삭제된 파일을 삭제하라고 하는 요청이니 "파일이 존재하지 않습니다"같은 오류메세지와 함께 오류 코드를 응답한다.
2. 이미 이전 요청에서 삭제된 파일이지만 현재 파일은 삭제된 상태이므로 삭제를 성공했다고 응답한다.
'멱등'은 클라이언트의 관점이 아닌 '해당 리소스 관점'에서 보는 것이다. 1,2 번 방식 둘다 리소스 관점에서 삭제된 상태이므로 어느 방식을 사용해도 무방하다.
-> 상황에 따라 다르겠지만 '사용성 측면'에서 1번이 더 나은 방법이라고 생각한다.
Q. PUT, DELETE 메서드가 '캐시 불가능'인 이유는?
-> 캐시 가능 메서드인가를 판단하는데 중요한 점은 '데이터의 변경 관점'이다. '캐시'라는 것은 원본 데이터가 변경되지 않고 유지되어야 한다. 만약 post,put,delete,patch로 데이터를 변경하게 되면 '원본 데이터'가 변경되기 때문에 캐시를 유지하기가 어렵다.
GET은 단순 조회이기 때문에 데이터를 병경하지 않으므로 캐시 가능 메서드이다. HTTP에서는 저 4개의 메서드들을 캐시 가능 메서드라고 선언해 두었지만, 실제로는 데이터를 변경할 가능성이 있기때문에 대부분 캐시를 유지하지 않도록 구현한다.