ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] @ModelAttribute와 WebDataBinder
    프로그래밍/Spring 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 객체를 통해 에러객체를 받을 수 있고 에러 정보를 확인할 수 있다.

    댓글

Designed by Tistory.