REST API DELETE에 Body를 넣어도 될까?
REST API DELETE에 Body를 넣어도 될까?
문제 상황
카카오테크캠퍼스에서 위시리스트 API를 구현하다가 삭제 API의 URL 설계에서 고민이 생겼다.
원래 설계:
1
DELETE /api/wishlist/{id}
그런데 이 {id}가 wishlist의 id인지, product의 id인지 모호하다는 피드백을 받았다.
멘토님 피드백
“/api/wishlist/1 라는 경로가 있다면, 1은 바로 앞에 위치한 wishlist에 종속된, 관계가 있는 정보라고 이해할 수 있습니다. 그런데 설계해주신 건 wishlist와 관계가 없어보이는(product와 관련이 있는) 정보가 오도록 설계해주셨는데요. URL만 보면 wishlist의 식별자인지, product의 식별자인지 알아채기 어렵지 않을까요?”
시도 1: Body에 넣기
그러면 DELETE 요청의 Body에 product id를 넣으면 어떨까?
1
2
DELETE /api/wishlist
Body: { "productId": 1 }
찾아보니까 이 방법은 권장되지 않는다고 한다.
- HTTP 스펙상 DELETE 요청에 Body가 있어도 되지만, 서버가 무시할 수 있다
- 일부 프록시나 캐시 서버가 DELETE Body를 제거할 수 있다
- RESTful 관례에 어긋난다
시도 2: Query Parameter
1
DELETE /api/wishlist?productId=1
이것도 DELETE에 Query Parameter를 쓰는 게 어색하다는 의견이 있었다.
최종 선택: 명확한 Path Variable
1
DELETE /api/wishlist/products/{productId}
또는 더 짧게:
1
DELETE /api/wishlist/{productId}
결국 path variable 방식으로 돌아왔는데, URL에서 리소스 관계를 명확히 표현하는 방향으로 가닥을 잡았다.
/api/wishlist/products/{productId}가 길긴 하지만, “위시리스트에서 특정 상품을 삭제한다”는 의미가 명확하다.
배운 점
- REST API 설계에서 URL은 리소스의 관계를 명확히 표현해야 한다
- DELETE 요청에 Body나 Query Parameter를 쓰는 건 권장되지 않는다
- URL이 조금 길어지더라도 의미가 명확한 게 낫다
카카오테크캠퍼스 3기 선물하기 API 클론 코딩 중 멘토님 피드백 정리.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.