들어가며 링크 복사
안녕하세요. 길안내SDK파트 에단, 제이지, 루크입니다. 저희는 카카오내비 길안내의 지도 시각화를 개발합니다. 카카오내비 사용자에게 정확하고 직관적인 주행 경험 제공을 목표로, 경로 안내 품질과 지도 표현의 완성도를 지속적으로 개선하고 있습니다.
기존 카카오내비 주행 지도는 오랜 기간 서비스되며 안정성을 검증받았지만, SDK 확장이나 고성능 기준을 충족하기에는 구조적 제약이 있었습니다. 이에, 우리는 단순한 최적화가 아니라 지도 SDK의 지속 가능성을 확보하기 위한 재설계가 필요하다고 판단했습니다.
이 글에서는 기존 카카오내비 주행 지도의 문제점과 이를 해결하기 위해 새롭게 설계·구현한 신규 카카오내비 주행 지도(이하 KNMSDK)를 소개합니다. C++ 기반 통합 코어, 그래픽 추상화 계층(GDI), 데이터 의존성 없는 렌더링 엔진, 데이터·네트워크 파이프라인 고도화를 통해 기존 문제를 어떻게 해결했는지 공유합니다.
📚 추천 독자
이 글은 모바일 그래픽·렌더링 성능에 관심 있는 개발자, 멀티플랫폼(Android·iOS) 공통 아키텍처를 고민하는 엔지니어, 지도·공간 데이터 시각화 SDK를 설계·운영하는 분들이 읽으시면 더욱 좋아요!
우리가 경험한 문제 링크 복사
1. 성능의 한계 링크 복사
첫 번째로, 성능 측면의 한계가 분명했습니다. 기존 지도 렌더링 엔진은 Kotlin과 OpenGL ES 기반으로 구현되어 있었습니다. Kotlin은 생산성과 안정성 면에서는 장점이 있습니다. 하지만 렌더링과 같이 프레임 단위로 반복되는 환경에서는 객체 생명주기 관리 비용과, 런타임 추상화 계층의 부가 비용이 누적되며 프레임 타임을 일정하게 유지하는 데 불리했습니다. 특히 대규모 지도 데이터의 가공과 상태 갱신이 빈번한 구조에서는 이러한 오버헤드가 미세한 지연으로 축적되어 프레임 타임 변동성을 키우는 요인이 되었습니다.
또한 OpenGL ES는 모바일 환경에서 범용적으로 사용 가능한 API이지만, 파이프라인 상태 관리가 암묵적으로 이루어지고 드라이버 의존성이 높은 구조적 특성으로 인해, CPU 측 작업 비용을 정밀하게 통제하는 데 한계가 있었습니다. 드로우 콜 증가에 따른 상태 변경 비용, 내부 동기화 지점의 비가시성, 그리고 렌더링 파이프라인을 명확하게 분리하기 어려운 스레딩 모델은 복잡도가 높은 지도 렌더링 시나리오에서 확장성과 성능 안정성을 제한하는 요소였습니다.
여기에 장기간 누적된 레거시 코드가 더해지면서, 데이터 변환 과정에서의 불필요한 메모리 복사와 렌더링 스레드 간 동기화 지점이 제거되지 않은 채 남아 있었습니다. 이는 프레임 타임의 변동 폭을 키우는 주요 원인이 되었습니다. 그 결과 평균 FPS보다 프레임 드랍과 미세한 끊김이 빈번하게 발생했으며, 성능 최적화를 시도하더라도 근본적인 개선으로 이어지기 어려웠습니다.
2. 아키텍처 구조의 한계 링크 복사
기존 지도 시스템에서는 Android와 iOS에서 각각 Kotlin과 Swift로 렌더링 로직이 구현되어 있어, 플랫폼 간에 공유되는 공통 코드가 거의 존재하지 않았습니다. 여기에 플랫폼별 그래픽 API 차이까지 더해지면서 동일한 기능을 각 플랫폼에 맞게 중복으로 구현해야 했고, 이는 유지보수 비용 증가와 릴리즈 속도 저하로 이어졌습니다. 또한 렌더링 엔진과 지도 데이터가 강하게 결합한 구조 역시 큰 제약으로 작용했습니다. 이 구조에서는 데이터 포맷이나 렌더링 방식 중 하나만 변경하더라도 광범위한 리팩토링이 불가피했고, 그로 인해 구조적인 최적화나 점진적인 개선을 시도하기 어려웠습니다.
통합 지도 모듈 설계와 구현 링크 복사
1. C++ 기반 Android·iOS 통합 코어 링크 복사
KNMSDK에서는 주요 모듈을 C++로 통합했습니다. Android와 iOS가 동일한 렌더링 및 데이터 파이프라인을 사용하도록 공통 코어를 구성하고, 플랫폼별 UI 및 시스템 연동만 어댑터 레이어로 분리했습니다.
2. GDI(Graphics Device Interface) 기반 그래픽 추상화와 데이터 독립 렌더링 엔진 링크 복사
KNMSDK의 핵심 구성 요소 중 하나는 GDI(Graphics Device Interface, 그래픽 추상화 계층)입니다.
GDI는 Metal, Vulkan, OpenGL과 같은 서로 다른 그래픽 API를 단일 인터페이스로 추상화한 계층입니다. 런타임 환경에 따라 사용 가능한 그래픽스 백엔드를 선택할 수 있도록 설계되었습니다. Vulkan 사용이 불안정한 디바이스에서는 OpenGL로 자동 폴백하도록 구성했으며, 리소스 생성, 동기화, 큐 서브미션과 같은 그래픽 API별 차이를 공통 인터페이스 사용으로 렌더링 스택 전반을 단순화했습니다.
렌더링 엔진은 지도 데이터에 종속되지 않도록 구현했습니다. 이러한 구조 덕분에 그래픽 백엔드를 교체하거나 새로운 렌더링 기법을 도입하더라도 상위 로직이나 지도 데이터 구조의 큰 변경 없이, 리팩토링과 기능 확장이 가능한 유연한 렌더링 아키텍처를 확보할 수 있었습니다.
엔진 내부에서는 Vulkan·Metal 중심의 고성능 그래픽 API를 활용합니다. SSBO 기반 GPU Driven Rendering, half-float vertex 포맷을 통한 메모리 사용량 절감, image·font atlas를 활용한 배치 효율 개선 등을 통해 렌더링 성능을 고도화했습니다. 또한 파이프라인 상태 캐싱과 드로우 콜 배치를 통해 CPU 오버헤드를 최소화했습니다.
3. FlatBuffers 기반 스트리밍 데이터 파이프라인 링크 복사
서버로부터 수신한 지도 raw data는 FlatBuffers를 사용해 직렬화·역직렬화되며, 이를 통해 파싱 단계에서의 오버헤드를 최소화했습니다. 수신된 데이터는 즉시 렌더링에 적합한 형태로 가공된 뒤 로컬 DB에 저장되고, 이후에는 캐시를 먼저 재사용함으로써 불필요한 재다운로드 비용을 줄였습니다.
데이터 로딩은 스트리밍 방식으로 설계되어, 초기 진입 시 전체 데이터를 한 번에 로드하는 대신 실제로 필요한 타일만 점진적으로 로딩합니다. 이를 통해 초기 화면 표시 지연을 최소화하고, 이동 경로에 따라 데이터가 자연스럽게 보강되는 구조를 구현했습니다.
네트워크 경로 역시 curl 기반으로 재정비하여 병렬 요청 구조를 개선하고, 캐시 정책을 조정해 중복 요청을 제거했습니다. 그 결과, 네트워크 상태나 데이터 규모 변화에 따른 영향이 줄어들었고, 지도 데이터 공급 지연을 의미 있게 개선할 수 있었습니다.
개선 결과 링크 복사
KNMSDK를 적용한 결과, 지도 데이터 양이 기존 대비 2배 이상 증가한 상황에서도 안정적인 렌더링 성능을 유지했습니다. iOS에서는 평균 GPU 프레임 타임을 약 2배 개선했으며, Android 환경에서는 최대 20배 이상 단축했습니다. 이와 함께 렌더링 데이터 구조와 리소스 관리 방식을 정비하면서 전체 메모리 사용량을 약 35% 절감했고, 불필요한 연산을 제거해 전력 소모 역시 약 25% 감소시켰습니다.
성능 개선 외에 여러 표현 개선과 자유로운 지도 커스터 마이징도 가능해졌습니다.
KNMSDK가 열어준 확장 가능성 링크 복사
KNMSDK의 가장 큰 변화는 지도 SDK로서의 확장성입니다. 데이터 디펜던시가 제거된 렌더링 엔진 구조 덕분에, KNMSDK는 단순한 “주행 지도”를 넘어 다음과 같이 확장됩니다.
주된 원인은 다음과 같습니다.
- 지도 테마와 스타일의 자유로운 커스터마이징
- 위성 지도, 하이브리드 지도 등 다양한 데이터 소스 적용
- 지도 데이터가 아닌 다른 공간 데이터 시각화로의 확장
- 플랫폼에 종속되지 않는 네이티브 렌더링 기반 SDK 제공
즉, KNMSDK는 “특정 지도 데이터를 그리기 위한 엔진”이 아니라 어떤 공간 데이터라도 표현할 수 있는 렌더링 기반 SDK로 진화했습니다.
마치며 링크 복사
기존 지도 시스템이 가지고 있던 구조적·성능적 한계를 극복하기 위해 저희는 C++ 기반 통합 모듈 도입, 그래픽스 API 추상화, 데이터 의존성 없는 렌더링 엔진 구조, FlatBuffers 기반의 경량 스트리밍 그리고 네트워크 전송·처리 최적화를 단계적으로 적용했습니다.
그 결과 프레임 안정성 향상, 전력 효율 개선, 메모리 사용량 절감이라는 정량적으로 의미 있는 성과를 달성했습니다. 또한 단순한 성능 개선을 넘어 플랫폼에 종속되지 않고 장기적인 확장과 유지보수가 가능한 지도 SDK 아키텍처를 재정의했습니다.
앞으로도 KNMSDK를 중심으로 주행을 풍부하게 반영하는 지도 표현, 다양한 환경에 대응하는 공간 시각화 그리고 실시간 데이터와 결합한 새로운 지도 경험을 위해 계속해서 도전하겠습니다. 단순한 길안내를 넘어 사용자에게 더 직관적이고 몰입감 있는 공간 이해 경험을 제공하는 플랫폼으로 발전시켜 나가겠습니다.