티스토리 뷰
@ModelAttribute 사용시 선택 되는 생성자/@AllArgsConstructor 와 @NoArgsConstructor가 동시에 사용되면 어떻게 될까?/ @ModelAttribute는 @Setter 없이도 사용이 가능하다
첸첸 2023. 9. 13. 13:09List를 조회하는 API가 있었는데, 어느날 갑자기 조회 조건대로 조회가 안되니 확인을 해달라는 연락을 받았다.
원래는 잘 되던건데...갑자기 안된다..? 범인은 나겠지🥹
Git 히스토리를 찾아보니 @NoArgsConstructor 를 추가해놓았다.
처음엔 잘 이해가 안갔다..@NoArgsConstructor를 붙였어도 @AllArgsConstructor가 있는데 왜 바인딩이 안되는거지?🤔
우선 아래와 같이 컨트롤러와 VO를 만들고 각각의 경우에 바인딩이 어떻게 되는지 확인 해보았다.
(스프링에서 @ModelAttribute를 붙이지 않는 경우 적절한 전략을 사용하여 요청 파라미터를 바인딩 하므로 어노테이션을 생략했습니다.)
👉🏼 @AllArgsConstructor -> binding 🙆🏻♀️
👉🏼 @NoArgsConstructor -> binding🙅🏻♀️
👉🏼 @AllArgsConstructor & @NoArgsConstructor -> binding🙅🏻♀️
왜일까..?
@ModelAttribute의 동작 방법에 정답이 있다.
@ModelAttribute가 객체를 생성 할 때 선택하는 생성자는 매개변수가 적은 생성자이다.
따라서, @NoArgsConstructor 와 @AllArgsConstructor 로 두가지의 생성자를 만든 경우 기본생성자를 선택해 객체를 초기화 하기 때문에 값이 바인딩 되지 않은 것이다.
공식문서에 보면 @ModelAttribute가 어떻게 객체를 만드는지 알 수 있다.
The Pet instance above is sourced in one of the following ways:
- Retrieved from the model where it may have been added by a @ModelAttribute method.
- Retrieved from the HTTP session if the model attribute was listed in the class-level @SessionAttributes annotation.
- Obtained through a Converter where the model attribute name matches the name of a request value such as a path variable or a request parameter (see next example).
- Instantiated using its default constructor.
- Instantiated through a “primary constructor” with arguments that match to Servlet request parameters. Argument names are determined through JavaBeans @ConstructorProperties or through runtime-retained parameter names in the bytecode.
만약 @NoArgsConstructor를 사용하여야 하는 경우 @Setter를 정의하여 값을 셋팅 할 수 있다.
아마 @ModelAttribute의 경우 @Setter 를 정의해야만 사용 할 수 있다는 잘못된 정보가 여기에서 파생된 것 같다.
'백엔드 > spring' 카테고리의 다른 글
- Total
- Today
- Yesterday
- Docker
- 코딩테스트
- react
- 오토에버코테
- springboot
- javascript
- Linux
- Spring
- 리액트
- centos
- mysql
- java
- 도커
- 아파치카프카
- 자바코테
- 전자정부프레임워크
- 톰캣
- 현대
- java 코테
- 현대오토에버
- 코테
- Kubernetes
- 자바
- softeer java
- tomcat
- 자바스크립트
- 쿠버네티스
- 현대코테
- 스프링
- softeer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |