스프링부트 공통 Exception 처리하기
- Project/Project Setting
- 2020. 1. 12.
사용된 어노테이션
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 등의 에러에 따른 로직을 분리하여 공통화 처리를 함으로써 좀더 나은 프로젝트로 개발할 수 있다.
'Project > Project Setting' 카테고리의 다른 글
SpringBoot + ElasticSearch 연동 및 간단 API 호출해보기 (0) | 2021.02.09 |
---|---|
SpringBoot + Redis 연동하기 (0) | 2020.01.19 |
SpringBoot에 Swagger을 빠르게 적용해보기 (0) | 2019.10.25 |
SpringBoot에 Http Client Feign 적용해보기 (0) | 2019.10.25 |
AWS ec2에 jenkins 설치하기 (+jdk1.7 삭제 후 openjdk11 설치) (0) | 2019.10.19 |