์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    [Architecture] MVVM + Clean Architecture๋ฅผ ์•Œ์•„๋ณด์ž

    SwiftUI ํŠน์„ฑ์ƒ ViewModel์„ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ๋งค์šฐ ์‰ฝ๋‹ค. @ObservedObject ์งฑ์งฑ! ๋•๋ถ„์— ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ViewModel๋กœ ๋ถ„๋ฆฌ๋Š” ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค. Massive ViewModel์ด๋ž„๊นŒ? ๊ทธ๋ž˜์„œ ํ•ด์ปคํ†ค ๋•Œ๋Š” ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๊ฑท์–ด๋‚ด๊ณ  ์•„ํ‚คํ…์ณ์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ๊ดœ์ฐฎ์€ ์•ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ํŒ€์› ์ค‘ ํ•œ ๋ถ„์ด ํด๋ฆฐ ์•„ํ‚คํ…์ณ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ๊ณ„์…”์„œ ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•˜๊ณ , ์ „๋ณด๋‹ค๋Š” ์–ด๋Š์ •๋„ ์™„์„ฑ๋œ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์„œ๋ก ์ด ๊ธธ์—ˆ์ง€๋งŒ ์•„๋ฌดํŠผ ํ•ด์ปคํ†ค์„ ๊ณ„๊ธฐ๋กœ Clean Architecure์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์–ด์„œ ์ „์— ๋ถ๋งˆํฌํ•ด๋‘” ๊ธ€์„ ๋ณด๋ฉด์„œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. Clean Architecture and MVVM on iOS When we deve..

    [iOS / SwiftUI] MapKit, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋„๋กœ๋ช… ์ฃผ์†Œ ๋ณ€ํ™˜ํ•˜๊ธฐ

    23.01.13 - ์•ฑ์„ ์ฒ˜์Œ ์„ค์น˜ํ–ˆ์„ ๋•Œ ํ˜„์žฌ ์œ„์น˜๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ์ง€๋‚œ ๋ฒˆ ํ”„๋กœํ† ํƒ€์ž…์— ์ด์–ด ์ด๋ฒˆ ์ฃผ๋ถ€ํ„ฐ๋Š” MVP๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๊ธฐ์กด์— ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์‹ค์ œ FireStore์™€ ์—ฐ๋™ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์žก์•˜๋‹ค. ์ด๋ฒˆ ์ฃผ์— ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ์›€์ง์ธ ์ขŒํ‘œ์— ๋Œ€ํ•œ ๋„๋กœ๋ช… ์ฃผ์†Œ๋ฅผ ์‹ค์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ด 2. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ๋งˆ์ปค๊ฐ€ ์‚ด์ง ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ์›€์ง์ž„์ด ๋ฉˆ์ถ”๋ฉด ๋งˆ์ปค๊ฐ€ ๋‹ค์‹œ ๋‚ด๋ ค์˜ด 3. ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜๋กœ ์ง€๋„์˜ Focus๋ฅผ ๋ณ€๊ฒฝํ•จ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. 1. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ์›€์ง์ธ ์ขŒํ‘œ์— ๋Œ€ํ•œ ๋„๋กœ๋ช… ์ฃผ์†Œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ง์ด ์ข€ ๊ธธ๋‹ค. ๊ฐ„..

    [iOS / SwiftUI] OnAppear, OnDisappear๋Š” ์–ธ์ œ ํ˜ธ์ถœ๋ ๊นŒ?

    SwiftUI๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ View ๋‚ด๋ถ€์—์„œ ์ง์ ‘์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ onAppear๋ฅผ ํ•œ ๋ฒˆ์ฏค์€ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ฐ€๋ น, print(ํ”„๋กœํผํ‹ฐ)์ฒ˜๋Ÿผ View ๋‚ด๋ถ€์—์„œ ์ ‘๊ทผํ•˜๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. View๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋‹ฌ๋ผ๋Š” ์—๋Ÿฌ๋‹ค. ์ด๋Ÿฐ ์—๋Ÿฌ์™€ ๋งˆ์ฃผ์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด View ๋‚ด๋ถ€์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , onAppear ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค. ์•„๋ฌดํŠผ ์ด๋Ÿด ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” onAppear๋Š” SwiftUI View Life Cycle์— ์†ํ•˜๊ณ , ์˜ค๋Š˜์€ Life Cycle์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. SwiftUI์—์„  3๊ฐœ์˜ Life Cycle์ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ Appear, Update, Disappear ์ด๋‹ค. 1. onAppear onAppear์€ View๊ฐ€ ๋ณด์—ฌ์ง€๊ธฐ..

    [์—๋Ÿฌ์™€์˜ ๋™์นจ] 22๋…„ 11์›” 4์ฃผ์ฐจ

    22.11.21 json์— ์กด์žฌํ•˜๋Š” key, value๋ฅผ struct์—์„œ ์ •์˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์ •์ƒ์ ์œผ๋กœ Decoding ๋ฐ˜๋Œ€๋กœ json์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” key, value๋ฅผ struct์—์„œ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” KeyNotFound Error๊ฐ€ ๋ฐœ์ƒ ํŠน์ • value์— key-value๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์กด์žฌํ•  ๋•Œ๋Š” Optional์„ ์ ์šฉ ๋งŒ์•ฝ, key-value๋ฅผ ์ œ๋Œ€๋กœ ์ •์˜ํ–ˆ๋Š”๋ฐ KeyNotFound Error๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠน์ • key-value๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ 22.11.22 json์—๋Š” id๊ฐ€ ์—†์ง€๋งŒ identifiable์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด uuid๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒฝ์šฐ var์ด ์•„๋‹Œ let์œผ๋กœ ์„ ์–ธ EnvironmentObject๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ตœ์ƒ๋‹จ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ์— ๋ทฐ์˜ ๊ฒŒ์ธต ๊ตฌ์กฐ..

    [iOS / SwiftUI] ์Šคํฌ๋กค, ๋ฌดํ•œ์œผ๋กœ ์ฆ๊ฒจ์š”~ (LazyVStack์œผ๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ)

    ์˜ค๋Š˜์€ ScrollView์™€ LazyVStack์„ ํ™œ์šฉํ•˜์—ฌ SwiftUI์—์„œ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค, LazyVStack์ด ์กฐ๊ธˆ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. LazyVStack์€ ๋ง ๊ทธ๋Œ€๋กœ Lazyํ•˜๊ฒŒ VStack์„ ๊ทธ๋ฆฐ๋‹ค๋Š” ๋Š๋‚Œ์œผ๋กœ, VStack์œผ๋กœ ๋ณด์—ฌ์ค„ ํ•ญ๋ชฉ์ด ์‹ค์ œ๋กœ UI์— ๋ณด์—ฌ์งˆ ๋•Œ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๋Š” View์ด๋‹ค. Apple Developer Documentation developer.apple.com ๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ VStack๊ณผ๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ? ํ‰์†Œ์— ์‚ฌ์šฉํ•˜๋˜ VStack์€ ๋ทฐ๊ฐ€ ๋ณด์—ฌ์งˆ ๋•Œ(onAppear) ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ScrollView + VStack ์กฐํ•ฉ์œผ๋กœ List๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ์ดˆ๊ธฐ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค. ์ ์€ ๊ฐœ์ˆ˜์˜ ๊ฐ„๋‹จํ•œ ํ•ญ๋ชฉ๋“ค์„ ..

    "let us: Go! 2022 Fall"์— ๋‹ค๋…€์™”์Šต๋‹ˆ๋‹ค!

    ๋‘๊ทผ๋‘๊ทผ ๋ ›์–ด์Šค๊ณ ! ๐Ÿ‘‹ ์ง€๋‚œ ์ฃผ์— ๋ ›์–ด์Šค๊ณ ์— ๋‹ค๋…€์™”๋‹ค. 11์›” 5์ผ์— ๋‹ค๋…€์™”์ง€๋งŒ! ์ง€๊ธˆ ํšŒ๊ณ ๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค. ์›๋ž˜ ํšŒ๊ณ ๋Š” ์ผ์ฃผ์ผ ๋’ค์— ์“ฐ๋Š”๊ฒŒ ๊ตญ๋ฃฐ! ๐Ÿ˜‹ ์šฐ์„  ๋ ›์–ด์Šค๊ณ ๋Š” ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ‹์‚ฌ ์•ฑ์Šค์ฟจ์—์„œ ํ•œ ๋ถ„์ด ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์ฃผ์…”์„œ ์•Œ๊ฒŒ ๋๊ณ , ์šด ์ข‹๊ฒŒ ํ‹ฐ์ผ“ํŒ…์— ์„ฑ๊ณตํ•ด์„œ ์ฐธ๊ฐ€ํ•˜๊ฒŒ ๋๋‹ค. ํ‹ฐ์ผ“์€ ํ•™์ƒ ํ‹ฐ์ผ“๊ณผ ์ผ๋ฐ˜ ํ‹ฐ์ผ“์ด ์žˆ๋‹ค. ํ•™์ƒ ํ‹ฐ์ผ“์ด ํ›จ์”ฌ ์ €๋ ดํ•˜์ง€๋งŒ ์ˆ˜๋Ÿ‰์ด ์ ์–ด์„œ, ํ•™์ƒ ํ‹ฐ์ผ“ ์˜ˆ๋งค์—๋Š” ์‹คํŒจํ–ˆ๊ณ  ์ผ๋ฐ˜ ํ‹ฐ์ผ“์„ ์˜ˆ๋งคํ–ˆ๋‹ค! ๋ฒ„์Šค๋ฅผ ํƒ€๊ณ  ์„œ์šธ๊นŒ์ง€ ๊ฐ€์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ ์กฐ๊ธˆ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ iOS ์„ธ๋ฏธ๋‚˜๋ฅผ ์ฐธ๊ฐ€ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์•„์นจ ์ผ์ฐ ์„œ์šธ์„ ํ–ฅํ–ˆ๋‹ค. ๋ฐœํ‘œ ์žฅ์†Œ๋Š” ์ฝ”์—‘์Šค ์•ž์— ์žˆ๋Š” Finda์˜€๋‹ค. 30๋ถ„ ์ •๋„ ์ผ์ฐ ๋„์ฐฉํ–ˆ๋”๋‹ˆ ์šด์˜์ง„์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฑฐ์˜ ์—†์—ˆ๋‹ค. ๋’ค์— ๊ณ„์‹  ๋ถ„๊ณผ ์–˜๊ธฐ๋ฅผ ๋‚˜๋ˆŒ๊นŒํ–ˆ์ง€๋งŒ ๊ฐ™์ด ์˜ค์‹  ๋ถ„์ด ์žˆ..

    [iOS / Swift] Swift ๋ฌธ์ž์—ด ์ •๋ณตํ•˜๊ธฐ (aka 'Character')

    Swift๋กœ ๋ฌธ์ž์—ด ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๋ณด๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค. (error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String) '์ด๊ฒŒ ์™œ ์•ˆ๋จ? ใ…‹ใ…‹' ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ์ •๋„๋กœ ์•ˆ๋œ๋‹ค. ์•„๋ฌดํŠผ ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ์ž์ฃผ ์ ‘ํ–ˆ๊ธฐ์— ๊ธ€๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณต์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. 1. ๋ฌธ์ž์—ด ํ˜• ๋ณ€ํ™˜ํ•˜๊ธฐ 1. String -> Int ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ์ฒ˜๋Ÿผ Int()๋กœ ํ˜• ๋ณ€ํ™˜์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ด ๋•Œ, String์ธ์ง€ SubString์ธ์ง€ Character์ธ์ง€ ์ž˜ ์‚ดํŽด๋ณธ๋‹ค. (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด... error: cannot convert value of type 'String.Element' (aka 'Chara..

    [iOS / SwiftUI] ๋‹ค์–‘ํ•œ ์ƒํƒœ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์•Œ์•„๋ณด์ž!

    State์™€ Binding ์ง€๋‚œ ์‹œ๊ฐ„ @State์™€ @Binding ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค. 1. @State @State ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์„ ์–ธ๋œ ๋ทฐ์™€ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ข€ ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ๋ทฐ์™€ ๋ฐ”์ธ๋”ฉ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋ทฐ๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‚ดํŽด๋ณด์ž. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ˆซ์ž๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ ์•ฑ์ด๋‹ค. struct ContentView: View { @State private var number: Int = 0 var body: some View { VStack { Text("\(self.number)") Button(action: { self.number += 1 }) ..

    [iOS / SwiftUI] ํ‚ค๋ณด๋“œ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„์š”...๐Ÿ˜ฉ

    SwiftUI Keyboard Dismiss ์–ด์ œ ๊ตฌํ˜„ํ•œ ํŒ€ ๊ณผ์ œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ตฌํ˜„ํ•˜๋˜ ๋„์ค‘์— ์ถ”๊ฐ€ํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์†Œํ”„ํŠธ ํ‚ค๋ณด๋“œ ํ˜น์€ ๋ฒ„ํŠผ์„ ํ†ตํ•ด์„œ ์ž…๋ ฅ ๋ฐ›๋Š”๋ฐ, ์†Œํ”„ํŠธ ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅ ๋ฐ›์€ ๊ฒฝ์šฐ์— Submit์„ ๋ˆ„๋ฅด์ง€ ์•Š๊ณ , ๋ทฐ์˜ ํด๋ฆญํ•˜๋”๋ผ๋„ ์†Œํ”„ํŠธ ํ‚ค๋ณด๋“œ๊ฐ€ ๋‹ซํžˆ๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. 1. Focused ์šฐ์„  ์ด ๊ธฐ๋Šฅ์€ SwiftUI 3.0 (iOS 15) ์ด์ƒ๋ถ€ํ„ฐ ์ง€์›ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ํƒ“์ธ๊ฐ€ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. var body: some View { @State private var input: String = "" @FocusState private var isFocused: Bool // ์ƒ๋žต... VStack { TextField("PlaceHolder", $i..

    [iOS / SwiftUI] ForEach๋กœ View๋ฅผ ๋ฆฌํŽ™ํ† ๋ง ํ•ด๋ณผ๊นŒ์š”?

    Swift UI์—์„œ ForEach๋กœ View ์—ฌ๋Ÿฌ ๊ฐœ ์˜ค๋Š˜ ์Šคํ„ฐ๋””์—์„œ ๋‚ ์”จ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€๋ฅผ Swift UI๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. HStack๊ณผ VStack์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ์˜€๊ณ  ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•˜๊ณ  ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„์ด ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด์„œ ๊ฒน์น˜๋Š” ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„ ์ด๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋นจ๊ฐ„์ƒ‰ ๋ทฐ ์•ˆ์— ์ดˆ๋ก์ƒ‰ ๋ทฐ๋“ค์ด ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์—๋Š” HStack ๋‚ด๋ถ€์— VStack์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ForEach๋ฅผ ํ™œ์šฉํ•ด์„œ VStack์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค. 1. ๊ธฐ์กด ์ฝ”๋“œ struct DailyHourWeatherView: View { var body: some View { HS..