당근 로컬 프로필: Git 기반 변경 이력을 활용한 데이터 중복 처리 및 최적화 전략
🤖 AI 추천
백엔드 개발자, 데이터 엔지니어, 서비스 개발 리드
🔖 주요 키워드

핵심 기술: 이 글은 당근의 로컬 비즈니스 서비스에서 발생하는 복잡한 데이터 중복 문제를 해결하기 위해 Git의 변경 이력(commit) 개념을 차용한 아키텍처를 소개합니다. 다양한 경로로 수집되는 업체 정보의 중복을 방지하고, 여러 프로필에 흩어진 최신/최적의 정보를 대표 프로필로 효과적으로 통합하는 방안을 제시합니다.
기술적 세부사항:
- 로컬 프로필 생성 방식: 사장님 직접 등록, 유저 제안, 외부 수급 등 세 가지 방식을 통해 로컬 프로필이 생성됩니다.
- 중복 문제 발생: 유저 제안 등으로 프로필이 생성된 후 사장님이 직접 등록할 경우 동일 업체가 중복 노출되는 문제가 발생합니다.
- 초기 중복 방지 및 처리: 유사 프로필 탐지 및 연결, 중복 프로필 탐지 후 대표 프로필로 병합하는 시스템을 구축했습니다.
- 병합 정책: 대표 프로필은 노출, 병합된 프로필은 미노출 및 대표 프로필로 리다이렉트합니다.
- 병합 후 아쉬운 점: 병합된 프로필에 더 최신의, 혹은 더 좋은 정보가 포함되어 있음에도 대표 프로필에 반영되지 못하는 현상이 발생합니다.
- Git에서 영감 얻기: Git의 브랜치별 변경 이력을 추적하고 필요한 변경 사항만 취합하여 병합하는 방식에서 아이디어를 얻었습니다.
- 변경 이력 기반 최적화:
Local Profile Mutation
객체를 통해 로컬 프로필의 생성 및 변경 절차를 통일하여 일관된 변경 이력(변경 시점, 소스, 값 등)을 저장합니다.Snapshot
개념을 도입하여, 병합 관계에 있는 모든 프로필의 변경 이력을 조회하고 최적의 변경 값을 선별하여 대표 프로필에 반영합니다.- Snapshot Candidate 선정 로직: 변경 시점과 변경 소스를 기준으로 최적의 값을 선정합니다.
- Reduce 추상화:
Filter
와Evaluator
를 사용하여 유연하게 최적의 스냅샷 값을 선정하는 로직을 구성합니다.- Filter: 변경 사항을 포함할지 검사 (예: Composite Snapshot 무시, 신뢰 낮은 소스 변경 무시).
- Evaluator: 두 Candidate 간 우선순위 결정 (예: 빈값 vs 비어있지 않은 값, 사장님 변경 우선, 신뢰할 만한 외부 정보 우선).
- 결과: 대표 프로필에 가격표, 영업시간, 홈페이지 주소 등 풍부한 데이터 노출이 가능해졌습니다.
개발 임팩트: 복잡한 데이터 수집 및 관리 과정에서 발생할 수 있는 정보 유실을 방지하고, 사용자에게 최신의 정확한 업체 정보를 제공하는 서비스 품질 향상에 기여합니다. Git과 유사한 변경 이력 관리 및 병합 전략은 대규모 데이터 처리 및 시스템 확장성에 대한 좋은 아키텍처적 시사점을 제공합니다.
커뮤니티 반응: (원문에 직접적인 커뮤니티 반응 언급은 없으나, Git을 활용한 문제 해결 방식은 개발자 커뮤니티에서 긍정적인 반응을 얻을 수 있는 주제입니다.)
📚 관련 자료
git
본문의 핵심 아이디어인 'Git의 변경 이력(commit)을 활용한 데이터 병합 및 최적화'와 직접적인 연관성을 가집니다. Git의 브랜치 병합 및 충돌 해결 메커니즘은 글에서 제시하는 로컬 프로필 병합 전략의 근간이 됩니다.
관련도: 95%
spring-data-jpa
JPA (Java Persistence API)는 데이터 영속성 관리를 위한 프레임워크로, 글에서 언급된 Local Profile Mutation 객체를 통해 프로필 데이터를 생성/변경하고 변경 이력을 저장하는 백엔드 시스템 구축에 활용될 수 있습니다. 변경 이력 관리를 위한 데이터 모델링 및 쿼리 로직 구현과 관련이 있습니다.
관련도: 70%
Apache Kafka
고성능 분산 스트리밍 플랫폼으로, 다양한 소스(사장님 등록, 유저 제안, 외부 수급)에서 발생하는 로컬 프로필 관련 변경 이벤트를 실시간으로 수집하고 처리하는 데 사용될 수 있습니다. 글에서 제시하는 변경 이력 수집 및 Snapshot 생성을 위한 이벤트 기반 아키텍처와 관련이 있습니다.
관련도: 60%