티스토리 뷰
예외를 처리하고 로깅을 설정하는 것은 안정성을 유지하는 데에 있어 매우 중요하다.
1. @RestControllerAdvice와 @ExceptionHandler
Application이 실행되는 동안 발생할 수 있는 예외들을 효율적으로 처리하기 위해서는 예외 처리 전략이 필요하다. Spring에서는 이러한 예외 처리 로직을 일관되게 관리하기 위해 @RestControllerAdvice와 @ExceptionHandler를 제공한다.
[ @RestControllerAdvice ]
- 모든 컨트롤러에서 발생하는 예외를 중앙에서 처리할 수 있도록 도와주는 annotation이다. 이 annotation을 사용하면 controller마다 개별적으로 예외 처리를 하지 않고, 한 곳에서 공통적으로 처리할 수 있어 코드 중복을 줄이고 유지 보수를 용이하게 만든다.
- 컨트롤러 전역에 걸친 예외 처리
- 예외 발생 시 공통된 응답 포맷을 제공
- 여러 종류의 예외에 대한 일관된 관리
[ @ExceptionHandler ]
- 특정 예외가 발생했을 때 실행될 메소드를 정의하는 annotation이다. 예외 발생 시 어떤 메소드가 호출되는지를 결정하는 역할을 한다.
- 예를들어, NullPointerException이 발생하면 이를 처리하기 위해 미리 정의한 handler 메소드가 실행된다.
- 특정 예외에 대한 처리 로직 정의
- 다양한 예외에 대해 다른 처리 방법 적용 가능
- 컨트롤러 내부 또는 @RestControllerAdvice와 함께 사용 가능
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("NullPointerException occurred");
}
}
2. 사용자 정의 예외 처리: ApplicationException과 ApplicationError
Application을 개발하다 보면, 표준 예외로는 처리하기 어려운 비즈니스 로직에 대한 예외를 처리해야 할 때가 있다. 이 경우 사용자 정의 예외를 만들어 사용하는 것이 좋다.
[ ApplicationException ]
- 비즈니스 로직에서 발생할 수 있는 예외를 관리하기 위해 설계된 사용자 정의 예외 클래스이다. 이를 통해 표준 예외로는 충분히 설명되지 않은 비즈니스 로직의 오류를 명확히 처리할 수 있다.
[ ApplicationError ]
- 예측 가능한 예외 상황들을 미리 정의하고, 그에 맞는 메시지를 설정하기 위해 사용하는 열거형(enum)이다. 각 예외 상황에 대한 메시지를 중앙에서 관리할 수 있어, 에러 발생 시 개발자와 사용자에게 명확한 피드백을 제공한다.
public class ApplicationException extends RuntimeException {
private final ApplicationError error;
public ApplicationException(ApplicationError error) {
super(error.getMessage());
this.error = error;
}
public ApplicationError getError() {
return error;
}
}
public enum ApplicationError {
USER_NOT_FOUND("User not found"),
INVALID_REQUEST("Invalid request");
private final String message;
ApplicationError(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
3. 로깅 설정을 통한 예외 추적
logging은 application의 중요한 활동을 기록하여 개발자가 시스템을 추적하고 문제를 파악하는데 도움을 준다. 특히 예외가 발생할 때는 logging을 통해 예외 발생 위치와 그 원인을 쉽게 찾을 수 있다.
[ Logging Level ]
로깅은 중요도에 따라 5가지 레벨로 나뉜다.
- ERROR: 치명적인 문제로 인해 시스템이 일부 기능을 수행하지 못할 때 사용한다.
- WARN: 시스템이 작동하긴 하지만, 예상치 못한 상황이 발생했을 때 사용한다.
- INFO: 시스템의 정상적인 동작을 기록할 때 사용한다.
- DEBUG: 개발 단계에서 디버깅 목적으로 사용하는 상세 로그이다.
- TRACE: 매우 상세한 로그로, 주로 문제 해결을 위한 디버깅 시 사용된.
logging:
level:
root: info
com.example: debug
- 문제 추적: 예외가 발생했을 때 로그를 남기면, 문제 발생 시점과 원인을 쉽게 파악할 수 있다.
- 성능 분석: 로그를 통해 시스템이 어느 부분에서 병목이 발생하는지, 성능이 어떻게 되는지를 알 수 있다.
- 디버깅 지원: 디버깅 단계에서 상세한 로그를 통해 개발자가 문제를 해결하는 데 큰 도움이 된다.
4. 자주 발생하는 예외 처리
Application을 운영하다 보면 자주 발생하는 예외들이 있다. 이 예외들에 대해 미리 대비하는 것이 중요하다.
[ 자주 발생하는 예외 ]
- IllegalArgumentException: 메서드에 잘못된 인자가 전달될 때 발생한다.
- NullPointerException: 객체가 null일 때, 해당 객체의 메서드를 호출하려 할 때 발생한다.
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
return ResponseEntity.badRequest().body("Invalid argument: " + ex.getMessage());
}
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Unexpected null value: " + ex.getMessage());
}
'Spring' 카테고리의 다른 글
엑셀 파일 처리 기능 구현 (0) | 2024.10.07 |
---|---|
프로젝트에서 사용한 주요 JPA : Entity, Mapping, 논리적 삭제 (0) | 2024.09.30 |
데이터 접근 1. JdbcTemplate (0) | 2024.07.10 |
API 예외처리 (0) | 2024.07.01 |
Spring MVC (0) | 2024.06.28 |