Post

7주1일차_트랜잭션_개념과_선언적_프로그래밍_방식_비교

7주1일차_트랜잭션_개념과_선언적_프로그래밍_방식_비교

필기 내용

1.2.3 롤백 설정의 유의점

  1. 예외 전파:
    • 예외는 호출자에게 전파되어야만 트랜잭션 롤백이 발생합니다.
    • 예외를 내부에서 처리하거나 로그만 출력하면 트랜잭션은 커밋될 수 있습니다.

    잘못된 예제:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     @Transactional
     public void processTransaction() {
         try {
             // 작업 수행
             throw new RuntimeException("Error occurred");
         } catch (RuntimeException e) {
             System.out.println("Exception handled internally");
             // 예외를 처리하면 트랜잭션이 커밋될 수 있음
         }
     }
    
  2. 프록시 메커니즘:
    • Spring의 @Transactional은 프록시 기반으로 동작합니다. 같은 클래스 내부에서 트랜잭션 메서드를 호출하면 트랜잭션이 제대로 적용되지 않을 수 있습니다.
    • 해결책: 외부 클래스에서 호출하거나, AOP를 활용해 분리.

2. 외부 시스템 장애

  • 문제:
    • 외부 시스템(예: 결제 게이트웨이, 메시지 큐)이 다운되면, 트랜잭션 상태와 외부 작업 결과가 불일치할 수 있습니다.
    • 예: 결제 성공 후 주문 저장 중 실패하거나, 반대로 주문 저장 성공 후 결제 API 호출이 실패.
  • 해결 방법:
    • 보상 트랜잭션(Compensating Transaction):
      • API 호출 성공 이후 데이터베이스 작업이 실패하면, API 호출을 취소하는 로직을 추가합니다.
      • 예: 결제가 성공한 경우, 주문 저장 실패 시 결제를 취소하는 API 호출 수행.
    • 트랜잭션 내 API 호출 순서 조정:
      • 데이터베이스 작업 후 외부 API를 호출하도록 설계하여, 데이터 정합성을 우선 보장합니다.
      • 예: 주문 저장 후 결제 API 호출.

4. 재시도 로직 적용

  • 문제:
    • 외부 API 호출 실패가 일시적인 네트워크 장애나 과부하로 발생하는 경우가 많습니다.
    • 즉각적인 실패 처리 대신 재시도를 통해 성공률을 높일 수 있습니다.
  • 해결 방법:
    • Spring의 @Retryable 어노테이션이나 Resilience4j 라이브러리를 활용하여 재시도 로직을 구현합니다.
    • 일정 횟수 재시도 후에도 실패하면 사용자 정의 예외를 던지고, 트랜잭션을 롤백합니다.

Action Plan

  • Retryable 실습 테스트
  • FeignClient 실습
    • 외부 상품 서비스 호출테스트
  • 이력서 피드백을 위한 설문 제출해두기.

수업 내용 필기 정리.

  • 롤백제어의 필요성이 있을수 있다.
  • api는 대부분 성공한다.
  • 단 api 호출 실패시 어떻게 할것인가? 에 대해서 처리를 해야한다.
    • 1% 확률로 실패했는데 적절히 처리안했다면 db를 수정해야하는 케이스가 있을 수 있다.
  • API call을 메서드 상단에서 해서 리스크 낮게 접근하자!
  • OpenFeign
    • 인터페이스만 정의하면 된다.
    • 서비스 레벨에서 메서드로써 호출할 수 있다.
  • 비동기 처리도 할 수 있다.
  • 외부 api call 시 작업해야할 것.
    • 네트워크 에러
    • 파싱 에러
    • 비즈니스 적 에러

externalService 실습.

  • 데이터를 추가해야함.
  • 본 프로젝트에
    • external

action2

  • 관성처럼 사는 것은 아닌지 확인.
This post is licensed under CC BY 4.0 by the author.