스프링부트 공통 Exception 처리하기

반응형
728x90
반응형

사용된 어노테이션

SpringBoot 프레임워크에서 Exception 처리를 공통처리를 해보자. 그전에, 알아야할 어노테이션을 정리해보자.

어노테이션 설명
@RestController @Controller + @ResponseBody 이다. Json, Xml 등의 format으로 return 해줄 경우에 사용한다.
@RestControllerAdvice 기본은 @ControllerAdvice 어노테이션이 존재하는데, Json, Xml Format으로 return 해줄 경우 대신 사용한다. 웹 어플리케이션 전역에서 Exception 발생시, 해당 에러를 잡아 처리한다.
@ExceptionHandler 발생한 Exception 에 따라 선택적으로 특정 메소드를 실행한다.

 

 

Exception 파일

  • BadRequestException.java
public class BadRequestException extends RuntimeException {
    private String errorCode;

    /**
     * default 400 Error
     */
    public BadRequestException() {
        this.errorCode = EnvironmentCode.INVALID_REQUEST_DATA;
    }

    /**
     * Error Code 지정
     * @param code
     */
    public BadRequestException(String code) {
        this.errorCode = code;
    }

    public String getErrorCode() {
        return errorCode;
    }
}

 

위 파일은 아래 코드에서 예시로 사용된다.

if ("aa".equals(test)) {
	throw new BadRequestException();
}

if ("bb".equals(test)) {
	throw new BadRequestException("잘못된 이름입니다.");
}

 

Common Exception 파일

  • CommonExceptionHandler.java
@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler extends LogUtil {

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<?> error400(BadRequestException e) {
        log.error("400 Error : " + catchLog(e));
        return ...;
    }

    @ExceptionHandler({RuntimeException.class, Exception.class})
    public ResponseEntity<?> error500(Exception e) {
        log.error("500 Error : " + catchLog(e));
        return ...;
    }
}

 

 

구현 설명

CommonExceptionHandler.java 파일의 error400, error500과 같은 구현된 메소드를 어떻게 찾아가는지 알아보자.

if ("aa".equals(test)) {
	throw new BadRequestException();
}

(1) 해당 if문을 타고 아래 ‘throw new BadRequestException(); 을 실행하였다. 어플리케이션에서는 에러가 발생한 것이다.

(2) 그렇다면 @RestControllerAdvice 어노테이션으로 인해 CommonExceptionHandler.java 파일을 찾아갈 것이다.

 

@ExceptionHandler(BadRequestException.class)
@ExceptionHandler(RuntimeException.class, Exception.class})

 

(3) 이 2개의 어노테이션이 선언된 메소드 2개중에, 발생된 에러가 BadRequestException 이다.
이 때문에, 첫번째 @ExceptionHandler(BadRequestException.class)이 선언된 메소드의 코드가 실행된다.

 

 

마무리

공통 Exception 처리를 함으로써, 웹 어플리케이션에서 발생할 수 있는 Exception 을 분리하여, 각 Excpetion에 따라 실행되어야하는 코드를 공통화시킬 수 있다. 만약 500 Exception이 발생하였을때 ElasticSearch 에 Log를 적재시켜야하는 코드가 추가되어야할때, 우리는 단 하나의 파일 CommonExceptionHandler.java 의 메소드만 수정하면 된다. 

 

중복 코드를 줄일 수 있고, Restful 에서 사용되는 404, 400, 500, 401 등의 에러에 따른 로직을 분리하여 공통화 처리를 함으로써 좀더 나은 프로젝트로 개발할 수 있다.

 

 

반응형

Designed by JB FACTORY