@RequestParam / @RequestBody / @ModelAttrubute

지노·2021년 4월 26일
0
post-custom-banner

@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 없이 필드 값을 넣어 줄 수 있을까?
      • 추후 Reflection 관련 공부...

학습 로그

# [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/

참조

profile
Spring Framework를 이용한 웹 개발과 AWS 서비스, Container를 사용한 CI/CD 인프라에 관심이 있습니다.
post-custom-banner

0개의 댓글