
안드로이드 전용이던 '지도 퀘스트 앱', 아이폰으로 오다
StreetComplete라는 앱 들어보셨나요? 오픈스트리트맵(OpenStreetMap, 줄여서 OSM)에 정보를 채워 넣는 앱인데요, 그동안은 안드로이드에서만 쓸 수 있었어요. 그런데 이번에 iOS 버전이 공개 베타에 들어갔어요. 아이폰 사용자도 정식 출시 전에 직접 설치해서 써보고 피드백을 줄 수 있게 된 거죠.
먼저 OSM이 뭐냐면, '지도판 위키피디아'라고 생각하시면 돼요. 전 세계 자원봉사자들이 도로, 건물, 가게, 벤치, 횡단보도 같은 정보를 직접 입력해서 만드는 무료 지도 데이터베이스거든요. 라이선스(ODbL)만 지키면 누구나 가져다 쓸 수 있어서 많은 앱과 서비스가 내부적으로 OSM 데이터를 쓰고 있어요.
StreetComplete는 어떻게 동작하나요?
문제는 OSM 편집이 꽤 어렵다는 거예요. OSM 데이터는 '태그'라는 키-값 쌍으로 되어 있는데, 예를 들어 건물 층수는 building:levels=3, 도로 포장 재질은 surface=asphalt처럼 적어야 하거든요. 어떤 상황에 어떤 태그를 써야 하는지 규칙을 알아야 하니까 처음 시작하는 사람에게는 장벽이 높죠.
StreetComplete는 이걸 게임처럼 바꿔버렸어요. 앱이 내 주변 지도 데이터를 내려받은 다음, 빠져 있는 정보를 찾아서 '퀘스트'로 띄워줘요. '이 건물은 몇 층인가요?', '이 길은 무슨 재질로 포장돼 있나요?', '이 벤치에 등받이가 있나요?' 같은 질문이 지도 위에 마커로 뜨면, 산책하다가 눈으로 확인하고 버튼만 누르면 돼요. 그러면 앱이 답을 올바른 태그로 바꿔서 OSM 서버에 올려줘요. 사용자는 태그 문법을 하나도 몰라도 되는 거죠.
진짜 흥미로운 부분: 어떻게 iOS로 옮겼을까
개발자라면 '어떻게' 옮겼는지를 더 눈여겨볼 만해요. StreetComplete는 원래 Kotlin으로 작성된 안드로이드 앱인데요, 개발팀은 iOS 앱을 Swift로 처음부터 다시 만드는 대신 코드베이스를 Kotlin Multiplatform(KMP) 기반으로 옮기는 길을 택했어요.
KMP가 뭐냐면, Kotlin 코드 하나를 여러 플랫폼용으로 컴파일하는 기술이에요. 안드로이드에서는 평소처럼 JVM 바이트코드로, iOS에서는 Kotlin/Native를 거쳐 네이티브 바이너리로 컴파일되거든요. 여기에 Compose Multiplatform을 더하면 UI 코드까지 공유할 수 있어요.
이게 왜 중요하냐면, StreetComplete는 대기업 프로젝트가 아니라 소수의 메인테이너와 자원봉사자가 꾸려가는 오픈소스라서요. 퀘스트 종류만 해도 엄청나게 많은데, 이걸 안드로이드용과 iOS용 두 벌로 따로 관리하는 건 현실적으로 불가능에 가깝죠. 퀘스트 로직, 태그 변환 규칙, OSM API 통신, 로컬 데이터 저장 같은 핵심 로직을 한 번만 짜서 양쪽에서 같이 쓰는 게 사실상 유일한 선택지였던 셈이에요.
물론 쉬운 길은 아니에요. 기존 코드가 안드로이드 SDK나 자바 전용 라이브러리에 기대고 있다면 그 부분을 하나씩 멀티플랫폼 라이브러리(예를 들어 HTTP 통신은 Ktor, 직렬화는 kotlinx.serialization)로 바꿔야 하거든요. 지도 렌더링이나 위치 정보처럼 플랫폼마다 사정이 다른 부분은 KMP의 expect/actual 문법으로 '공통 인터페이스 + 플랫폼별 구현'으로 나눠야 하고요. 이런 작업을 꾸준히 쌓아 올린 결과물이 이번 베타예요.
Flutter, React Native와는 뭐가 다를까
크로스플랫폼이라고 하면 Flutter나 React Native가 먼저 떠오르실 텐데요. Flutter는 Dart 언어로 짜고 자체 렌더링 엔진으로 화면을 직접 그려요. React Native는 JavaScript/TypeScript로 짜고 네이티브 UI 컴포넌트를 불러다 쓰는 방식이고요. 새로 시작하는 프로젝트라면 둘 다 좋은 선택지예요. 하지만 이미 Kotlin으로 잘 짜인 안드로이드 앱이 있다면 얘기가 달라져요. 전부 다른 언어로 다시 써야 하니까요.
KMP의 강점이 바로 여기 있어요. 기존 Kotlin 코드를 최대한 살리면서 공유하는 범위를 조금씩 넓혀갈 수 있거든요. 구글도 2024년부터 안드로이드와 iOS 간 비즈니스 로직 공유에 KMP를 공식 지원하고 있고, Compose Multiplatform의 iOS 지원도 2025년에 안정(stable) 버전이 됐어요. StreetComplete는 이 흐름을 보여주는, 꽤 규모 있는 실전 사례예요.
한국 개발자에게 주는 시사점
첫째, 이미 Kotlin으로 안드로이드 앱을 운영하고 있는 팀이라면 StreetComplete 저장소가 좋은 교과서가 돼요. 실제로 돌아가는 앱이 KMP로 모듈을 어떻게 나누고 플랫폼 의존 코드를 어떻게 분리했는지 직접 읽어볼 수 있거든요. 튜토리얼보다 훨씬 현실적인 고민이 담겨 있어요.
둘째, 한국의 OSM 데이터는 유럽에 비하면 아직 빈 곳이 많은 편이에요. 국내에서는 네이버·카카오 지도가 워낙 강하다 보니 OSM 기여자가 상대적으로 적었거든요. 그런데 OSM은 라이선스만 지키면 자유롭게 쓸 수 있는 글로벌 지도 데이터라서, 사이드 프로젝트나 스타트업에서 지도 기능이 필요할 때 큰 도움이 돼요. 출퇴근길에 퀘스트 몇 개만 풀어도 우리 동네 데이터가 좋아지고, 그 혜택은 이 데이터를 쓰는 개발자 모두에게 돌아오죠.
셋째, 오픈소스 기여를 처음 시작하기에도 좋아요. 아직 베타 단계라 버그 리포트 하나, 번역 하나도 소중한 기여가 되거든요.
마무리
한 줄 정리: StreetComplete의 iOS 베타는 '작은 팀도 Kotlin Multiplatform으로 기존 안드로이드 앱을 iOS까지 넓힐 수 있다'는 걸 보여주는 실전 증거예요.
여러분이라면 새 크로스플랫폼 앱을 만들 때 Flutter, React Native, KMP 중 무엇을 고르실 건가요? 어떤 기준으로 고르는지 댓글로 경험을 나눠주세요!
🔗 출처: Hacker News