← 글 목록
💡 관련 위키 주제:backend-system-reliability→

트랜잭션 내 외부 API 호출 시 발생하는 문제와 해결 방안

트랜잭션 내부에서 외부 API를 호출할 때 발생하는 커넥션 풀 고갈과 데이터 정합성 문제를 살펴보고, 이를 해결하기 위한 트랜잭션 범위 최적화 및 최종적 일관성 설계 전략을 알아봅니다.

트랜잭션 내 외부 API 호출의 위험성

스프링의 @Transactional 어노테이션을 사용하여 트랜잭션을 선언하고 그 안에서 외부 API를 호출하는 구조는 실무에서 흔히 발견됩니다. 하지만 이 방식은 트랜잭션이 유지되는 동안 데이터베이스 커넥션을 점유한다는 점에서 시스템에 잠재적인 위험을 초래합니다.

외부 API 응답이 지연될 경우, 해당 트랜잭션이 커넥션을 점유하는 시간도 함께 길어집니다. 이로 인해 커넥션 풀이 고갈되면, 외부 API와 무관한 다른 서비스 요청들까지 커넥션을 할당받지 못해 전체 시스템 장애로 이어질 가능성이 있습니다.

또한, 외부 호출과 데이터베이스 작업이 동일한 트랜잭션 내에 존재할 때 문제가 발생할 수 있습니다. 외부 호출은 성공했으나 이후 트랜잭션이 롤백되는 경우, 외부 시스템과 데이터베이스 간의 데이터 정합성이 어긋나는 상황이 발생합니다.

트랜잭션 범위 최적화 및 데이터 정합성 확보

시스템의 안정성을 높이기 위해서는 트랜잭션의 범위를 최소화해야 합니다. 데이터베이스 작업을 먼저 커밋하고 외부 API 호출을 커밋 전후로 분리하는 구조를 고려하는 것이 좋습니다.

분리된 시스템 간의 데이터는 원자적 처리가 불가능하므로, 한 번에 상태를 일치시키기보다는 최종적 일관성(Eventual Consistency)을 지향하는 설계가 필요합니다. 외부 호출 실패 시에는 아웃박스 패턴이나 재시도 큐 등을 활용하여 데이터를 보정하는 전략을 수립해야 합니다.

MSA 환경에서의 확장 고려사항

마이크로서비스 아키텍처(MSA) 환경에서는 격리된 시스템 간의 데이터 정합성을 보존하는 것이 더욱 중요합니다. 이 경우 분산 트랜잭션을 구현하기 위해 2PC(Two-Phase Commit)나 SAGA 패턴과 같은 분산 트랜잭션 처리 방식을 고려해야 할 수 있습니다.