pile·
백엔드·마켓컬리마켓컬리 Hello World·

주소정제 서비스 내재화 - 2화 ( 그럴싸한 계획 )

컬리 OMS 팀이 외부 주소정제 업체 호출 비용을 줄이려 행안부 오픈 API와 자체 축적 데이터를 조합해 주소정제 1.0을 설계·배포한 과정과, 배포 직후 겪은 장애를 다룬다. 3개월 만에 외부 호출을 절반 이하로 줄여 월 150~200만원을 아꼈지만, 행안부 API 타임아웃으로 약 1,000건 요청이 실패해 대응 방식을 바꿨다.

핵심 포인트
  • 행안부 도로명 주소조회 API로 건물관리번호(bdMgtSn)를 얻고, 좌표조회 API로 GRS80 UTM-K 위경도를 얻는 두 API를 조합했다.
  • 좌표조회 API는 5초당 10건 제한이라 제약이 커, 5년치 '외부 주소정제 축적 데이터'를 캐시처럼 활용해 좌표를 커버했다.
  • 같은 건물관리번호면 같은 기본주소라는 성질을 이용해, 이미 정제된 다른 고객 데이터로 신규 요청을 채우는 flow를 설계했다.
  • AS-IS 테스트 점검 → latency 체크 → QA → 운영 카나리 일주일 모니터링의 보수적 배포 계획을 따랐다.
  • 배포 후 행안부 주소조회 API가 5~10분간 타임아웃/502를 내며 캐시에 없는 주소 요청이 대량 실패했다.
상세 정리
  • 목표 설정: 계약 종료는 멀게 느껴져, 일단 외부 업체 API 호출 비용만이라도 최소화하는 것을 1차 목표로 잡았다.
  • API 발견: 도로명·지번을 넣으면 건물관리번호까지 주는 주소조회 API와, 도로명코드·본번·부번으로 위경도를 주는 좌표조회 API를 찾았다.
  • 제약 확인: 담당자 통화로 주소조회는 쿼리 제한 없음, 좌표조회는 5초당 10건 제한, 과도한 요청은 IP 차단 가능이라는 조건을 파악했다.
  • 좌표 확보 아이디어: 좌표 API 제한이 커서, 계약 시 허락받아 캐싱해둔 5년치 정제 주소 데이터로 건물 좌표를 대체 조달하기로 했다.
  • 가설 검증: 운영에서 외부 API로 호출됐던 주소 50~100개를 무작위로 찍어 커버 가능성을 확인하고 충분하다고 판단했다.
  • 정제 1.0 flow: STEP1은 주소조회 API로 건물관리번호를 얻어 축적 DB에서 정제 주소를 찾고, STEP2는 없으면 좌표조회 API를 시도하는 구조다.
  • 배포 계획: 테스트 코드 점검, latency 영향 체크, QA 검증, 운영 카나리 최소 일주일 모니터링, 간단한 에러는 핫픽스·복잡하면 롤백으로 정했다.
  • 효과: 3개월 만에 외부 호출을 절반 이하로 줄여 월 150~200만원을 절감했다.
  • 장애 발생: 배포 일주일 뒤 저녁, 10분간 약 1,000건의 OMS API 응답에서 에러가 났고 결제 중 고객이 재시도를 겪었다.
  • 원인: 주소조회 API가 5~10분간 타임아웃·502를 냈고, 메인 캐시에 없는 주소 요청만 장애 대상이 됐다.
  • 대응: 타임아웃을 더 짧게 줄이고 retry를 제거했으며, 타임아웃 예외 시 무조건 기존 외부업체 호출로 폴백하도록 바꿨다.
  • 재평가: API 안정성을 과신했고, 축적 데이터만으론 신규 고객 주소를 다 못 커버해 외부 업체 계약은 못 끊는다는 한계를 인정하고 방향을 재검토했다.
왜 읽나외부 의존을 API와 캐시로 대체하려는 백엔드 엔지니어에게 점진 배포와 폴백 설계, 외부 API 장애 대응의 교훈.
마켓컬리
마켓컬리 Hello World 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·github-engGitHub Engineering·

    조기 종료를 없애야 벡터화된다 — 메모리 속도 소스 코드 케이스 폴딩

    GitHub의 코드 검색 엔진 Blackbird는 480TB 이상의 소스 코드를 인덱싱하기 전 모든 바이트에 case folding을 적용한다. 이 글은 Rust로 구현한 case folding을 메모리 대역폭 한계(45+ GiB/s)까지 끌어올린 두 가지 반직관적 최적화를 상세히 다룬다. 핵심은 루프 조기 종료(break) 제거로 LLVM 벡터화를 유도하고, UTF-8을 디코딩하지 않고 바이트 공간 산술만으로 fold를 수행하는 것이다.

    #rust#unicode#simd+2
  2. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    트랜잭션 스크립트에서 숙소 메타 + 가격 계산 모듈로 — 전시 아키텍처 개선기 (2/3)

    여기어때 전시개발팀이 숙소 상세(PDP) API를 해부한 결과, 코드상으로는 DB 호출 3번처럼 보이던 요청이 실제로는 MongoDB $lookup 체인으로 컬렉션을 19회 접근하는 구조였다. 이 트랜잭션 스크립트 방식의 핵심 문제는 "aggregation이 I/O를 가린다"는 점으로, 독립적인 쿼리 10개가 단일 파이프라인에 직렬화되어 병렬화 기회를 잃고, 가격 때문에 거의 안 바뀌는 이미지까지 매 요청마다 읽어야 하는 읽기 증폭이 발생했다. V3에서는 "조회 시점 조립"을 "쓰기 시점 사전 조립"으로 전환하고, 화면별로 복제되던 가격 계산 로직을 goodsprice 단일 모듈로 수렴했다. 4개 API(PLP/PDP/RDP/ILP)의 반복 마이그레이션은 Claude Code skill로 절차를 고정하고 쉐도잉 + 동일성 검증으로 안전망을 마련하는 방식으로 진행됐다.

    #architecture#migration#caching+2