네트워크+HTTP

DeleteMapping 리스트(List) 구현 트러블 발생 및 해결

류창 2022. 10. 3. 14:25
반응형

구현할 문제:

 

 

여러개의 상품을 선택하여  경매상품삭제 버튼을통해  DeleteMapping 요청을 보내려고한다.

 

Request Body에 리스트를담아서....  deletemapping으로 삭제처리를 하자!! 라는 전략을 짯다.

 

 

문제 해결 고찰:

근데 코딩을 하다보니 계속 이런 오류가 발생했다..

No primary or single unique constructor found for interface java.util.List

 

Required request parameter 'idList' for method parameter type List is not present

 

 

이런저런 원인 분석을 하였더니,  과거 포스팅을한 부분에서  원인을 알 수 있었다.

 

Delete 부분을 보자,  요청에 Body를 지원하지 않. 는. 다

난 이제까지 Body가 없는데 Body에다 데이터를 집어넣는 짓을 하고있었다.

 

 

그래서?  DeleteMapping으론 리스트를 보낼수 없는가?   

 

그건 아니다.

 

DeleteMapping에 삭제 요청을 할때   @RequestParam,  @PathVariable를 사용하여 리스트를 보낼수 있다.

 

@PathVariable를 예로들자면,  Delete  /auctions/1,2,3,4   (/auctions/{ids}) 같이다. 

 

예시는 Get이지만 Delete도 동일하다

 

 

하지만   /auctions/1,2,3,4   이 경로를 만들려면 자바스크립트(또는 ajax)의 도움이 필요하다.

 

왜냐하면,  체크박스의 체크된 게시글을 실시간으로 체크하여 경로를 생성하여 보내야하는데,

자바스크립트없이  1 2 3 4 사이에  ,(콤마) 를 찍을 방도가 없다..!!

const url = "/xxx/yyy/" + String(data);

 

다음과같이  data를 실시간으로 체크하여 uri가공한뒤 요청을 보내야한다.

 

정말 아쉽게도 이 프로젝트는 자바스크립트를 사용하지 않기로 하였으므로, 다른 방도를 생각해봤다.

 

Final :

 

결국 @PostMapping을 사용하는걸로 결정했다. 

 

@PostMapping의  주된 목적은 리소스 생성에 있지만,  조건부 삭제일때도 사용해도된다.

 

EX) 게시글 삭제는 본인의 글일때만 본인이 삭제할수있다.  다른 사용자가 삭제하려고들땐, 삭제할수없다.

 

@DeleteMapping은  조건부 삭제를 권장하진않는다. 

 

그이유는  @DeleteMapping은  멱등한 메소드 이기때문이다.

 

멱등하다는 뜻은 "언제 어디서든 여러번 요청해도 같은 결과값을 얻을수 있다" 라는 의미다

 

EX)   유저1은  본인이 작성한 게시글 1 빼곤 다른글을 삭제할수 없다.  /auctions/2,3,4

         유저2는  본인이 작성한 게시글 2, 3,4 글을 삭제할수 있다.  /auctions/2,3,4

 

같은 경로를 요청했는데  다른 결과값을 얻는다.  이는 곧 멱등하지않는다.

 

멱등하지 않는 메소드는 @PostMapping으로 !!

 

 

 

3줄 요약

 

1. @DeleteMapping은  요청에 Body를 지원하지 않는다. 

2. @DeleteMapping으로 List삭제를 요청하는것은  JS를 이용하면 가능하다.

3. @DeleteMapping은  멱등해야하므로, 조건부삭제는 맞지않는다. @PostMapping을 사용하자.

반응형

'네트워크+HTTP' 카테고리의 다른 글

HTTP 표현 헤더  (0) 2022.03.09
HTTP 상태코드  (0) 2022.03.09
HTTP 메소드  (0) 2022.01.16
HTTP의 특징  (0) 2022.01.13
네트워크 : TCP에 대하여  (0) 2022.01.09