Search

ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ

ํ”Œ๋Ÿฌํ„ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ

flutter_app โ”œโ”€โ”€ android โ”œโ”€โ”€ ios โ”œโ”€โ”€ build โ”œโ”€โ”€ lib โ”‚ โ””โ”€โ”€ main.dart โ”œโ”€โ”€ test โ”œโ”€โ”€ pub.yaml โ”œโ”€โ”€ pubspec.lock โ””โ”€โ”€ README.md

android

ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์ปดํŒŒ์ผํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ
โ€ข
Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ Android ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
โ€ข
์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ ์„ค์ •๊ณผ Gradle ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

ios

ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์ปดํŒŒ์ผํ•œ iOS ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ
โ€ข
iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ iOS ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
โ€ข
iOS ์•ฑ์˜ ์„ค์ •๊ณผ Info.plist ํŒŒ์ผ์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

build

ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ, ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ
โ€ข
๋นŒ๋“œ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ ๋ฐ ๋นŒ๋“œ ์ค‘์— ์ƒ์„ฑ๋œ ๊ธฐํƒ€ ํŒŒ์ผ์ด ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” .gitignore ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

lib

ํ”Œ๋Ÿฌํ„ฐ ์•ฑ ๊ฐœ๋ฐœ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ
โ€ข
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
โ€ข
main.dart์™€ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง„์ž…์  ๋ฐ ๋‹ค๋ฅธ Dart ํŒŒ์ผ๋“ค์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

main.dart

์•ฑ ์‹คํ–‰ ์‹œ, ์‹œ์ž‘์ ์ด ๋˜๋Š” ๋ฉ”์ธ ํŒŒ์ผ
โ€ข
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ด ๋˜๋Š” Dart ์ฝ”๋“œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
โ€ข
์—ฌ๊ธฐ์—์„œ ์•ฑ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ๊ณผ ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.
// main.dart import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}); // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ์œ„์ ฏ @override Widget build(BuildContext context) { return MaterialApp( // ๋””๋ฒ„๊ทธ ๋ฐฐ๋„ˆ ๋น„ํ™œ์„ฑํ™” debugShowCheckedModeBanner: false, title: 'Flutter App', // ์•ฑ ์ด๋ฆ„ theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: 'Flutter App Main Title'), // ํ™ˆ ํ™”๋ฉด ์ œ๋ชฉ ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; // ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ void _incrementCounter() { setState(() { _counter++; }); } // ์ˆซ์ž๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ void _decrementCounter() { setState(() { // ์ˆซ์ž๊ฐ€ 0๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ์†Œ _counter > 0 ? _counter-- : 0; }); } // ํ™”๋ฉด์„ ๋นŒ๋“œํ•˜๋Š” ๋ฉ”์„œ๋“œ @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.headline4, ), ], ), ), floatingActionButton: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ SizedBox(width: 20), // ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” FloatingActionButton FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Add', // ํˆดํŒ ํ…์ŠคํŠธ child: const Icon(Icons.add), ), const Spacer(), // ์ˆซ์ž๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” FloatingActionButton FloatingActionButton( onPressed: _decrementCounter, tooltip: 'Minus', // ํˆดํŒ ํ…์ŠคํŠธ child: const Icon(Icons.remove), ), ], ), ); } }
YAML
๋ณต์‚ฌ

test

ํ…Œ์ŠคํŠธ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ
โ€ข
ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
โ€ข
ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

pubspec.yaml

ํ”„๋กœ์ ํŠธ ์ด๋ฆ„, ์„ค๋ช…, ๋ฒ„์ „, ์˜์กด์„ฑ, ์ •์  ํŒŒ์ผ(asset) ์„ ๊ด€๋ฆฌํ•˜๋Š” ์„ค์ • ํŒŒ์ผ
โ€ข
Dart ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ์ผ์ธ pubspec.yaml ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
โ€ข
์˜์กด์„ฑ ํŒจํ‚ค์ง€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„, ๋ฒ„์ „, ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ๋“ฑ์ด ์—ฌ๊ธฐ์— ์ •์˜๋ฉ๋‹ˆ๋‹ค.
# pubspec.yaml # ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„ name: flutter_app # ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช… description: A new Flutter project. # ํŒจํ‚ค์ง€๋ฅผ pub.dev์— ๊ฒŒ์‹œํ•˜์ง€ ์•Š์Œ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # ๋ฒ„์ „ ์ •๋ณด version: 1.0.0+1 # Flutter SDK ๋ฒ„์ „ ๋ฐ ํ™˜๊ฒฝ ์„ค์ • environment: sdk: '>=2.18.2 <3.0.0' # ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ๋ชฉ๋ก dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 # ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ•„์š”ํ•œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ๋ชฉ๋ก dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 # Flutter ์„ค์ • flutter: # Material Design ์‚ฌ์šฉ ์—ฌ๋ถ€ uses-material-design: true
YAML
๋ณต์‚ฌ

pubspec.lock

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ
โ€ข
ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์˜ ์ •ํ™•ํ•œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
โ€ข
pubspec.yaml ํŒŒ์ผ์— ๋ช…์‹œ๋œ ์˜์กด์„ฑ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

README.md

ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŒŒ์ผ
โ€ข
ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…, ์‚ฌ์šฉ๋ฒ•, ๋ผ์ด์„ ์Šค ๋“ฑ์„ ๊ธฐ๋กํ•œ ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
โ€ข
ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”์™€ ๊ณต์œ ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.