본문 바로가기

소프트웨어공학/아키텍처

shopify의 RN에서 네이티브로의 전환을 보고 나서 정리한 현대적 대안들

현대 모바일 크로스플랫폼 대안 아키텍처 보고서

"비즈니스 로직은 공유하고, UI는 순수 네이티브로 렌더링한다."
React Native / Flutter의 런타임 한계와 100% 네이티브 중복 개발 비용 사이에서 탄생한 현대적 모바일 아키텍처 분석


📌 1. 배경: 왜 현대적 대안이 필요한가?

모바일 앱 개발은 지난 10여 년간 두 극단 사이에서 끊임없는 트레이드오프를 겪어왔습니다.

[전통적 네이티브 개발]                                [전체 크로스플랫폼 (RN/Flutter)]
• 100% 네이티브 UI & 성능                              • 단일 언어 / 단일 코드베이스
• iOS(Swift) / Android(Kotlin) 2벌 작성 필요           • 런타임 오버헤드, JS 브릿지 병목
• 높은 인건비와 기능 동기화(Parity) 버그 발생           • 비네이티브 감성(Jank), OS 신기능 대응 지연
                          ↘                    ↙
                     [현대적 대안: 분리형 아키텍처]
                  • 비즈니스 로직(Core): 단일 언어로 공유
                  • 사용자 인터페이스(UI): 100% 순수 네이티브

최근 Shopify의 React Native 포기 선언과 함께 주목받고 있는 방식은 "비즈니스 로직(네트워크, 캐시, DB, 암호화, 상태 관리)은 하나의 언어로 공유하고, 화면(UI)은 각 OS의 최신 순수 네이티브 프레임워크(SwiftUI, Jetpack Compose)로 작성하는 분리형 아키텍처"입니다.


🚀 2. 핵심 대안 1: KMP (Kotlin Multiplatform)

JetBrains가 개발한 기술로, 모바일 앱 비즈니스 로직을 Kotlin 언어로 단일화하는 방식입니다.

1) 구조 및 동작 원리

┌────────────────────────────────────────────────────────┐
│                   Native UI Layer                      │
│   iOS: SwiftUI (Swift)   │   Android: Jetpack Compose  │
└──────────────┬─────────────────────────┬───────────────┘
               │ (Obj-C/Swift 바이너리)   │ (네이티브 바이트코드)
┌──────────────┴─────────────────────────┴───────────────┐
│                 KMP Shared Business Logic               │
│          (Ktor 통신, SQLDelight DB, 데이터 모델)          │
└────────────────────────────────────────────────────────┘
  • Android: Kotlin 코드가 별도 변환 없이 100% 네이티브 JVM/Android 바이트코드로 직접 컴파일되어 실행됩니다.
  • iOS: Kotlin/Native LLVM 컴파일러가 코드를 Objective-C / Swift 호환 네이티브 프레임워크(바이너리)로 빌드하여 iOS 프로젝트에 정적으로 연결합니다.

2) 특징 및 장단점

  • 장점:
    • 안드로이드 개발자에게 추가 학습 비용이 거의 없음.
    • 기존 네이티브 앱에 점진적(Brownfield)으로 도입 가능.
    • AI 코딩 시대에 로직을 두 번 짜지 않아도 되는 "토큰 최적화" 효과.
  • 단점:
    • iOS 측에서의 메모리 관리 디버깅 및 Swift-Kotlin 인터페이스 매핑이 간혹 까다로움.
    • iOS 개발자 입장에서 Kotlin 빌드 툴체인(Gradle)을 다뤄야 하는 심리적 장벽.
  • 대표 채택 기업:
    • Netflix: 스튜디오 앱의 데이터 동기화 및 캐시 엔진 공유
    • Block (Cash App): 핵심 금융 결제 및 상태 로직 공유
    • Philips, 9GAG, McDonald's

🦀 3. 핵심 대안 2: Rust Core + UniFFI + 네이티브 UI

앱의 가장 무겁고 복잡한 핵심 엔진을 Rust로 작성하고, Mozilla의 UniFFI 도구를 통해 네이티브 언어(Swift, Kotlin)에 매끄럽게 바인딩하는 고성능 아키텍처입니다.

1) 구조 및 동작 원리

┌────────────────────────────────────────────────────────┐
│                   Native UI Layer                      │
│         iOS (SwiftUI)    │     Android (Jetpack Compose)│
└──────────────┬─────────────────────────┬───────────────┘
               ▼                         ▼
┌────────────────────────────────────────────────────────┐
│           UniFFI (자동 생성된 바인딩 레이어)              │
│       Swift FFI 바인딩    │    Kotlin JNI 바인딩       │
└──────────────┬─────────────────────────┬───────────────┘
               ▼                         ▼
┌────────────────────────────────────────────────────────┐
│                 Rust Core Engine                        │
│    (오프라인 DB 동기화, E2EE 암호화, 고속 계산/캐싱)     │
└────────────────────────────────────────────────────────┘
  • Rust Core: 메모리 안전성(Memory Safety)과 C/C++ 수준의 성능을 갖춘 단일 Rust 라이브러리로 핵심 로직 작성.
  • UniFFI (Universal Foreign Function Interface):
    • Mozilla가 Firefox용으로 개발해 오픈소스화한 도구.
    • Rust 코드에 UDL(인터페이스 정의 언어)이나 매크로(uniffi::setup_scaffolding!)를 선언하면, Swift와 Kotlin(JNI)에서 즉시 import해서 쓸 수 있는 바인딩 코드를 전자동으로 생성.
    • 개발자가 위험하고 복잡한 C FFI 코드를 한 줄도 직접 짤 필요가 없음.
  • 네이티브 UI: 120Hz ProMotion 스크롤, 제스처, 접근성(Accessibility)을 100% 보장하는 네이티브 UI 작성.

