- 참조
- 요청관련 어노테이션 구분
- @RequestBody
- @RequestPart
- @RequestParam
- @ModelAttribute
@RequestBody
- Http 요청으로 넘어오는 Body의 내용을 HttpMessageConverter를 통해 Java객체로 역직렬화
- multipart 요청이 아닌(바이너리 파일을 포함하지 않는) 데이터를 받는 역할
- HttpMessageConverter
- Http요청과 응답에 대해 전략 패턴을 사용해서 converting하는 역할
- 전략 패턴은 하나의 메서드가 여러 가진 대응 방법을 미리 준비해두고 필요한 상황마다 대응 방법을 달리 하는 방법
- @RequestPart, @RequestBody에 사용되며 동작방식은 필드의 ObjectMapper를 이용하고 이 ObjectMapper는 NoArgsConstructor와 Getter나 Setter를 통해 field에 접근 가능
- 접근이 가능한 이유는 Jackson라이브러리는 Reflection을 통해 private field에 값을 할당할 수 있기 때문
- ObjectMapper를 Override하면 어떤 접근자도 필요없게 만들 수 있다?
- Http요청의 헤더에 포함되는 Content-Type을 보고 어떤 Converter를 사용할지 결정하기 때문에 반드시 명시해야함
- Content-Type의 종류(일부)
- application/x-www-form-urlencoded: HTML form의 default값으로 key&value 형태로 전송
- application/json: { key: value } 형태로 전송
- multipart/form-data: 파일 업로드시 사용되며, 파일을 포함한 여러 데이터가 있다는 의미를 가짐(@RequestBody로 받을 수 없음)
@RequestPart
- Content-Type이 multipart/form-data와 관련된 경우 사용
- MultipartFile이 포함되지 않는 경우 @RequestBody와 같이 HttpMessageConverter가 작동
- @RequestBody가 필요하지만 Binary Stream이 포함되는 경우에 사용됨
@RequestParam
- 하나의 파라미터만 받을 때 사용됨, 하지만 필수 파라미터로 인식되므로 주의해야함
required = false
를 통해 필수 파라미터 비활성화 가능
- @RequestPart와 같이 MultipartFile을 받을 수 있음
- @RequestPart와 다른 점은 @RequestParam의 경우 MultipartFile이 없는 경우 Converter나 PropertyEditor에 의해 처리됨
- 하지만, @RequestPart는 HttpMessageConverter에 의해 Content-Type을 참고하여 처리
@ModelAttribute
- Spring Controller에서 default로 @ModelAttribute가 사용됨
- Content-Type이 multipart/form-data인 경우나 Http 파라미터를 받는 경우에 사용됨
- 즉 Http Body 또는 파라미터에 대해 모두 처리 가능하고 Body와 파라미터가 함께 오는 경우에도 처리됨
- 이런 방식이 가능한 이유는 @ModelAttribute는 필드 내부와 1:1로 값이 Setter나 Constructor를 통해 매핑
- @RequestPart와 다른 점은 HttpMessageConverter에 의해 값이 바인디되는 것이 아니라 적절한 Setter혹은 Constructor를 통해 값이 주입됨
- 정리
@RequestBody
- application/json을 주고받을 때 사용
- multipart/form-data가 포함되는 경우 사용 불가
@RequestPart
- @RequestBody + multipart/form-data인 경우 사용
- @RequestBody와 @RequestPart는 HttpMessageConverter에 의해 동작하므로 Setter없이 Object생성
@ReuqestParam
- 1개의 Http 파라미터를 받는 경우 사용
- multipart/form-data를 받아야 되는 경우에 사용
- 기본 설정으로 required = true 로 설정되어 있음
@ModelAttribute
- @RequestPart와 유사하지만 동작 원리는 완전히 다름
- 값에 직접적으로 접근할 수 있는 수단이 필요
- @RequestMapping, @GetMapping 차이
- Spring 4.3 버전부터 Spring MVC 컨트롤 메서드를 위한 새로운 어노테이션 5개 추가
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@PatchMapping
- 이름에서 구분 가능하듯이 각 어노테이션은 Http Method별로 매핑
- 기존의
@RequestMapping
을 사용하면 세부적으로 HttpMethod를 지정해줬지만, 새로운 어노테이션을 사용하면 그럴 필요가 없어짐