Flutter 5

5์ผ๊ฐ„ ๊ฐœ๋ฐœํ•œ Flutter ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๊ด€์ œ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ๊ธฐ

1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”๋ฐฐ๊ฒฝ: ๊ธฐ์กด ์ž์œจ์ฃผํ–‰ ๊ด€์ œ ์‹œ์Šคํ…œ ๊ณ ๋„ํ™”๊ธฐ๊ฐ„: ์ถ”์„ ์—ฐํœด ๊ธฐ๊ฐ„ (2025.10.07 ~ 2025.10.11) ๊ฐœ์ธ ์ฃผ๋„ ์ž๋ฐœ์  ๊ฐœ๋ฐœ๋ชฉํ‘œ: ๊ธฐ์กด ์›น์˜ 5๋‹จ๊ณ„ ์ ‘๊ทผ ๋น„ํšจ์œจ ๋ฐ ์‹ค์‹œ๊ฐ„ ์ธ์ง€ ์ง€์—ฐ ๋ฌธ์ œ ํ•ด์†Œ๊ธฐ๋Šฅ: ์‹ค์‹œ๊ฐ„ ์˜์ƒ(WebRTC) + MQTT ์„ผ์„œ ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์•Œ๋ฆผ2. ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ๋ฐฐ๊ฒฝ ๊ธฐ์กด ๊ด€์ œ ์›น ๋Œ€์‹œ๋ณด๋“œ๋Š” ์žฆ์€ ํ˜„์žฅ ์ถœ์žฅ๊ณผ ์ƒˆ๋ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์ˆ˜์ธ ์—…๋ฌด ํ™˜๊ฒฝ์— ๋ถ€์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ฐจ๋Ÿ‰ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ๋…ธํŠธ๋ถ์„ ์ผœ๊ณ , ์‚ฌ์ดํŠธ ์ ‘์† → ๋กœ๊ทธ์ธ → ์ฃผํ–‰ ํ˜„ํ™ฉ ํƒญ ํด๋ฆญ → ํŠน์ • ์ฐจ๋Ÿ‰ ์„ ํƒ๊นŒ์ง€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ๋งŒ ์›ํ•˜๋Š” ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ํ™•์ธํ•˜๋Š” ์ •๋ณด๋Š” ํ•œ์ •๋˜์–ด ์žˆ์—ˆ์ง€๋งŒ ์ ‘๊ทผ ๊ณผ์ •์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ..

[Flutter] ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์—์„œ ์ „ํ™”๊ฑธ๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

Flutter ์•ฑ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.1. ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜๋จผ์ € url_launcher ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” ์™ธ๋ถ€ ์•ฑ(์ „ํ™”, ๋ฌธ์ž, ๋ธŒ๋ผ์šฐ์ € ๋“ฑ)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.pubspec.yaml์— ์˜์กด์„ฑ ์ถ”๊ฐ€dependencies: flutter: sdk: flutter url_launcher: ^6.2.1 # ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉํŒจํ‚ค์ง€ ์„ค์น˜flutter pub get 2. ํ”Œ๋žซํผ๋ณ„ ๊ถŒํ•œ ์„ค์ •Android ์„ค์ •android/app/src/main/AndroidManifest.xml ํŒŒ์ผ์— ์ „ํ™” ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: iOS ์„ค์ •ios/Runner/Info.p..

[Flutter] ํ”Œ๋Ÿฌํ„ฐ์—์„œ Google Maps ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •๋ฆฌ

