Flutter 릴리스 관리

Flutter 앱의 성공적인 개발 및 출시를 위해서는 효과적인 릴리스 관리가 필수적입니다. 릴리스 관리는 앱의 버전 관리, 출시 일정, 테스트, 배포 등을 포함하는 종합적인 프로세스입니다. 아래에서 Flutter 앱의 릴리스 관리에 관한 주요 측면을 설명하겠습니다.

버전 관리

Flutter 앱의 버전은 pubspec.yaml 파일에서 관리됩니다.

version: 1.0.0+1

여기서:

  • 1.0.0은 사용자에게 표시되는 버전 번호(버전 이름)
  • +1은 내부적으로 사용되는 빌드 번호(버전 코드)

시맨틱 버저닝(Semantic Versioning)

Flutter 앱 버전 관리에 시맨틱 버저닝을 사용하는 것이 좋습니다:

  • 메이저(Major) 버전 (첫 번째 숫자): 호환되지 않는 API 변경
  • 마이너(Minor) 버전 (두 번째 숫자): 이전 버전과 호환되는 기능 추가
  • 패치(Patch) 버전 (세 번째 숫자): 버그 수정

예를 들어, 버전 2.3.1에서:

  • 2: 메이저 버전
  • 3: 마이너 버전
  • 1: 패치 버전

빌드 번호

빌드 번호는 앱스토어에 제출할 때마다 증가시켜야 합니다. 동일한 버전 이름으로 새 빌드를 제출할 때도 빌드 번호는 증가해야 합니다.

# 첫 번째 릴리스
version: 1.0.0+1

# 버그 수정 릴리스
version: 1.0.1+2

# 새로운 기능 추가
version: 1.1.0+3

# 주요 변경사항이 있는 새 버전
version: 2.0.0+4

릴리스 브랜치 관리

효과적인 릴리스 관리를 위해 Git과 같은 버전 관리 시스템에서 브랜치 전략을 수립하는 것이 중요합니다.

Git-Flow 모델

Flutter 프로젝트에 자주 사용되는 Git-Flow 모델은 다음과 같은 브랜치 구조를 가집니다:

  • main/master: 제품 릴리스 코드
  • develop: 개발 중인 코드
  • feature/*: 개별 기능 개발
  • release/*: 릴리스 준비
  • hotfix/*: 긴급 수정

릴리스 준비 프로세스

  1. develop 브랜치에서 release/x.y.z 브랜치 생성
  2. 릴리스 브랜치에서 버그 수정 및 릴리스 준비
  3. 테스트 완료 후 release 브랜치를 maindevelop에 병합
  4. main에 태그 생성 (예: v1.0.0)

테스트 전략

테스트 수준

효과적인 릴리스 관리에는 다층적 테스트 전략이 필요합니다:

  1. 단위 테스트: 개별 기능 및 클래스 테스트
  2. 위젯 테스트: UI 구성 요소 테스트
  3. 통합 테스트: 여러 구성 요소의 상호 작용 테스트
  4. 성능 테스트: 앱 성능 및 리소스 사용량 테스트

CI/CD 파이프라인

Flutter 앱의 지속적 통합 및 배포(CI/CD) 파이프라인을 구축합니다:

# .github/workflows/ci.yml 예시 (GitHub Actions)
name: CI
on:
  push:
    branches: [develop, main, "release/*"]
  pull_request:
    branches: [develop]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.10.0"
          channel: "stable"
      - run: flutter pub get
      - run: flutter analyze
      - run: flutter test
      - run: flutter build apk --release

릴리스 환경 관리

Flutter에서는 다양한 빌드 환경(개발, 스테이징, 프로덕션)을 관리해야 합니다.

환경별 구성

--dart-define 플래그를 사용하거나 환경별 구성 파일을 만들어 다양한 환경을 관리할 수 있습니다:

// main.dart
void main() {
  final environment = const String.fromEnvironment(
    'ENVIRONMENT',
    defaultValue: 'development',
  );

  // 환경에 따른 설정 로드
  final config = getConfig(environment);

  runApp(MyApp(config: config));
}

// 빌드 명령
// flutter build apk --dart-define=ENVIRONMENT=production

또는 flutter_config 같은 패키지를 사용할 수 있습니다:

dependencies:
  flutter_config: ^2.0.0
import 'package:flutter_config/flutter_config.dart';

void main() async {
  await FlutterConfig.loadEnvVariables();
  runApp(MyApp());
}

// 사용
final apiUrl = FlutterConfig.get('API_URL');

릴리스 체크리스트

릴리스 전 다음 체크리스트를 확인합니다:

  1. 버전 정보 업데이트: pubspec.yaml의 버전 번호 업데이트
  2. 변경 로그 업데이트: 새 기능, 수정 사항 등을 문서화
  3. 모든 테스트 통과 확인: 단위, 위젯, 통합 테스트
  4. 성능 테스트: 메모리 누수, 렌더링 성능, 네트워크 효율성 등
  5. 접근성 검사: 접근성 가이드라인 준수 확인
  6. 다국어 지원 확인: 번역 누락 또는 오류 확인
  7. 앱 아이콘 및 스플래시 화면: 모든 필요한 이미지 자산 포함
  8. 라이선스 및 법적 문서: 제3자 라이브러리 라이선스, 개인정보 처리방침 등

릴리스 배포 자동화

Fastlane을 사용한 배포 자동화

Flutter 프로젝트에 Fastlane을 통합하여 배포 프로세스를 자동화할 수 있습니다:

# fastlane/Fastfile
platform :android do
  desc "Android 릴리즈 빌드 및 배포"
  lane :release do
    # 버전 번호 업데이트
    increment_version_code(
      gradle_file_path: "android/app/build.gradle"
    )

    # 앱 빌드
    sh("flutter build appbundle --release")

    # Google Play에 업로드
    upload_to_play_store(
      track: "production",
      aab: "../build/app/outputs/bundle/release/app-release.aab"
    )
  end
end

platform :ios do
  desc "iOS 릴리즈 빌드 및 배포"
  lane :release do
    # 버전 업데이트
    increment_build_number(xcodeproj: "ios/Runner.xcodeproj")

    # 앱 빌드
    sh("flutter build ios --release --no-codesign")

    # 코드 서명 및 앱스토어 업로드
    build_app(
      workspace: "ios/Runner.xcworkspace",
      scheme: "Runner",
      output_directory: "build/ios/ipa",
      output_name: "Runner.ipa"
    )

    upload_to_app_store(
      app_identifier: "com.example.myApp",
      ipa: "build/ios/ipa/Runner.ipa",
      skip_screenshots: true,
      skip_metadata: false
    )
  end
end

릴리스 모니터링

앱이 출시된 후에도 지속적인 모니터링이 필요합니다:

Firebase Crashlytics 통합

dependencies:
  firebase_core: ^2.15.1
  firebase_crashlytics: ^3.3.5
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // Crashlytics 초기화
  if (!kDebugMode) {
    FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  }

  runApp(MyApp());
}

분석 및 사용자 피드백

Firebase Analytics나 다른 분석 도구를 통합하여 사용자 행동 및 앱 성능을 모니터링합니다.

결론

효과적인 Flutter 릴리스 관리는 버전 관리, 브랜치 전략, 테스트 자동화, 배포 파이프라인, 출시 후 모니터링을 포함한 종합적인 접근 방식을 필요로 합니다. 이러한 프로세스를 체계적으로 구현하면 높은 품질의 앱을 일관되게 출시하고 사용자에게 안정적인 경험을 제공할 수 있습니다.

results matching ""

    No results matching ""