2025.05.30 (๊ธˆ)

โœจ Gemini 2.5 Pro์˜ ์š”์•ฝ ใ€€

Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ ๊ฐ•์˜ DevStory - ์ธํ”„๋Ÿฐ DevStory , ๊ฐœ๋ฐœ ์ง€์‹์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์•„์š”!์ž…๋ฌธ์ž๋„ ํ•  ์ˆ˜ ์žˆ๋Š” Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ ๐Ÿƒโ€โ™‚๏ธ์™•์ดˆ๋ณด๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š”Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ[์‚ฌ์ง„]์•ฑ ๊ฐœ๋ฐœ์„ ๋ฐฐ์šฐ๋ฉด ๊ทธ๋™์•ˆ ์ƒ์ƒ๋งŒ ํ•ด์˜ค๋˜ ๋‚˜๋งŒ์˜ ์•ฑ ์„œ๋น„์Šค๋ฅผ ์ „ ์„ธ๊ณ„์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‚ฌ์‹ค
  • ์›๋ฌธ: http://blog.naver.com/hyeogikarp/223882864462
  • ๋„ค์ด๋ฒ„ ๋ฐœํ–‰ ์‹œ๊ฐ: 2025/05/30 11:30 KST
  • ์›๋ฌธ ์นดํ…Œ๊ณ ๋ฆฌ: ๊ฐœ๋ฐœ ๊ณต๋ถ€

์›๋ฌธ

Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ ๊ฐ•์˜ DevStory - ์ธํ”„๋Ÿฐ
DevStory , ๊ฐœ๋ฐœ ์ง€์‹์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์•„์š”!์ž…๋ฌธ์ž๋„ ํ•  ์ˆ˜ ์žˆ๋Š” Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ ๐Ÿƒโ€โ™‚๏ธ์™•์ดˆ๋ณด๋„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š”Flutter ์•ฑ ๊ฐœ๋ฐœ ๊ธฐ์ดˆ[์‚ฌ์ง„]์•ฑ ๊ฐœ๋ฐœ์„ ๋ฐฐ์šฐ๋ฉด ๊ทธ๋™์•ˆ ์ƒ์ƒ๋งŒ ํ•ด์˜ค๋˜ ๋‚˜๋งŒ์˜ ์•ฑ ์„œ๋น„์Šค๋ฅผ ์ „ ์„ธ๊ณ„์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‚ฌ์‹ค ์•ฑ์„ ๋งŒ๋“œ๋Š”

