@ControllerAdvice
AOP를 이용한 방식
핵심적인 로직은 아니지만 프로그램에서 필요한 '공통적인 관심사(cross-concern)는 분리하자' 라는 개념
1. 예제를 위해 exception 패키지를 생성하고 CommonExceptionAdvice 클래스를 안에 생성해준다.
CommonExceptionAdvice.class
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice{
@ExceptionHandler(Exception.class)
public String except(Exception ex, Model model) {
log.error("Exception .... " + ex.getMessage());
model.addAttribute("exception", ex);
log.error(model);
return "error_page";
}
}
CommonExceptionAdvice는 @ControllerAdvice 어노테이션을 적용하지만 예외처리를 목적으로 생성하는 클래스이므로
별도의 로직을 처리하지는 않는다.
@ControllerAdvice : 객체가 스프링 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도
@ExceptionHandler : 해당 메서드가 ( ) 들어가는 예외타입을 처리한다는것을 의미
Exception.class : 모든 예외에 대한 처리
*JSP 화면에서 구체적인 메시지를 보고싶다면 Model을 이용해 전달한다.
XML 설정
2.
exception 패키지는 servlet-context.xml 에서 인식하지 않기때문에 <component-scan>을 이용해서
해당 패키지의 내용을 조사하도록 한다.
servlet-context.xml
<context:component-scan base-package="org.zerock.exception" />
JAVA 설정
2.
exception 패키지는 ServletConfig 클래스에서 인식하지 않기때문에 ComponentScan 의 basePackages 를 이용해
해당 패키지의 내용을 조사하도록 한다.
3.
CommonExceptionAdvice의 except( ) 의 리턴값은 문자열이므로 JSP 파일의 경로가 되기때문에
error_page.jsp가 된다.
/WEB-INF/views 폴더내에 error_page.jsp 파일을 만들어주도록 한다.
error_page.jsp
결과
예외의 메시지가 정상적으로 출력되고있는것을 확인할수있다.
404 에러페이지
WAS의 구동중 가장 흔한 에러와 관련된 HTTP 상태코드 '404' 와 '500' 에러코드
500 메세지는 Internal Server Error 이므로 @ExceptionHandler를 이용해 처리되지만
잘못된 URL을 호출할때 보이는 404에러 메세지는 다르게 처리하는것이 좋다.
XML 설정
1.
스프링 MVC의 모든 요청은 DispathcerServlet 을 이용해 처리되기때문에
404에러도 같이 처리할수있도록 web.xml을 수정해준다.
web.xml
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
CommonExceptionAdvice 클래스에서는 메서드를 추가해준다.
CommonExceptionAdvice.class
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handle404(NoHandlerFoundException ex){
return "custom404";
}
JAVA 설정
1.
web.xml에 설정한 throwExceptionIfNoHandlerFound를 설정하기위해서 서블릿 3.0 이상을 이용해야만 하고
WebConfig 클래스를 수정해주어야 한다.
WebConfig.class
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
}
2.
CommonExceptionAdvice의 handle404의 리턴값은 문자열이므로 JSP 파일의 경로가 되기때문에
cutom404.jsp가 된다.
/WEB-INF/views 폴더내에 cutom404.jsp 파일을 만들어주도록 한다.
cutom404.jsp
결과
/sample/.. 로 시작하는 URL의 경우는 SampleController가 무조건 동작하기때문에 이를 제외한 경로로
테스트를 해보면 브라우저에 존재하지 않는 URL은 custom404.jsp 페이지가 보이는것을 확인할수있다.
'Spring' 카테고리의 다른 글
한글문제 UTF-8 필터처리 (0) | 2021.04.29 |
---|---|
각 영역의 Naming Convention ( 명명 규칙 ) (0) | 2021.04.28 |
Spring 파일 업로드 설정 (0) | 2021.04.27 |
Spring MVC 기본설정 (0) | 2021.04.22 |
Spring , Lombok , JUnit 어노테이션 정리 (0) | 2021.04.20 |