프로그래밍/Spring

[Spring] @ModelAttribute와 WebDataBinder

byungmin 2021. 12. 31. 12:16

@ModelAttribute

적용 대상을 Model의 속성으로 자동 추가해주는 어노테이션 (Model에 자동 저장)

반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능하다.

 

 

예제 1 - 매개변수

 

기존에는 브라우저의 요청 값을 매개변수로 받아서 Model 객체를 통해서 매개변수를 저장했었다.

@RequestMapping("/testMVC")
public String main(User user, Model model) {
    
    // 매개변수로 받은 user 객체를 Model에 저장
    model.addAttribute("user", user);
    
    // 작업 결과를 보여줄 뷰의 이름을 반환
    return "userInfo";
}

 

Model에 저장하고자 하는 매개변수 앞에 @ModelAttribute를 붙이면 model.addAttribute메서드에 저장하지 않고도 결과를 보여줄 페이지에서 매개변수를 사용할 수 있다.

@RequestMapping("/testMVC")
// public String main(@ModelAttribute("user") User user) {
public String main(@ModelAttribute User user) { // 위와 동일

    // 매개변수로 받은 user 객체를 Model에 저장
    //model.addAttribute("user", user);

    // 작업 결과를 보여줄 뷰의 이름을 반환
    return "userInfo";
}

 

예제 2 - 반환타입

@RequestMapping("/testMVC")
public String main(@ModelAttribute User user) {

    //String userInfo = getUserInfo(user);

    // 매개변수로 받은 user 객체를 Model에 저장
    //model.addAttribute("user", user);

    // 작업 결과를 보여줄 뷰의 이름을 반환
    return "userInfo";
}

private @ModelAttribute("userInfo") String getUserInfo(User user) {
    return user.toString();
}

유저의 정보를 toString으로 보여주는 getUserInfo 메서드의 반환타입 앞에 @ModelAttribute를 적으면 결과를 model에 자동으로 저장시켜준다.

 

예제 3 - 생략 가능 여부

 

참조형 매개변수 앞에는 @ModelAttribute를 생략하고 사용할 수 있다.

@RequestMapping("/testMVC")
public String main(User user, Model model) {
    
    // 매개변수로 받은 user 객체를 Model에 저장
    // model.addAttribute("user", user); 참조형 매개변수는 바로 model에 저장된다.
    
    // 작업 결과를 보여줄 뷰의 이름을 반환
    return "userInfo";
}

 

WebDataBinder

브라우저를 통해서 요청받은 값이 실제 서버의 객체에 바인딩 될 때 중간 역할을 한다. 크게 두 가지 작업을 진행한다.

먼저 타입 변환을 해주고 그 후 데이터 검증을 실시 한다. 변환 결과나 에러는 BindingResult에 저장한다.

WebDataBinder의 역할

예제

@ExceptionHandler
public String error(Exception exception, BindingResult result) {
    exception.printStackTrace();
    FieldError error = result.getFieldError();

    System.out.println(error.getField());
    System.out.println(error.getDefaultMessage());
    return "errorPage";
}

@RequestMapping("/testMVC")
public String main(@ModelAttribute User user) {

    // 작업 결과를 보여줄 뷰의 이름을 반환
    return "userInfo";
}

BindingResult 객체를 통해 에러객체를 받을 수 있고 에러 정보를 확인할 수 있다.