예외처리
1.예외처리
1.1 @ExceptionHandler와 @ControllerAdvice
1.1.1 @ExceptionHandler
main메서드와 main2메서드를 살펴보면, 각각 Exception, NullPointerException이 발생할 걸 알 수 있다. 일반적인 예외처리 방식인 try-catch문을 쓰면 각 메서드에 추가적인 코드가 생기지만 @ExceptionHandler를 사용하면 위와 같이 메서드의 예외에 해당하는 예외처리 메서드로 이동하여 코드를 좀더 간결하게 만들 수 있다. 만약 하나의 메서드에서 여러개의 예외를 처리 하고 싶다면 catcher2메서드와 같이 ‘{}’로 예외를 묶어서 표현 할 수 있다.
1.1.2 @ContollerAdvice
@ControllerAdvice는 하나의 클래스가 아니라 프로젝트 안의 모든 클래스에게 예외 처리 메서드를 사용할 수 있는 기능을 제공한다. 만약 특정한 패키지에만 예외 처리 메서드 적용하고 싶다면 패키지 주소를 @ControllerAdvice 메서드안에 적어주면 된다
위의 그림에서는 ‘NullPointerException’이 중복(Exception은 NullPointerException을 포함한다)된다. 중복되는 경우에는 어떤 메서드를 선택해야할까? 예외 처리 메서드가 중복되면 컨트롤러 내의 의미가 명확한 예외 처리 메서드가 우선 실행한다. 여기서는 catcher2의 메서드가 실행된다.
2.@ResponseStatus
@ResponseStatus 어노테이션은 응답 메시지의 상태 코드를 변경할 때 사용된다. @ResponseStatus가 붙는 경우는 두 가지로 압축할 수 있다.
2.1 예외 처리 메서드 앞에 붙는 경우
catcher2메서드가 요청처리에 성공하면 응답메시지에서는 상태 코드가 200으로 나온다. 하지만 이 메서드는 예외를 처리하는 메서드라서 정상을 나타내는 상태 코드 200이 아니라 클라이언트 혹은 서버에서 비정상으로 작동하는 응답코드 400, 혹은 500 상태 코드를 나타내줘야한다. 위와 같이 @ResponseStatus는 상태코드를 원하는 코드로 바꾸는 게 가능하다.
2-2 예외 클래스 앞에 붙는 경우
@ResponseStatus를 예외 클래스(RuntimeException) 앞에 붙이면 사용자가 지정하는 예외클래스가 된다. @ResponseStatus는 기본 값으로 500 상태코드 즉 서버에러 상태 코드를 갖는다. 만약 500 사용자가 500 상태코드가 아닌 클라이언트 에러인 400 Bad Request를 상태 코드로 지정하고 싶다면 @ResponseStatus 어노테이션을 추가한뒤 괄호() 원하는 에러메시지를 적어주면 된다.
3.web.xml에 에러페이지 표시하기
web.xml에서는 상태 코드별로 뷰를 맵핑할 수 있다.위의 error-page를 통해 ‘400 상태 코드’가 나오면 뷰 ‘/error400.jsp’로 상태 코드가 ‘500’이면 뷰 ‘/error500.jsp’가 나온다.
# 4. SimpleMappingExceptionResolver
출처:스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
Comments