2) 1Password의 실제 구현 사례

1Password는 모바일 앱(v8)을 전면 개편하면서 이 아키텍처를 도입했습니다.

  • 동작 방식: 마스터 비밀번호 암호화, E2EE 복호화, 로컬 볼트(Vault) SQLite 동기화 전체를 Rust Core로 단일화하고, UniFFI를 통해 iOS(SwiftUI)와 Android(Compose)에 연결.
  • Typeshare 도구 오픈소스화:
    • Rust의 데이터 구조체(struct)와 열거형(enum)을 Swift 구조체 및 Kotlin 데이터 클래스로 자동 변환/동기화해 주는 도구인 Typeshare를 자체 개발하여 공개.

3) 특징 및 장단점

  • 장점:
    • 극한의 성능 및 보안: 시스템 레벨 언어(Rust)의 무결성과 메모리 안전성.
    • 플랫폼 확장성: 동일한 Rust 코어를 모바일뿐만 아니라 데스크톱(macOS, Windows, Linux), CLI, 웹(WebAssembly), 백엔드 서버까지 100% 동일하게 공유 가능.
  • 단점:
    • Rust 언어 자체의 가파른 학습 곡선(소유권, 라이프타임 개념).
    • 모바일 빌드 파이프라인(크로스 컴파일) 구축의 초기 난이도.
  • 대표 채택 사례:
    • 1Password: 볼트 암호화 및 동기화 엔진
    • Mozilla Firefox: 탭 동기화, 계정 관리, 핵심 브라우저 로직
    • Signal: 종단간 암호화(E2EE) 프로토콜 코어

🔬 4. 기타 주목할 만한 시도들

1) Shopify의 'Helix' 아키텍처

Shopify는 이번 네이티브 회귀 블로그에서 Helix라는 자체 프레임워크를 공개했습니다.

  • 핵심 철학: UI와 비즈니스 로직/상태(State)를 완전히 분리.
  • AI 에이전트 친화적 설계: UI가 없는 헤드리스(Headless) 환경에서 CLI를 통해 AI 코딩 에이전트가 상태를 직접 주입하고, 시나리오를 시뮬레이션하며, 단위 테스트를 실행할 수 있는 구조를 구축했습니다.

2) Rust + WebAssembly (Wasm)

비즈니스 로직을 Rust로 컴파일하여 Wasm 런타임 형태로 모바일 환경에 임베딩하는 방식도 보안 샌드박스가 필요한 영역에서 연구되고 있습니다.


📊 5. 아키텍처 종합 비교 매트릭스

평가 항목 Full Native (Swift + Kotlin) React Native / Flutter KMP + Native UI Rust Core + UniFFI
비즈니스 로직 공유 ❌ 불가 (2벌 작성) ✅ 완전 공유 ✅ 완전 공유 (Kotlin) ✅ 완전 공유 (Rust)
UI 렌더링 품질 ⭐⭐⭐⭐⭐ (완벽) ⭐⭐⭐ (간헐적 쟁크) ⭐⭐⭐⭐⭐ (완벽) ⭐⭐⭐⭐⭐ (완벽)
런타임 성능 ⭐⭐⭐⭐⭐ (최상) ⭐⭐⭐ (JS/엔진 오버헤드) ⭐⭐⭐⭐ (우수) ⭐⭐⭐⭐⭐ (최상)
개발 학습 곡선 보통 낮음 (웹 개발자 접근 용이) 보통 (안드로이드 친화) 높음 (Rust 필요)
플랫폼 확장성 모바일 전용 모바일/웹/데스크톱 모바일/데스크톱/서버 모바일/웹/서버/임베디드 전천후
추천 프로젝트 플랫폼 종속적 UX가 최우선인 앱 빠른 프로토타이핑, 단순 CRUD 앱 일반 엔터프라이즈, 핀테크, 커머스 암호화, 보안, 메신저, 멀티미디어, 고성능 앱

🏁 6. 결론 및 실무 제언

  1. "One Size Fits All(만능 도구)"은 없다:
    • UI까지 단일 코드로 해결하려는 시도(React Native, Flutter)는 일정 규모 이상의 복잡도를 가진 앱에서는 반드시 성능 및 플랫폼 유지보수의 벽에 부딪힙니다.
  2. 모바일 팀의 최적 선택지:
    • 일반적인 비즈니스 서비스(이커머스, 배달, O2O 등): 팀 내 안드로이드/백엔드 역량을 살릴 수 있는 KMP + Native UI가 가장 생산적입니다.
    • 보안, 암호화, 로컬 DB 연산, 멀티미디어 처리가 핵심인 서비스: 1Password와 Firefox처럼 Rust Core + UniFFI + Native UI 조합이 가장 신뢰할 수 있는 장기적 아키텍처입니다.
  3. AI 시대의 흐름:
    • AI 에이전트 덕분에 코드 생성 비용이 낮아진 것은 사실이지만, "아키텍처의 단순성과 플랫폼 본연의 UX 품질"을 유지하는 것은 여전히 엔지니어링의 핵심 과제입니다.

7 .참고

https://news.ycombinator.com/item?id=49643982
https://shopify.engineering/back-to-native