์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 
์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 

[Lv.3] ์‹ค์ „ ๋„คํŠธ์›Œํฌ ํ†ต์‹  - SwiftUI Combine, Async/Await

SwiftUI์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ํ•ต์‹ฌ์ธ Combine๊ณผ Async๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ฃจ๋ฉฐ, ์‹ค์ „ ํ”„๋กœ์ ํŠธ์™€ ์ตœ์‹  ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ SwiftUI ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. (๐Ÿ“Œ ๋ชจ๋“  ๊ฐ•์˜ ์ž๋ฃŒ PDF ๋ฐ ์‹ค์Šต Code ํŒŒ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค)

Thumbnail

์ค‘๊ธ‰์ž๋ฅผ ์œ„ํ•ด ์ค€๋น„ํ•œ
[๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ, SwiftUI] ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”

  • Combine ๊ณผ Async/Await ์„ ํ™œ์šฉํ•œ SwiftUI ๋„คํŠธ์›Œํฌ ํ†ต์‹ 

  • ์‹ค์ „ ํ”„๋กœ์ ํŠธ(MBox Movie App)๋กœ ๋ฐฐ์šฐ๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

  • JSON ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”์™€ Codable ํ™œ์šฉ๋ฒ•

  • SwiftUI Concurrency ์‹ฌํ™” ํ•™์Šต

SwiftUI ์•ฑ์€ ์–ด๋–ป๊ฒŒ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‹ต์€ Combine๊ณผ Async/Await์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ์•ฑ ๊ฐœ๋ฐœ์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ํ•„์ˆ˜์ ์ธ ์ž‘์—…์ด๋ฉฐ, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ Combine๊ณผ Async/Await์ž…๋‹ˆ๋‹ค.

๋ณธ ๊ฐ•์˜์—์„œ๋Š” SwiftUI์™€ ํ•จ๊ป˜ Combine๊ณผ Async/Await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ(MBox Movie App)๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. Publisher์™€ Operator, JSON ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”, ๊ทธ๋ฆฌ๊ณ  TMDB API ํ†ตํ•ฉ๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ •์„ ์‹ค์Šตํ•˜๋ฉฐ iOS ๊ฐœ๋ฐœ ๊ธฐ์ˆ ์„ ํ•œ ๋‹จ๊ณ„ ๋” ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜์˜ ํŠน์ง• ๐Ÿ”‘

๐Ÿ“Œ SwiftUI๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ตฌํ˜„: ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” Combine๊ณผ Async/Await๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“Œ  ์‹ค์ „์—์„œ ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅ: JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, API ํ†ตํ•ฉ, ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ๋“ฑ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ๋“ค์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๐Ÿ“Œ์ด๋ก  10%, ์‹ค์Šต 90%: ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ง์ ‘ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ, ์‹ค์ œ ์•ฑ์—์„œ ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ณผ์ •: SwiftUI ๊ธฐ์ดˆ๋ฅผ ๋‹ค์กŒ๋‹ค๋ฉด ๋ฐ”๋กœ ๋„์ „ ๊ฐ€๋Šฅ! iOS ๊ฐœ๋ฐœ ๊ธฐ์ˆ ์„ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์„ธ์š”.

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜ ์ถ”์ฒœํ•ด์š”

iOS ์•ฑ ๊ฐœ๋ฐœ์„ ๋ ˆ๋ฒจ์—… ์›ํ•ด์š”

Combine๊ณผ Async/Await์˜ ํ•ต์‹ฌ์„ ์ดํ•ดํ•˜๊ณ  SwiftUI๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž.

์‹ค์ „ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๊ณ  ์‹ถ์œผ์‹  ๋ถ„
JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, API ์—ฐ๋™ ๋“ฑ ์‹ค๋ฌด ๊ธฐ์ˆ ์„ ํ•™์Šตํ•˜๋ฉฐ ์‹ค์ œ ์•ฑ(MBox Movie App)์„ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ถ„.

