# {프로젝트명} — 빌드 및 배포

> **버전**: v1
> **작성일**: {날짜}
> **담당**: 개발팀장
> **적용 범위**: {프로젝트명} 빌드·배포 전 과정

---

## 1. 플랫폼별 빌드 설정

### 1.1 Android

| 항목 | 값 |
|------|-----|
| **Scripting Backend** | IL2CPP |
| **Target Architecture** | ARM64 (필수), ARMv7 (선택 — 구형 기기 지원 시) |
| **Minimum API Level** | Android 7.0 (API 24) 이상 권장 |
| **Target API Level** | 최신 API (Play Store 정책 준수) |
| **Internet Access** | Require |
| **Custom Main Gradle Template** | 서드파티 요구 시 활성화 |
| **Split APK / AAB** | 배포: AAB (Play Store), QA: APK |

**빌드 전 체크**:
- [ ] KeyStore 파일 경로·비밀번호 확인 (릴리스 빌드)
- [ ] `AndroidManifest.xml` 권한 최소화 검토
- [ ] ANR·크래시 없음 (에뮬레이터 + 실기기 모두)

### 1.2 iOS

| 항목 | 값 |
|------|-----|
| **Scripting Backend** | IL2CPP |
| **Target SDK** | Device SDK (배포), Simulator SDK (에뮬레이터 테스트) |
| **Minimum iOS Version** | 14.0 이상 권장 |
| **Signing** | Xcode Automatic Signing (Provisioning Profile) |

**빌드 전 체크**:
- [ ] Apple 개발자 인증서·Provisioning Profile 유효기간 확인
- [ ] `Info.plist` 권한 설명(NSPhotoLibraryUsageDescription 등) 입력
- [ ] TestFlight 업로드 전 크래시 없음 확인

### 1.3 Windows (Editor/Standalone)

| 항목 | 값 |
|------|-----|
| **용도** | 개발 에디터 + Windows Standalone QA |
| **Architecture** | x86_64 |
| **Scripting Backend** | Mono (Editor), IL2CPP (Standalone 배포 시) |

---

## 2. 빌드 변형(Build Variant)

| 변형 | 로그 레벨 | 치트 | 용도 | 컴파일 심볼 |
|------|----------|------|------|------------|
| **Dev** | 전체 (Info+Warn+Error) | 활성 | 개발 중 디버깅 | `DEVELOPMENT_BUILD`, `ENABLE_CHEATS` |
| **QA** | 일부 (Warn+Error) | 활성 | QA 배포, 버그 재현 | `QA_BUILD`, `ENABLE_CHEATS` |
| **Release** | 최소 (Error만) | 비활성 | 스토어 제출 | (없음, 기본) |

**컴파일 심볼 활용 예시**:
```csharp
#if ENABLE_CHEATS
// 치트 메뉴, 수동 데이터 조작 코드
#endif

#if DEVELOPMENT_BUILD || UNITY_EDITOR
// 개발/에디터 전용 검증 코드
DataValidator.ValidateAll();
#endif
```

**컴파일 심볼 관리**:
- Player Settings > Other Settings > Scripting Define Symbols에서 설정
- NerdNavis.Framework의 `NerdNavis.Editor.Symbols` 도구를 활용하여 변형별 심볼 일괄 전환

---

## 3. 버전 관리

**버전 체계**: `Major.Minor.Patch` (Semantic Versioning)

| 구성 | 변경 기준 |
|------|----------|
| **Major** | 하위 호환 불가한 대규모 변경, 새 게임 모드 추가 등 |
| **Minor** | 새 기능 추가, 컨텐츠 업데이트 |
| **Patch** | 버그 수정, 밸런스 조정 |

**빌드 넘버**: 각 빌드마다 자동 증가 (CI/CD 또는 Editor 스크립트로 자동화)

```csharp
// NerdNavis.Editor.Build 도구 연동 또는 직접 구현
// PlayerSettings.bundleVersion = "1.2.3"
// PlayerSettings.Android.bundleVersionCode = 123  (Major*10000 + Minor*100 + Patch 권장)
```

**스토어 정책**:
- Android: `bundleVersionCode` 는 항상 단조 증가 (롤백 불가)
- iOS: `Build Number` 항상 단조 증가

---

## 4. 배포 파이프라인

```
[개발팀] 빌드 생성
    │
    ▼
코드 서명 (KeyStore / Apple Certificate)
    │
    ▼
업로드
├── Dev/QA → Firebase App Distribution / TestFlight / 사내 공유
└── Release → Google Play Console / App Store Connect
    │
    ▼
배포 완료 → 공유/일일보고 or PD 지시 로그 기록 (C13·P19)
```

**자동화 목표**:
- 빌드 트리거: Git 태그 push 또는 수동 트리거
- 업로드 자동화: `{선택 예: fastlane / GitHub Actions / Jenkins}`
- 배포 알림: 팀 내 채널 공유

---

## 5. 스토어 제출 체크리스트

### 5.1 공통 (Android / iOS 공통)

- [ ] **Release 빌드 변형** 으로 빌드 (ENABLE_CHEATS 없음 확인)
- [ ] **빌드 번호** 이전 버전보다 증가했는지 확인
- [ ] **콘솔 에러 없음** (P14: Unity 콘솔 에러 잔존 상태 배포 금지)
- [ ] **크래시 없음** (실기기 최소 1대 이상 검증)
- [ ] **IAP 영수증 서버 검증** 정상 동작 확인 (수상한잡화점 Critical 교훈)
- [ ] **AES 키 하드코딩 없음** 확인 (소스 검색: `02_기술스택_결정 섹션 3.2 참조`)
- [ ] **개발용 씬(`9x_Tool_*`) Build Settings에서 제외** 확인
- [ ] **권한 요청** 최소화 및 사유 명시 (`Info.plist` / `AndroidManifest.xml`)
- [ ] **개인정보처리방침 URL** 스토어 등록 완료

### 5.2 Android 추가

- [ ] **AAB 포맷** 제출 (APK 아님)
- [ ] **Target API Level** Play Store 현행 정책 충족
- [ ] **64-bit 지원** (ARM64 포함 빌드)

### 5.3 iOS 추가

- [ ] **TestFlight** 에서 베타 검증 완료
- [ ] **Provisioning Profile** 유효기간 충분히 남음
- [ ] **앱 심사 노트** 작성 (특수 기능 있는 경우)

---

## 변경 이력

| 버전 | 일자 | 작성자 | 내용 |
|------|------|--------|------|
| v1 | {날짜} | 개발팀장 | 템플릿 초안. 수상한잡화점 Critical 3건 체크리스트 반영 |
