포스트

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 라이센스를 따릅니다.