1. 각각의 Controller 내에 예외 처리하는 메서드 생성

1. 형식
@ExceptionHandler(예외발생객체명.class)
public ModelandView ex1(){}

- 해당 Controller내에서 발생한 예외만 처리
- 다른 Controller에서 발생한 예외는 처리하지 않음
- 각각의 Controller에서 각각 메서드 생성

//예외처리 메서드 ++++++++++++++++++++++++++++
	@ExceptionHandler(BindException.class)
	public ModelAndView ex1() {
		ModelAndView mv = new ModelAndView();
		System.out.println("예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}
	
	@ExceptionHandler(NullPointerException.class)
	public ModelAndView ex2() {
		ModelAndView mv = new ModelAndView();
		System.out.println("Nullpointer 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}
	
	@ExceptionHandler(Exception.class)
	public ModelAndView ex3() {
		ModelAndView mv = new ModelAndView();
		System.out.println("Exception 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}
	
	@ExceptionHandler(Throwable.class)
	public ModelAndView ex4() {
		ModelAndView mv = new ModelAndView();
		System.out.println("Exception 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}

2. 예외를 전역 처리

- 예외를 전문적으로 처리하는 Controller 생성

1. 예외를 처리할 전문 Controller용 클래스 생성
2. @Controller 이 아닌 @ControllerAdvice 선언
3. 예외를 처리할 예외메서드 선언

@ControllerAdvice
public class ExceptionController {
	
	@ExceptionHandler(BindException.class)
	public ModelAndView ex1(Exception e) {
		ModelAndView mv = new ModelAndView();
		
		System.out.println(e.getMessage());
		
		System.out.println("========================");
		
		e.printStackTrace();
		
		System.out.println("예외 발생 처리");
		mv.addObject("msg", "불편을 죄송!");
		mv.addObject("path", "../");
		mv.setViewName("common/getResult");

		return mv;
	}
	
	@ExceptionHandler(NullPointerException.class)
	public ModelAndView ex2(NullpointerException ex) {
		ModelAndView mv = new ModelAndView();
		System.out.println("Nullpointer 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}
	
	@ExceptionHandler(Exception.class)
	public ModelAndView ex3(Exception ex) {
		ModelAndView mv = new ModelAndView();
		System.out.println("Exception 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}
	
	@ExceptionHandler(Throwable.class)
	public ModelAndView ex4() {
		ModelAndView mv = new ModelAndView();
		System.out.println("Exception 예외 발생 처리");
		mv.setViewName("error/error");
		return mv;
	}

}

3. Front Error 처리

Exception는 서버오류 (500번대) 이므로 ExceptionHandler에서 처리 가능
Front 오류는(400번대) 문법오류가 아니고, URL주소나 method 형식이 다른 경우 발생.

1. application.properties에 작성
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false

2. ExeptionHandler Method 선언
//400 : 파라미터가 잘못된 경우
HttpMessageNotReadableException

//401 : 인증 실패
AuthenticationException
//403 : 권한 실패
AcessDeniedException
//405 : Method 형식 실패
HttpRequestMethodNotFoundException

//404 
	@ExceptionHandler(NoHandlerFoundException.class)
	public ModelAndView ex5() {
		ModelAndView mv = new ModelAndView();
		System.out.println("4XX 예외 발생 처리");
		mv.addObject("message", "Page를 찾을 수 없습니다");
		mv.setViewName("error/error");
		return mv;
	}