ㅅㅇ

[Spring] @RequestBody, @RequestParam, @ModelAttribute 본문

SW_STUDY/SpringBoot

[Spring] @RequestBody, @RequestParam, @ModelAttribute

SO__OS 2023. 5. 23. 11:43

@RuquestParam

1개의 HTTP 요청 파라미터를 받기 위해 사용하는 어노테이션

 

** @ModelAttribute 과 @RequestBody 의 방식의 차이를 이해하자.

 

@ModelAttribute

HTTP Body 내용과 HTTP 파라미터의 값들은 생성자, Getter, Setter를 통해 주입하기 위해 사용하는 어노테이션

 

- 값 변환이 아닌 값을 주입시키므로 변수들의 생성자나 Getter,Setter가 없으면 변수들이 저장되지 않는다.

 

@RequestBody

클라이언트가 전송하는 JSON 형태의 HTTP Body 내용을 Java Object로 변환시켜주는 어노테이션

- @RestController에서 @RequestBody의 바인딩은 Jackson라이브러리의 ObjectMapper을 통해 이뤄진다.

- 이때, ObjectMapper는 @RequestBody가 Property로 구현되어 있거나,

생성을 위임한 경우가 아니라면

기본 생성자는 꼭 필요하다.  => @NoArgsConstructor가 필요한 이유

 

- 그리고 Reflection을 사용해서 필드 값들을 넣어주기에, Setter는 필요하지 않는다.

 

- 그러나, 이때, ObjectMapper는 Setter와 Getter로 DTO의 필드를 가져온다. 그렇기에

Getter, Setter 모두가 없다면 ObjectMapper가 바인딩하는데 DTO에 setter와 getter가 없으니 찾지 못해 오류가 난다.

그래서 Getter, Setter 둘 중 하나는 있어야 하는 것이다.

DTO에 사용할 필요가 거의 없는 Setter보다 프로덕션 코드에 사용되거나

테스트에서 필요한 Getter를 넣는 것이 좋다는 이유로 

=> 일반적으로 기본생성자 @NoArgsConstructor와 @Getter 어노테이션을 작성한다.