KoreaIt Academy/Spring Boot

[Spring Boot] @ControllerAdvice, @ExceptionHandler을 이용한 예외처리 방법(404, 500 에러)

hongeeii 2021. 10. 8.
728x90
반응형

@ControllerAdvice 란?

@Controller나 @RestController에서 발생한 예외를 한 곳에서 관리하고 처리할 수 있게 도와주는 어노테이션입니다.

즉 스프링에서 예외처리를 전역적으로 핸들링하기 위해 @ControllerAdvicde 어노테이션을 사용할 수 있습니다.

 

@ExceptionHandler

@ExceptionHandler같은 경우는 @Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서

하나의 메서드에서 처리해주는 기능을 합니다.



예외 처리 과정

프로그래밍에서 예외 처리는 아주 중요하면서도 아주 어렵습니다.

과하다할 만큼 상세하고 다양하게 예외를 잡아 처리해준다면,

클라이언트도 그렇고 서버도 그렇고 더 안정적인 프로그램이 될 수 있게 도와줍니다.

예외 처리를 하는 경우와 방법은 다양합니다.

 

if문으로 잡든 try-catch로 잡든 상위 메서드로 예외처리를 위임하든 코드는 복잡해집니다.

그렇게 되면 유지보수하기 아주 어려워지고 가독성이 안좋아집니다.

비즈니스 로직에 집중하기 어렵고, 비즈니스 로직과 관련된 코드보다 예외 처리를 위한 코드가 더 많아지는 경우도 생긴다.

이런 문제를 조금이라도 개선하기 위해 @ExceptionHandler와 @ControllerAdvice를 사용한다고 보면 이해가 쉬워집니다.

 

500 에러 페이지 처리

위의 except메소드는 500에러 처리를 할 수 있는 코드입니다.

ExceptionHandler(Exception.class)  //Exception타입이 아니라 .class를 붙임으로써 값으로 인식합니다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>오류</title>
</head>
<body>
    <h1>문제 발생</h1>
    <h4 th:text="${exception.getMessage()}"></h4>
    <ul>
        <th:block th:each="stack : ${exception.getStackTrace()}">
            <li th:text="${stack}"></li>
        </th:block>
    </ul>
</body>
</html>

model.addAttribute(exception)에 담아준것으로 view에서 어떤 에러가 났는지 표시하고, 에러페이지를 만들어 줍니다.

 

 

 

404 에러 페이지 처리 

500 메세지는 Internal Server Error이므로 @ExceptionHandler를 이용해서 처리가 가능하지만,
404 메세지는 문법 오류가 아니고 잘못된 URL을 호출할 때 보이므로 다르게 처리해주어야 합니다.

@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handle404(NoHandlerFoundException e){
return "error404_page";
}

application.properties 

spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false

 

 

728x90
반응형

추천 글