추가 공부/Web

[Spring] @RequestBody Vs @RequestPart Vs @RequestParam Vs @ModelAttribute 차이점

개발자가 되고 싶은 곰 2024. 10. 24. 00:55

1. RequestBody

Http 요청으로 넘오는 body 데이터를 HttpMessageConverter를 통하여 Java Object로 역직렬화를 하며

multipart 요청이 아닌, 어떤 바이너리 파일을 포함하고 있지 않은 데이터를 받는 역할을 한다.

 

HttpMessageConverter란

Http 요청과 응답에 대해 '전략 패턴' 을 사용하 converting(반환) 해주는 역할이다.

'전략 패턴'은 하나의 메서드가 여러 가지의 대응 방법을 미리 준비해두고

필요한 상황마다 대응 방법을 달리하는 것을 말한다.

 

RequestBody의 경우 Http 요청으로 넘오올때 Header의 Content-type을 보고 어떤 Converter를 사용할지 정한다.

이에 Content-type 아래와 같이 명시해줘야한다.

 

application/json : {key : value} 형태 전송

application/x-www-form-urlencoded : key=value&key=value 형태로 전송

multipart/form-data : 파일 업로드시 사용되고 '파일을 비롯한 여러 데이터가 있다' 라고 명시해준다.

 

2. RequestPart

Content-type 이 'multipart/form-data' 의 경우 사용된다.

MultipartFile이 포함되는 경우에 MultiPartResolver가 동작한다.

MultipartFile이 포함되지 않는 경우 @RequestBody와 같이 HttpMessageConverter가 동작하게 된다

 

3. RequestParam

1개의 파라미터 데이터를 받을 경우 사용된다.

무조건 데이터가 들어오게 설정되어 있기에 파라미터가 들어오지 않는 경우 BadRequest가 발생하며

들어올지 정확하지 않다면 required = false를 지정해주어야한다.

(default 값이 required = true 이다.)

 

RequestParam 또한 RequestPart 와 같이 MultipartFile을 받을 때 사용한다.

RequestPart와 다른점으로는 RequestParam의 경우 파라미터 값이 String 이나 MultipartFile이 아닌경우

Converter OR PropertyEditor 로 처리되지만

RequestPart 는 HttpMessageConverter를 이용하며 Content-type을 참고한다.

 

4. ModelAttribute

Spring Controller에서 값을 받을때 default가 @ModelAttribute 이며 사용은 아래와 같이 사용한다.

Content-type이 Multipart/form-data 형태를 받을때

Http 파라미터를 받을때

 

사용에 대해 알 수 있듯이 Http Body로 오든 파라미터로 오든 모두 받을 수 있고

body와 파라미터가 같이 오는 경우도 값을 받아온다.

 

이런 형태로 사용이 가능한 이유는 @ModelAttribute는

필드 내부와 1:1 값이 Setter로 Constructor를 통해 매핑되기 때문이다.

 

@RequestPart와 다른 점으로는 HttpMessageConverter에 의해 값이 바인딩되는 것이 아니라

Setter OR Constructor를 통해 값이 주입된다.

728x90