모든 글

배치 재실행 비용을 줄이기 위해 수신과 가공을 분리하는 법

외부 데이터를 저장한 뒤 제공자 호출 없이 내부 가공만 재실행해 대형 배치의 트래픽과 복구 비용을 줄이는 방법입니다.

출처 및 AI 안내: 이 글은 제미니의 개발실무 유튜브를 기반으로 작성되었습니다. gpt-5.6-sol 모델을 사용해 생성·편집했습니다.

외부 데이터를 가져오고, 가공하고, 저장하는 일을 하나의 긴 배치로 묶으면 내부 가공 버그 때문에 외부 호출까지 전부 다시 해야 할 수 있다. 두 단계의 실패 비용이 다르다면 수신과 가공을 분리한다. 받은 데이터를 저장한 뒤 제공자를 다시 호출하지 않고 내부 처리만 반복할 수 있게 만든다.

모든 배치를 여러 잡으로 쪼개야 한다는 규칙은 아니다. 비용이 크거나 호출 제한이 있는 외부 API와 다시 실행해야 할 수 있는 가공 로직을 분리하는 선택이다.

한 번의 재시도가 모든 부수 효과를 반복하면 안 된다

상품 목록을 가져온 다음 각 상품의 옵션을 다시 외부 API로 조회한다고 하자. 중간에 실패하면 처음부터 재실행하는 것만으로도 수많은 호출이 중복될 수 있다. 실패 위치를 알더라도 거대한 흐름 안에 정확한 이어하기 로직을 넣는 일은 또 다른 복잡성이 된다.

실패 원인이 내부에만 있을 수도 있다. 태그 매핑이 틀렸거나 필요한 옵션 데이터가 누락됐을 수 있다. 이때 정상인 원본 데이터를 다시 받아도 버그는 고쳐지지 않는다. 외부 트래픽 예산만 다시 쓰고, 작은 제공자의 서비스에 부담을 주거나 호출 제한에 걸릴 수 있다.

원본 스테이징을 재실행 경계로 삼는다

두 단계로 나누면 복구 단위가 달라진다.

수신 배치는 외부 API를 호출하고 받은 모양에 가까운 데이터를 저장한다. 가공 배치는 스테이징 데이터를 읽어 애플리케이션 모델로 변환하고 최종 테이블에 쓴다. 변환이 실패하면 두 번째 배치만 다시 돌리면 된다.

상품과 옵션 데이터를 따로 저장할 수도 있고 원본 특성에 맞는 다른 형태를 쓸 수도 있다. 외부 API 호출과 내부 가공을 분리하는 것이 핵심이다.

의도적인 재가공도 쉬워진다. 매핑 규칙이 바뀌면 제공자를 다시 호출하지 않고 보관한 원본 스냅샷에서 내부 표현을 재생성할 수 있다.

분리는 비용을 없애지 않고 옮긴다

수신 배치도 중간에 실패할 수 있으므로 자체적인 재시작 지점이 필요하다. 배치를 나눈다고 첫 단계의 실패까지 해결되지는 않는다.

두 배치의 연결 방식도 정해야 한다. 단순한 시스템은 수신 완료 예상 시각보다 충분히 뒤에 가공을 예약할 수 있고, 수신 뒤 가공을 실행할 수도 있으며, 정산 같은 작업은 더 구조화된 흐름을 쓸 수도 있다. 환경에 따라 선택이 달라진다.

핵심 질문은 어느 부분을 외부 호출 없이 다시 실행해야 하느냐다. 외부 수신은 비싸고 내부 변환은 실패하거나 바뀔 수 있다면 둘 사이에 저장 경계를 둔다.