예외처리를 위한 메서드를 컨트롤러 안에 만들 수 있다. 메서드에는 @ExceptionHandler를 붙여주고 안에는 처리할 예외를 넣어준다. 하나의 메서드로 여러개의 예외를 처리하기 위해서는 매개변수를 배열로 입력한다. 위 코드에서 예외처리 메서드 안에서의 Model과 컨트롤러 메서드 안에서의 Model은 서로 다른 객체이다.
예외처리 메서드는 원래 같은 컨트롤러 안에서 발생하는 예외만 처리할 수 있으나, 별도의 클래스를 만들고 예외처리 메서드를 작성한 후, @ControllerAdvice를 클래스에 붙이면 모든 컨트롤러의 예외를 처리 가능하다. @ControllerAdvice에 아무것도 적어주지 않으면 모든 패키지에 적용되고 패키지를 적어주면 지정된 패키지에서만 적용가능하다. 만약 같은 예외처리가 같은 컨트롤러 안에 있고, @ControllerAdvice가 있는 예외처리 클래스, 두 클래스에 다있다면 가까운 같은 클래스내의 예외처리 메서드가 실행된다.(예외처리메서드가 중복된 경우, 컨트롤러 내의 예외처리 메서드가 우선)
상태코드를 바꾸어주는 역할
위에서 예외처리를 했는데 응답으로 200번, 서버가 요청을 처리했다라는 응답이 나왔다. 이러한 경우는 예외처리를 해주었지만 서버에서 예외가 발생하였으므로 500번, 즉 서버에서 오류가 발생하여 요청을 수행할 수 없다는 응답을 보내주어야 한다. 이럴때 사용하는 것이 @ResponseStatus이다.
이와 같이 상태코드가 500으로 바뀐것을 알 수 있다.