์ตœ์‹  iOS ๊ธฐ์ˆ ์— ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„
SwiftUI์˜ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ๊ฒฝํ—˜ํ•˜๋ฉฐ, ์ตœ์‹  ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ณ  ์‹ถ์œผ์‹  ๋ถ„.

์ด๋Ÿฐ ๋‚ด์šฉ์„ ๋ฐฐ์›Œ์š”. ๐Ÿ“š

Combine๊ณผ Async/Await์˜ ์™„๋ฒฝ ์ดํ•ด

โ€ข ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ตœ์‹  SwiftUI ๊ธฐ์ˆ (Combine๊ณผ Async/Await)์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

โ€ข URLSession์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ Combine์˜ Publisher, Subscriber, Operator, ๊ทธ๋ฆฌ๊ณ  Async/Await๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ  ์ตํžˆ๊ธฐ

โ€ข Combine์˜ Filter์™€ Sequence Operations๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

โ€ข ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ(Transforming, Filtering, Timing, Multiple Publisher Operations)์„ ์‹ค์Šต์„ ํ†ตํ•ด ์ตํž™๋‹ˆ๋‹ค

์‹ค์ „ ํ”„๋กœ์ ํŠธ: MBox Movie App ๊ฐœ๋ฐœ

โ€ข TMDB API๋ฅผ ํ™œ์šฉํ•œ ์˜ํ™” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” MBox Movie App ์ œ์ž‘.

โ€ข HomeView, DetailView, MyListView ๋“ฑ์„ ๊ตฌ์„ฑํ•˜๋ฉฐ ์‹ค์ œ ์•ฑ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


SwiftUI Concurrency

โ€ข Async/Await, Task, Actor ๋“ฑ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ํ•™์Šตํ•˜๋ฉฐ, ๊ธฐ์กด CompletionHandler ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค.

โ€ข TaskGroup๊ณผ Actor๋ฅผ ํ™œ์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

โ€ข ์‹ค์ „ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด SwiftUI์—์„œ Concurrency์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.


PDF ์ด๋ก  ์ž๋ฃŒ ๋ฐ ์‹ค์Šต ํŒŒ์ผ ์ œ๊ณต

โ€ข ๊ฐ•์˜์— ํ•„์š”ํ•œ ๋ชจ๋“  PDF ์ž๋ฃŒ์™€ Xcode ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โ€ข ๋‹จ๊ณ„๋ณ„ ์ฝ”๋“œ ์˜ˆ์ œ๋กœ ๊ฐ•์˜ ๋‚ด์šฉ์„ ๋ฐ”๋กœ ์‹ค์Šตํ•˜๊ณ  ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ๋ชจ๋“  ๊ณผ์ •์„ ํ†ตํ•ด SwiftUI์˜ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ๋งˆ์Šคํ„ฐํ•˜๊ณ , ์‹ค์ „์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๐Ÿš€

์„ ์ˆ˜ ๊ฐ•์˜

Swift์™€ SwiftUI์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์ด ๊ฐ•์˜๋ฅผ ์‹œ์ž‘ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๊ธฐ์ดˆ์ ์ธ Swift ๋ฌธ๋ฒ• ๋ฐ SwiftUI ์‚ฌ์šฉ๋ฒ•์ด ๋ถ€์กฑํ•˜๋‹ค๋ฉด ์•„๋ž˜ ๊ฐ•์˜๋“ค์„ ๋จผ์ € ์ˆ˜๊ฐ•ํ•˜์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

UPDATE LOG ๐Ÿ†™

[2.0] Add Concurrency Section - 2025-02-17

  • Cuncurrency Intro

  • Async-Await

  • Task

  • Actor

  • @MainActor

  • AsyncLet

  • TaskGroup

  • Continuation

  • AsyncStrem

์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ  ์‚ฌํ•ญ

