[Spring] ControllerAdvice

2024. 7. 6. 23:01BE/Spring

1. ControllerAdvice

 

 

예외 발생 시 매번 try-catch를 해도 되지만 귀찮다.

 

@ControllerAdvice은 비즈니스 로직과 예외 처리를 완전히 분리시켜줌과 동시에 원하는 곳에 원하는 방식으로 예외를 처리할 수 있게 해 준다.

 

<!-- web.xml -->
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <!-- DispatcherServlet이 해당 mapping을 찾지 못할 경우 NoHandlerFoundException를 throw하게 설정 -->
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
            <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

spring 6.1 버전부터는 throwExceptionIfNoHandlerFound의 default 값은 true라서 별도로 설정하지 않아도 된다.

 

package com.company.board.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.NoHandlerFoundException;

@ControllerAdvice
public class ExceptionControllerAdvice {

    private final Logger logger = LoggerFactory.getLogger(ExceptionControllerAdvice.class);

    @ExceptionHandler(Exception.class)
    public String handleException(Exception ex, Model model) {
        logger.error("Exception 발생 : {}", ex.getMessage());
        model.addAttribute("msg", "처리중 에러 발생!!!");
        return "error/error";
    }

    @ExceptionHandler(NoHandlerFoundException.class)
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public String handle404(NoHandlerFoundException ex, Model model) {
        logger.error("404 발생 : {}", "404 page not found");
        model.addAttribute("msg", "해당 페이지를 찾을 수 없습니다!!!");
        return "error/error";
    }

    // 더 많은 예외처리도 추가할 수 있다.
}
  • @ControllerAdvice
    : 이 방법은 controller만 지원하므로 sevice와 dao에서 발생한 예외는 controller로 throw 해야 한다.

 

이제는 모든 예외를 한 곳에서 처리할 수 있다!

 


 

- 2024.07.24 추가

 

RestController + ControllerAdvice = RestControllerAdvice

 

예외가 발생했을때 json으로 응답하고 싶은 경우 사용할 것.

'BE > Spring' 카테고리의 다른 글

[Spring] Connection Pool  (0) 2024.07.06
[Spring] File Upload & Download  (0) 2024.07.06
[Spring] Java Config  (0) 2024.07.06
[Spring] AOP  (0) 2024.07.06
[Spring] Interceptor  (0) 2024.07.06