“만든 앱을 세상에 내놓을 차례입니다.”
이 글에서는 EAS Build로 앱을 빌드하고 App Store와 Play Store에 배포하는 전 과정을 살펴봅니다.
배포 전 전체 흐름
앱 완성
↓
app.json 설정 (버전, 아이콘, 스플래시)
↓
EAS Build (클라우드 빌드)
↓
내부 테스트 (TestFlight / 내부 테스트)
↓
앱스토어 심사 제출
↓
출시 🎉
EAS란?
EAS(Expo Application Services)는 Expo가 제공하는 클라우드 빌드/배포 서비스입니다.
| 서비스 | 역할 |
|---|---|
| EAS Build | 클라우드에서 iOS / Android 앱 빌드 |
| EAS Submit | 앱스토어 자동 제출 |
| EAS Update | OTA 업데이트 (앱스토어 심사 없이 배포) |
Mac 없이도 iOS 앱을 빌드할 수 있다는 것이 가장 큰 장점입니다.
1단계 — 사전 준비
Expo 계정 생성 & 로그인
# EAS CLI 설치
npm install -g eas-cli
# Expo 계정 로그인
eas login
개발자 계정 준비
| 플랫폼 | 계정 | 비용 |
|---|---|---|
| iOS (App Store) | Apple Developer Program | 연 $99 (약 13만원) |
| Android (Play Store) | Google Play Console | 1회 $25 (약 3만원) |
2단계 — app.json 최종 설정
빌드 전 앱의 기본 정보를 꼼꼼히 설정합니다.
{
"expo": {
"name": "나의 앱",
"slug": "my-app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"userInterfaceStyle": "automatic",
"splash": {
"image": "./assets/images/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"ios": {
"bundleIdentifier": "com.yourname.myapp",
"buildNumber": "1",
"supportsTablet": false,
"infoPlist": {
"NSCameraUsageDescription": "프로필 사진 촬영에 사용됩니다.",
"NSPhotoLibraryUsageDescription": "사진 선택에 사용됩니다.",
"NSLocationWhenInUseUsageDescription": "주변 검색에 사용됩니다."
}
},
"android": {
"package": "com.yourname.myapp",
"versionCode": 1,
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"permissions": [
"CAMERA",
"READ_EXTERNAL_STORAGE",
"ACCESS_FINE_LOCATION"
]
},
"extra": {
"eas": {
"projectId": "your-eas-project-id"
}
}
}
}
아이콘 & 스플래시 이미지 규격
| 항목 | 크기 | 형식 |
|---|---|---|
| 앱 아이콘 | 1024 × 1024px | PNG (투명 배경 없음) |
| Android 어댑티브 아이콘 | 1024 × 1024px | PNG |
| 스플래시 이미지 | 1284 × 2778px | PNG |
3단계 — EAS 프로젝트 초기화
eas init
eas.json 파일이 생성됩니다.
// eas.json
{
"cli": {
"version": ">= 5.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}
빌드 프로필 설명
| 프로필 | 용도 |
|---|---|
development | 개발용 빌드 (개발 서버 연결) |
preview | 내부 테스트용 빌드 |
production | 앱스토어 제출용 빌드 |
4단계 — 빌드
Android 빌드 (APK / AAB)
# 내부 테스트용 APK (설치 파일)
eas build --platform android --profile preview
# 앱스토어 제출용 AAB
eas build --platform android --profile production
iOS 빌드
# 내부 테스트용 (TestFlight)
eas build --platform ios --profile preview
# 앱스토어 제출용
eas build --platform ios --profile production
동시 빌드
# iOS + Android 동시 빌드
eas build --platform all --profile production
빌드는 EAS 클라우드 서버에서 진행됩니다.
완료까지 보통 10~20분 소요되며, 완료 시 이메일로 알림이 옵니다.
5단계 — 내부 테스트
Android — 내부 테스트 트랙
- Google Play Console 접속
- 내부 테스트 → 새 버전 만들기
- 빌드된
.aab파일 업로드 - 테스터 이메일 추가
- 테스터는 링크로 앱 설치
iOS — TestFlight
# EAS로 TestFlight에 자동 업로드
eas submit --platform ios --profile production
또는 Apple Developer 콘솔에서 직접 업로드 후,
TestFlight에서 테스터 초대합니다.
6단계 — 앱스토어 제출
EAS Submit으로 자동 제출
# Android Play Store 제출
eas submit --platform android --profile production
# iOS App Store 제출
eas submit --platform ios --profile production
수동 제출 시 필요한 정보
공통
- 앱 이름, 설명 (국문/영문)
- 스크린샷 (각 기기 사이즈별)
- 앱 아이콘
- 카테고리, 연령 등급
- 개인정보 처리방침 URL
App Store 추가 항목
- 앱 미리보기 영상 (선택)
- 키워드 (100자 이내)
- 심사 메모 (특별한 기능 설명)
Play Store 추가 항목
- 짧은 설명 (80자 이내)
- 긴 설명 (4000자 이내)
- 그래픽 이미지 (Feature Graphic)
7단계 — OTA 업데이트 (EAS Update)
앱스토어 심사 없이 JavaScript 코드만 즉시 업데이트할 수 있습니다.
버그 수정, UI 변경 등 빠른 배포가 필요할 때 유용합니다.
# EAS Update 설정
eas update:configure
// app.json에 추가
{
"expo": {
"updates": {
"url": "https://u.expo.dev/your-project-id"
},
"runtimeVersion": {
"policy": "appVersion"
}
}
}
# 업데이트 배포
eas update --branch production --message "버그 수정"
앱을 다시 시작하면 자동으로 최신 코드가 적용됩니다.
OTA 업데이트 가능한 것 vs 불가능한 것
| 가능 ✅ | 불가능 ❌ |
|---|---|
| JS/TS 코드 변경 | 네이티브 모듈 추가 |
| UI 수정 | app.json 설정 변경 |
| 버그 수정 | 새 권한 추가 |
| 텍스트, 이미지 변경 | SDK 버전 업그레이드 |
버전 관리
앱 버전은 두 가지 숫자로 관리합니다.
// app.json
{
"expo": {
"version": "1.2.0", // 사용자에게 보이는 버전
"ios": {
"buildNumber": "5" // 앱스토어 내부 빌드 번호 (제출할 때마다 증가)
},
"android": {
"versionCode": 5 // Play Store 내부 버전 코드 (제출할 때마다 증가)
}
}
}
eas.json에서 "autoIncrement": true 설정 시 빌드 번호가 자동으로 증가합니다.
심사 기간 참고
| 플랫폼 | 첫 심사 | 업데이트 심사 |
|---|---|---|
| App Store (iOS) | 1~3일 | 1~2일 |
| Play Store (Android) | 3~7일 | 수 시간~1일 |
첫 심사는 시간이 더 걸릴 수 있으니 여유 있게 일정을 잡으세요.
자주 발생하는 심사 거절 사유
App Store
- 기능이 너무 단순하거나 웹사이트 수준인 경우
- 개인정보 처리방침이 없는 경우
- 스크린샷이 실제 앱과 다른 경우
- 미완성된 기능이 있는 경우
Play Store
- 타겟 API 레벨이 최신 기준 미충족
- 개인정보 처리방침 미등록
- 광고 정책 위반
전체 배포 흐름 정리
1. app.json 설정 (버전, 아이콘, 권한)
↓
2. eas build --platform all --profile production
↓
3. 내부 테스트 (TestFlight / Play 내부 테스트)
↓
4. eas submit --platform all --profile production
↓
5. 앱스토어 심사 (1~7일)
↓
6. 출시 🎉
↓
7. 버그 수정은 eas update (OTA)
기능 추가는 eas build → eas submit
정리
| 명령어 | 역할 |
|---|---|
eas build --platform android | Android 빌드 |
eas build --platform ios | iOS 빌드 |
eas build --platform all | 동시 빌드 |
eas submit --platform android | Play Store 제출 |
eas submit --platform ios | App Store 제출 |
eas update | OTA 업데이트 배포 |
시리즈를 마치며
7편에 걸쳐 Expo의 개발 환경 세팅부터 앱스토어 배포까지 전 과정을 살펴보았습니다.
1편 환경 세팅 & 첫 앱 실행
2편 핵심 컴포넌트 & 스타일링
3편 Expo Router로 화면 이동
4편 상태 관리 & API 연동
5편 카메라, 위치, 푸시 알림
6편 Firebase 로그인 & 데이터베이스
7편 빌드 & 앱스토어 배포
가장 중요한 것은 일단 만들어보는 것입니다.
작은 앱 하나를 처음부터 끝까지 완성해보는 경험이 어떤 강의보다 값진 공부가 됩니다. 🚀
시리즈 목차
- 1편 Expo 개발 환경 세팅 & 첫 앱 실행
- 2편 화면 구성 & 핵심 컴포넌트
- 3편 화면 이동 구현 (Expo Router)
- 4편 상태 관리 & API 연동
- 5편 디바이스 기능 활용 (카메라, 위치, 알림)
- 6편 Firebase 연동
- 7편 빌드 & 앱스토어 배포 ← 현재 글