현재 GlobalExceptionHandler 클래스에서는 두 가지 사용자 정의 예외(ResourceNotFoundException과 CustomerAlreadyExistsException)만 처리하고 있습니다. 그러나 애플리케이션 내에서 발생할 수 있는 모든 런타임 예외를 처리하려면 Exception.class를 처리하는 글로벌 예외 핸들러를 추가해야 합니다.
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponseDto> handleGlobalException(Exception exception,
WebRequest webRequest) {
ErrorResponseDto errorResponseDTO = new ErrorResponseDto(
webRequest.getDescription(false),
HttpStatus.INTERNAL_SERVER_ERROR,
exception.getMessage(),
LocalDateTime.now()
);
return new ResponseEntity<>(errorResponseDTO, HttpStatus.INTERNAL_SERVER_ERROR);
}
런타임 예외가 발생했을 때 글로벌 예외 핸들러가 제대로 작동하는지 테스트하기 위해, AccountController 클래스에서 의도적으로 예외를 발생시킵니다.
@AllArgsConstructor를 삭제하여 의존성 주입이 실패하도록 설정합니다.
이로 인해 AccountService가 null이 되고, API 호출 시 NullPointerException이 발생하게 될 것입니다.
// POST /api/accounts/create (생성 API 호출 시)
{
"status": "500",
"error": "Internal Server Error",
"message": "IAccountService is null",
"path": "/api/accounts/create",
"timestamp": "2023-08-25T10:00:00"
}
코드를 빌드한 후, API를 호출하여 NullPointerException이 발생하는지 확인합니다. 발생한 예외는 글로벌 예외 핸들러에 의해 처리되어, 클라이언트는 적절한 오류 응답을 받게 됩니다.
글로벌 예외 처리는 애플리케이션의 모든 컨트롤러 메서드에서 발생할 수 있는 예외를 일관되게 처리하는 데 매우 중요합니다. 이를 위해 @ControllerAdvice와 @ExceptionHandler 애노테이션을 결합하여 전역 에러 로직을 구현합니다.
이 과정을 통해 런타임 예외가 발생했을 때 애플리케이션이 안정적으로 예외를 처리하고, 클라이언트에게 적절한 오류 메시지를 반환할 수 있음을 확인할 수 있습니다.