# 연관 글

# 들어가며

PART1과 PART2를 통해 네이티브 사이드에서 Build Flavors를 구성하는 방법에 대해서 살펴보았다.

네이티브 사이드에서 설정을 끝마쳤다면 사실상 Build Flavors 설정은 끝났다고 볼 수 있다. 하지만 힘겹게 Flavors를 설정한 궁극적인 목표는 빌드 유형에 따라 API URL 혹은 3rd Party 라이브러리에서 사용할 Key 값이나 설정 파일 등에 변형을 주고자 작업했을 것이다.

이번 글에서는 빌드 유형에 따라 API URL 등을 분기하여 Flutter 앱을 실행하는 방법에 대해 간략하게 다뤄보고자 한다.

아래의 방법은 여러 사이트의 정보를 조합하고 개인적으로 사용하면서 나에게 가장 적합하다고 판단되는 방법일 뿐이니 참고만 하고 실제 작업하며 개인에게 적합한 방법을 찾아나가는 데 도움이 될 수 있으면 한다.

# 어떻게 구성하였는가?

Flutter 앱을 실행하게 되면 가장 먼저 main()이라는 함수를 찾아 실행하게 된다. 실제로 새로운 Flutter 프로젝트를 만들고 lib/main.dart 파일을 열어보면 아래와 같은 코드를 볼 수 있다.

void main() => runApp(MyApp());class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}

나의 경우 개발 / 운영 버전을 분리하여 운영하는 것이 Build Flavors를 구성한 목적이기 때문에 프로그램의 Entry Point인 main() 함수를 분리하고 빌드 유형에 따른 각종 정보를 전역적으로 관리하기 위한 환경설정 파일을 만들었다.

# 전역 정보 관리를 위한 Environment

API_URL / 3rd Party 라이브러리의 Key 등을 전역적으로 관리하기 위하여 lib 폴더 하위에 env 라는 패키지를 생성하고 environment.dart 파일을 생성하였다.

전역적으로 해당 객체의 인스턴스로 접근하여 위치와 상관없이 어디서든 API_URL 등에 대한 정보를 접근하기 위해 Environment 클래스를 싱글톤 객체로 만들었다.

추가적으로 기존에 lib/main.dart 에 있던 실질적인 앱을 실행해 주는 역할을 하는 runApp 함수를 호출할 수 있도록 해당 파일에 배치하였다.

그 이유는 아래에서 개발과 운영 버전에 따라 main() 함수를 호출하는 파일을 분리하기 때문에 불필요한 코드의 중복을 제거하기 위함이다.

# Entry Point — main 함수의 분리

위의 Environment 클래스의 구현을 다시 확인해보면 새로운 인스턴스를 생성할 때 빌드 유형을 구분하기 위한 enum 타입인 BuildType 을 넘겨줄 수 있도록 구현되어 있다.

그러므로 아래와 같이 빌드 유형에 따라 실행되는 main() 함수를 분리한 뒤 BuilType을 명시적으로 넘겨주어야 Environment 클래스에서 빌드 유형에 따른 추가적인 처리를 할 수 있다.

lib/env/development.dart
lib/env/production.dart

위에서 언급했듯 실질적으로 앱을 실행시켜주는 runApp 함수를 각각 해당 파일들에서 처리할 경우 runApp 함수와 부가적으로 MaterialApp 등의 각종 Widget들을 매번 추가해 줘야 하는 불편한 부분이 생길 수 있기 때문에 단순히 Environment 클래스의 인스턴스를 생성하고 빌드 유형을 구분할 수 있도록 값을 주입해 주어 환경설정 파일에서 runApp 을 실행할 수 있도록 구성해 주었다.

# 빌드 변형에 따른 앱 실행

여기까지 작업이 완료되었다면 Flutter 앱을 실행할 때 원하는 빌드 유형을 선택하여 시작할 수 있다.
나의 경우 개발과 운영 버전에 따라 main 함수를 분리하였기 때문에 아래의 command를 이용하여 개발과 운영 버전에 해당하는 앱을 간단하게 실행할 수 있다.

  • flutter run --flavor development -t lib/env/development.dart
  • flutter run --flavor production -t lib/env/production.dart

하지만 실제 개발을 진행하다 보면 IDE에서 지원하는 run 기능을 사용하고 싶을 것이다. 해당 기능을 이용하여 빌드 유형을 지정한 후 실행하는 방법도 그리 어렵지는 않다.

Edit Configurations
Add Flutter Configuration

Android Studio를 이용한다면 IDE에서 Edit Configurations 메뉴로 진입하여 Flutter에 대한 Configuration을 추가한 뒤 원하는 빌드 유형에 대한 Flavor Name과 해당 빌드 유형이 실행할 Entry Point에 대한 파일을 설정하면 된다.

# 마무리

총 3개의 PART를 통해 Android / iOS / Flutter 사이드에서 각각 Build Flavors를 추가하는 방법에 대해 알아보았다. 글이 길어질 것을 고려하여 3개의 글로 나눠 작성하여 복잡하게 느껴질 수 있겠지만 막상 한번 작업해보면 그리 어려운 작업은 아닐 것이라 생각된다.

현재 진행하고 있는 사이드 프로젝트에서는 Flutter와 Firebase를 중점적으로 사용할 예정이다. 이후 Flavors 구성과는 조금 무관한 주제일 수 있지만 이번에 추가한 빌드 유형에 따라 Firebase 프로젝트를 각각 생성하고 App과 Firebase의 통신을 위해 제공되는 google-services.jsonGoogleService-Info.plist 를 빌드 유형별로 추가하는 방법에 대해 다뤄볼 예정이다.

--

--