App Bundle ID — 는 Apple 및 Google 생태계에서 소프트웨어 제품의 등록, 서명 및 배포에 사용되는 고유한 애플리케이션 식별자입니다. 각 앱은 프로젝트 생성 시 Bundle ID를 얻으며, 이 식별자는 전체 수명 주기 동안 변경되지 않습니다. Apple Developer Documentation에 따르면 Bundle ID는 서비스, 인증서 및 프로비저닝 프로필을 바인딩하는 데 사용됩니다.
핵심 사항
Bundle Identifier는 운영 체제와 앱 스토어에서 애플리케이션을 고유하게 식별하는 문자열입니다. iOS 및 macOS에서는 Bundle ID, Android에서는 Package Name이라고 하며, 기능적으로는 둘 다 동일한 역할을 수행합니다: 기기와 스토어에서 앱의 고유성을 보장합니다.
운영 체제는 기기에서 앱을 구분하기 위해 Bundle ID를 사용합니다. 동일한 식별자를 가진 두 앱은 동시에 설치할 수 없습니다 — 시스템은 이를 동일한 제품으로 간주합니다. 앱 스토어도 게시 시 Bundle ID의 고유성을 확인합니다.
Apple은 2008년 iOS SDK 출시와 함께 Bundle ID를 도입했습니다. 역방향 도메인 표기법 형식은 Java(패키지 명명 규칙)에서 차용되었으며, 클래스 이름 충돌을 방지하는 데 사용됩니다. Google은 Android에서 이 방식을 채택하여 두 모바일 생태계에서 일관성을 보장했습니다.
| 플랫폼 | 필드 이름 | 예시 |
|---|---|---|
| iOS/macOS | Bundle Identifier | com.example.myapp |
| Android | Package Name | com.example.myapp |
| watchOS | Bundle Identifier | com.example.myapp.watchkit |
| tvOS | Bundle Identifier | com.example.myapp.tvos |
Bundle ID는 점으로 구분된 여러 세그먼트로 구성됩니다. 첫 번째 부분은 개발자 또는 회사 식별자(com, org, net)입니다. 두 번째는 회사 도메인(example, google, apple)입니다. 이후 세그먼트는 앱 이름과 플랫폼을 지정합니다.
일반적인 Bundle ID는 com.company.appname과 같습니다. Apple은 전역 고유성을 보장하기 위해 역방향 도메인 표기법 사용을 권장합니다. 회사에 도메인이 없는 경우 이메일 사용이 허용됩니다: com.example.myapp 또는 org.example.myapp.
Apple은 Wildcard Bundle ID — 별표가 있는 식별자 템플릿을 지원합니다: com.example.*. 이 템플릿을 사용하면 동일한 회사의 여러 앱에서 하나의 App ID를 사용할 수 있습니다. Wildcard ID는 개발 중에 편리하지만 일부 Apple 서비스 사용을 제한하므로 프로덕션에는 권장되지 않습니다.
와일드카드 제한 사항: 푸시 알림, CloudKit, 인앱 구매 및 Game Center에는 명시적(explicit) Bundle ID가 필요합니다. com.example.* 템플릿을 사용하는 경우 이러한 서비스를 사용할 수 없습니다. 프로덕션 앱의 경우 모든 Apple 서비스의 완전한 기능을 보장하기 위해 항상 explicit Bundle ID를 사용하세요.
와일드카드 외에도 Apple은 Apple Developer Program에 등록할 때 개발 팀에 할당되는 접두사 식별자를 지원합니다. 접두사(Team ID)는 모든 App ID 및 프로비저닝 프로필에 자동으로 추가됩니다. 서로 다른 두 Team ID가 동일한 Bundle ID를 만들 수 있지만, 기기에서는 다른 앱으로 간주됩니다.
Bundle ID 등록은 앱을 게시하기 전 필수 단계입니다. Apple 생태계에서는 Apple Developer Portal의 Certificates, Identifiers & Profiles 섹션을 통해 등록합니다. Google Play에서는 개발자 콘솔에서 앱을 만들 때 Bundle ID를 지정합니다.
Apple Developer 포털에서 Identifiers 섹션을 선택하고 Register 버튼을 클릭한 다음 App ID 유형을 지정합니다. 정확한 Bundle ID 이름을 입력하고 필요한 기능(Push Notifications, CloudKit, Sign in with Apple)을 선택합니다. 등록 후 식별자는 프로비저닝 프로필을 만드는 데 사용할 수 있습니다.
// 앱 코드에서 Bundle ID 확인
let bundleID = Bundle.main.bundleIdentifier
print("Current Bundle ID: \(bundleID ?? "unknown")")
// 빌드 조건에 대한 Bundle ID 확인
if bundleID == "com.example.app.production" {
// 프로덕션 구성
Analytics.shared.configure(.production)
}
Google Play Console은 사전 Bundle ID 등록이 필요하지 않습니다. 식별자는 앱 모듈의 build.gradle 파일에 지정되며 전체 Google Play에서 고유해야 합니다. 앱 생성 후 Package Name을 변경하는 것은 불가능하므로 식별자를 신중하게 선택하고 Google Play 검색을 통해 고유성을 확인하세요. Google은 삭제된 앱의 식별자를 해제하지 않으므로 한 번 사용된 Bundle ID는 다른 개발자가 사용할 수 없습니다.
App Store Connect에 등록할 때는 기존에 등록된 식별자 세트에서 Bundle ID를 지정해야 합니다. 식별자가 아직 Apple Developer 포털에 등록되지 않은 경우 시스템에서 자동으로 생성하도록 제안합니다. 등록 후 Bundle ID는 팀에 바인딩되며 Apple 지원에 문의하지 않고는 다른 개발자 계정으로 이전할 수 없습니다. 각 Bundle ID는 Development, Ad Hoc, App Store 등 다양한 환경에 대해 여러 프로비저닝 프로필을 가질 수 있습니다.
확장 기능이 있는 iOS 앱의 Bundle ID를 등록할 때는 각 구성 요소를 개별적으로 등록해야 합니다. 위젯 확장, 키보드, Notification Service 및 Watch App에는 기본 식별자에서 파생된 자체 식별자가 있습니다. App Store Connect는 App Record를 만들 때 이를 그룹화하여 모든 구성 요소를 단일 앱으로 게시할 수 있도록 합니다.
Xcode에서 Bundle ID 설정은 Info.plist, Build Settings 및 Signing & Capabilities의 여러 위치에서 수행됩니다. 핵심 필드는 앱 대상의 Bundle Identifier입니다. 푸시 알림부터 CloudKit까지 모든 Apple 서비스가 이 식별자에 바인딩됩니다. Bundle ID를 잘못 지정하면 서명 오류가 발생하고 App Store에 게시할 수 없게 됩니다.
<!-- Info.plist — 프로젝트의 기본 Bundle ID -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Build Settings — PRODUCT_BUNDLE_IDENTIFIER 변수 -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->
Xcode는 Build Settings에서 PRODUCT_BUNDLE_IDENTIFIER 변수를 사용합니다. 빌드 구성마다 다른 값을 설정할 수 있습니다: Debug의 경우 com.example.app.dev, Release의 경우 com.example.app. 이렇게 하면 테스트를 위해 동일한 기기에 프로덕션 버전과 함께 개발 버전을 설치하는 것이 편리합니다.
앱에 확장 기능(Notification Service, Widget, Watch App)이 있는 경우 각 확장 기능은 접미사가 있는 자체 Bundle ID를 받습니다. 기본 앱: com.example.app. 위젯 확장: com.example.app.widget. Watch App: com.example.app.watchkit. 각 식별자는 Apple Developer Portal에 개별적으로 등록되고 자체 프로비저닝 프로필을 받습니다. Xcode는 빌드 중에 이러한 종속성을 자동으로 관리합니다.
App Bundle ID(Apple)와 Package Name(Google)은 동일한 목적을 가진 유사한 개체이지만 iOS 및 Android 생태계에서 사용 규칙이 다릅니다. 두 식별자 모두 역방향 도메인 표기법을 사용하며 공식 앱 스토어에 게시한 후에는 변경할 수 없습니다.
Apple 생태계에서 Bundle ID는 프로비저닝 프로필 및 인증서에 바인딩됩니다. 개발 팀을 변경할 때 Bundle ID는 App Store Connect를 통해 계정 간에 이전할 수 있습니다. Android에서 Package Name은 Google Play의 앱에 엄격하게 바인딩되며 개발자 계정 간에 이전할 수 없습니다.
| 특성 | iOS Bundle ID | Android Package Name |
|---|---|---|
| 최대 길이 | 무제한 | 150자 |
| 세그먼트 구분자 | 점 (.) | 점 (.) |
| 허용 문자 | A-Z, a-z, 0-9, 점, 하이픈 | A-Z, a-z, 0-9, 점, 밑줄 |
| 와일드카드 | 지원 (*) | 지원 안 함 |
| 코드에서 사용 | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
차이점에도 불구하고 두 식별자는 중요한 역할을 합니다: 식별자 없이는 공식 스토어에 앱을 게시할 수 없습니다. 크로스 플랫폼 프로젝트에 대한 권장 사항 — Firebase, Analytics 및 기타 서비스와의 통합을 단순화하기 위해 iOS 및 Android 버전에서 동일한 식별자를 사용하세요. 이는 또한 개발 팀의 탐색을 단순화합니다: 두 프로젝트 모두에 대해 하나의 식별자를 사용하면 CI/CD 설정 및 환경 구성 시 혼동을 줄일 수 있습니다.
Flutter 또는 React Native로 개발할 때는 코드베이스가 공유되고 많은 자동 빌드 도구가 두 플랫폼에서 동일한 패키지 이름을 예상하므로 단일 식별자가 특히 중요합니다. Firebase 프로젝트도 iOS 및 Android에 대해 단일 식별자에 바인딩되어 분석 및 충돌 보고 설정을 단순화합니다.
자주 묻는 질문
Bundle ID 변경은 App Store 또는 Google Play에 게시한 후에는 불가능합니다. 시스템은 새 식별자를 완전히 다른 앱으로 간주합니다. 기존 제품을 업데이트하려면 Bundle ID가 앱 수명 주기 전체에 걸쳐 변경되지 않은 상태로 유지되어야 합니다.
iOS 또는 Android 기기는 첫 번째 앱 위에 동일한 식별자를 가진 두 번째 앱을 설치할 수 없습니다. 시스템은 오류를 표시하고 기존 앱을 삭제하도록 제안합니다. 스토어에서도 중복된 Bundle ID로 게시하는 것이 차단됩니다.
회사의 역방향 도메인 표기법을 사용하세요: com.companyname.appname. 하이픈과 특수 문자는 피하세요. 앱에 확장 기능이 있는 경우 점으로 구분된 접미사를 추가하세요. 식별자가 고유하고 다른 개발자가 사용하지 않는지 확인하세요.
네, 각 확장 기능 — 위젯, Watch App, Notification Service — 에는 자체 Bundle ID가 필요합니다. 식별자는 계층 구조를 형성합니다: com.example.app이 기본, com.example.app.widget이 위젯용, com.example.app.watchkit이 Watch용입니다. 모두 Apple Developer Portal에 개별적으로 등록되며 상위 앱과 공통 App ID를 공유합니다.
Bundle ID는 앱 코드의 식별자 문자열입니다. App ID는 Apple Developer Portal의 개체로, Bundle ID와 활성화된 서비스(capabilities) 세트를 결합합니다. App ID는 Bundle ID를 기반으로 생성되며 프로비저닝 프로필을 생성하는 데 사용됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.