[꼼꼼한 개발자] 꼼코더
25. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 Exception 처리, @ControllerAdvice, @ExceptionHandler, 404 에러 페이지 본문
25. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 Exception 처리, @ControllerAdvice, @ExceptionHandler, 404 에러 페이지
꼼코더 2023. 1. 5. 01:50✅ Controller의 Exception 처리
Controller를 작성할 때 예외 상황까지 고려한다면 처리해야 하는 작업량은 엄청나게 늘어난다.
스프링 MVC에서는 이러한 작업을 다음과 같은 방식으로 처리할 수 있다.
- @Exception와 @ControllerAdvice를 이용한 처리
- @ResponseEntity를 이용한 예외 메세지 구성
✍🏻 @ControllerAdvice
@ControllerAdvice는 뒤에서 배우게 될 AOP를 이용한 방식이다. AOP에 대해 간단히 언급하자면
AOP는 ‘핵심적인 로직은 아니지만 프로그램에서 필요한 공통적인 관심사는 분리’하자는 개념이다.
Controller를 작성할 때 메서드의 모든 예외사황을 전부 핸들링해야 한다면
중복적이고 많은 양의 코드를 작성해야 하지만
AOP 방식을 이용한다면 공통적인 예외사황에 대해서 별도로
@ControllerAdvice를 이용해서 분리하는 방식이다.
👨🏻💻 CommonExceptionAdvice 클래스 작성
org.zerock.exception 패키지 생성 → CommonExceptionAdvice 클래스 생성
CommonExceptionAdvice는 @ControllerAdvice 어노테이션을 적용하지만
예외 처리를 목적으로 생성하는 클래스이므로 별도의 로직을 처리하지는 않는다.
어노테이션은 @ControllerAdvice와 @ExceptionHandler을 사용하고 있다.
- @ControllerAdvice : 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시
- @ExceptionHandler : 해당 메서드가 ‘()’ 안에 들어가는 예외 타입을 처리한다는 것을 의미.
위와 같이 Exception.class를 지정하였으면 except()만을 이용해서 처리할 수 있다.
만약 특정한 타입의 예외를 다루고 싶다면 Exception.class대신 구체적인 예외 클래스를 지정해야 한다.
JSP 화면에서도 구체적인 메시지를 보고 싶다면 Model을 이용해서 전달하는 것이 좋다.
org.zerock.exception 패키지는 servlet-context.xml에서 인식하지 않기 때문에
<component-scan>을 이용해서 해당 패키지의 내용을 조사하도록 해야 한다.
👨🏻💻 error_page.jsp 작성
CommonExceptionAdvice의 except()의 리턴값은 문자열(참고)이므로 JSP 파일의 경로가 된다.
따라서 JSP는 error_page.jsp이므로 /WEB-INF/views 폴더 내에 작성해야 한다.
예외의 메시지가 정상적으로 출력되는지 확인해 보려면 고의로 숫자, 날짜 등의 파라미터 값을 변환하여 문제를 만들어내어 호출할 수 있다.
예시로 /sample/ex04?name=aaa&age=11&page=9와 호출해야 하는 URL에서
고의로 age 값을 숫자로 변환할 수 없게 다른 값을 전달해 보거나
page와 같은 파라미터를 생략하는 등의 작업을 통해서 확인할 수 있다.
💁🏻♂️ 결과
아래 화면은 고의로 age 값을 ‘bbb’와 같은 문자열로 전송하였을 때 보이는 화면이다.
호출 : /sample/ex04?name=aaa&age=bbb&page=9
☕️ Java 설정을 이용하는 경우
ServletConfig 클래스에 ‘org.zerock.exception’ 패키지를 인식해야 하므로 아래와 같이 ‘org.zerock.exceprion’ 패키지를 추가해야 합니다.
🤬 404 에러 페이지
WAS의 구동 중 가장 흔하게 나타나는 HTTP 상태 코드는 ‘404’와 ‘500’ 에러 코드이다.
500 메시지는 @ExceptionHanlder를 이용해서 처리되지만
잘못된 URL을 호출할 때 보이는 404는 다르게 처리해야 한다.
서블릿이나 JSP를 이용하여 개발하면 web.xml을 이용해서 별도의 에러페이지를 지정할 수 있다.
에러 발생 시 추가적인 작업을 하기는 어렵기 때문에 스프링을 이용해서 404와 같이 WAS 내부에서 발생하는 에러를 처리하는 방식을 알아두자
👨🏻💻 web.xml 수정
스프링 MVC의 모든 요청은 DispatcherServlet을 이용해서 처리되므로 404 에러도 같이 처리할 수 있도록 web.xml을 수정한다.
👨🏻💻 CommonExceptionAdviece.java 수정
CommonExceptionAdviece에도 메서드를 추가하여 수정해 준다
👨🏻💻 custom404.jsp 작성
에러 메시지는 custom404.jsp를 작성해서 처리한다.
💁🏻♂️ 결과
호출 : http://localhost:8080/nopage
존재하지 않은 URL 호출 시 cutom404.jsp 페이지가 보이는 걸 확인할 수 있다.
/sample/..로 시작하는 URL의 경우에는 SampleController가 무조건 동작하므로
이를 제외한 경로로 테스트를 진행했다.
☕️ Java 설정을 사용하는 경우
web.xml에 설정한 throwExceptionIfNoHandlerFound를 설정하기 위해서
서블릿 3.0 이상을 이용해야만 하고 WebConfig 클래스를 아래와 같이 수정해야만 한다.
🧹 최종 정리
- 스프링 MVC에서는 Controller를 작성할 때 예외 상황 고려 작업을 아래와 같은 방식으로 처리한다.
- @Exception와 @ControllerAdvice를 이용한 처리
- @ResponseEntity를 이용한 예외 메세지 구성
- @ControllerAdvice는 AOP를 이용한 방식이다.
- AOP는 ‘핵심적인 로직은 아니지만 프로그램에서 필요한 공통적인 관심사는 분리’하자는 개념
- AOP 방식을 이용한다면 공통된 예외사황서 별도로 @ControllerAdvice를 이용해서 분리하는 방식이 있다.
- @ControllerAdvice : 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시
- @ExceptionHandler : 해당 메서드가 ‘()’ 안에 들어가는 예외 타입을 처리한다는 것을 의미.
- 예외 처리를 목적으로 생성하는 클래스이는 별도의 로직을 처리하지는 않는다.
- 예외 결과를 JSP 화면에서도 구체적인 메시지를 보고 싶다면 Model을 이용해서 전달하는 것이 좋다.
- WAS의 구동 중 가장 흔하게 나타나는 HTTP 상태 코드는 ‘404’와 ‘500’ 에러 코드이다.
- 500 메시지는 @ExceptionHanlder를 이용해서 처리되지만 잘못된 URL을 호출할 때 보이는 404는 다르게 처리해야 한다.
- 서블릿이나 JSP를 이용하여 개발하면 web.xml을 이용해서 별도의 에러페이지를 지정할 수 있다.
- 스프링을 이용해서 404와 같이 WAS 내부에서 발생하는 에러를 처리를 할 수 있다.
- 스프링 MVC의 모든 요청은 DispatcherServlet을 이용해서 처리된다.
위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.