Spring/스프링 이론

@RequestBody vs @RequestParam vs @RequestPart

블로그 주인장 2024. 1. 5.

토이프로젝트를 진행 중인데 파일을 업로드 하고 싶을 때 요청을 받을 때

어떤 구문을 사용해야하는지 알아보다가 @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> 로 모든 파라미터를 한번에 받을 수 있지만, 유지 보수성이 떨어진다.

반응형

댓글