Java 예외 처리 예제 (폴백 로직)

CosmoNumb·2024년 8월 3일
0

java

목록 보기
19/24

예외처리는 프로그램 실행 중에 발생할 수 있는 오류를 처리하여 프로그램이 중단되지 않고 계속 실행되도록 하는 기법입니다. 예외는 일반적으로 예상치 못한 상황에서 발생하는데, 이러한 예외를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있습니다.

예외 처리 개념

  1. 예외(Exception): 프로그램 실행 중에 발생하는 오류나 비정상적인 상황을 말합니다. 예외는 Exception 클래스의 인스턴스로 표현됩니다.
  2. 예외 처리(Handling): 예외가 발생했을 때 이를 적절히 처리하여 프로그램이 계속 실행되도록 하는 것입니다. 주로 try, catch, finally 블록을 사용합니다.
  3. 던지기(Throwing): 예외가 발생하면 이를 던져서(causing to throw) 상위 메서드로 예외를 전달합니다. throw 키워드를 사용합니다.
  4. 잡기(Catching): 던져진 예외를 잡아서 처리하는 것입니다. catch 블록을 사용합니다.

예외 처리 기본 문법

try {
    // 예외가 발생할 수 있는 코드
} catch (ExceptionType1 e1) {
    // 예외 처리 코드 (ExceptionType1 처리)
} catch (ExceptionType2 e2) {
    // 예외 처리 코드 (ExceptionType2 처리)
} finally {
    // 예외 발생 여부와 상관없이 항상 실행되는 코드 (옵션)
}

예제 코드 해석

1. fallbackGetProductDetails 메서드

public Product fallbackGetProductDetails(String productId, Throwable t)

이 메서드는 주로 서킷 브레이커 패턴이나 폴백(fallback) 메커니즘에서 사용됩니다. 특정 메서드 호출이 실패했을 때 실행되는 대체 메서드입니다.

  • String productId: 요청된 제품 ID입니다.
  • Throwable t: 원래 메서드 호출에서 발생한 예외입니다. 예외의 원인을 알 수 있습니다.

이 메서드는 원래 메서드 호출이 실패했을 때 실행되어, 오류를 처리하거나 대체 로직을 수행하는 데 사용됩니다.

2. RuntimeException 예외 던지기

if ("111".equals(productId)) {
    log.warn("###Received empty body for productId: {}", productId);
    throw new RuntimeException("Empty response body");  // productId가 111이면 에러 발생시킴
}

이 코드는 productId가 "111"인 경우에 강제로 예외를 발생시키는 부분입니다.

  • "111".equals(productId): productId가 "111"인지 비교합니다.
  • log.warn("###Received empty body for productId: {}", productId): 로그에 경고 메시지를 출력합니다. {}productId로 대체됩니다.
  • throw new RuntimeException("Empty response body"): RuntimeException을 발생시킵니다. 이 예외는 productId가 "111"인 경우, 비어 있는 응답 본문(예: HTTP 응답 본문이 없는 경우)을 나타내기 위해 강제로 던집니다.

예외 처리 흐름 예제

public String getProductDetails(String productId) {
    try {
        if ("111".equals(productId)) {
            log.warn("###Received empty body for productId: {}", productId);
            throw new RuntimeException("Empty response body");  // productId가 111이면 에러 발생시킴
        }
        // 정상적인 제품 상세 정보 가져오기 로직
        return "Product details for " + productId;
    } catch (RuntimeException e) {
        log.error("Exception occurred while getting product details", e);
        return fallbackGetProductDetails(productId, e); // 예외 발생 시 폴백 메서드 호출
    }
}

public String fallbackGetProductDetails(String productId, Throwable t) {
    log.warn("Fallback method called for productId: {} due to {}", productId, t.getMessage());
    return "Fallback product details for " + productId;
}
  1. getProductDetails 메서드에서 productId가 "111"인 경우 RuntimeException을 던집니다.
  2. 이 예외는 catch 블록에서 잡히고, 로그에 오류를 기록합니다.
  3. fallbackGetProductDetails 메서드를 호출하여 폴백 로직을 실행합니다.
  4. 폴백 메서드는 대체 제품 상세 정보를 반환합니다.

0개의 댓글