Exception를 자세히 살펴보기 전에 Exception, Error 의 개념을 살펴보도록 하겠습니다.
프로그래밍에서 예외란 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름을 어긋나는 것.
그리고 자바에서 예외는 개발자가 직접 처리할 수 있기 때문에 예외 상황을 미리 예측하여 핸들링할 수 있습니다.
Exception 과 Error는 엄연히 다른 개념인데
에러는 시스템에 무엇인가 비정상적인 상황이 발생한 경우에 사용됩니다. 주로 JVM에서 발생시키는 것이며 예외와 반대로 이를 애플리케이션 코드에서 잡으려고 하면 안 된다고 하네요.
에러의 예로는 OutOfMemoryError, ThreadDeath, StackOverflowError 등이 있습니다.
Exception 발생 이랑 달리 에러가 발생하게 되면 매우 심각할 것입니다.
Exception에는 Unchecked Exception 과 Checked Exception 2가지가 존재 합니다.
스프링에서 API 프로젝트를 하게 되면 저희가 처리해야 될 예외상황이 존재하는데 그때 RuntimeException을 상속 받은 CustomException을 구현하고 RestControllerAdvice로 처리를 하는 방식이 있습니다.
// CustomApiException.class
@Getter
@RequiredArgsConstructor
// RuntimeException을 상속받았음으로 Uncechked Exception 입니다.
public class CustomApiException extends RuntimeException{
private final ResponseMessage errorMessage;
// ResponseMessage 원하는 대로 만들어보세영
}
// UserService.class
if (user == null) {
// 저희가 원하는 시점에 Exception 발생시킴.
throw new CustomApiException(ResponseMessage.NOT_FOUND_USER);
}
// GlobalExceptionHandler.class
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
// CustomApiException 이 발생하면 여기서 처리하게 됩니다.
@ExceptionHandler(CustomApiException.class)
public ResponseEntity<?> handleApiException(CustomApiException e) {
return makeErrorResponse(e.getErrorMessage());
}
// 우리의 Response 형태로 변환 하는 함수
private ResponseEntity<Object> makeErrorResponse(ResponseMessage errorMessage) {
CustomResponse errorResponse = new CustomResponse(errorMessage);
return ResponseEntity.status(errorMessage.getStatusCode()).body(errorResponse);
}
}
ControllerAdvice 를 구현하여
원하는 Exception 들에 대해 원하는 처리를 할 수 있습니다.
RestControllerAdvice를 만들었을 때
Checked Exception, Unchecked Exception에 대해서 알게되어서
지금 와서 공부를 했습니다.
Exception 의 구조를 알게 되니까 왜 RuntimeException을 상속을 받아야되는지
CustomeException을 어떻게 처리를 할 수 있는지 에 대해서 이해가 됐습니다.