@RequestBody는 HTTP 메세지의 Body를 어떻게 자바 객체로 변환할까?
@RequestBody
- @RequestBody는 클라이언트가 전송하는 HTTP Body 내용을 Java Object로 변환시켜주는 역할
- Body가 존재하지 않는 Get 메소드에 @RequestBody를 활용하려고 한다면 에러가 발생
- @RequestBody로 받는 JSON 데이터는 Spring에서 관리하는 HttpMessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환
HttpMessageConverter
- Spring MVC에서 기본으로 등록해주는 HttpMessageConverter
- String
- ByteArray
- Resouce
- Form
- @EnableWebMvc Annotation 사용 시에 해당 라이브러리가 클래스패스에 존재하면 자동으로 등록
- Jackson
- Jackson2
- Gson
- Atom
- RSS
- JAXB2
@RequestParam
- @RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해 사용
- 필수 여부 default 설정이 true이기 때문에 반드시 해당 파라미터가 요청에 포함되어야 함
- 반드시 필요한 변수가 아니라면 required 값을 false로 설정하거나, defaultValue 옵션을 사용하여 default로 사용할 값을 지정해야 함
@ModelAttribute
- 클라이언트가 전송하는 HTTP Body의 내용과 파라미터들을 Setter를 통해 1대1로 객체에 바인딩
@ResponseBody와 @ModelAttribute의 차이
- @ModelAttribute는 바인딩시키는 어떤 데이터를 set해주는 Setter함수가 없다면 매핑이 되지 않음
- @RequestBody는 요청받은 데이터를 변환시키는 것이기 때문에, Setter함수가 없어도 값이 매핑이 된다.
- Setter 없이 어떻게 매핑을 하지?
- @RequestBody의 바인딩은 Jackson라이브러리의 ObjectMapper가 수행
- ObjectMapper는 @RequestBody가 Property로 구현되어 있거나 생성 위임한 경우가 아니면 기본 생성자로 생성
- ObjectMapper는 Setter와 Getter로 필드를 가져온다.
- Setter를 사용하지 않고 Reflection을 사용하여 필드 값을 넣어줌
- Reflection은 Setter 없이 필드 값을 넣어 줄 수 있을까?
학습 로그
# [Spring] @RequestBody vs @ModelAttribute
## 내용
- @RequestBody 와 @ModelAttribute의 차이점에 대해 학습
## 링크
* https://velog.io/@jh8579/RequestParam-RequestBody-ModelAttrubute
* https://mangkyu.tistory.com/72
* https://velog.io/@conatuseus/RequestBody%EC%97%90-%EC%99%9C-%EA%B8%B0%EB%B3%B8-%EC%83%9D%EC%84%B1%EC%9E%90%EB%8A%94-%ED%95%84%EC%9A%94%ED%95%98%EA%B3%A0-Setter%EB%8A%94-%ED%95%84%EC%9A%94-%EC%97%86%EC%9D%84%EA%B9%8C-3-idnrafiw
* https://xmfpes.github.io/java/reflection/
참조