기본적인 AbstratAnnotationConfigDispatcherServeleteInitializer의 설정이 요구사항을 만족하지 못할 때, 제공하는 방법
DispatcherServelet 설정 사용자 정의하기
추가설정을 위해, 오버라이드 할 수 있는 메소드들(getServletMappings(), getRootConfigClasses(), getServeletConfigClsses() 제외)이 존재함.
* customizedRegistration() : AbstratAnnotationConfigDispatcherServeleteInitializer가 서블릿 컨테이너와 DispatcherServelet을 등록한 후, ServletRegistration안에 전달하면서, 호출.. DispatcherServlet에 추가적인 설정 적용
=> customizedRegistration()에서 넘겨지는 ServletRegistration.Dynamic으로 setLoadOnStartup()을 호출하여, load-on-startup의 우선순위를 설정, setInitParameter()를 호출하여, 초기 인자를 설정하고, 멀티파트 지원 설정을 위해 setMultipartConfig()를 호출하는 등의 기능을 수행함... (??)
=> 해당 내용에서 예외-처리 코드를 걷어내고, @ExceptionHandler를 통해, 간단한 코드로 바꿀 수 있다.
/// 해당 코드에서는, 예외처리 부분을 걷어냄
@RequestMapping(method=RequestMethod.POST)
public String saveCoffee(~~~) {
coffeeRepsitory.save(~~)
return "redirect:/coffees";
}
// 새로운 ExceptionHandler코드를 통해, 에러 핸들링 가능
@ExceptionHandler(DuplicateCoffeeException.class)
public String hanldeDuplicateCoffee() {
return "error/duplicate";
}
* 같은 컨트롤러 내의 모든 핸들러 메소드에서 발생한 예외를 처리한다. 잠재적으로 발생하는 모든 메소드 중복을 커버 가능
어드바이징 컨트롤러
* @ExceptionHandler 메소드가 동일 컨트롤러 클래스 내의 모든 메소드에서 발생하는 예외를 처리한다면, 모든 컨트롤러 메소드에서 발생하는 예외는 컨트롤러 어드바이스(Controller Advice)로 처리
@ControllerAdvice : @ExceptionHandler, @InitBinder, @ModelAttribute가 포함된 메소드를 모두 포함한다 + @RequestMapping이 붙은 메소드에도 전역적으로 사용된다.
// @Component가 자체적으로 붙어있음 -> 컴포넌트 스캐닝에 의해 선택
@ControllerAdvice
public class AppWideExceptionHandler {
@ExceptionHandlder(DuplicateCoffeeException.class)
public String duplicateCoffeeHandler() {
return "error/duplicate";
}
}
리다이렉션 되는 요청간의 데이터 전달
리다이렉션되는 메소드에서, 리다이렉션을 처리하는 메소드에 데이터를 넘겨주는 방법
* 데이터를 URL 템플릿을 사용하여, 패스변수나 쿼리인자로 전달
* 데이터를 플래스 애트리뷰트에 넣어서 전달
URL템플릿과 함께 리다이렉션 하기
* 패스변수나 쿼리인자로 데이터를 넘기는 것은 매우 간단.... 단순히 "redirect:/coffees/{coffeeName}" 이런 식으로 String에 연결하면 된다. 사용자가 해야할 일은, 모델에 값을 설정해주는 것 뿐
@RequestMapping(value="/register", method=POST)
public String processRegistration(~~~~, Model model) {
~~~~
model.addAttribute("coffeName", coffee.getCoffeeName());
return "redircet:/coffee/{coffeeName}";
}
=> URL 템플릿의 플레이스홀더에 채워지므로, 안전하지 않은 문자는 빠짐.. => coffeeName이 아메리카노 일 경우 /coffees/americano로 매핑
@RequestMapping(value="/register", method=POST)
public String processRegistration(~~~~, Model model) {
~~~~
model.addAttribute("coffeName", coffee.getCoffeeName());
model.addAttribute("shot", coffee.getShot());
return "redircet:/coffee/{coffeeName}";
}
=> 해당 경우에는, 모델의 애트리뷰트가 플레이스홀더에 매핑되지 않으므로, 리다이렉션에 자동적으로 쿼리 인자로 붙음