Flutter ์•ฑ์—์„œ ์ง€๋„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ Google Maps API ํ‚ค ์„ค์ •๋ถ€ํ„ฐ ์‹ค์ œ ์ง€๋„ ๊ตฌํ˜„๊นŒ์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.1. Google Cloud Console์—์„œ API ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ1-1. Google Cloud Console ์ ‘์†Google Cloud Console์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค1-2. Maps API ํ™œ์„ฑํ™”์ขŒ์ธก ๋ฉ”๋‰ด์—์„œ "API ๋ฐ ์„œ๋น„์Šค" → "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ํด๋ฆญ"Maps SDK for Android" ๊ฒ€์ƒ‰ ํ›„ ํ™œ์„ฑํ™”"Maps JavaScript API"๋„ ํ•จ๊ป˜ ํ™œ์„ฑํ™” (์›น์—์„œ๋„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ)1-3. API ํ‚ค ์ƒ์„ฑ"API ๋ฐ ์„œ๋น„์Šค" → "์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด" ํด๋ฆญ"+ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ" → "API ..

[Flutter] ํ”Œ๋Ÿฌํ„ฐ ์•ฑ ๊ฐœ๋ฐœ ์‹œ ํ™”๋ฉด ์ „ํ™˜ ์‹œ ๋ฌดํ•œ ๋กœ๋”ฉ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ

๋ฌธ์ œ ์ƒํ™ฉ Flutter ์•ฑ์—์„œ MenuScreen์—์„œ StoreListScreen์œผ๋กœ ํ™”๋ฉด ์ „ํ™˜ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค..API ํ˜ธ์ถœ์€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋จ๋ฐ์ดํ„ฐ๋„ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•„์˜ดsetState()๋„ ์ •์ƒ ํ˜ธ์ถœ๋˜์–ด _isLoading์ด false๋กœ ๋ณ€๊ฒฝ๋จbuild() ๋ฉ”์„œ๋“œ๋„ ๋‹ค์‹œ ํ˜ธ์ถœ๋จํ•˜์ง€๋งŒ ํ™”๋ฉด์—๋Š” ๊ณ„์† ๋กœ๋”ฉ ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋จ ์ดˆ๊ธฐ ์‹œ๋„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋“ค1. ๊ธฐ๋ณธ์ ์ธ ๋””๋ฒ„๊น…print('๐Ÿ“ฑ BUILD ํ˜ธ์ถœ๋จ - _isLoading: $_isLoading, storeData.length: ${storeData.length}');print('๐Ÿ“ฑ ์กฐ๊ฑด ํ™•์ธ - _isLoading == true: ${_isLoading == true}');print('๐Ÿ“ฑ ์กฐ๊ฑด ํ™•์ธ - _isLoading ==..

[Flutter] ์ฃผ๋‹ˆ์–ด ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์˜ Flutter ์„ธ์…˜ ๊ด€๋ฆฌ ์‚ฝ์งˆ๊ธฐ

Spring Boot๋กœ 2๋…„๊ฐ„ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•ด์˜จ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ฒ˜์Œ์œผ๋กœ Flutter ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ ๊ฒช์€ ๋ผˆ์•„ํ”ˆ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์„ธ์…˜ ๊ด€๋ฆฌ ๋ถ€๋ถ„์—์„œ ํฌ๋กฌ์—์„œ๋Š” API ํ˜ธ์ถœ์ด ์•ˆ ๋˜๋Š”๋ฐ, APK๋กœ ์ถ”์ถœํ•ด์„œ ๋ชจ๋ฐ”์ผ๋กœ API ํ˜ธ์ถœ์„ ํ•˜๋ฉด ์ž˜ ๋˜๋Š” ํ™ฉ๋‹นํ•œ ์ƒํ™ฉ์„ ๊ฒช์—ˆ๋Š”๋ฐ, ๊ฐ™์€ ๋ฌธ์ œ๋กœ ๊ณ ์ƒํ•˜์‹ค ๋ถ„๋“ค์„ ์œ„ํ•ด ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค.0. ๋ฌธ์ œ ์ƒํ™ฉSpring Boot + Spring Security๋กœ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•œ REST API ์„œ๋ฒ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Postman์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์ฃ .1. POST /login (username, password) -> 200 OK + SESSION ์ฟ ํ‚ค2. GET /categories (SESSION ์ฟ ํ‚ค ํฌํ•จ) -> 200 OK + ๋ฐ์ดํ„ฐ ํ•˜์ง€๋งŒ Fl..