어노테이션 들여다보기 - 3

YJS·2023년 10월 25일
0

Spring Boot 탐구

목록 보기
6/11

😖문제 상황

컨트롤러에서 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);
    }


🤓문제 해결 과정

step1. @RequestParam 어노테이션이 어떤 경우에 사용되는지 확인한다.

@RequestParam은 주로 HTTP GET 요청에 사용된다.
url의 쿼리 문자열 파라미터를 추출할 때 사용된다. 예를 들어 '?param=value' 형식의 요청 파라미터 값을 추출하는데 사용된다.

step2. MultipartFile을 전달하는 경우 권장되는 어노테이션과 형식을 확인한다.

멀티파트 요청에서 파일 업로드와 같은 바이너리 데이터를 처리할때 주로 @RequestPart어노테이션을 사용한다. 파일 업로드와 관련된 요청인 POST, PUT등에서 사용한다.

put요청의 경우 기본적으로 @RequestParam 어노테이션을 사용하여 멀티파트 데이터를 보내기에는 제한이 있다. put요청은 주로 요청 본문(request body)에 데이터를 담아 보내는 것이 일반적이다. 멀티파트 데이터를 put요청에서 처리하려면 @RequestPart 혹은 @RequestParam을 사용하는게 적절하다.

step3. 기존의 어노테이션이 왜 정상 작동했는지 확인한다.

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);
}

그렇다면 위에서 언급한 어노테이션 말고 또 다른 어노테이션들은 언제 쓰는게 올바른 방법일까?

🤓 API 요청과 응답에 사용되는 어노테이션 뿌시기 🤓

Spring에서 API를 만들 때 @RequestParam, @RequestBody, @RequestPart, 그리고 @ModelAttribute는 각각 요청 파라미터를 다루는 데 사용되는 어노테이션들이며, API의 요청 및 응답 형태에 따라 선택해야 한다.

1) @RequestParam:

  • 이 어노테이션은 URL의 쿼리 문자열 파라미터를 추출할 때 사용됩니다.
  • 주로 HTTP GET 요청에 사용됩니다.
  • 예를 들어, ?param=value 형식의 요청 파라미터 값을 추출하는 데 사용됩니다.

2) @RequestBody:

  • 이 어노테이션은 요청 본문(request body)의 내용을 객체로 변환할 때 사용됩니다.
  • 주로 HTTP POST, PUT, PATCH와 같은 요청에서 JSON 또는 XML과 같은 데이터를 요청 본문에 담아 보낼 때 사용됩니다.

3)@RequestPart:

  • 이 어노테이션은 멀티파트(multipart) 요청에서 파일 업로드와 같은 바이너리 데이터를 처리할 때 사용됩니다.
  • 주로 파일 업로드와 관련된 요청에서 사용됩니다.

4) @ModelAttribute:

  • 이 어노테이션은 웹 요청의 데이터를 Java 객체로 바인딩할 때 사용됩니다.
  • 주로 HTML 폼 데이터를 컨트롤러 메서드의 인자로 바인딩할 때 사용됩니다. - - HTML 폼과 컨트롤러 메서드의 파라미터 객체 간 데이터 바인딩을 처리합니다.

⭐️tip!
API의 메서드에 따라 어떤 어노테이션을 사용할지는 요청과 응답 형태에 따라 다릅니다. 예를 들어, GET 요청에서는 @RequestParam을 사용하여 쿼리 문자열 파라미터를 추출하고, POST 요청에서는 @RequestBody를 사용하여 요청 본문을 읽을 수 있습니다. 또한, 멀티파트 파일 업로드가 필요한 경우 @RequestPart를 사용할 수 있습니다. HTML 폼 데이터를 처리해야 하는 경우에는 @ModelAttribute를 사용할 수 있습니다. API 메서드의 목적과 요청 데이터의 형식을 고려하여 적절한 어노테이션을 선택하면 됩니다.

profile
우당탕탕 개발 일기

0개의 댓글