프로그래밍/Spring Boot
[Spring] 예외 처리 ExceptionHandler
연유뿌린빙수
2024. 11. 29. 19:12
스프링에서 @ExceptionHandler는 애플리케이션에서 발생하는 특정 예외를 처리하기 위해 사용되는 애노테이션이다.
@ExceptionHandler는 주로 REST API를 개발할 때 유용하며, 사용자에게 친화적인 에러 메시지를 제공하거나 특정 HTTP 상태 코드를 반환하는 데 사용된다.
-> Response Body를 직접 설정 가능
기본 사용법
@ExceptionHandler는 컨트롤러 클래스나, 컨트롤러 계층 전반에서 예외를 처리하는 데 사용됩니다.
@RestController
@RequestMapping("/api")
public class SampleController {
@GetMapping("/test")
public String testEndpoint() {
// 예외 발생
throw new IllegalArgumentException("잘못된 입력입니다!");
}
// 예외 처리 메서드
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
return new ResponseEntity<>("예외 발생: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
기능 설명
- 특정 예외 처리:
- @ExceptionHandler는 특정 예외 클래스나 그 하위 클래스에서만 트리거됩니다.
- 위의 예제에서는 IllegalArgumentException을 처리합니다.
- 다양한 반환값 지원:
- 반환값으로 뷰 이름, 객체, 또는 ResponseEntity 등을 사용할 수 있습니다.
- 주로 REST API에서는 ResponseEntity로 JSON 또는 문자열 응답을 반환합니다.
- 글로벌 예외 처리:
- 개별 컨트롤러에서 관리하기 어려운 경우, 글로벌 예외 처리를 위한 @ControllerAdvice와 함께 사용합니다.
글로벌 예외 처리
@ControllerAdvice를 사용하면 모든 컨트롤러에서 발생하는 예외를 중앙에서 처리할 수 있습니다.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
return new ResponseEntity<>("글로벌 처리: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
return new ResponseEntity<>("알 수 없는 예외 발생: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
추가 기능
- 다중 예외 처리:
- 하나의 메서드에서 여러 종류의 예외를 처리할 수 있습니다.
@ExceptionHandler({IllegalArgumentException.class, NullPointerException.class}) public ResponseEntity<String> handleMultipleExceptions(RuntimeException ex) { return new ResponseEntity<>("예외 발생: " + ex.getMessage(), HttpStatus.BAD_REQUEST); }
- HTTP 상태 코드 설정:
- ResponseEntity를 사용하지 않고도 간단히 상태 코드를 변경하려면 @ResponseStatus를 활용할 수 있습니다.
@ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public String handleIllegalArgumentException(IllegalArgumentException ex) { return "잘못된 요청입니다: " + ex.getMessage(); }
- 커스텀 에러 응답 구조:
- 사용자 정의 예외 응답 객체를 반환하여 API의 일관성을 유지합니다.
public class ErrorResponse { private String message; private int status; // 생성자 및 Getter/Setter } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException ex) { ErrorResponse errorResponse = new ErrorResponse("잘못된 요청입니다.", 400); return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST); }
@ExceptionHandler를 적절히 활용하면 유지보수성이 높아지고, 예외 상황에서도 사용자 경험을 향상시킬 수 있습니다.