For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /ko/docs/mobile/tech-stack.md (or send Accept: text/markdown).
Mobile 기술 스택
Expo 앱 내부의 기술과 각각의 역할.
시작하기 전에
Mobile 앱은 작은 네이티브 표면입니다: 아래의 모든 라이브러리는 이미 apps/mobile/package.json에 고정되어 있으므로 이 페이지의 어떤 것도 별도 설치가 필요하지 않습니다. 이 페이지는 각 부분의 역할을 설명하여 이후 가이드가 이해되도록 합니다.
백엔드는 Web 리포지토리에서 자체 스택 — Next.js, Postgres 및 공급자 어댑터 — 을 유지합니다. 앱은 그 어느 것도 내장하지 않고 EXPO_PUBLIC_API_URL을 통해 도달하므로 Mobile 전용 체크아웃이 작게 유지됩니다.
Expo + React Native
Expo는 앱을 실행, 번들링, 빌드하는 도구 체인이고, React Native는 webview가 아닌 실제 네이티브 인터페이스 요소를 렌더링합니다. Expo Router는 파일 기반 내비게이션을 제공합니다: apps/mobile/app/ 아래의 모든 파일이 화면이 되고, 로그인 스택은 app/(app)/ 아래에 그룹화됩니다.
Expo Go는 전화기에서 공유 개발 미리 보기를 열고, development build는 자체 설치 가능한 앱입니다 — 구매 또는 생체 인식 잠금과 같은 네이티브 모듈이 실행되어야 할 때 필요합니다.
TypeScript
모든 앱 코드는 TypeScript이며 패키지에는 엄격한 타입 검사가 포함됩니다. 기기나 실행 중인 백엔드 없이 모든 파일을 검사할 수 있습니다.
Better Auth Expo + 보안 스토리지
로그인은 시스템 브라우저를 통해 Better Auth Expo 클라이언트를 탑니다: 앱이 백엔드의 인증 페이지를 열고, 백엔드가 앱의 딥링크 스킴으로 돌아가며, 세션 토큰은 expo-secure-store — iOS의 Keychain과 Android의 Keystore — 에 보관되며 평문 스토리지나 번들 구성에는 절대 들어가지 않습니다.
같은 모듈이 패스키, expo-local-authentication을 통한 선택적 생체 인식 앱 잠금, 워크스페이스 범위의 오프라인 캐시를 지우는 로그아웃을 다룹니다.
RevenueCat 구매
react-native-purchases는 StoreKit과 Play Billing을 키트의 자격 동기화에 연결합니다: 앱이 스토어 구매를 시작하고, 백엔드가 RevenueCat webhook을 통해 검증하고, 서버가 워크스페이스가 사용할 수 있는 것을 결정합니다.
첫 번째 미리 보기에서는 구매가 꺼져 있습니다(EXPO_PUBLIC_MOBILE_PURCHASES_PROVIDER=off). 실제 구매 및 복원 테스트에는 EAS 개발 빌드가 필요합니다. Expo Go는 네이티브 구매 모듈을 실행할 수 없기 때문입니다.
EAS Build + Submit
eas.json에는 세 개의 프로필이 있습니다: development는 iOS 시뮬레이터용 dev client를 빌드하고, preview는 테스터용 내부 Android APK를 빌드하고, production은 자동 증가된 버전과 Play 내부 트랙 제출 단계로 스토어 바이너리를 빌드합니다.
빌드는 Expo 클라우드에서 실행되므로 바이너리를 생성하는 데 로컬 Xcode나 Android Studio가 필요하지 않습니다 — 자신의 컴퓨터에서 시뮬레이터를 실행할 때만 필요합니다.
검증 도구
결정론적 Vitest 스위트는 세션 스토리지, 딥링크, 채팅 스트리밍 및 취소, 자격, 구매, 오프라인 캐시, 알림 라우팅을 다룹니다 — 기기 없이 컴퓨터에서 실행됩니다. 앱 잠금, 푸시 전달, 스토어 구매와 같은 네이티브 전용 동작은 대신 EAS 개발 빌드에서 검증됩니다.
corepack pnpm --filter @supastack/mobile test
corepack pnpm --filter @supastack/mobile typecheck