Enum으로 Exception 관리
카테고리: Spring
현재 프로젝트에서 Enum으로 customize한 Exception 처리에 대해 간단하게 소개한다.
현재 나는 이런식으로 Enum을 관리하고있다.
Enum은 다양한 방법으로 사용이 가능하지만 이번 포스팅에선 Exception ErrorCode에 대해서 써보겠다.
에러 Enum Class 선언
테스트 용도로 최소한의 에러코드를 만들었다.
@Getter
@AllArgsConstructor
public enum ErrorCode {
// 공통
COMMON_BAD_REQUEST_400(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
COMMON_INTERNAL_ERROR_500(HttpStatus.INTERNAL_SERVER_ERROR, "알 수 없는 오류가 발생하였습니다."),
// JWT 관련
JWT_BAD_TOKEN_400(HttpStatus.BAD_REQUEST, "잘못된 JWT 토큰입니다."),
JWT_UNAUTHORIZED_401(HttpStatus.UNAUTHORIZED, "만료된 JWT 토큰입니다."),
JWT_NOT_FOUND_404(HttpStatus.NOT_FOUND, "유효한 JWT 토큰이 없습니다."),
JWT_NOT_ALLOWED_405(HttpStatus.METHOD_NOT_ALLOWED, "지원되지 않는 JWT 토큰입니다."),
// Member 관련
MEMBER_LOGINID_NOT_FOUND_404(HttpStatus.NOT_FOUND, "회원 정보를 찾을 수 없습니다."),
MEMBER_LOGINID_DUPLICATION_409(HttpStatus.CONFLICT, "이미 가입된 이메일입니다."),
/**
* 해당 주석 위로 enum 코드 추가 바랍니다.
* 코드 추가시 간편하게 진행하기 위해 생성한 미사용 코드입니다. 사용하지마세요.
* 생성이유 : enum 마지막 요소에 ; 을 입력해야하기에, 끝부분에 추가하게 될 경우 ; 을 재입력해야함
*/
DO_NOT_USED(null, null);
private final HttpStatus httpStatus;
private final String message;
}
Custom 에러 구현
우선은 테스트용도로 간단하게 만들었다.
공통 Exception을 구현
@Getter
public class RequestException extends RuntimeException {
private final HttpStatus httpStatus;
public RequestException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.httpStatus = errorCode.getHttpStatus();
}
}
Exception handler 구현
@RestControllerAdvice를 활용하여 공통된 오류 메시지 형식으로 응답
@RestControllerAdvice
@Slf4j
public class ResponseExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(RequestException.class)
protected ResponseEntity<String> handleCustomException(RequestException e) {
log.debug("Exception : '{}'", e.getMessage());
return new ResponseEntity<>(e.getMessage(), e.getHttpStatus());
}
@ExceptionHandler(JsonProcessingException.class)
protected ResponseEntity<String> jsonProcessingException(JsonProcessingException e) {
log.debug("Exception : '{}'", e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
세팅은 완료 Test를 해보자.
테스트를 위한 예제코드
public MemberLocalDto createLocal(UUID mbId, MemberLocalDto memberLocalDto) {
Optional<Member> optionalMember = memberRepository.findById(mbId);
Member member = optionalMember.orElseThrow(() -> new RequestException(ErrorCode.MEMBER_LOGINID_NOT_FOUND_404));
}
Postman으로 Test결과 Enum Class에 선언된 Message형식으로 응답된다.
아래 처럼 추후 Message뿐만 아니라 전체적인 정보를 응답할수있게 프론트와 정의 후 변경 예정이다.
"status": 400,
"error": "Bad Request",
"exception": "Gururu.exception.exception.BadRequestException",
"message": "잘못된 요청 오류",
"path": "/"
댓글남기기