7주1일차_트랜잭션_개념과_선언적_프로그래밍_방식_비교
7주1일차_트랜잭션_개념과_선언적_프로그래밍_방식_비교
필기 내용
1.2.3 롤백 설정의 유의점
- 예외 전파:
- 예외는 호출자에게 전파되어야만 트랜잭션 롤백이 발생합니다.
- 예외를 내부에서 처리하거나 로그만 출력하면 트랜잭션은 커밋될 수 있습니다.
잘못된 예제:
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"); // 예외를 처리하면 트랜잭션이 커밋될 수 있음 } }
- 프록시 메커니즘:
- Spring의
@Transactional은 프록시 기반으로 동작합니다. 같은 클래스 내부에서 트랜잭션 메서드를 호출하면 트랜잭션이 제대로 적용되지 않을 수 있습니다. - 해결책: 외부 클래스에서 호출하거나, AOP를 활용해 분리.
- Spring의
2. 외부 시스템 장애
- 문제:
- 외부 시스템(예: 결제 게이트웨이, 메시지 큐)이 다운되면, 트랜잭션 상태와 외부 작업 결과가 불일치할 수 있습니다.
- 예: 결제 성공 후 주문 저장 중 실패하거나, 반대로 주문 저장 성공 후 결제 API 호출이 실패.
- 해결 방법:
- 보상 트랜잭션(Compensating Transaction):
- API 호출 성공 이후 데이터베이스 작업이 실패하면, API 호출을 취소하는 로직을 추가합니다.
- 예: 결제가 성공한 경우, 주문 저장 실패 시 결제를 취소하는 API 호출 수행.
- 트랜잭션 내 API 호출 순서 조정:
- 데이터베이스 작업 후 외부 API를 호출하도록 설계하여, 데이터 정합성을 우선 보장합니다.
- 예: 주문 저장 후 결제 API 호출.
- 보상 트랜잭션(Compensating Transaction):
4. 재시도 로직 적용
- 문제:
- 외부 API 호출 실패가 일시적인 네트워크 장애나 과부하로 발생하는 경우가 많습니다.
- 즉각적인 실패 처리 대신 재시도를 통해 성공률을 높일 수 있습니다.
- 해결 방법:
- Spring의
@Retryable어노테이션이나 Resilience4j 라이브러리를 활용하여 재시도 로직을 구현합니다. - 일정 횟수 재시도 후에도 실패하면 사용자 정의 예외를 던지고, 트랜잭션을 롤백합니다.
- Spring의
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.