한 기기에 개발·운영 앱을 동시에 설치하는 방법: 올리브영 DEV/PROD 환경 분리
올리브영이 Android Product Flavor와 iOS xcconfig로 DEV/PROD 앱을 패키지명·식별자·서버·서드파티 SDK까지 완전 분리해 한 기기에 동시 설치 가능하도록 구현
AI 요약
Context
올리브영 앱은 개발용과 운영용이 동일한 앱 식별자(iOS Bundle Identifier, Android applicationId)를 공유했기 때문에 모바일 OS의 샌드박스 정책상 한 기기에 두 버전을 동시 설치할 수 없었다. 이로 인해 환경 전환 시 기존 앱 삭제 또는 덮어씌워야 하면서 로그인 세션, 로컬 DB, 캐시 데이터가 초기화되어 연속적인 테스트가 불가능했고, 시각적 구분이 없어 비개발 직군의 혼란과 배포 사고 위험(테스트 데이터 운영 DB 반영, 테스트 푸시 고객 발송 등)이 발생했다.
Technical Solution
- Android Build Variant 구조 도입: BuildType(debug/release) × ProductFlavor(production/develop) 조합으로 4가지 앱 버전(developDebug, developRelease, productionDebug, productionRelease) 생성, 협업 동료 배포는 developRelease와 productionRelease 두 가지로 한정
- Android 패키지명 분리: 운영 applicationId를
com.oliveyoung에서 개발 applicationId는com.oliveyoung.dev로 설정해 OS 레벨에서 두 앱을 서로 다른 앱으로 인식하도록 강제 - Android 소스셋 분리: app/src/main(공통) + app/src/develop(개발 환경 전용) + app/src/production(운영 환경 전용)으로 구분해 앱 아이콘, 앱 이름, 매니페스트 분리 관리
- iOS Build Configuration과 Scheme 재구성: 기존 Debug/Release 2가지에서 DEV/PROD 4가지 Build Configuration(OliveYoung-DEV, OliveYoung-PROD 등)으로 확대하고 각각 대응하는 Scheme 생성해 빌드 목적을 코드 단계에서 명확화
- iOS xcconfig 파일로 환경별 설정 분리: Dev.xcconfig, Prod.xcconfig 파일에서 API_BASE_URL, 서드파티 API Key 등을 코드 밖으로 이관
- iOS 시스템 레벨 식별자 분리: Bundle Identifier, App Group/Keychain Group, Associated Domains(Universal Links)를 환경별로 각각 구성해 Extension 데이터 공유 시 환경 혼선 방지
- 서드파티 SDK 환경 분리: AppsFlyer, Firebase, Braze 등 각 SDK의 앱 등록 ID/API Key를 xcconfig(iOS) 또는 ProductFlavor(Android)의 환경 설정 파일로 이관해 데이터 소스 명확화
- CI/CD 워크플로우 분리 및 가드레일 적용: GitHub Actions에서 DEV 워크플로우는 DEV Scheme만, PROD 워크플로우는 PROD Scheme만 허용하도록 설정; DEV 빌드는 Firebase App Distribution으로 내부 배포, PROD 빌드는 TestFlight 및 App Store로 배포
- 환경 혼선 검증 기준 수립: 설치 확인(한 기기 동시 설치), 엔드포인트 확인(네트워크 로그), 서드파티 프로젝트 확인(이벤트 수집 경로), 딥링크 확인(Universal Links/App Links 라우팅) 4가지 항목으로 환경 분리 상태 반복 검증
Key Takeaway
개발/운영 환경 분리는 설정 파일(xcconfig), 빌드 시스템(Product Flavor, Build Configuration), 패키지 식별자를 동시에 분리해야만 구조적으로 환경이 섞이지 않는 상태를 만들 수 있다. CI/CD의 자동화만으로는 충분하지 않으며, 설치·엔드포인트·서드파티 데이터·딥링크 4가지 검증 기준을 통해 반복적으로 환경 분리 상태를 확인하는 운영 규칙이 필수다.
실천 포인트
모바일 네이티브 앱을 개발·운영 환경으로 분리해야 하는 조직에서는 플랫폼별 빌드 시스템(Android Gradle ProductFlavor, iOS Build Configuration)을 먼저 도입하고, 패키지명/Bundle Identifier를 환경별로 다르게 설정한 후, API 엔드포인트·서드파티 SDK 키·식별자(App Group, Associated Domains 등)를 설정 파일(xcconfig, gradle 변수)로 완전 분리하면 한 기기에서 두 앱을 동시 실행하며 환경 전환 없이 테스트할 수 있고 배포 사고를 구조적으로 방지할 수 있다.