토이프로젝트를 진행 중인데 파일을 업로드 하고 싶을 때 요청을 받을 때
어떤 구문을 사용해야하는지 알아보다가 @RequestPart 문에 사용해야한다는 것을 알았습니다.
HTTP 요청할 때 사용하는 어노테이션인 @RequestBody 와 @RequestPart 더불어 @RequestParam
각각 특징에 대해 알아보겠습니다.
@RequestParam
RequestParam은 Servlet request 파라미터에 접근하기 위해 사용한다.
MultipartFile 과 같은 것들도 동일하게 작동한다.
단, 파라미터가 String이나 MultiFile이 아닌 경우, Converter 나 PropertyEditor에 의해 처리된다.
1개의 HTTP 요청 파라미터를 받기 위해서 사용하며, 파라미터 여부가 default로 true 이기 때문에 파라미터가
반드시 전송되어야한다.
만약, 전송되지 않는 경우에는 클라이언트 오류인 400 에러가 발생한다(required = false 변경하면 상관없어진다)
RequestParam 은 단순 파라미터 값에 효과적인 어노테이션이다.
@PostMapping("/like")
public ResponseEntity<?> like(@RequestParam(name = "id") Long commentId, @LoginUser String username) {
return ResponseEntity.ok(commentLikeService.like(commentId, username));
}
@RequestPart
RequestPart는 HTTP RequestBody에 multipart/form-data 가 포함되어 있는 경우 사용하는 어노테이션이다.
MultipartFile이 포함되어 있는 경우에는 MultipartResolver 가 동작하여 역직렬화를 하게된다.
이는 Byte로 되어있는 데이터를 객체 형태로 변환하는 것이다.
만약 MultipartFile 이 포함되어 있지 않다면, RequestBody와 동일하게 동작된다.
@PostMapping("/post")
public ResponseEntity<?> create(@Valid @RequestPart(value = "request") PostRequest requestDto,
@LoginUser String username,
@RequestPart(value = "image", required = false) List<MultipartFile> files) {
return ResponseEntity.status(HttpStatus.CREATED).body(postService.createPost(requestDto, username, files));
}
@RequestBody
RequestBody는 클라이언트가 전송하는 Json 형태의 HTTP RequestBody를 HttpMessageConverter를 이용하여
Java 객체의 형태로 Convert 해주는 어노테이션이다.
주로 사용하는 Content-Type
- application/json : {key : value} 형태인 Json 형태로 전송
- application/x-www.form-urlencoded : name=obo&number=123456 형태인 쿼리 스트링 형태로 전송
- multipart/form-data : 파일 업로드시 사용되며, 파일을 포함한 여러 데이터가 part(쪼개서) 형식으로 나눠서 전송
선택적으로 @Valid 어노테이션을 추가해서 자동 유효성 검사를 적용할 수 있다.
@PostMapping("/signUp")
public ResponseEntity<?> signUpMember(@RequestBody SignUpDto request) {
return ResponseEntity.status(HttpStatus.CREATED).body(authService.signUp(request));
}
많은 데이터를 주고 받을 때에는 @RequestBody 와 DTO 를 이용하는 편이 좋다.
- MultipartFile을 여러개로 받기 위해서는 List<MultipartFile> 형태로 받을 수 있다.
- Map<String, Object> 로 모든 파라미터를 한번에 받을 수 있지만, 유지 보수성이 떨어진다.
'Spring > 스프링 이론' 카테고리의 다른 글
Http Interface 사용하기 (0) | 2024.01.08 |
---|---|
SpringBoot Swagger 3.x.x 적용하기 (0) | 2023.12.31 |
로그인 유저 어노테이션 기반으로 정보 가져오기(@AuthenticationPrincipal 커스텀) (0) | 2023.12.24 |
댓글