Spring boot에서는 기본적으로 에러페이지를 지원해주고 있는데요. 배포해놓은 서비스에 기본적인 에러페이지가 뜨게되면 좋지않다고 생각되어 변경해보도록 하겠습니다.

먼저 templates 디렉토리 아레에 error 디렉토리를 만든 후 에러코드별 페이지를 하나씩 만들어 줍니다.

이렇게 에러코드별로 만들어놓은 HTML은 해당 HTTP status code가 발생 하였을 경우 status code에 맞는 html을 보여주게 됩니다.

그러나 서버에서 보내주는 에러의경우 매우 다양한 에러가 있는데요 

  • 해당 유저를 찾을 수 없어서 500에러
  • 해당 포스트를 찾을 수 없어서 500에러
  • 글쓰다가 등록실패로 500에러 등이 있을수 있습니다.

이러한 에러를 모두 500.html 페이지 하나로 관리하려면 어떤 에러가 발생했는지 관리하기 힘들어집니다. 

이것을 해결하기위해 커스텀 에러를 정의하고 @ControllerAdvice에러 커스텀에러를 처리하도록 하겠습니다.

@Slf4j
public class PostNotFoundException extends RuntimeException {

    public PostNotFoundException(Long id) {
        super("해당 포스트를 찾을 수 없습니다.");
        log.error(id + " 번 포스트를 찾을 수 없습니다!");
    }

    public PostNotFoundException() {
        super();
    }
}

 

 

먼저 커스텀에러를 정의해 줍니다 저는 해당 포스트를 찾지 못하였을경우 에러를 뱉도록 하였습니다.

ServiceLayer에서 해당 포스트를 찾지 못할경우 방금 정의한 PostNotFoundException을 던져줍니다.

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends RuntimeException {

    @ExceptionHandler(PostNotFoundException.class)
    public String PostNotFoundException(PostNotFoundException e) {
        log.error(e.getMessage());
        return "error/post_not_found.html";
    }
}

그후 @ControllerAdvice를 이용하여 전체 Controller에서 발생하는 에러를 여기서 처리해주는데요

@ExceptionHandler를 사용하여 PostNotFoundException이 발생하였을 경우 처리를 해줍니다.

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends RuntimeException {

    @ExceptionHandler(PostNotFoundException.class)
    public String PostNotFoundException(PostNotFoundException e) {
        return "error/post_not_found.html";
    }
}

에러 메시지를 로그로 출력하고 template/error/post_not_found.html 파일로 에러화면을 보여줍니다.

+ Recent posts