컨트롤러 메서드에서 @ModelAttribute로 객체를 바로 받을 수 있다. 이 경우 세 가지 작업이 자동으로 진행된다.
- 파라미터 타입의 오브젝트를 생성한다(리플렉션으로 만들기에 디폴트 생성자가 반드시 필요한듯?)
- 오브젝트의 프로퍼티에 웹 파라미터가 바인딩된다(프로퍼티의 이름이 form input태그의 name 속성과 같을 시 setter를 통해 바인딩된다).
HTTP를 통해 전달받는 파라미터는 기본적으로 문자열이기에 적절한 변환이 필요하다. 만약 변환이 불가능한 경우 BindingResult 오브젝트 안에 오류를 저장해서 컨트롤러로 넘겨주거나 예외를 발생시킨다.
- 모델의 값을 검증한다.
의문점
- 그동안 Form에 Setter를 안 만들고 ModelAttribute에 적용했는데 잘 동작했었다. 그러나 Form 의 속성 중 List를 넣었을 경우 Setter 없인 동작하지 않았다. 왜지??
- 객체를 생성할 때 디폴트 생성자가 반드시 필요한거로 알고있는데 디폴트 생성자 없이도 잘 동작하던데..?
ㄴ 스프링 4.0부터 CGLIB에서 objenesis라는 특별한 라이브러리를 사용해 기본 생성자 없이 객체 생성이 가능해져서 그런듯
[Spring/스프링] @ModelAttribute로 List 객체에 바인딩