Spring/SpringMVC

[Spring MVC] 예외처리

각시탈코더 2022. 2. 23. 15:23

예외처리

 스프링은 try-catch문 뿐만 아니라 다양한 예외처리 방법을 제공한다. 스프링에서 제공하는 다양한 예외처리 방법에 대해 알아보겠다.


1.@ExceptionHandler와 @ControllerAdvice

1-1@ExceptionHandler

 

 main메서드와 main2메서드를 살펴보면, 각각 Exception, NullPointerException이 발생할 걸 알 수 있다. 일반적인 예외처리 방식인 try-catch문을 쓰면 각 메서드에 추가적인 코드가 생기지만 @ExceptionHandler를 사용하면 위와 같이 메서드의 예외에 해당하는 예외처리 메서드로 이동하여 코드를 좀더 간결하게 만들 수 있다. 만약 하나의 메서드에서 여러개의 예외를 처리 하고 싶다면 catcher2메서드와 같이 '{}'로 예외를 묶어서 표현 할 수 있다.

 

 

1-2 @ControllerAdvice

 

 @ControllerAdvice는 하나의 클래스가 아니라 프로젝트 안의 모든 클래스에게 예외 처리 메서드를 사용할 수 있는 기능을 제공한다. 만약 특정한 패키지에만 예외 처리 메서드 적용하고 싶다면 패키지 주소를 @ControllerAdvice 메서드안에 적어주면 된다. 

 

 

위의 이미지와 같이 'NullPointerException'이 중복된다. 중복되는 경우에는 어떤 메서드를 선택해야할까? 예외 처리 메서드가 중복되면 컨트롤러 내의 예외 처리 메서드가 우선한다. 여기서는 catcher2의 메서드가 실행된다.


2.@ResponseStatus

 @ResponseStatus 어노테이션은 응답 메시지의 상태 코드를 변경할 때 사용된다. @ResponseStatus가 붙는 경우는 두 가지로 압축할 수 있다.

 

2-1 예외 처리 메서드 앞에 붙는 경우

 

 catcher2메서드가 요청처리에 성공하면 응답메시지에서는 상태 코드가 200으로 나온다. 하지만 이 메서드는 예외를 처리하는 메서드라서 정상을 나타내는 상태 코드 200이 아니라 클라이언트 혹은 서버에서 비정상으로 작동하는 응답코드 400, 혹은 500 상태 코드를 나타내줘야한다. 위와 같이 @ResponseStatus는 상태코드를 원하는 코드로 바꾸는 게 가능하다. 

 

  • 상태코드
Http reponse status code description
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
... ...
500 Internal Server Error
501 Not Implmented
503 Service Unavailable
... ...

 

2-2 예외 클래스 앞에 붙는 경우

 

 

 @ResponseStatus를 예외 클래스 앞에 붙이면 사용자가 지정하는 예외클래스가 된다. @ResponseStatus는 기본 값으로 500 상태코드 즉 서버에러 상태 코드를 갖는다. 만약 500 사용자가 500 상태코드가 아닌 클라이언트 에러인 400 Bad Request를 상태 코드로 지정하고 싶다면 @ResponseStatus 어노테이션을 추가한뒤 괄호() 원하는 에러메시지를 적어주면 된다.

 


3.<error-page> - web.xml

 web.xml에서는 상태 코드별로 뷰를 맵핑할 수 있다.

 

 위의 <error-page>를 통해 '400 상태 코드'가 나오면 뷰 '/error400.jsp'로 상태 코드가 '500'이면 뷰 '/error500.jsp'가 나온다.   

 


3.SimpleMappingExceptionResolver

상태코드 뿐만아니라 예외 종류별로 뷰 맵핑을 사용할 수 있다. servlet - context.xml에 SimpleMappingExceptionResolver를 등록한다.

 


4.스프링에서의 예외 처리 정리

  • 컨트롤러 메서드 내에서 try-catch로 처리
  • 컨트롤러에 @ExceptionHandler메서드가 처리
  • @ControllerAdvice클래스의 @ExceptionHandler메서드가 처리
  • 예외 종류별로 뷰 지정 - SimpleMappingExceptionResolver
  • 응답 상태 코드별로 뷰 지정 - <error-page>

출처:스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)