티스토리 뷰

Spring

예외 처리와 로깅 설정

Js0l 2024. 9. 30. 13:09

예외를 처리하고 로깅을 설정하는 것은 안정성을 유지하는 데에 있어 매우 중요하다.

 

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가지 레벨로 나뉜다. 

 

  1. ERROR: 치명적인 문제로 인해 시스템이 일부 기능을 수행하지 못할 때 사용한다.
  2. WARN: 시스템이 작동하긴 하지만, 예상치 못한 상황이 발생했을 때 사용한다.
  3. INFO: 시스템의 정상적인 동작을 기록할 때 사용한다.
  4. DEBUG: 개발 단계에서 디버깅 목적으로 사용하는 상세 로그이다.
  5. 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
공지사항
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함