App/Flutter

IntelliJ + Flutter + env 으로 Uri 관리하기

임리을 2024. 7. 3. 20:04

안녕하세요. 앱 개발자가 되어 돌아왔습니다.

입사하자마자 버그 수정을 하며 코드를 보니 실수하기 좋은 부분이 있었습니다.

(그리고 한달 뒤에 실수했습니다..)

 

 

문자열로 관리되고 있는 Uri

테스트, 운영 서버의 Uri을 문자열로 사용하고 있었습니다.

 

// 티스토리는.. dart 코드블럭이 없네요..
// final API_SERVER_URI = 'https://test.tistory.com'
final API_SERVER_URI = 'https://product.tistory.com'

 

 

저는 절차가 1개씩 늘어날 때마다 실수를 해서 최대한 줄이려고 하는 편입니다.

그런 저에게 이 코드는 실수할 것이 분명했습니다.

그래서 Build Mode에 따라 Uri을 바꿔주기로 했습니다.

 

env 파일 생성

먼저, 프로젝트 루트 디렉터리에 환경 변수 파일을 생성합니다. 여기서는 .env와 .env.production 두 파일을 생성합니다.

 

# .env
API_URL=https://test.tistory.com
# .env.production
API_URL=https://product.tistory.com

 

이제 환경 변수 파일을 통해 URI를 관리할 수 있게 되었습니다.

 

main.dart에 로직 추가

flutter_dotenv 패키지를 사용하여 환경 변수를 로드합니다. pubspec.yaml 파일에 해당 패키지를 추가합니다.

dependencies:
  flutter_dotenv: ^5.0.2 # 추가
  
# ....

assets:
  - .env                 # 추가
  - .env.production      # 추가

 

그런 다음, main.dart 파일을 수정하여 환경 변수를 로드하는 로직을 추가합니다.

import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

Future<void> _initEnv() async {
  const envFileName = const String.fromEnvironment(
    'ENV_FILE_NAME',
    defaultValue: '.env.production',
  );
  await dotenv.load(fileName: envFileName);
  debugPrint('load env file: $envFileName');
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await _initEnv();
  runApp(MyApp());
}

class API {
  late final API_URI;
  
  API() {
    API_URI = dotenv.env['API_URI']!;
  }
}
  • 위에서 꼭!!! String.fromEnvironment 메서드를 사용할 때 const를 붙여줘야 합니다!
  • 저는 flutter build apk와 같은 명령어를 쓸 때 .env.production 을 읽게 하려고 기본 값을 이렇게 설정했습니다.

 

 

IntelliJ에 실행 환경 구성

이제 IntelliJ에서 실행할 때 사용할 환경 변수를 설정합니다.

 

  1. Run/Debug Configuration을 엽니다.
  2. Add New Configuration 아이콘을 클릭하고 Flutter를 선택합니다.
  3. Name을 적절히 설정합니다(예: dev).
  4. Additional run args에 다음을 추가합니다:
    1. Test Uri 사용: --dart-define=ENV_FILE_NAME=.env
    2. 운영 Uri 사용: envFileName의 기본 값을 .env.production으로 설정해서 값을 주지 않으면 됩니다.

 

 

  • 단점은, 내부에 배포할 때 테스트 서버를 바라보도록 환경변수 값을 같이 설정해줘야 합니다.
    • 이것도 실수할 거 같으니 개선해봐야겠습니다..