@ControllerAdvice의 스프링에서 전역 예외 처리 및 공통 설정 관리하기

궁금하면 500원·2024년 5월 25일

미생의 스프링

목록 보기
2/48

@ControllerAdvice?

@ControllerAdvice는 스프링 MVC의 전역 예외 처리와 공통적인 기능을 제공합니다.

이 어노테이션을 사용하면 애플리케이션 전역에서 발생하는 예외를 한 곳에서 처리할 수 있어,
코드의 중복을 줄이고 유지 보수를 용이하게 합니다.

@ControllerAdvice는 컨트롤러의 전역 설정, 공통 기능 적용,
예외 처리 등을 중앙 집중화할 수 있습니다.

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

// 글로벌 예외 처리 클래스
@ControllerAdvice
public class GlobalExceptionHandler {

    // NullPointerException 예외 처리
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ErrorResponse handleNullPointerException(NullPointerException ex) {
        return new ErrorResponse("NULL_POINTER", "A null pointer exception occurred: " + ex.getMessage());
    }

    // 모든 예외를 처리하는 일반 예외 처리
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ErrorResponse handleException(Exception ex) {
        return new ErrorResponse("INTERNAL_ERROR", "An internal error occurred: " + ex.getMessage());
    }

    // 에러 응답 클래스
    public static class ErrorResponse {
        private String errorCode;
        private String message;

        // 생성자, getter, setter
        public ErrorResponse(String errorCode, String message) {
            this.errorCode = errorCode;
            this.message = message;
        }

        public String getErrorCode() {
            return errorCode;
        }

        public void setErrorCode(String errorCode) {
            this.errorCode = errorCode;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }
    }
}

문제: 예외가 처리되지 않은경우

  • 원인: @ControllerAdvice 클래스가 스프링의 컴포넌트 스캔 범위에 포함되지 않았거나,
    예외를 처리할 메서드가 누락되었을 수 있습니다.

  • 해결: @ControllerAdvice 클래스가 애플리케이션의 컴포넌트 스캔 범위에 포함되도록 패키지
    구조를 확인하고, 필요한 예외 처리를 위한 메서드를 추가합니다.

@ComponentScan을 사용하여 올바른 패키지를 스캔하도록 설정합니다.

문제: 특정 예외만 처리되지 않는 경우

  • 원인: 예외가 특정 클래스 또는 패키지에서 발생하고 @ExceptionHandler 메서드가 그 예외를
    처리하지 않거나, 예외 처리 메서드가 잘못된 타입을 지정한 경우입니다.

  • 해결: @ExceptionHandler 어노테이션에 지정된 예외 타입이 실제로 발생하는
    예외와 일치하는지 확인합니다.

예외 처리 메서드의 파라미터 타입이 올바른지 확인하고, 메서드의 반환 타입과 응답 상태를 검토합니다.

결론

@ControllerAdvice를 활용하면 스프링 애플리케이션에서 예외를 효율적으로 처리할 수 있어
코드의 가독성과 유지 보수성이 크게 향상됩니다.

전역적으로 예외를 처리할 수 있는 중앙 집중화된 접근 방식은 복잡한 시스템에서 예외를 관리하는 데 매우 유용하며,
예외 처리 로직을 재사용 가능하게 만들어줍니다.

이러한 패턴은 코드의 중복을 줄이고, 일관된 예외 응답을 보장하여 개발자의 생산성을 높이는 데 기여합니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글