컨트롤러 메서드에서 @ModelAttribute로 객체를 바로 받을 수 있다. 이 경우 세 가지 작업이 자동으로 진행된다.

  1. 파라미터 타입의 오브젝트를 생성한다(리플렉션으로 만들기에 디폴트 생성자가 반드시 필요한듯?)
  2. 오브젝트의 프로퍼티에 웹 파라미터가 바인딩된다(프로퍼티의 이름이 form input태그의 name 속성과 같을 시 setter를 통해 바인딩된다). HTTP를 통해 전달받는 파라미터는 기본적으로 문자열이기에 적절한 변환이 필요하다. 만약 변환이 불가능한 경우 BindingResult 오브젝트 안에 오류를 저장해서 컨트롤러로 넘겨주거나 예외를 발생시킨다.
  3. 모델의 값을 검증한다.

의문점

  1. 그동안 Form에 Setter를 안 만들고 ModelAttribute에 적용했는데 잘 동작했었다. 그러나 Form 의 속성 중 List를 넣었을 경우 Setter 없인 동작하지 않았다. 왜지??
  2. 객체를 생성할 때 디폴트 생성자가 반드시 필요한거로 알고있는데 디폴트 생성자 없이도 잘 동작하던데..? ㄴ 스프링 4.0부터 CGLIB에서 objenesis라는 특별한 라이브러리를 사용해 기본 생성자 없이 객체 생성이 가능해져서 그런듯

[Spring/스프링] @ModelAttribute로 List 객체에 바인딩