[백엔드 모의면접] 트랜잭션 안에서 외부 API를 호출하면 어떻게 될까?
안녕하세요.
인프랩에서 모의면접 서비스를 개발/운영하고 있는 약풍이라고 해요.
일주일의 절반이 지난 목요일입니다.
"물컵에 물이 절반이나 남았네"라고 생각할 수도 있지만, "벌써 물컵의 물을 반이나 먹었네!"라고 생각할 수도 있어요.
이 글을 읽으시는 분들께, 목요일도 화이팅입니다 🚀
오늘의 백엔드 질문
하나의 트랜잭션 안에서 결제 요청이나 메일 발송 같은 외부 API를 호출하는 코드가 있다면, 어떤 문제가 생길 수 있을까요?
주문, 예약, 알림처럼 외부 연동이 들어간 프로젝트를 이력서에 썼다면 자주 이어지는 질문이에요.
@Transactional을 메서드 위에 붙이고 그 안에서 외부 호출까지 같이 하는 코드는 실제로 굉장히 흔하게 보게 돼요.
이 질문은 단순히 프레임워크 사용법을 아는지가 아니라, 트랜잭션이 붙잡고 있는 자원이 무엇이고 그 시간이 길어지면 서비스가 어떻게 무너지는지를 그려볼 수 있는지 보는 질문이에요.
답변 키포인트
트랜잭션이 열려 있는 동안 DB 커넥션을 계속 점유한다는 점
외부 API 응답이 느려지면 커넥션 풀이 고갈되어, 무관한 API도 영향을 받는다는 점
외부 호출은 성공했는데 이후 트랜잭션이 롤백되면 데이터 정합성이 어긋난다는 점
트랜잭션 범위를 줄이고 외부 호출을 커밋 전/후로 빼는 방법
커밋 이후 처리에 실패했을 때의 재시도와 보정 방법
응답 속도만이 문제인가
이 질문에서 "외부 API가 느리면 응답이 느려진다"까지만 말하면 아쉬운 답변이에요.
한 요청이 커넥션을 점유한 채로 기다리면, 풀에 남은 커넥션이 하나씩 사라지고, 결국 그 API와 아무 상관 없는 조회 요청까지 커넥션을 못 받아 전체 장애로 번지거든요.
DB 작업을 먼저 끝내고 커밋한 뒤에 외부 호출을 하는 구조로 바꿀 수 있는지,
그리고 외부 호출은 성공했는데 DB가 롤백된 경우처럼 두 시스템의 상태가 갈라지는 지점을 어떻게 맞출지까지 설명할 수 있게 준비하는 게 좋아요.
면접에서는
면접에서 이 질문을 받았다면 "트랜잭션은 DB 커넥션을 점유하는 구간이라, 응답 시간을 예측할 수 없는 외부 호출을 그 안에 두면 커넥션 점유 시간이 외부 시스템에 영향받게 된다"는 식으로 시작하면 좋아요.
그다음에는 아래 순서로 이어서 설명하면 돼요.
커넥션 풀 고갈로 서비스 전체가 영향을 받는다.
그래서 DB 작업을 먼저 커밋하고, 외부 호출은 커밋 전/후 이벤트로 분리한다.
분리하면 외부 호출 실패 기록이 남으니, 아웃박스나 재시도 큐로 나중에 데이터를 보정한다.
여기까지 말하면 두 시스템의 상태를 어떻게 일치시킬지 묻는 질문이 따라올 수 있어요.
이때는 결국 한 번에 원자적으로 맞추는 것은 불가능하고, 최종적인 결과를 일치시키는 방향으로 설계한다고 연결해주면 더 좋아요.
MSA 환경에서의 데이터 정합성
이 문제는 MSA 환경에서 특히 흔하게 발생하는 문제예요.
두 격리된 시스템의 데이터 정합성을 보존하는 방법이 더 궁금하다면, 분산 트랜잭션(Distributed Transaction)과 관련된 키워드(2PC, SAGA, 코레오그래피, 오케스트레이션 등)를 더 찾아보는 것도 추천해요.
꼬리질문
다음의 꼬리질문도 생각해보세요.
트랜잭션이 길어지면 DB 입장에서는 구체적으로 어떤 부담이 생기나요?
커넥션 풀이 고갈되면 새로 들어온 요청은 어떤 상태가 되나요?
외부 호출을 커밋 이후로 옮기려면 어떤 방법을 쓰시겠어요?
커밋은 됐는데 그 뒤의 외부 호출이 실패하면 어떻게 복구하나요?
반대로 외부 결제는 승인됐는데 우리 트랜잭션이 롤백되면 어떻게 처리하시겠어요?
외부 API에 타임아웃을 건다면 기준은 어떻게 정하시겠어요?
AI 모의면접으로
나의 면접 스킬을 체크해보세요
프론트엔드,백엔드,FDE 기술면접부터 문화면접까지,
개발자 면접 준비를 실전처럼 연습해 보세요.
답변 0