www.inflearn.com

  1. Flutter ๋ž€?
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ: Google์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋กœ Android, iOS, Web, Desktop ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Dart ์–ธ์–ด ์‚ฌ์šฉ: UI๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

  1. ํ•ต์‹ฌ ์ปจ์…‰: ๋ชจ๋“  ๊ฒƒ์€ ์œ„์ ฏ (Widget)
  • UI ๊ตฌ์„ฑ ๋‹จ์œ„: ์œ„์ ฏ์„ ์กฐ๋ฆฝํ•˜์—ฌ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค.

  • ์œ„์ ฏ ํŠธ๋ฆฌ (Widget Tree): ์œ„์ ฏ๋“ค์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ, ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Key? key์™€ super(key: key): ์œ„์ ฏ ์ƒ์„ฑ์ž์—์„œ Key๋Š” ์œ„์ ฏ ํŠธ๋ฆฌ๊ฐ€ ์žฌ๊ตฌ์„ฑ๋  ๋•Œ ์œ„์ ฏ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ˜„์žฌ ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋…์ด ์žˆ๋‹ค๋Š” ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.

  • BuildContext context: ์œ„์ ฏ ํŠธ๋ฆฌ์—์„œ ํ˜„์žฌ ์œ„์ ฏ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ƒ์œ„ ์œ„์ ฏ์˜ ๋ฐ์ดํ„ฐ๋‚˜ ํ…Œ๋งˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐ์ฒด์ด๋‹ค. Navigator.pop(context)์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ํ™œ์šฉ๋œ๋‹ค.

  • ์ฃผ์š” ์œ„์ ฏ ๋ถ„๋ฅ˜:

  • StatelessWidget: ์ƒํƒœ๊ฐ€ ์—†๋Š” ์ •์ ์ธ ์œ„์ ฏ์ด๋‹ค.

  • StatefulWidget: ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ๋™์ ์ธ ์œ„์ ฏ์ด๋‹ค. (์ฝ”๋“œ ์˜ˆ์‹œ ์ƒ๋žต)

  • StatefulWidget: ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ๋™์ ์ธ ์œ„์ ฏ์ด๋‹ค. (์ฝ”๋“œ ์˜ˆ์‹œ ์ƒ๋žต)

  1. ๊ธฐ๋ณธ์ ์ธ ์•ฑ ๊ตฌ์กฐ ๋ฐ ์ฃผ์š” ์œ„์ ฏ
  • main() ํ•จ์ˆ˜ & runApp() & MaterialApp & Scaffold:

  • MaterialApp์˜ home: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒซ ํ™”๋ฉด์„ ์ง€์ •ํ•œ๋‹ค. (์˜ˆ: home: HomePage())

  • MaterialApp์˜ home: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒซ ํ™”๋ฉด์„ ์ง€์ •ํ•œ๋‹ค. (์˜ˆ: home: HomePage())

  • AppBar ์ƒ์„ธ ์†์„ฑ:

  • ๋ ˆ์ด์•„์›ƒ ์œ„์ ฏ:

  • Column & Row:

  • Padding: ์ž์‹ ์œ„์ ฏ ์ฃผ๋ณ€์— ์—ฌ๋ฐฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • Padding: ์ž์‹ ์œ„์ ฏ ์ฃผ๋ณ€์— ์—ฌ๋ฐฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • Container: ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ๋ง(ํฌ๊ธฐ, ์ƒ‰์ƒ, ์—ฌ๋ฐฑ, ํ…Œ๋‘๋ฆฌ ๋“ฑ)์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ๊ฐํ˜• ์œ„์ ฏ์ด๋‹ค.

  • Container: ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ๋ง(ํฌ๊ธฐ, ์ƒ‰์ƒ, ์—ฌ๋ฐฑ, ํ…Œ๋‘๋ฆฌ ๋“ฑ)์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ๊ฐํ˜• ์œ„์ ฏ์ด๋‹ค.

  • Expanded: Row๋‚˜ Column์˜ ์ž์‹ ์œ„์ ฏ์ด ๋‚จ์€ ๊ณต๊ฐ„์„ ์ฑ„์šฐ๋„๋ก ํ™•์žฅ์‹œํ‚จ๋‹ค.

  • Expanded: Row๋‚˜ Column์˜ ์ž์‹ ์œ„์ ฏ์ด ๋‚จ์€ ๊ณต๊ฐ„์„ ์ฑ„์šฐ๋„๋ก ํ™•์žฅ์‹œํ‚จ๋‹ค.

  • SingleChildScrollView: ์ž์‹ ์œ„์ ฏ์˜ ๋‚ด์šฉ์ด ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

  • SingleChildScrollView: ์ž์‹ ์œ„์ ฏ์˜ ๋‚ด์šฉ์ด ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

  • ListView.builder: ๋งŽ์€ ์ˆ˜์˜ ์•„์ดํ…œ์„ ํšจ์œจ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์„ ๋งŒ๋“ ๋‹ค. ํ™”๋ฉด์— ๋ณด์ด๋Š” ์•„์ดํ…œ๋งŒ ์ƒ์„ฑํ•œ๋‹ค.

  • ListView.builder: ๋งŽ์€ ์ˆ˜์˜ ์•„์ดํ…œ์„ ํšจ์œจ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์„ ๋งŒ๋“ ๋‹ค. ํ™”๋ฉด์— ๋ณด์ด๋Š” ์•„์ดํ…œ๋งŒ ์ƒ์„ฑํ•œ๋‹ค.

  • Stack: ์œ„์ ฏ๋“ค์„ ๊ฒน์ณ์„œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค (Z์ถ•).

  • Stack: ์œ„์ ฏ๋“ค์„ ๊ฒน์ณ์„œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค (Z์ถ•).

  • AspectRatio: ์ž์‹ ์œ„์ ฏ์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ๊ณ ์ •์‹œํ‚จ๋‹ค.

  • AspectRatio: ์ž์‹ ์œ„์ ฏ์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ๊ณ ์ •์‹œํ‚จ๋‹ค.

  • double.infinity: Container ๋“ฑ์˜ width๋‚˜ height ์†์„ฑ์— ์‚ฌ์šฉ๋˜์–ด, ๋ถ€๋ชจ ์œ„์ ฏ์ด ํ—ˆ์šฉํ•˜๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋กœ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค.

  • double.infinity: Container ๋“ฑ์˜ width๋‚˜ height ์†์„ฑ์— ์‚ฌ์šฉ๋˜์–ด, ๋ถ€๋ชจ ์œ„์ ฏ์ด ํ—ˆ์šฉํ•˜๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋กœ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค.

  • SizedBox: ํŠน์ • ํฌ๊ธฐ์˜ ๋นˆ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ž์‹ ์œ„์ ฏ์˜ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • SizedBox: ํŠน์ • ํฌ๊ธฐ์˜ ๋นˆ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ž์‹ ์œ„์ ฏ์˜ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ธฐ๋ณธ UI ์œ„์ ฏ:

  • Text & TextStyle: ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์Šคํƒ€์ผ์„ ์ง€์ •ํ•œ๋‹ค.

  • Image.network: ๋„คํŠธ์›Œํฌ URL๋กœ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜์—ฌ ํ‘œ์‹œํ•œ๋‹ค.

  • Image.network: ๋„คํŠธ์›Œํฌ URL๋กœ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜์—ฌ ํ‘œ์‹œํ•œ๋‹ค.

  • fit: BoxFit.cover: ์ด๋ฏธ์ง€๊ฐ€ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ง€์ •๋œ ๊ณต๊ฐ„์„ ๊ฝ‰ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค. (๊ณต๊ฐ„๋ณด๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ํฌ๋ฉด ์ž˜๋ฆด ์ˆ˜ ์žˆ๋‹ค)Icon: ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•œ๋‹ค.

  • fit: BoxFit.cover: ์ด๋ฏธ์ง€๊ฐ€ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ง€์ •๋œ ๊ณต๊ฐ„์„ ๊ฝ‰ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค. (๊ณต๊ฐ„๋ณด๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ํฌ๋ฉด ์ž˜๋ฆด ์ˆ˜ ์žˆ๋‹ค)

  • fit: BoxFit.cover: ์ด๋ฏธ์ง€๊ฐ€ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ง€์ •๋œ ๊ณต๊ฐ„์„ ๊ฝ‰ ์ฑ„์šฐ๋„๋ก ํ•œ๋‹ค. (๊ณต๊ฐ„๋ณด๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ํฌ๋ฉด ์ž˜๋ฆด ์ˆ˜ ์žˆ๋‹ค)

  • Icon: ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•œ๋‹ค.

  • TextField & InputDecoration ์ƒ์„ธ: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

  • TextField & InputDecoration ์ƒ์„ธ: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.

  • ElevatedButton, TextButton, IconButton: ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฒ„ํŠผ ์œ„์ ฏ์ด๋‹ค.

  • ElevatedButton, TextButton, IconButton: ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฒ„ํŠผ ์œ„์ ฏ์ด๋‹ค.

  • Card: ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์˜ ์นด๋“œ ํ˜•ํƒœ UI๋ฅผ ๋งŒ๋“ ๋‹ค. ์•ฝ๊ฐ„์˜ ๊ทธ๋ฆผ์ž์™€ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Card: ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์˜ ์นด๋“œ ํ˜•ํƒœ UI๋ฅผ ๋งŒ๋“ ๋‹ค. ์•ฝ๊ฐ„์˜ ๊ทธ๋ฆผ์ž์™€ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Divider: ์‹œ๊ฐ์ ์ธ ๊ตฌ๋ถ„์„ ์„ ๋งŒ๋“ ๋‹ค.

  • Divider: ์‹œ๊ฐ์ ์ธ ๊ตฌ๋ถ„์„ ์„ ๋งŒ๋“ ๋‹ค.

  • CircleAvatar: ์ฃผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์›ํ˜• ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • CircleAvatar: ์ฃผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์›ํ˜• ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • Colors.black.withOpacity(0.5): ์ƒ‰์ƒ์— ํˆฌ๋ช…๋„๋ฅผ ์ ์šฉํ•œ๋‹ค. 0.0 (์™„์ „ ํˆฌ๋ช…) ~ 1.0 (์™„์ „ ๋ถˆํˆฌ๋ช…).

  • Colors.black.withOpacity(0.5): ์ƒ‰์ƒ์— ํˆฌ๋ช…๋„๋ฅผ ์ ์šฉํ•œ๋‹ค. 0.0 (์™„์ „ ํˆฌ๋ช…) ~ 1.0 (์™„์ „ ๋ถˆํˆฌ๋ช…).

  • Drawer ๋ฐ ๊ด€๋ จ ์œ„์ ฏ:

  • Drawer: Scaffold์˜ drawer ์†์„ฑ์— ์ง€์ •๋˜๋ฉฐ, ํ™”๋ฉด ํ•œ์ชฝ์—์„œ ์Šฌ๋ผ์ด๋“œ ๋˜์–ด ๋‚˜์˜ค๋Š” ํŒจ๋„์ด๋‹ค.

  • DrawerHeader: Drawer ์ƒ๋‹จ ์˜์—ญ์„ ๊พธ๋ฐ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์œ„์ ฏ์ด๋‹ค.

  • ListTile: Drawer ๋‚ด์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. leading, title, trailing, onTap ๋“ฑ์˜ ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

  • ListTile: Drawer ๋‚ด์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. leading, title, trailing, onTap ๋“ฑ์˜ ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

  • PageView: ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€(ํ™”๋ฉด)๋ฅผ ์ขŒ์šฐ๋กœ ์Šคํฌ๋กค ํ•˜๋ฉฐ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์œ„์ ฏ์ด๋‹ค. (์˜ˆ: ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ)

  1. ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ธฐ์ดˆ
  • Navigator.pop(context): ํ˜„์žฌ ํ™”๋ฉด(๋ผ์šฐํŠธ)์„ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ด์ „ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. Drawer๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋‹ซ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  1. ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ (๊ฐ„๋‹จ ์˜ˆ์‹œ)
  • List<Map<String, dynamicยป: ListView.builder ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ Dart์˜ ๋ฆฌ์ŠคํŠธ์™€ ๋งต์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์ด๋‹ค. ๊ฐ Map์€ ํ•˜๋‚˜์˜ ์•„์ดํ…œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ , String ํ‚ค๋กœ ๊ฐ’์— ์ ‘๊ทผํ•œ๋‹ค.
  1. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  • lib ํด๋”: ์ฃผ๋กœ Dart ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ด๋‹ค. main.dart๊ฐ€ ๊ธฐ๋ณธ ์‹œ์ž‘ ํŒŒ์ผ์ด๋‹ค.

  • pubspec.yaml ํŒŒ์ผ: ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์˜์กด์„ฑ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํŒจํ‚ค์ง€) ๊ด€๋ฆฌ, SDK ๋ฒ„์ „ ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.

  • VSCode: ์ฃผ์š” ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  • Command Palette (Ctrl+Shift+P / Cmd+Shift+P): Flutter: New Project, Flutter: Launch Emulator ๋“ฑ ๋‹ค์–‘ํ•œ Flutter ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • ์œ ์šฉํ•œ ๋‹จ์ถ•ํ‚ค: ์ž๋™์™„์„ฑ (Ctrl+Space/Option+Esc), ๋ฆฌํŒฉํ„ฐ (Ctrl+Shift+R), ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณด๊ธฐ (Ctrl+Option) ๋“ฑ ์œ ์šฉํ•œ ๋‹จ์ถ•ํ‚ค ์ตํžˆ๊ธฐ ํ•„์ˆ˜! (์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ ๋ชฉ์ )

  • ๋‚˜์ค‘์— VSCode ๋‹จ์ถ•ํ‚ค ์œ„์ฃผ๋กœ ๊ฐ„๋‹จํ•œ ํฌ์ŠคํŒ…์„ ๋งŽ์ด ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

  • ex) VSCode์—์„œ Presentation Mode ์ผœ๋Š” ๋ฐฉ๋ฒ•

  • Emulator: ๊ฐ€์ƒ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ๋กœ, ์‹ค์ œ ๊ธฐ๊ธฐ ์—†์ด ์•ฑ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค.

  • Hot Reload (ํ•ซ ๋ฆฌ๋กœ๋“œ): ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•ฑ ์ƒํƒœ๋ฅผ ๋Œ€๋ถ€๋ถ„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์— ๋ฐ˜์˜ํ•œ๋‹ค. (๋ฒˆ๊ฐœ ๋ชจ์–‘ ์•„์ด์ฝ˜)

  • Hot Restart (ํ•ซ ๋ฆฌ์Šคํƒ€ํŠธ): ์•ฑ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค. (์› ๋ชจ์–‘ ์•„์ด์ฝ˜)

  • analysis_options.yaml: Dart ์ฝ”๋“œ ๋ถ„์„ ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค. (์˜ˆ: ํŠน์ • ๋ฆฐํŠธ ๊ทœ์น™ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”)

  • ์˜ˆ๋ฅผ ๋“ค์–ด, print ํ•จ์ˆ˜๋ฅผ ์จ์„œ Debug Console์— ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด, production์—์„œ๋Š” ์“ฐ๋ฉด ์•ˆ ๋œ๋‹ค๊ณ  ๋‚œ๋ฆฌ๋ฅผ ์นœ๋‹ค.

  • ๊ทธ๊ฑด production ๋•Œ ์•Œ์•„์„œ ๋นผ๋ฉด ๋  ์ผ์ด๋‹ˆ, ๋ฆฐํŠธ ๊ทœ์น™์—์„œ โ€˜avoid_printโ€™๋ฅผ ์ œ๊ฑฐํ•ด ๋ณด์ž.ํ•ด๊ฒฐ๋ฒ• 1. ํ•ด๋‹น dart ํŒŒ์ผ ์ƒ๋‹จ์— ignore_for_file ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ๊ทธ๊ฑด production ๋•Œ ์•Œ์•„์„œ ๋นผ๋ฉด ๋  ์ผ์ด๋‹ˆ, ๋ฆฐํŠธ ๊ทœ์น™์—์„œ โ€˜avoid_printโ€™๋ฅผ ์ œ๊ฑฐํ•ด ๋ณด์ž.

  • ํ•ด๊ฒฐ๋ฒ• 1. ํ•ด๋‹น dart ํŒŒ์ผ ์ƒ๋‹จ์— ignore_for_file ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ํ•ด๊ฒฐ๋ฒ• 2. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋‹จ์— ์žˆ๋Š” analysis_options.yaml์—์„œ ๋ฌด์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ํ•ด๊ฒฐ๋ฒ• 2. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋‹จ์— ์žˆ๋Š” analysis_options.yaml์—์„œ ๋ฌด์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ํ•ด๊ฒฐ๋ฒ• 2. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋‹จ์— ์žˆ๋Š” analysis_options.yaml์—์„œ ๋ฌด์‹œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  1. Flutter ํ•™์Šต ๋ฐฉ๋ฒ•
  • Widget Catalog & Widget of the week: Flutter ๊ณต์‹ ๋ฌธ์„œ์˜ ์œ„์ ฏ ์นดํƒˆ๋กœ๊ทธ์™€ โ€˜Widget of the weekโ€™ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์œ„์ ฏ์„ ํ•™์Šตํ•œ๋‹ค.

  • ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ์šฉ: Flutter ๊ด€๋ จ ์ปค๋ฎค๋‹ˆํ‹ฐ(์˜จ๋ผ์ธ ํฌ๋Ÿผ, ์˜คํ”ˆ์ฑ— ๋“ฑ)์—์„œ ์งˆ๋ฌธํ•˜๊ณ  ๋‹ต๋ณ€ํ•˜๋ฉฐ ํ•จ๊ป˜ ์„ฑ์žฅํ•œ๋‹ค.

  • Dart ๋ฌธ๋ฒ• ์ˆ™์ง€: Flutter๋Š” Dart ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, Dart ๋ฌธ๋ฒ•์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ’ญ ์ผ๊ธฐ

