예외처리
스프링은 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>
출처:스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
'Spring > SpringMVC' 카테고리의 다른 글
[SpringMVC] rediect와 forward (0) | 2022.02.26 |
---|---|
[SpringMVC] 요청과 응답 (0) | 2022.02.25 |
[SpringMVC] 데이터 변환과 검증 (0) | 2022.02.24 |
[Spring MVC] MVC 패턴 (0) | 2022.02.23 |
[Spring MVC] 쿠키와 세션 (0) | 2022.02.22 |