티스토리 뷰

728x90

List를 조회하는 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.

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/modelattrib-method-args.html

 

@ModelAttribute :: Spring Framework

You can use the @ModelAttribute annotation on a method argument to access an attribute from the model or have it be instantiated if not present. The model attribute is also overlain with values from HTTP Servlet request parameters whose names match to fiel

docs.spring.io

 

만약 @NoArgsConstructor를 사용하여야 하는 경우 @Setter를 정의하여 값을 셋팅 할 수 있다.

아마 @ModelAttribute의 경우 @Setter 를 정의해야만 사용 할 수 있다는 잘못된 정보가 여기에서 파생된 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함