티스토리 뷰

반응형

예외 처리를 위한 방법 중 @ControllerAdvice를 사용 하여 존재 하지 않은 URL을 요청시 NoHandlerFoundException에 처리 하는 방법이 어려워 글로 남겨 본다.

 

우선 컨트롤러에 없는 URL로 요청을 했기 때문에 컨트롤러에서 사용되는 Exception 처리가 되지 않는다. dispatcher servlet 으로 전달된 요청은 ResourceHttpRequestHandler로 매핑이 되고 /error를 호출하는 것 같다.  커스텀 error 컨트롤러를 만들어서 처리를해주면 되지만 다른 에러와 동일하게 처리하고자 @ControllerAdvice에서 하는 방법을 찾아보았다.

 

 

환경

Srping Boot 2.5.5

 

 

application.yml 설정

  thymeleaf:
    prefix: classpath:templates/
    suffix: .html
    cache: false

  mvc:
    throw-exception-if-no-handler-found: true

  web:
    resources:
      add-mappings: false

 

구현을 위해 application.yml 설정을 위와 같이 진행해야한다. throw-exception-if-no-handler-found: true 옵션은 존재하지 않은 URL를 호출 시에 Exception 처리를 하도록 설정하는 것이다.  add-mappings: false 는 요청된 URL 경로가 없을 때 ResourceHttpRequestHandler와 매핑이 되는 것을 차단하는 것이다.

 

 

@ControllerAdvice 예시 코드

@ControllerAdvice
public class ControllerExceptionAdvice {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String NoHandlerFoundException (NoHandlerFoundException e) {
        log.info("--------404 error---------" + e);
        return "error";
    }

 

@ControllerAdvice 어노테이션을 사용하면 Bean에 등록이 되고 모든 @Controller에서 Exception발생 시 처리할 수 있게 해준다. 

@ExceptionHandler 과 예외 처리하고 싶은 Exception을 넣고 처리 로직을 추가해주면 된다. 여기 까지 하면 원하는 방식대로 예외 처리를 할 수 있다. 이번 경우 모든 에러에 대해 같은 웹 페이지를 보여줘야하므로 에러 Page를 리턴했다. 하지만 여기서 페이지의 js, css 등 정적 파일들을 요청하지 못하는 에러가 발생했다.

 

문제의 원인은 add-mappings: false 옵션 때문이였다. 이 옵션은 localhost:8000/api/techbrad 로 요청을 보낼때 /static/api/디렉토리 밑에 techbrad 파일이 있는지 매핑 작업을 못하도록 하는 것이다. 따라서 정적파일을 브라우저에 다운로드 받지 못했다. 이 것에 대해 예외 처리를 해주는 방법은 아래와 같다.

 

 

MvcConfig.class 코드

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/css/**")
                .addResourceLocations("classpath:/static/css/");
        registry
                .addResourceHandler("/js/**")
                .addResourceLocations("classpath:/static/js/");
        registry
                .addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
    }
}

 

css, js 따로 매핑 해도 되고 /**로 resource 경로 전체를 매핑 시켜 줘도 된다. 이렇게 하면 정적파일이 정상적으로 다운로드 되는 것을 확인 할 수 있다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함