본문 바로가기
Back-End/Spring

Spring boot @ControllerAdvice

by 어렵다어려웡 2021. 5. 17.

쉽게 말하자면 컨트롤러 계층에서 AOP를 적용시키기 위한 어노테이션이라고 할수 있을것 같다.

 

해당 어노테이션을 주로 사용하는 예시에는 예외처리에 대한 코드가 대부분 있다.

컨트롤러단 메서드들의 코드들을 좀 더 단순화 시키고 가독성이 좋게 하기 위한 목적으로 쓰이는 편이다.

 

이 어노테이션과 비슷한 어노테이션이 하나 존재한다 -> @RestControllerAdvice

 

보면 눈치 채셨겠지만 차이점은 Rest한 메서드들에 적용시킬지 아닐지에 대한 것 뿐이다.

 

우선 2가지 정도의 예외를 직접 간단히 만들어보았습니다..

public class NotEnoughStockException extends RuntimeException {

    public NotEnoughStockException() {
        super("해당 상품의 재고가 부족합니다.");
    }
}
public class IsNotCartException extends RuntimeException {

    public IsNotCartException() {
        super("장바구니가 없습니다.");
    }
}

 

예외처리 메서드

@ControllerAdvice
public class ExceptionController {

    // 복수개의 에러잡기
    @ExceptionHandler(value = {NotEnoughStockException.class, IsNotCartException.class})
    public String exceptionHandler(RuntimeException e) {
        return e.getMessage();
    }

    // 하나의 에러잡기
//    @ExceptionHandler
//    public String notEnoughStockExceptionHandler(NotEnoughStockException e) {
//        return e.getMessage();
//    }
}

@ControllerAdvice를 선언하고 예외처리를 할 메서드에 @ExceptionHandler를 선언해서 사용합니다.

 

위처럼 여러개의 예외처리를 한꺼번에 하고싶을 경우 @ExceptionHandler의 매개변수로 value의 값에

예외처리할 클래스를 지정하시면 되겠습니다.

 

그게 아니라면 예외처리 메서드의 매개변수에 예외처리할 클래스를 넣고 해당 메세지를 리턴하면 되겠습니다.

 

이런식으로 한다면 직접적으로 Controller단 로직안에 try - catch문을 넣을 이유가 사라집니다.