์‹ค์Šต ํ™˜๊ฒฝ

  • ์šด์˜์ฒด์ œ: ๊ฐ•์˜๋Š” macOS ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. Xcode ๊ด€๋ จ ์ž‘์—…์€ macOS ํ™˜๊ฒฝ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ๋„๊ตฌ: ์ตœ์‹  Xcode ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์˜ ์ค‘ ์ œ๊ณต๋˜๋Š” ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์€ Xcode 15 ์ด์ƒ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค..

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”!

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • SwiftUI์™€ Combine์„ ์‹ฌํ™” ํ•™์Šตํ•˜๊ณ  ์‹ถ์€ ๋ถ„

  • ์‹ค์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ธฐ์ˆ ์„ ์ตํžˆ๊ณ  ์‹ถ์€ ๋ถ„

  • ์ตœ์‹  iOS ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ์™€ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • Swift ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

  • SwiftUI ๊ธฐ๋ณธ ์ง€์‹

  • SwiftUI ์ค‘๊ธ‰ ์‚ฌ์šฉ ๊ฒฝํ—˜ (CoreData, SwiftData)

์•ˆ๋…•ํ•˜์„ธ์š”
Jacob(์ œ์ด์ฝฅ)์ž…๋‹ˆ๋‹ค.

663

๋ช…

์ˆ˜๊ฐ•์ƒ

31

๊ฐœ

์ˆ˜๊ฐ•ํ‰

43

๊ฐœ

๋‹ต๋ณ€

5.0

์ 

๊ฐ•์˜ ํ‰์ 

3

๊ฐœ

๊ฐ•์˜

์ƒ์‹œ ํ•™์ƒ ํ• ์ธ์ค‘

๊ฐ•์˜ ๊ธˆ์•ก์ด ๋ถ€๋‹ด๋˜๋Š” ํ•™์ƒ๋ถ„๋“ค์„ ์œ„ํ•ด์„œ ๋ณธ์ธ ํ•™๊ต ๋ฉ”์ผ ๊ณ„์ •์œผ๋กœ ์˜ˆ) @***.ac.kr , @***.edu

์ด๋ฉ”์ผ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ์ „ ๊ฐ•์˜ ํ• ์ธ ์ฟ ํฐ์„ ๋ณด๋‚ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ‘‰ jacobko@kakao.com


์•ˆ๋…•ํ•˜์„ธ์š”. ๐Ÿ˜€

๋‰ด์งˆ๋žœ๋“œ์—์„œ iOS ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š” Jacob ์ž…๋‹ˆ๋‹ค.

SwiftUI ์„ ํ†ตํ•ด ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ iOS APP ์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๊ฐ•์˜๋ฅผ ์ œ์ž‘์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.

SwiftUI ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ iOS ๊ฐœ๋ฐœ ๊ด€๋ จ ์ž๋ฃŒ๋“ค์„ ์ €์˜ Jacob's DevLog ์—์„œ ๋งŒ๋‚˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰  Jacob's DevLog ๋ฐ”๋กœ๊ฐ€๊ธฐ


Hello. ๐Ÿ˜€

I'm Jacob,living in New Zealand.

I'm currently working on creating various tutorials to make it easy for anyone to develop iOS apps through SwiftUI.

You can find not only SwiftUI but also various iOS development-related materials on my Jacob's DevLog.

๐Ÿ‘‰  Go to Jacob's DevLog directly

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

43๊ฐœ โˆ™ (12์‹œ๊ฐ„ 14๋ถ„)

ํ•ด๋‹น ๊ฐ•์˜์—์„œ ์ œ๊ณต:

์ˆ˜์—…์ž๋ฃŒ
๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์•„์ง ์ถฉ๋ถ„ํ•œ ํ‰๊ฐ€๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.
๋ชจ๋‘์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ์ˆ˜๊ฐ•ํ‰์˜ ์ฃผ์ธ๊ณต์ด ๋˜์–ด์ฃผ์„ธ์š”!