스프링에서는 @ControllerAdvice와 @ExceptionHandler 어노테이션을 이용해 전역에서 발생하는 예외를 처리할 수 있다. 이렇게 하면 개별 컨트롤러에서 예외를 처리하는 것이 아니라, 한 곳에서 모든 예외를 관리할 수 있어 유지보수가 용이하다.
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<String> handleException(Exception e){
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
위의 코드는 모든 예외를 잡아내서 500 에러와 함께 예외 메시지를 반환한다.
스프링에서는 개발자가 직접 예외 클래스를 정의하여 사용할 수 있다. 이를 통해 보다 세밀한 예외 처리가 가능하며, 비즈니스 로직에 맞는 예외 메시지를 전달할 수 있다.
public class CustomException extends RuntimeException {
public CustomException(String message) {
super(message);
}
}
위의 코드는 사용자 정의 예외 클래스를 생성하는 방법을 보여준다.
예외 처리 시 HTTP 상태 코드를 적절히 사용하면 클라이언트에게 더욱 정확한 상황을 전달할 수 있다. 예를 들어, 리소스를 찾지 못했을 때는 404 Not Found, 권한이 없을 때는 403 Forbidden 등의 상태 코드를 반환한다.
예외 발생 시 사용자에게 어떤 정보를 전달할지 설정할 수 있다. 예를 들어, 예외 메시지, HTTP 상태 코드, 발생 시간 등의 정보를 포함시킬 수 있다.
@ExceptionHandler(CustomException.class)
public ResponseEntity<Map<String, Object>> handleCustomException(CustomException e) {
Map<String, Object> errorInfo = new HashMap<>();
errorInfo.put("message", e.getMessage());
errorInfo.put("status", HttpStatus.BAD_REQUEST);
errorInfo.put("timestamp", LocalDateTime.now());
return new ResponseEntity<>(errorInfo, HttpStatus.BAD_REQUEST);
}
위의 코드는 커스텀 예외 발생 시 예외 메시지, 상태 코드, 발생 시간을 포함한 에러 정보를 반환한다.
오늘의 학습을 통해 스프링에서 예외를 어떻게 처리하는지에 대해 배웠다. @ControllerAdvice, @ExceptionHandler 어노테이션을 사용하는 방법, 커스텀 예외 클래스를 만드는 방법, HTTP 상태 코드와 예외 처리의 연관성 등에 대해 알아보았다. 이를 통해 사용자 친화적인 애플리케이션을 만드는 데 도움이 될 것이라고 생각한다.