[꼼꼼한 개발자] 꼼코더

25. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 Exception 처리,  @ControllerAdvice, @ExceptionHandler, 404 에러 페이지 본문

Spring/코드로 배우는 스프링 웹 프로젝트

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을 이용해서 처리된다.

 

 

 

위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.

 

코드로 배우는 스프링 웹 프로젝트 - YES24

이 책은 Spring Framework(이하 스프링)를 사용해서 말 그대로 ‘웹 프로젝트’를 어떻게 진행하는지를 설명하는 책이다. 웹 프로젝트라고 거창하게 표현하지만, 좀 더 구체적으로는 스프링으로 웹

www.yes24.com

 

 

Comments