컨트롤러에서 api 요청 및 응답 형태에 따른 어노테이션을 혼동하여 사용하고 있었다. 특히 이미지나 영상을 전달하기 위한 경우 정상적으로 api는 작동을 했지만 권장되지 않는 방법을 사용하고 있었다.
문제 코드 )
@PutMapping("{objectId}")
public void modifyObject(@PathVariable long objectId, @Valid @RequestPart FormRequest request,
@RequestParam(required = false) List<MultipartFile> coverImages,
@RequestParam(required = false) List<MultipartFile> materialImages) {
objectService.modifyObject(objectId, request, coverImages, materialImages);
}
@RequestParam은 주로 HTTP GET 요청에 사용된다.
url의 쿼리 문자열 파라미터를 추출할 때 사용된다. 예를 들어 '?param=value' 형식의 요청 파라미터 값을 추출하는데 사용된다.
멀티파트 요청에서 파일 업로드와 같은 바이너리 데이터를 처리할때 주로 @RequestPart어노테이션을 사용한다. 파일 업로드와 관련된 요청인 POST, PUT등에서 사용한다.
put요청의 경우 기본적으로 @RequestParam 어노테이션을 사용하여 멀티파트 데이터를 보내기에는 제한이 있다. put요청은 주로 요청 본문(request body)에 데이터를 담아 보내는 것이 일반적이다. 멀티파트 데이터를 put요청에서 처리하려면 @RequestPart 혹은 @RequestParam을 사용하는게 적절하다.
Spring MVC에서 @RequestParam 어노테이션을 사용하여 멀티파트 파일을 처리하는 것은 일반적으로 지원되지 않는다. 그러나 여전히 정상 작동한 이유는 스프링이 내부적으로 이러한 형태의 요청을 처리할 수 있도록 몇가지 자동 변환 및 데이터 바인딩 기능을 제공하기 때문이다.
스프링 부트에서 @RestController를 사용하면 요청 본문을 자동으로 처리하는데 기본적으로 JSON 데이터를 처리할 수 있다. 이는 @RequestBody 어노테이션이 자동으로 요청 본문의 JSON 데이터를 해당 메서드의 파라미터로 바인딩 해주기 때문이다.
그러나 멀티파트 파일 업로드와 같은 바이너리 데이터의 처리를 위해서는 @RequestPart 어노테이션을 사용하는 것이 더 명시적이며 권장되는 방법이다.
@PutMapping("{objectId}")
public void modifyObject(@PathVariable long objectId, @Valid @RequestPart FormRequest request,
@RequestPart(required = false) List<MultipartFile> coverImages,
@RequestPart(required = false) List<MultipartFile> materialImages) {
objectService.modifyObject(objectId, request, coverImages, materialImages);
}
그렇다면 위에서 언급한 어노테이션 말고 또 다른 어노테이션들은 언제 쓰는게 올바른 방법일까?
Spring에서 API를 만들 때 @RequestParam, @RequestBody, @RequestPart, 그리고 @ModelAttribute는 각각 요청 파라미터를 다루는 데 사용되는 어노테이션들이며, API의 요청 및 응답 형태에 따라 선택해야 한다.
1) @RequestParam:
2) @RequestBody:
3)@RequestPart:
4) @ModelAttribute:
⭐️tip!
API의 메서드에 따라 어떤 어노테이션을 사용할지는 요청과 응답 형태에 따라 다릅니다. 예를 들어, GET 요청에서는 @RequestParam을 사용하여 쿼리 문자열 파라미터를 추출하고, POST 요청에서는 @RequestBody를 사용하여 요청 본문을 읽을 수 있습니다. 또한, 멀티파트 파일 업로드가 필요한 경우 @RequestPart를 사용할 수 있습니다. HTML 폼 데이터를 처리해야 하는 경우에는 @ModelAttribute를 사용할 수 있습니다. API 메서드의 목적과 요청 데이터의 형식을 고려하여 적절한 어노테이션을 선택하면 됩니다.