실전 프로젝트 2주차. 자바와 스프링 기본으로 돌아가라는 멘토님의 피드백을 듣고 쓰레드부터 자바를 다시 공부중이다. 오늘 TIL에는 아직 프로젝트에 적용은 하지 않았지만 고민을 하고 있는 Custom exception에 대해 정리해보려 한다.
굳이 custom exception을 만들지 않아도 된다.
표준 예외가 자바 스프링에서 잘 구현되어 있고 이걸 쓰는 것 만으로도 충분하다.
하지만 custom exception은 구현하기에 따라 상세한 예외정보를 제공할 수 있고, 예외 발생 후처리가 용이해지는 장점도 있다.
이전까지의 프로젝트에서는 표준 Exception을 사용했었지만 이번 프로젝트에는 custom exception을 구현해보고 싶어서 시도해보려 한다.
@Getter
public class CustomException extends RuntimeException {
private final HttpStatus httpStatus;
public CustomException(ExceptionType exceptionType) {
super(exceptionType.getMessage());
this.httpStatus = exceptionType.getHttpStatus();
}
}
RuntimeException을 상속했고 httpStatus를 속성으로 뒀다.
아래의 ExceptionType을 생성자의 파라미터로 넣으면 만들어진다.
@Getter
@AllArgsConstructor
public enum ExceptionType {
BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "알 수 없는 오류가 발생하였습니다."),
TOKEN_EXPIRED_EXCEPTION(HttpStatus.UNAUTHORIZED, "토큰이 유효하지 않습니다."),
LOGIN_FAIL_EXCEPTION(HttpStatus.UNAUTHORIZED, "유저 정보가 일치하지 않습니다."),
ALREADY_EXISTS_EXCEPTION(HttpStatus.CONFLICT, "이미 값이 존재합니다."),
ACCESS_DENIED_EXCEPTION(HttpStatus.FORBIDDEN, "로그인 후 사용해주세요."),
NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "요청하신 자료를 찾을 수 없습니다."),
NOT_FOUND_KEY_EXCEPTION(HttpStatus.NOT_FOUND, "요청하신 키를 찾을 수 없습니다."),
NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "요청하신 유저를 찾을 수 없습니다."),
RESERVATION_FINISHED_EXCEPTION(HttpStatus.BAD_REQUEST , "예매가 완료된 공연입니다."),
ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 데이터입니다."),
OVER_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "최대 요청 개수를 초과하였습니다."),
KEYWORD_NULL_EXCEPTION(HttpStatus.BAD_REQUEST, "키워드를 작성해주세요."),
EMPTY_RESULT_EXCEPTION(HttpStatus.BAD_REQUEST, "조회된 공연이 없습니다.");
private final HttpStatus httpStatus;
private final String message;
}
에러 타입을 ENUM으로 설정해뒀다.
아직 제대로 예외를 취합하지 않아서 초기세팅으로만 해뒀다.
추후 프로젝트에 맞게 수정 예정.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<MessageResponseDto> handleRuntimeException(CustomException e){
String message = e.getMessage().split(":")[0];
MessageResponseDto messageResponseDto = new MessageResponseDto(e.getHttpStatus(), message);
return new ResponseEntity<>(messageResponseDto, e.getHttpStatus());
}
...
해당 예외는 GlobalExceptionHandler에서 잡으면 된다.