Programming/Spring MVC

모델, 바인더, 예외 처리, 전역 컨트롤러 (스프링 MVC - 7)

흠냐아뤼 2020. 3. 26. 21:21
728x90

 

1. @ModelAttribute

- @Controller, @ControllerAdvice 를 사용한 클래스에서 모델 정보를 초기화 할 때 사용함

- @RequestMapping과 같이 사용하면 해당 메소드에서 리턴하는 객체를 모델에 넣어준다. (뷰는 요청 url로 찾음 - 리퀘스트 투 뷰 네임 트렌스레이터) <이렇게 잘 사용x>

 

@ModelAttribute
    public void categories(Model model) {
        model.addAttribute("categories", List.of("study", "hobby"))
    }

    @GetMapping("/events/model/test")
    @ModelAttribute
    public Event modelTest() {
        return new Event();
    }

 

 

2. @InitBinder

특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 사용

 

@Controller
public class SampleController {

    @InitBinder("event")
    public void initEventBinder(WebDataBinder webDataBinder) {
    	// 바인딩 설정
        webDataBinder.setDisallowedFields("id");
        
        // 포메터 설정
        webDataBinder.addCustomFormatter(new EventFormatter());
        
        // Validator 설정
        webDataBinder.addValidators(new EventValidator());
    }
}

 

public class EventValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass) {
        return Event.class.isAssignableFrom(aClass);
    }

    @Override
    public void validate(Object o, Errors errors) {
        Event event = (Event)o;
        if(event.getName().equalsIgnoreCase("aaa")) {
            errors.rejectValue("name", "wrongValue", "the Value is not allowed");
        }
    }
}

 

 

3. 예외 처리 핸들러 (@ExceptionHandler)

특정 예외가 발생한 요청을 처리하는 핸들러 정의

- REST API의 경우 응답 본문에 에러에 대한 정보를 담아주고, 상태 코드를 설정하려면 ResponseEntity를 주로 사용한다.

 

@Controller
public class SampleController {

    @ExceptionHandler
    public String eventErrorHandler(EventException e, Model model) {
        model.addAttribute("message", "event exception");
        return "/error";
    }
}

 

 

4. 전역 컨트롤러 (@ControllerAdvice)

모델 객체 설정, 바인딩 설정, 예외 처리를 모든 컨트롤러 전반에 걸쳐 적용하고 싶은 경우에 사용

- @ExceptionHandler

- @InitBinder

- @ModelAttributes

 

적용할 범위를 지정할 수도 있다.

- 특정 애노테이션 가지고 있는 경우

- 특정 패키지 이하의 컨트롤러에만 적용하기 

- 특정 클래스 타입만 적용하기

 

 

 

인프런 백기선님 '스프링 MVC’ 강의를 듣고 정리한 내용입니다.
728x90