Flutter 튜토리얼 77편: SDK와 pubspec.yaml
요약
핵심 요지
- 문제 정의: Flutter 프로젝트를 설정하고 관리하려면 SDK 구조와
pubspec.yaml1 파일을 이해해야 한다. - 핵심 주장: pubspec.yaml은 프로젝트의 의존성, 에셋, 폰트 등 핵심 설정을 관리하는 중앙 구성 파일이다.
- 주요 근거: Flutter는 Dart SDK를 포함하며,
flutter와dartCLI 도구를 통해 앱을 생성, 빌드, 테스트한다. - 실무 기준: 에셋, 폰트, 플러그인 설정은 pubspec.yaml의 flutter 섹션에서 관리한다.
- 한계: YAML 문법에서 들여쓰기(탭 vs 공백)가 중요하며, 실수하면 파싱 오류가 발생한다.
문서가 설명하는 범위
- Flutter SDK에 포함된 구성 요소
- flutter와 dart CLI 도구 사용법
- pubspec.yaml의 Flutter 전용 필드
- 에셋, 폰트, 플러그인 설정 방법
읽는 시간: 15분 | 난이도: 초급
참고 자료
- Flutter SDK overview - SDK 개요
- Flutter’s pubspec options - pubspec 옵션
문제 상황
Flutter 프로젝트를 시작하면 여러 파일과 폴더가 생성됩니다. 그중 pubspec.yaml은 가장 중요한 설정 파일이지만, 어떤 옵션이 있는지 모르면 제대로 활용하기 어렵습니다.
흔한 질문들
패키지를 어떻게 추가하지?이미지를 앱에 포함하려면 어디에 설정하지?커스텀 폰트는 어떻게 사용하지?Flutter SDK에는 뭐가 들어있지?해결 방법
Flutter SDK의 구조를 이해하고 pubspec.yaml의 필드를 알면 프로젝트를 효과적으로 관리할 수 있습니다.
챕터 1: Flutter SDK 구성 요소
Why
NOTEFlutter 앱을 개발하려면 Flutter SDK가 필요합니다. SDK에는 Dart 언어, 프레임워크, 도구들이 포함되어 있습니다.
SDK가 무엇을 제공하는지 알면 어떤 도구를 언제 사용해야 하는지 이해할 수 있습니다.
What
NOTEFlutter SDK에는 다음이 포함됩니다.
구성 요소 설명 Dart SDK Dart 언어와 런타임 렌더링 엔진 모바일 최적화 2D 렌더링 엔진 프레임워크 React 스타일의 선언적 UI 프레임워크 위젯 라이브러리 Material Design, Cupertino 스타일 위젯 테스트 API 유닛, 위젯, 통합 테스트 도구 DevTools 디버깅, 프로파일링 도구 CLI 도구 flutter,dart명령어 도구
How
TIPflutter CLI 도구
flutter명령어는 Flutter 앱 개발의 핵심 도구입니다.Terminal window # 새 프로젝트 생성flutter create my_app# 앱 실행flutter run# 앱 빌드flutter build apkflutter build ios# 테스트 실행flutter test# 의존성 설치flutter pub get# 환경 확인flutter doctordart CLI 도구
dart명령어는 Dart 언어 관련 작업에 사용됩니다.Terminal window # 코드 포맷팅dart format .# 정적 분석dart analyze# deprecated API 자동 수정dart fix --apply# 패키지 관리dart pub getdart pub add httpSDK 위치
Flutter SDK는 설치 시 지정한 경로에 있습니다.
Terminal window # SDK 위치 확인flutter sdk-path# 환경 변수 설정 (macOS/Linux)export PATH="$PATH:$HOME/development/flutter/bin"
Watch out
WARNINGIDE 도구(VS Code 확장, Android Studio 플러그인)는 최근 2년간의 Flutter SDK 버전만 지원합니다. 너무 오래된 SDK를 사용하면 IDE 기능이 제대로 작동하지 않을 수 있습니다.
Terminal window # SDK 버전 확인flutter --version# SDK 업그레이드flutter upgrade
결론: Flutter SDK는 앱 개발에 필요한 모든 도구와 라이브러리를 포함합니다.
챕터 2: pubspec.yaml 기본 구조
Why
NOTEpubspec.yaml은 Flutter 프로젝트의 핵심 설정 파일입니다. 프로젝트 메타데이터, 의존성, 에셋 등 모든 설정이 이 파일에 있습니다.
패키지를 추가하거나 에셋을 포함할 때 반드시 이 파일을 수정해야 합니다.
What
NOTEpubspec.yaml은 YAML 형식으로 작성됩니다. Dart 공통 필드와 Flutter 전용 필드가 있습니다.
Dart 공통 필드:
name: 프로젝트 이름description: 프로젝트 설명version: 버전 번호environment: SDK 버전 제약dependencies: 런타임 의존성dev_dependencies: 개발용 의존성Flutter 전용 필드:
flutter: Flutter 관련 설정assets: 에셋 파일 목록fonts: 커스텀 폰트 설정uses-material-design: Material 아이콘 사용 여부
How
TIP기본 pubspec.yaml 예제
name: my_flutter_appdescription: A new Flutter project.publish_to: none # pub.dev에 공개하지 않음version: 1.0.0+1environment:sdk: ^3.10.0dependencies:flutter:sdk: flutter # Flutter SDK 의존성cupertino_icons: ^1.0.8 # iOS 스타일 아이콘dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^6.0.0 # 권장 린트 규칙flutter:uses-material-design: true # Material 아이콘 사용버전 지정 방법
표현 의미 ^1.0.01.0.0 이상, 2.0.0 미만 (권장) >=1.0.0 <2.0.0명시적 범위 any모든 버전 1.0.0정확히 이 버전만 의존성 추가하기
Terminal window # 명령어로 추가 (권장)flutter pub add http# pubspec.yaml에 직접 추가 후 설치flutter pub getpubspec.lock
첫 빌드 시
pubspec.lock파일이 생성됩니다. 이 파일은 설치된 패키지의 정확한 버전을 기록합니다.# pubspec.lock (자동 생성, 수정하지 않음)packages:http:dependency: "direct main"version: "1.2.0"
Watch out
WARNINGYAML은 들여쓰기에 민감합니다. 탭 대신 공백 2칸을 사용해야 합니다.
# 잘못된 예 (탭 사용)flutter:uses-material-design: true # 오류!# 올바른 예 (공백 2칸)flutter:uses-material-design: true들여쓰기가 잘못되면 파싱 오류가 발생합니다.
결론: pubspec.yaml은 YAML 형식으로 프로젝트 설정을 관리하며, 들여쓰기에 주의해야 합니다.
챕터 3: 에셋 설정
Why
NOTE이미지, JSON 파일, 아이콘 등을 앱에 포함하려면 에셋으로 등록해야 합니다. pubspec.yaml에 에셋 경로를 명시하면 앱 번들에 포함됩니다.
What
NOTE
assets필드는 앱에 포함할 파일이나 폴더를 지정합니다.지원되는 파일 유형:
- 이미지: JPEG, PNG, GIF, WebP, BMP
- 데이터: JSON, XML, 텍스트
- 기타: 설정 파일, 라이선스 파일
How
TIP개별 파일 등록
flutter:assets:- assets/images/logo.png- assets/images/background.jpg- assets/data/config.json폴더 전체 등록
폴더 경로 끝에
/를 붙이면 해당 폴더의 모든 파일이 포함됩니다.flutter:assets:- assets/images/ # images 폴더의 모든 파일- assets/icons/ # icons 폴더의 모든 파일해상도별 이미지
Flutter는 해상도별 이미지를 자동으로 선택합니다.
assets/images/logo.png # 1x (기본)2.0x/logo.png # 2x3.0x/logo.png # 3xpubspec.yaml에는 기본 경로만 등록합니다.
flutter:assets:- assets/images/logo.pngFlavor별 에셋
빌드 Flavor에 따라 다른 에셋을 사용할 수 있습니다.
flutter:assets:- path: assets/production/imagesflavors:- production- path: assets/staging/imagesflavors:- staging코드에서 에셋 사용
// 이미지 위젯Image.asset('assets/images/logo.png')// JSON 파일 로드final jsonString = await rootBundle.loadString('assets/data/config.json');
Watch out
WARNING에셋 경로는 pubspec.yaml 기준 상대 경로입니다. 경로가 잘못되면 빌드 시 오류가 발생하거나 런타임에 파일을 찾을 수 없습니다.
# 프로젝트 구조my_app/pubspec.yamlassets/images/logo.png# pubspec.yamlflutter:assets:- assets/images/logo.png # 올바른 경로# - images/logo.png # 잘못된 경로
결론: assets 필드로 이미지, 데이터 파일 등을 앱에 포함할 수 있습니다.
챕터 4: 폰트 설정
Why
NOTE앱에 커스텀 폰트를 사용하면 브랜드 아이덴티티를 강화하고 가독성을 높일 수 있습니다. pubspec.yaml에서 폰트 파일을 등록하고 스타일(굵기, 기울임)을 지정합니다.
What
NOTE
fonts필드는 커스텀 폰트를 등록합니다.
속성 설명 family폰트 패밀리 이름 asset폰트 파일 경로 weight굵기 (100-900) style스타일 (italic)
How
TIP기본 폰트 등록
flutter:fonts:- family: Robotofonts:- asset: fonts/Roboto-Regular.ttf- asset: fonts/Roboto-Bold.ttfweight: 700- asset: fonts/Roboto-Italic.ttfstyle: italic여러 폰트 패밀리
flutter:fonts:- family: Robotofonts:- asset: fonts/Roboto-Regular.ttf- asset: fonts/Roboto-Bold.ttfweight: 700- family: NotoSansKRfonts:- asset: fonts/NotoSansKR-Regular.ttf- asset: fonts/NotoSansKR-Bold.ttfweight: 700코드에서 폰트 사용
// TextStyle에서 직접 사용Text('Hello',style: TextStyle(fontFamily: 'Roboto'),)// ThemeData에서 기본 폰트 설정MaterialApp(theme: ThemeData(fontFamily: 'NotoSansKR',),)// 굵기와 스타일 지정Text('Bold Italic',style: TextStyle(fontFamily: 'Roboto',fontWeight: FontWeight.w700,fontStyle: FontStyle.italic,),)가변 폰트 (Variable Fonts)
가변 폰트는 하나의 파일로 여러 굵기를 지원합니다.
flutter:fonts:- family: RobotoFlexfonts:- asset: fonts/RobotoFlex-VariableFont.ttf// 가변 폰트에서 원하는 굵기 사용Text('Variable Weight',style: TextStyle(fontFamily: 'RobotoFlex',fontWeight: FontWeight.w450, // 100-900 사이 값),)
Watch out
WARNING폰트 weight 값은 정해진 값만 사용할 수 있습니다. 100, 200, 300, 400, 500, 600, 700, 800, 900 중 하나여야 합니다.
# 잘못된 예- asset: fonts/Roboto-Medium.ttfweight: 550 # 오류!# 올바른 예- asset: fonts/Roboto-Medium.ttfweight: 500폰트 파일이 없거나 경로가 잘못되면 기본 시스템 폰트가 사용됩니다.
결론: fonts 필드로 커스텀 폰트를 등록하고 굵기, 스타일을 지정할 수 있습니다.
챕터 5: 기타 Flutter 필드
Why
NOTEpubspec.yaml에는 에셋과 폰트 외에도 여러 Flutter 전용 필드가 있습니다. 이 필드들을 활용하면 앱 빌드와 동작을 세밀하게 제어할 수 있습니다.
What
NOTE주요 Flutter 전용 필드:
필드 설명 uses-material-designMaterial 아이콘 포함 여부 generate로컬라이제이션 코드 생성 plugin플러그인 설정 shadersGLSL 셰이더 파일 deferred-components지연 로딩 컴포넌트 (Android) configCLI 설정 플래그
How
TIPuses-material-design
Material 아이콘을 사용하려면 true로 설정합니다.
flutter:uses-material-design: true// Material 아이콘 사용Icon(Icons.home)Icon(Icons.settings)generate (로컬라이제이션)
다국어 지원을 위한 코드를 자동 생성합니다.
flutter:generate: true
l10n.yaml파일과 함께 사용합니다.licenses (추가 라이선스)
앱에 추가 라이선스 파일을 포함합니다.
flutter:licenses:- assets/licenses/third_party_license.txtshaders (GLSL 셰이더)
커스텀 셰이더를 앱에 포함합니다.
flutter:shaders:- assets/shaders/blur.frag- assets/shaders/glow.fragdefault-flavor
기본 빌드 Flavor를 지정합니다.
flutter:default-flavor: productionTerminal window # 기본 flavor 실행 (production)flutter run# 다른 flavor 실행flutter run --flavor stagingconfig (CLI 설정)
flutter CLI 동작을 설정합니다.
flutter:config:enable-swift-package-manager: truecli-animations: falseplugin (플러그인 개발용)
Flutter 플러그인을 개발할 때 플랫폼별 설정을 지정합니다.
flutter:plugin:platforms:android:package: com.example.my_pluginpluginClass: MyPluginios:pluginClass: MyPlugin
Watch out
WARNING
uses-material-design: true를 설정하지 않으면 Material 아이콘이 표시되지 않습니다.// uses-material-design: false면 아이콘이 안 보임Icon(Icons.home) // 빈 공간 또는 오류새 프로젝트를 생성하면 기본적으로 true로 설정됩니다.
결론: Flutter 전용 필드를 활용하면 Material 디자인, 로컬라이제이션, 셰이더 등 다양한 기능을 설정할 수 있습니다.
챕터 6: 필수 Flutter 패키지
Why
NOTEFlutter 앱 개발에는 몇 가지 필수 패키지가 있습니다. 이 패키지들은 Flutter SDK의 일부이거나 거의 모든 프로젝트에서 사용됩니다.
What
NOTE필수 패키지:
패키지 용도 flutterFlutter SDK flutter_test테스트 도구 flutter_localizations다국어 지원 flutter_lints코드 린트 규칙 cupertino_iconsiOS 스타일 아이콘
How
TIPflutter 패키지
모든 Flutter 프로젝트에 필수입니다.
dependencies:flutter:sdk: flutterflutter_test 패키지
테스트 코드 작성에 필요합니다.
dev_dependencies:flutter_test:sdk: flutterflutter_localizations 패키지
다국어 지원(i18n)에 필요합니다.
dependencies:flutter_localizations:sdk: flutterintl: any # 함께 사용MaterialApp(localizationsDelegates: [GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalCupertinoLocalizations.delegate,],supportedLocales: [Locale('en'),Locale('ko'),],)flutter_lints 패키지
권장 린트 규칙을 제공합니다.
dev_dependencies:flutter_lints: ^6.0.0
analysis_options.yaml에서 사용합니다.analysis_options.yaml include: package:flutter_lints/flutter.yamlcupertino_icons 패키지
iOS 스타일 아이콘을 제공합니다.
dependencies:cupertino_icons: ^1.0.8Icon(CupertinoIcons.heart)Icon(CupertinoIcons.settings)
Watch out
WARNING패키지를 추가한 후에는 반드시
flutter pub get을 실행해야 합니다.Terminal window # pubspec.yaml 수정 후flutter pub getIDE에서 자동으로 실행되기도 하지만, 문제가 생기면 수동으로 실행해 보세요.
결론: Flutter SDK 패키지들은 테스트, 로컬라이제이션, 린트 등 핵심 기능을 제공합니다.
한계
pubspec.yaml과 Flutter SDK에는 몇 가지 주의점이 있습니다.
- YAML 문법 민감성: 들여쓰기 오류가 파싱 실패로 이어짐
- 에셋 경로 오류: 잘못된 경로는 런타임 오류 발생
- SDK 버전 호환성: 패키지가 현재 SDK 버전과 호환되지 않을 수 있음
- pubspec.lock 충돌: 팀 개발 시 lock 파일 충돌 가능
Footnotes
-
pubspec.yaml(펍스펙): Dart/Flutter 프로젝트의 의존성과 메타데이터를 정의하는 YAML 형식의 설정 파일이다. ↩
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!