pile·
DB / 데이터·마켓컬리마켓컬리 Hello World·

주소정제 서비스 내재화 - 3화 ( 노가다의 달달한 열매 )

컬리 OMS 팀이 주소정제 2.0을 위해 행정안전부 API 의존을 걷어내고 전국 건물 데이터를 자체 DB로 구축한 과정을 다룬다. 행안부 내비게이션용 DB 파일을 세종시부터 검증해 전국 약 1,078만 건물을 적재했고, 이 건물 DB가 주소정제뿐 아니라 배송권역 캐시 개선까지 파급 효과를 냈다.

핵심 포인트
  • 행안부 주소기반 지원 사이트의 '내비게이션용 DB'가 위경도까지 포함해 자체 구축의 원천 데이터로 적합했다.
  • 가장 건물 수가 적은 세종시(약 5.6만 건물)를 먼저 넣어 운영 로그의 모든 주소가 커버되는지 검증한 뒤 전국으로 확장했다.
  • .txt 원본을 멀티파트로 받아 GRS80 UTM-K 좌표를 지리 위경도로 변환하며 DB에 넣는 적재 API를 직접 개발했다.
  • 사이트에 공개되지 않은 일단위 동기화 API를 행안부 담당자에게 문의해 알아내 매일 새벽 6시 자동 최신화를 구성했다.
  • 완성된 건물 DB는 약 1,078만 건이며, 배송가능권역 캐시 키를 건물관리번호 1개로 단순화해 메모리와 관리 부담을 줄였다.
상세 정리
  • 배경: 주소정제 2.0의 핵심 목표는 행안부 API를 fade out 하고 정제 기능을 직접 만드는 것이었다.
  • 데이터 출처: 행안부 주소기반 지원 사이트가 약 30종 데이터를 제공했고, 그중 위경도까지 담긴 '내비게이션용 DB'만 자체 구축에 필요한 정보를 모두 가졌다.
  • 검증 전략: 행정부처가 몰린 세종시를 첫 대상으로 잡아, 여기서 누락이 많으면 나머지 지역도 뻔하다는 가정으로 리스크를 먼저 걸렀다.
  • 세종시 결과: 약 5.6만 건물을 적재하니 운영에서 외부 API로 호출했던 세종시 주소가 전부 커버됐고, 누락은 도로명 오타나 실존하지 않는 주소뿐이었다.
  • 데이터 특성 발견: 정부청사 등 일부 건물은 정부가 의도적으로 위경도를 제공하지 않는다는 점을 검증 중 확인했다.
  • 좌표 변환: 원본은 GRS80 UTM-K 좌표(예: 983298, 1833434)라 익숙한 지리 위경도로 변환해 저장하는 게 유리해, 적재 API에서 row별로 변환 후 insert 했다.
  • 적재 방식 선택: csv import 대신 멀티파트 파일을 받는 API를 만든 이유는 좌표 변환과, 어차피 일단위 동기화에도 file→DB 로직이 필요했기 때문이다.
  • 최신화: 매일 zip으로 오는 일변동 자료를 수동 처리하기 번거로워, 비공개 일단위 동기화 API를 확보해 자동화했다.
  • 필드 취사선택 교훈: 필요한 컬럼만 발라 쓰려다 누락으로 재적재를 반복했고, 공공데이터는 일단 전 컬럼을 넣고 나중에 정리하는 게 낫다는 결론.
  • 지하여부 필드: 안 쓸 줄 알았던 '지하여부(0지상/1지하/2공중/3수상)' 값이 '지하93-1' 같은 주소 때문에 결국 전국 건물에 추가됐다.
  • 규모: 스테이징 기준 전국 약 10,778,620개 건물이 적재됐고, 시/도별 건물 수도 직접 쿼리로 확인 가능해졌다.
  • 시너지: 배송가능권역 캐시가 기존엔 우편번호+위경도 조합 키라 우편번호 변경 시 무효화됐는데, 건물관리번호 단일 키로 바꿔 메모리와 만료 관리가 크게 개선됐다.
  • 활용 확장: 컬리 1시간 배송 서비스를 건물 단위(역삼 한국타이어 빌딩)로 관리하며 주문~배달 전체 flow를 테스트했다.
왜 읽나공공데이터를 자체 DB로 내재화하려는 백엔드·데이터 엔지니어에게 검증 전략·좌표 변환·최신화 자동화의 실전 사례.
마켓컬리
마켓컬리 Hello World 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. DB / 데이터·spotify-engSpotify Engineering·

    데이터 레이크 온라인 포인트 쿼리 인덱싱 — RAP

    Spotify 엔지니어링이 페타바이트 규모 데이터 레이크(GCS)에 저장된 Parquet 파일에서 한 자릿수 밀리초 레이턴시로 포인트 쿼리를 수행하는 RAP(Random Access Parquet) 방식을 공개했다. Trino·BigQuery 같은 분산 SQL 엔진은 단일 행 조회도 스케줄링·플래닝 비용으로 수 초가 걸리지만, RAP는 외부 인덱스로 키→(파일, 행 번호)를 직접 매핑해 의존적 read chain을 병렬화함으로써 이 문제를 해결했다. 기존 KV 스토어(Bigtable)와 달리 GB당 비용이 클라우드 스토리지 read 수준에 불과해 장기 이력 데이터나 롱테일 피처도 인터랙티브 조회 대상이 된다.

    #data-engineering#indexing#data-lake+2
  2. DB / 데이터·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    데이터 통합— MongoDB 원칙으로 document를 통합하고 동기화를 재설계하다 (3/3)

    여기어때 전시개발팀은 ES 단일 대문서 → MongoDB v1 RDB 1:1 파편화 → v2 도메인 단위 통합이라는 세 차례 구조 전환을 거쳐 전체 동기화 시간을 약 1시간에서 10분으로 단축했다. 이 글은 3부작의 마지막으로, v2 통합 문서 구조에 맞춰 "$set/$unset 필드 단위 부분 갱신 + 이벤트 발행" 기반 동기화를 어떻게 재설계했는지 구체적인 MongoDB 패턴과 함께 설명한다.

    #denormalization#data-sync#mongodb+2
  3. DB / 데이터·pinterest-engPinterest Engineering·

    Pinterest 차세대 DB 수집 프레임워크의 자동화된 스키마 진화

    Pinterest의 CDC 기반 DB 수집 파이프라인은 MySQL에서 Kafka, Flink, Spark, Iceberg를 거치는 다층 구조다. 스키마 변경이 생기면 모든 계층을 동시에 업데이트해야 해 드리프트, 배포 실패, 데이터 불일치가 반복됐다. Pinterest 엔지니어링 팀은 이를 해결하기 위해 가산적 변경만 자동화하는 스키마 진화 프레임워크를 구축하고, PR 기반 롤아웃과 SLA 기반 일관성 모델을 도입했다.

    #data-pipeline#apache-flink#cdc+2