์ด๋ฏธ C, C++, Java, Javascript, Python, โ€ฆ ์ˆ˜๋งŽ์€ ์–ธ์–ด๋“ค์„ ๋‹ค๋ค„๋ดค๊ณ , Spring, Vue.js, Django, FlutterFlow ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ/ํˆด๊นŒ์ง€ ๋‹ค๋ค„๋ณธ ์‹œ์ ์ด์ง€๋งŒ, ํ˜น์‹œ๋‚˜ ๋†“์น˜๊ณ  ๊ฐ€๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…์ด ์žˆ์„๊นŒ ์‹ถ์–ด Flutter ๊ธฐ์ดˆ ๊ฐ•์ขŒ๋ถ€ํ„ฐ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐœ๋…๋“ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์Šคํ‚ต ํ•˜๋ ค ํ–ˆ๋Š”๋ฐ, ์ด๊ฑฐ ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ๊ฐœ๋ฐœ์—์„œ ์†์„ ๋†จ๋‚˜ ๋ณด๋‹ค. ๋‡Œ ๊ทผ์œก์ด ๊ตณ์—ˆ๋Š”์ง€, ๋จธ๋ฆฟ์†์— ๋น ๋ฆฟ๋น ๋ฆฟํ•˜๊ฒŒ ์–ด๋–ค ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋ ์ง€ ๊ตฌ์ƒ์ด ์ž˜ ์•ˆ๋˜๋”๋ผ.

