존재하지 않는 리소스의 DELETE 요청에 대한, 상태값은 204와 404 중 무엇이 적절할까요? #8
Replies: 5 comments 1 reply
-
구분 짓고 가야할 부분저는 이 주제에서 먼저 구분해야 하는 지점은 DELETE가 멱등하다는 것은 같은 요청을 여러 번 보내도 서버의 최종 상태가 같아야 한다는 의미이지, 예를 들어 /reservations/1 리소스를 삭제하는 요청을 보냈다고 가정해보면,
이후 같은 요청을 다시 보내면 이미 리소스는 존재하지 않습니다. 즉, 첫 번째 요청 이후에도 없고, 두 번째 요청 이후에도 없습니다. 무엇이 더 적절한지에 대한 해석그렇다면 204와 404 중 무엇이 더 적절한지는, 1. “삭제 결과”에 초점을 두면 204도 가능하다클라이언트의 의도가 “이 리소스가 더 이상 존재하지 않게 해줘”라면, 이 관점에서는 존재하지 않는 리소스에 DELETE를 보내도 최종 상태가 원하는 대로 되었으므로, 특히 클라이언트가 재시도 로직을 가지고 있는 경우에는 204가 더 단순할 수 있습니다.
이때 첫 번째 요청은 서버에서 성공했지만 응답만 유실되었을 수 있습니다. 그래서 “삭제 이후 리소스가 없어지면 성공”이라는 계약이라면 204가 자연스러울 수 있습니다. 2. “삭제 대상의 존재 여부”에 초점을 두면 404도 가능하다반대로 DELETE 요청을 “존재하는 특정 리소스를 삭제해줘”라는 의미로 해석한다면, 이 관점에서는 삭제할 대상이 없으므로 404 Not Found가 더 명확할 수 있습니다.
특히 사용자가 잘못된 id를 요청했거나, 그래서 저는 정답이 하나로 고정된다기보다, 저의 기준제 기준으로는 이렇게 구분할 수 있을 것 같습니다.
다만 일반적인 CRUD API라면 저는 404 Not Found 쪽이 조금 더 명확하다고 생각합니다. 이유는 DELETE 요청의 대상이 URI로 식별되는 특정 리소스이고,
여기서 {id}가 잘못되었거나 이미 삭제된 리소스라면, 최종 정리결론적으로 저는 이렇게 정리할 수 있을 것 같습니다. DELETE의 멱등성은 “같은 요청을 반복해도 서버의 최종 상태가 같아야 한다”는 의미이지, 따라서 존재하지 않는 리소스에 대한 DELETE 응답은 204와 404 모두 설계 의도에 따라 가능하다고 생각합니다. 다만 현재 API가 일반적인 리소스 중심 CRUD에 가깝고, |
Beta Was this translation helpful? Give feedback.
-
한줄 정리DELETE가 멱등한지를 결정 짓는 요인이 상태 코드가 아니기 때문에, 서비스 요구사항에 맞게 204와 404를 함께 사용하는 것이 적절하다입니다! 204: 리소스를 성공적으로 삭제하였을 때 받게 되는 응답 상태 코드 이렇게 2가지로 나눠 관리해야 클라이언트 입장에서 예외를 처리하기 용이할 것 같습니다. DELETE의 멱등성은 언제 준수되는가?
RFC 공식 문서에 따르면 멱등성의 정의는 "여러번 동일한 요청을 보냈을 때, 서버에 미치는 의도된 영향이 동일한 경우"를 의미합니다. 즉, 멱등성은 사용자 요청에 의한 리소스만을 고려하고 구현에 따른 부작용은 고려하지 않습니다.(여기서 구현에 따른 부작용은 예를 들어 존재하지 않는 id로 요청하여 리소스를 찾는데 실패한 상황을 예로 들 수 있을 것 같습니다.) 또한 외부 용인에 의해 변경된 사항 또한 멱등성의 고려 대상이 아닙니다.(예를 들면, 다른 트랜잭션이 중간에 끼워들어 연속적인 GET 요청의 응답이 다른 경우가 될 수 있을 것 같습니다.) 결국, 멱등하냐를 따질때는 상태 코드가 아닌 서버의 리소스를 관점으로 판단해야 한다고 생각합니다. 제 생각결국, 상태코드는 멱등한지에 영향을 주지 않기 때문에, 204와 404를 함께 사용해도 괜찮다라는 것이 저의 생각입니다. 따라서 404 NOT FOUND 상태코드를 제공해줌으로서, 프론트에서 예외 처리를 하기 더 용이하게 직관적으로 전달하고, 디버깅에 용이하도록 설계하는 것이 더 실용적이라고 생각합니다. |
Beta Was this translation helpful? Give feedback.
-
단순히 삭제 요청이 잘 처리되었음을 표시하기위해서는 204 응답을 주어도 괜찮습니다. DELETE가 멱등한 메서드인 이유는 리소스가 있을 때에도, 없을 때에도 모두 리소스가 없는 결과를 유지하기 때문입니다. 하지만 사용자 친화적인 방법을 고려해보았을 때는 404를 제공해주는 것이 더욱 적절하다 생각됩니다! 사용자 입장에서 특정 데이터를 삭제한다고 하였을 때 대부분의 경우에 보내는 요청이 정상적인 요청인지 검증하는 로직은 있는 것이 안전하다 생각됩니다. |
Beta Was this translation helpful? Give feedback.
-
RESTful API는 결과보다 자원(resource)을 우선으로 바라보는 설계라고 생각합니다. 대부분 떠오르는 케이스는 다음과 같습니다.
여기서 "첫번째 단계에서부터 존재하지 않는 id로 요청을 보내도 204를 보낼 것이냐" 를 생각해보았습니다. 이 경우 DELETE 요청은 "삭제된 상태를 만들어달라는 게" 아니라, "URL이 가리키는 특정 Resource를 삭제해달라는 요청" 이기 때문입니다. 따라서, 자원이 우선이며, 해당 자원이 존재하지 않는다면 대상을 찾을 수 없다는 의미의 404가 더 자연스럽다고 생각합니다. |
Beta Was this translation helpful? Give feedback.
-
|
이 질문에 대한 생각이 바뀌었는데요, 저는 처음에는 리소스가 없으니
그런데 이 둘은 성격이 다르다고 생각합니다. 현업에서는 API Gateway가 업스트림의 그래서 또한 존재하지 않는 id에 대한 삭제 요청은 클라이언트의 잘못된 요청이라기보다 멱등한 삭제 요청의 결과로 볼 수 있으므로, 해당 이유에서도 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
RFC 7231 스펙 문서에 따르면, DELETE 메서드는 기본적으로 명등성한 메서드입니다.
만약 id가 없는 리소스에 대해 DELETE 메서드를 호출했다면 204와 404 중 무엇을 제공해주는 것이 적절할까요?
참고리소스 - HTTP 메소드의 멱등성(Idempotence)과 Delete 메소드가 멱등한 이유
Beta Was this translation helpful? Give feedback.
All reactions