๐Ÿ‹ Flutter

๊ฐœ์š”์–ผ๋งˆ ์ „์— ํ”Œ๋Ÿฌํ„ฐ๋กœ ๋™๊ธ€๋™๊ธ€ํ•œ UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘ Stack ๊ตฌ์กฐ์— ์ž์‹์œ„์ ฏ๋“ค์„ ์›ํ˜•์œผ๋กœ ๋ฐฐ์น˜ํ•ด์•ผ ๋˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค.๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์›ํ˜•๋ฐฐ์น˜๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” dart:math ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์‚ผ๊ฐํ•จ์ˆ˜ ๊ธฐ๋Šฅ๋“ค (sin, cos) ๋“ฑ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๊ณ , ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„์„ ํ•˜๊ฒŒ ๋˜์–ด์„œ ๊ณต์œ ๋ฅผ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.์•„๋ž˜์˜ ์‚ฌ์ง„์€ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์›ํ˜• ์Šคํƒ ๊ตฌ์กฐ์˜ ๋ชจ์Šต์ด๋‹ค.   ๊ณผ์ผ์˜ ์ด๋ฆ„๋“ค์„ ๋”ฐ์„œ ๊ฐ ๊ฐœ์ˆ˜๋งŒํผ ์ž๋™์œผ๋กœ ์›ํ˜• ๋ฐฐ์น˜๊ฐ€ ์ด๋ค„์ง€๋Š” ๊ตฌ์กฐ๋‹ค.์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์‚ผ๊ฐ๋น„์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.์ค‘ํ•™๊ต ๋•Œ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ์ด์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๊ฑฐ์˜ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์›ํ˜• ์ขŒํ‘œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์› ๋ฐฉ์ •์‹์„ ์ด์šฉํ•˜๋‹ค ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ธ ์‚ผ๊ฐ๋น„๋ฅผ ๊ธฐ์–ตํ•ด ๋‚ด๊ฒŒ ๋˜์—ˆ๋‹ค.  ์‚ผ๊ฐ๋น„๋ฅผ ํ†ตํ•œ ๊ณ„์‚ฐ ๊ณต์‹  ์ž, ๋ณต์Šต์„..
MediaQuery์— ๋Œ€ํ•ดํ”Œ๋Ÿฌํ„ฐ์—์„œ๋Š” MediaQuery๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.MediaQuery๋Š” ์•ฑ์ด ์‹คํ–‰ ์ค‘์ธ ์žฅ์น˜์˜ ํ™”๋ฉด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ํ™”๋ฉด์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.Flutter์—์„œ ๋ฐ˜์‘ํ˜• UI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—†์–ด์„œ๋Š” ์•ˆ ๋  ์กด์žฌ์ด๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ UI ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. MediaQuery ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“คMediaQuery๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” MediaQuery.of(context).[property] ๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.ํ˜„์žฌ 3.24.0 ๊ธฐ์ค€์œผ๋กœ MediaQuery์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. sizewithNoTextScalingwithClampedTextScalingv..
๊ฐœ์š”ํ”Œ๋Ÿฌํ„ฐ์—์„œ ํ˜„์ง€ํ™”(Localization)๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ‚ค์ง€๋Š” ๋‹ค์–‘ํ•˜๋‹ค.๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€์ธ easy_localization๊ณผ ํ”Œ๋Ÿฌํ„ฐ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์ธ flutter_localizations๊ฐ€ ์žˆ๋‹ค (flutter_localization ์•„๋‹˜)๊ทธ๋Ÿฌ๋˜ ์ค‘ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์‘ํ˜• ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ localization์„ ์ ์šฉํ–ˆ์„ ๋•Œ ๋งค๋ฒˆ ์•ฑ์„ ์žฌ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ ์ด ๋‚˜๋ฅผ ๊ดด๋กญ๊ฒŒ ํ–ˆ๋‹ค.๋˜ํ•œ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ๋„์›€๋ฐ›์•„์„œ localization์„ ์ ์šฉํ•˜๋ ค๋‹ˆ ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง€๋Š” ๋Š๋‚Œ๋„ ๋“œ๋Š” ๊ฒŒ ์ข‹์ง€ ์•Š์•˜๋‹ค.์ด์ฐธ์— ์ƒˆ๋กญ๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒธ ๋‚˜๋Š” ์™ธ๋ถ€ํŒจํ‚ค์ง€์˜ ๋„์›€ ์—†์ด ์ง์ ‘ localization์„ ์ ์šฉํ•ด ๋ณด์ž๊ณ  ๊ฒฐ์‹ฌ์„ ํ–ˆ๊ณ , ๊น”๋”ํ•˜๊ฒŒ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ localization์„ ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.  ๊ตฌ์„ฑFlutter 3.10..
๊ฐœ์š”์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.Flutter ๋„ ์ดˆ์ฐฝ๊ธฐ 1.x ๋ฒ„์ „ ๋‹น์‹œ์—๋งŒ ํ•ด๋„ ์–ด๋–ค ํด๋ž˜์Šค๋“  ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ new ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์˜€์–ด์•ผ ํ–ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ Widget ๋“ค์€ class๋กœ ์„ ์–ธ๋˜์–ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— new ํ‚ค์›Œ๋“œ์˜ ์žฆ์€ ์‚ฌ์šฉ์œผ๋กœ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ฒŒ ๋˜๋ฉด์„œ  new๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ ์ž๋™์œผ๋กœ new ์ƒ๋žตํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. (์ผ๋ฐ˜ class๋„ ์ ์šฉ๋จ)๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฌด์ˆ˜ํžˆ ๋งŽ์ด ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.์ด๋•Œ ์‹ฑ๊ธ€ํ†คํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค.๋˜ํ•œ ์–ดํ”Œ๋ฆฌ..
๊ฐœ์š”์ด๋ฒˆ ์ฃผ์ œ๋Š” Flutter web์„ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” --web-renderer์˜ ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ html, canvaskit์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.์ด๋ฒˆ ์ฃผ์ œ์—์„œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ Œ๋”๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ wasm์€ ๋ณดํ†ต ๋ Œ๋”๋Ÿฌ๋ผ๊ณ  ํ•˜์ง€ ์•Š์•„ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋…ผํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ฒ ๋‹ค.์–ผ๋งˆ ์ „์— ํ”Œ๋Ÿฌํ„ฐ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•œ ํ”Œ๋Ÿฌํ„ฐ ์›น์„ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ๋‹ค.๊ฐœ๋ฐœ์šฉ PC์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„ ์ตœ๋Œ€ํ•œ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชน์‹œ ์•„๋ฆ„๋‹ค์šด ๋™์  ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋ ค๊ณ  ํ–ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ์ค‘๊ฐ„์ •๋„ ์™„์„ฑ์„ ํ•œ ํ›„ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„ PC์— ์žˆ๋Š” Nginx๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌ๋ฅผ ํ–ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ๋‚ด๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋งฅ๋ฏธ๋‹ˆ์—์„œ ๋ฐฐํฌ๋œ ์›น์‚ฌ์ดํŠธ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ชจ์Šต์œผ๋กœ ์ž˜ ๋ Œ๋”๋ง์ด ๋˜์—ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๊ธฐ๊ธฐ ์ค‘ ์„ฑ..
๊ฐœ์š”์„œ๋ฒ„์šฉ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์— Code-Server๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์ฝ”๋”ฉ์— ๋Œ€ํ•œ ์ œ์•ฝ ์‚ฌํ•ญ์ด ๋งŽ์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค.์•„์ดํŒจ๋“œ์—์„œ ๋‚ด ๊ฐœ์ธ Code-Server๋กœ ์ ‘์†ํ•˜์—ฌ NodeJS API ๊ตฌํ˜„์„ ํ•˜๋Š” ๋“ฑ, ๊ฐœ๋ฐœ ์ทจ๋ฏธ์— ๋Œ€ํ•œ ์ž์œ ๋„๊ฐ€ ๋งŽ์ด ๋†’์•„์กŒ๋‹ค. (๋””์Šค์ฝ”๋“œ ๋ด‡๋„ code-server๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌํ˜„ ์™„๋ฃŒ). Code-Server ๋งŒ์„ธ!!!!์š”์ฆ˜์— Flutter Web์„ ํ†ตํ•ด ์ด๋Ÿฐ์ €๋Ÿฐ ์‹คํ—˜์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, Flutter Web๋„ Headless-server๋ฅผ ๊ทผ๋ณธ์œผ๋กœ ํฌํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ Chrome์ด๋‚˜ ๊ธฐํƒ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋””๋ฒ„๊ทธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋Š” ๋“ฏํ–ˆ๋‹ค.๊ทผ๋ฐ ์ด ๋…€์„, ๋งŒ์•ฝ ์™ธ๋ถ€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด, Code-Server๋ฅผ ํ†ตํ•ด์„œ๋„ ์ถฉ๋ถ„ํžˆ Flutter ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์–ด๋–จ๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด..
Dogfoot_JW
'๐Ÿ‹ Flutter' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก