DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 컬리
#Backend

컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법

컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법
01

Summary

데이터 유실 0%, 새벽 장애 대응 끝! 컬리가 외부 데이터를 동기화하는 영리한 전략

아웃박스 패턴과 재시도 토픽으로 완성한 3PL 물류 시스템의 강력한 데이터 정합성 아키텍처

컬리가 직매입 모델(1P)에서 3자 물류(3PL)로 사업을 확장하며 직면한 외부 데이터 동기화 문제를 해결한 기술적 여정을 다룹니다. DB 트랜잭션과 메시징 시스템 사이의 간극을 메우는 아웃박스 패턴과 복잡한 재시도 메커니즘을 프레임워크의 표준 기능을 활용해 우아하게 구현한 사례를 소개합니다.

  • 01DB-Kafka 간의 원자성을 보장하기 위한 아웃박스 패턴 실무 적용 가이드
  • 022025년 릴리즈된 신규 경량 라이브러리 Namastack Outbox 도입 사례
  • 03Spring Kafka @RetryableTopic을 활용한 메인 토픽 블로킹 없는 지연 재시도 구현
  • 04카프카 토픽 파편화를 방지하기 위한 SINGLE_TOPIC 재사용 전략 활용
  • 05이중 직렬화 방지를 위한 재시도 토픽 전용 Kafka Template 구성 팁

+RECOMMENDATION

마이크로서비스 아키텍처(MSA)에서 서비스 간 데이터 정합성이 중요하거나, 외부 연동 시 발생하는 일시적 오류를 자동화된 재시도로 해결하고 싶은 백엔드 개발자들에게 실무적인 가이드를 제공합니다.

The Problem

3PL 사업 확장으로 외부 채널의 다양한 데이터 인입이 증가함에 따라, DB 쓰기와 메시지 발행 간의 원자성 미보장으로 인한 데이터 불일치 이슈와 참조 데이터 미생성으로 인한 일시적 처리 실패 시 운영자의 수동 개입이 빈번해지는 문제가 발생했습니다.

The Solution

DB와 메시지 발행의 원자성을 보장하기 위해 'Namastack Outbox' 라이브러리를 활용한 아웃박스 패턴을 도입하고, 일시적인 오류에 대응하기 위해 Spring Kafka의 @RetryableTopic을 적용하여 최대 24시간 동안 10분 간격으로 자동 재시도가 가능하도록 시스템을 보완했습니다.

The Result

인터페이스 테이블과 메시지 큐 간의 원자적 일관성을 확보하였으며, 시스템 스스로 일시적 오류를 복구하는 자가 치유(Self-healing) 구조를 달성하여 야간 등 비가동 시간대에도 운영자 개입 없이 안정적인 데이터 동기화가 가능해졌습니다.

Trade-off

카프카 메시지 발행 성공 후 아웃박스 상태 마킹 과정에서 장애가 발생할 경우 동일 메시지가 중복 발행될 가능성이 존재하므로, 이를 처리하는 컨슈머 측의 멱등성 보장 설계가 필수적으로 요구됩니다.

03

Key Concepts

Concept · 01

Outbox Pattern

데이터베이스 트랜잭션과 메시지 브로커 전송을 하나의 원자적 작업으로 묶기 위해, 발행할 이벤트를 DB의 전용 테이블에 먼저 기록하는 아키텍처 패턴입니다.

  • 트랜잭션 커밋 시 메시지가 테이블에 저장됨을 보장
  • 별도의 Poller가 테이블을 읽어 실제 메시지 큐로 발행
  • 메시지 발행 성공 시 테이블 내 상태값을 업데이트하여 중복 처리 방지
Concept · 02

RetryableTopic

메시지 컨슘 중 예외 발생 시 메인 토픽을 블로킹하지 않고 별도의 재시도 토픽으로 메시지를 넘겨 지연 처리하는 Spring Kafka의 기능입니다.

  • Backoff 설정을 통해 재시도 간격과 횟수를 선언적으로 관리
  • 최종 실패 시 Dead Letter Topic(DLT)으로 이동하여 사후 관리 가능
  • 비즈니스 로직 수정 없이 어노테이션만으로 강력한 재시도 정책 수립 가능
Concept · 03

SameIntervalTopicReuseStrategy

재시도 간격이 동일한 경우 여러 개의 재시도 토픽을 생성하지 않고 단일 토픽을 재사용하여 카프카 클러스터의 부하를 줄이는 전략입니다.

  • 기본값인 MULTIPLE_TOPICS 대신 SINGLE_TOPIC 설정을 통해 토픽 폭발 방지
  • 클러스터 내의 수많은 재시도 토픽 관리 오버헤드를 절감
  • 동일 간격 재시도 시나리오에서 운영 효율성 극대화
Continue reading · same source

컬리More from 컬리

View all posts from 컬리
  • AI에게 도메인을 가르치다 두 번 갈아엎은 이야기 — LLM Wiki + RAG 혼합기

    RAGLLMSQLite
    1개월 전
  • 현관문에도 얼굴이 있다: 배송 완료 사진 기반 On-device 오배송 탐지 시스템

    ONNXContrastive LearningDocumentDB
    2개월 전
  • 클로드 코드로 개발 팀장의 하루를 재설계한 이야기

    Claude CodeMCPWorkflow Automation
    2개월 전
  • AI 토큰 사용량 전사 1위 개발자가 148,000번의 대화에서 배운 것

    LLM AgentsOrchestrationPrompt Engineering
    3개월 전
  • AI 에이전트 15개를 동시에 굴리는 법 — AI 병렬 오케스트레이션 실전 운용기

    AI AgentsOrchestrationObsidian
    3개월 전

Source

컬리
컬리
Engineering Blog

Published · January 11, 2026

Topics

아웃박스 패턴카프카Spring Kafka데이터 정합성RetryableTopicNamastack Outbox3PL메시지 큐