์ด์ œ๋Š” VSCode์—์„œ Inline Chat(Gemini 2.5 Pro)์ด๋‚˜ Code Recommendation(GitHub Copilot) ๋“ฑ AI์˜ ๋„์›€์„ ๋ฐ›์œผ๋ฉด์„œ, ๊ธˆ๋ฐฉ๊ธˆ๋ฐฉ ๊ถ๊ธˆ์ฆ์„ ๋ฌป๊ณ , ๋‹ต์„ ์ฐพ์•„๋‚ด๊ณ , ์ž๋™์™„์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด์„œ ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋”ฉํ•˜๋Š” ์‹œ๋Œ€๊ฐ€ ๋˜์—ˆ๊ธฐ์—, ๋”์šฑ ๋น ๋ฅด๊ฒŒ ์ฝ”๋”ฉ ๋‡Œ ๊ทผ์œก์„ ๋ณต๊ตฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•œ๋‹ค.

๊ฐˆ ๊ธธ์ด ๋ฉ€๋‹ค! ๊ฐ€์ฆˆ์•„!

์ฒจ๋ถ€ ์ด๋ฏธ์ง€

naver-148-001

naver-148-002

naver-148-003

naver-148-004

naver-148-005

naver-148-006

naver-148-007

naver-148-008

naver-148-009

naver-148-010

์นดํ…Œ๊ณ ๋ฆฌ: ,

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