2014년 9월 23일 화요일

[spring] @ModelAttribute와 @RequestParam의 차이점

@ModelAttribute와 @RequestParam의 차이점


요청 파라미터를 메소드 파라미터에서 1:1로 받으면 @RequestParam이고, 도메인 오브젝트나 DTO의 프로퍼티에 요청 파라미터를 바인딩해서 한번에 받으면 @ModelAttribute




@ModelAttribute는 서브밋된 폼의 내용을 저장해서 전달받거나,
다시 뷰로 넘겨서 출력하기 위해 사용되는 오브젝트이다.
즉, 검증(Validatioin) 작업이 추가적으로 진행된다.
예를 들어 int 타입의 변수에 String 타입의 값을 넣을려고 할때 @ModelAttribute는 요청 파라미터를 적절히 타입변환을 시도한다. 만약 타입변환이 실패한다면 변환 중에 발생한 예외를 BindException 타입의 오브젝트에 담아서 컨트롤러에게 전달할 뿐이다.
그 이유는 @ModelAttribute는 요청 파라미터의 타입이 모델 오브젝트의 프로퍼티 타입과 일치하는지를 포함한 다양한 검증 기능을 수행하기 때문이다.

@ModelAttribute는 생략이 가능하다.
public String save(@ModelAttribute User user){ ... }
=> public String save(User user){ ... }

@ModelAttribute는 컨트롤러가 리턴하는 모델에 파라미터로 전달한 오브젝트를 자동으로 추가해준다.
모델의 이름은 기본적으로 파라미터 타입의 이름을 따른다.
MemberDto 클래스라면 memberDto라는 이름의 모델로 등록이 된다.
다른 이름을 사용하고 싶다면 지정할 수도 있다.
public save(@ModelAttribute("user") MemberDto memberDto){ ... }

댓글 없음:

댓글 쓰기