On this page
오늘은 스프링 부트에서 예외를 처리하는 방법에 대해 이야기해보려고 해요. 애플리케이션을 개발하다 보면 예외 상황을 만나는 건 피할 수 없죠. 이때 예외를 어떻게 처리하느냐가 정말 중요해요. 잘못된 예외 처리는 사용자 경험을 망칠 수 있고, 시스템의 안정성에도 영향을 줄 수 있답니다. 그래서, 예외를 쉽고 깔끔하게 처리하는 방법을 알려드릴게요!
기본적인 예외 처리
스프링 부트에서는 예외를 처리하는 여러 가지 방법을 제공하고 있어요. 그 중에서도 가장 많이 사용하는 방법은 @ControllerAdvice
와 @ExceptionHandler
를 이용하는 거예요. 함께 살펴볼까요?
1. @ControllerAdvice와 @ExceptionHandler 사용하기
@ControllerAdvice
는 전역 예외 처리를 가능하게 해주는 아주 멋진 어노테이션이에요. 이와 함께 @ExceptionHandler
를 사용하면 특정 예외를 잡아서 처리할 수 있어요.
먼저, 간단한 예외 처리 클래스를 만들어볼게요.
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
String bodyOfResponse = "이 요청은 처리할 수 없습니다.";
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}
위 코드에서 GlobalExceptionHandler
클래스는 전역 예외 처리기로 동작해요. handleConflict
메서드는 IllegalArgumentException
과 IllegalStateException
예외를 처리해요. 예외가 발생하면 **이 요청은 처리할 수 없습니다.
**라는 메시지와 함께 409 CONFLICT
상태 코드를 반환해요.
2. 사용자 정의 예외 처리
때때로, 내 애플리케이션에 맞는 사용자 정의 예외를 만들어야 할 때가 있어요. 사용자 정의 예외를 처리하는 방법도 간단해요.
먼저, 사용자 정의 예외 클래스를 만들어볼게요.
public class CustomException extends RuntimeException {
private static final long serialVersionUID = 1L;
public CustomException(String message) {
super(message);
}
}
그리고 나서, 이 예외를 처리하는 핸들러를 추가해요.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<String> handleCustomException(CustomException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
이제 CustomException
이 발생하면 400 BAD_REQUEST
상태 코드와 함께 예외 메시지를 반환하게 돼요.
3. RestTemplate 예외 처리
API 통신을 할 때 RestTemplate
을 많이 사용하죠. RestTemplate
을 사용할 때 발생하는 예외도 처리할 수 있어요. 예를 들어, API 호출 중 HttpClientErrorException
이 발생했을 때 처리하는 방법을 알아볼게요.
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.client.HttpClientErrorException;
@ControllerAdvice
public class RestTemplateExceptionHandler {
@ExceptionHandler(HttpClientErrorException.class)
protected ResponseEntity<String> handleHttpClientErrorException(HttpClientErrorException ex) {
String responseBody = ex.getResponseBodyAsString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(ex.getResponseHeaders().getContentType());
return new ResponseEntity<>(responseBody, headers, ex.getStatusCode());
}
}
이 코드는 HttpClientErrorException
을 처리하고, API 서버로부터 받은 응답을 클라이언트에게 그대로 전달해요. 이렇게 하면 클라이언트가 API 서버로부터 받은 에러 메시지를 그대로 볼 수 있답니다.
결론
스프링 부트에서 예외를 처리하는 방법은 정말 다양하고, 그만큼 강력해요. @ControllerAdvice
와 @ExceptionHandler
를 이용하면 예외를 쉽게 관리할 수 있고, 사용자 정의 예외도 깔끔하게 처리할 수 있어요. API 통신 중 발생하는 예외도 RestTemplateExceptionHandler
를 통해 처리할 수 있답니다.
예외 처리를 잘해두면 애플리케이션의 안정성이 높아지고, 사용자에게도 더 나은 경험을 제공할 수 있어요. 여러분도 스프링 부트에서 예외 처리를 깔끔하게 해보세요! 궁금한 점이 있으면 언제든지 댓글로 남겨주세요. 감사합니다!