@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

+ Recent posts