
솔직히 고백하자면, 지도 서비스를 구축할 때마다 등골이 서늘할 때가 있습니다.
구글 맵스나 Mapbox 같은 SaaS를 쓰자니 트래픽 비용이 무섭고,
자체 구축을 하자니 타일 서버, 라우팅 엔진, 지오코딩 DB까지 준비할 게 산더미처럼 쌓이기 때문입니다.
특히 제가 있는 AI 솔루션 분야에서는 '폐쇄망(On-Premise)' 요구사항이 빈번합니다.
공장 내부, 해상 운송 선박, 혹은 보안이 생명인 국방 관련 프로젝트들입니다.
이런 곳에서는 인터넷 연결을 전제로 하는 외부 API는 그림의 떡입니다.
막막했던 차에, 최근 흥미로운 프로젝트 하나를 발견했습니다.
바로 Corviont입니다.
이 도구의 컨셉은 아주 명확하고 매력적입니다.
"Docker Compose 한 방으로 오프라인 지도, 경로 탐색, 주소 검색을 끝낸다."
개발자라면 이 문장이 얼마나 달콤한지 아실 겁니다.
보통 지도 서비스를 자체 호스팅하려면 엄청난 삽질이 필요합니다.
OpenStreetMap 데이터를 다운로드 받아 타일로 변환하고,
OSRM이나 Valhalla 같은 무거운 라우팅 엔진을 빌드하고,
Nominatim 같은 거대한 주소 DB를 구축해야 하죠.
서로 다른 기술 스택을 엮느라 인프라팀과 밤을 새우기 일쑤입니다.
그런데 Corviont는 이 복잡한 과정을 하나의 스택으로 압축했습니다.
기술적으로 뜯어보면 구성이 꽤 알찹니다.

첫째, 벡터 타일(Vector Tiles)을 사용합니다.
PMTiles라는 단일 파일 포맷을 활용해 외부 타일 서버 없이 로컬에서 지도를 렌더링합니다.
파일 관리도 쉽고, 렌더링 속도도 빠릅니다.
둘째, Valhalla를 품었습니다.
오픈소스 라우팅 엔진 중에서도 유연성이 뛰어난 Valhalla를 컨테이너화했습니다.
단순히 지도를 보여주는 것을 넘어, A지점에서 B지점까지의 경로를 오프라인 상태에서 계산해 줍니다.
셋째, SQLite 기반 지오코딩을 지원합니다.
Nominatim 데이터를 경량화하여 SQLite에 담았습니다.
인터넷 없이도 "강남대로 123"을 검색하면 위경도 좌표를 뱉어낸다는 뜻입니다.
프론트엔드는 MapLibre를 기본으로 제공하지만,
API가 열려 있으니 여러분이 만든 기존 UI에 엔드포인트만 연결하면 그만입니다.
이 솔루션이 겨냥하는 지점은 명확합니다.
'엣지(Edge)'입니다.
네트워크가 불안정한 현장 차량,
통신 비용이 비싼 해상 물류,
데이터가 밖으로 나가면 안 되는 보안 시설.
이런 환경에서 돌아가는 AI 장비나 키오스크에 지도 기능이 필요하다면,
이보다 가볍고 확실한 대안을 찾기는 쉽지 않습니다.
물론, 아직 초기 단계라 해결해야 할 과제들도 보입니다.
가장 큰 걱정거리는 '데이터 업데이트'입니다.
도로는 매일 새로 뚫리고 건물은 바뀝니다.
오프라인 스택의 특성상 이 데이터를 주기적으로 갱신해 주는 파이프라인이 필수적인데,
다행히 로드맵을 보니 무중단 로컬 맵 업데이터를 개발 중이라고 합니다.
이 기능까지 붙는다면 엔터프라이즈 레벨에서도 충분히 검토해 볼 만한 물건이 될 겁니다.
커스텀 오버레이 기능도 준비 중이라니,
공장 도면이나 특정 POI(관심 지점)를 지도 위에 덮어씌우는 작업도 수월해지겠네요.
비즈니스 관점에서도 꽤 합리적인 접근입니다.
요금 정책을 '기기당 라이선스' 모델로 잡고 있습니다.
API 호출 건수마다 과금되는 모델에 지친 기업들에게는 가뭄의 단비 같은 소식이죠.
예산은 정해져 있는데 트래픽 예측이 안 될 때, 고정 비용 모델만큼 마음 편한 게 없거든요.
지금 당장 여러분의 프로젝트에 도입하지 않더라도,
이런 'All-in-One 오프라인 스택'이 가능하다는 걸 아는 것만으로도 큰 자산이 됩니다.
기술은 결국 비즈니스의 문제를 해결하기 위해 존재합니다.
"인터넷 안 되면 지도 못 씁니다"라고 말하는 대신,
"도커 컨테이너 하나만 띄우면 해결됩니다"라고 말할 수 있는 CTO.
개발자 여러분도 그런 무기 하나쯤은 주머니에 넣어두시길 바랍니다.
Monaco 데모 버전은 지금 바로 로컬에서 돌려볼 수 있습니다.
이번 주말, 가볍게 docker-compose up 한번 해보시는 건 어떨까요?


