컬리 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로 내재화하려는 백엔드·데이터 엔지니어에게 검증 전략·좌표 변환·최신화 자동화의 실전 사례.