๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

swift ๋ฌธ๋ฒ•๐Ÿ–ค

[SWIFT] ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์•ฑ์˜ ์„ฑ๋Šฅ / ๋ฐ˜์‘์„ฑ / ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐœ๋…

 

์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ผ (๋„คํŠธ์›Œํฌ ํ†ต์‹ )์€ ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด๋‹ค.

๋งŒ์•ฝ์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์•„์ดํฐ์˜ ํ™”๋ฉด์ฃผ์‚ฌ์œจ์€ 60Hz๋กœ 1์ดˆ์— 60๋ฒˆ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค. (์–ด๋–ค ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ๋™์ž‘)

-> ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋Ÿฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ

 

CPU

์ฝ”์–ด (Core) ==

์“ฐ๋ ˆ๋“œ (thread) == ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฐ์‚ฐ์žฅ์น˜์˜ ๊ฐœ์ˆ˜

ํด๋Ÿญ (Clock) ==

 

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ„๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ 1๋ฒˆ(๋ฉ”์ธ)์“ฐ๋ ˆ๋“œ์—์„œ๋งŒ ์ผ์„ ํ•œ๋‹ค.

 

1๋ฒˆ์“ฐ๋ ˆ๋“œ๋Š” ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผํ•˜๋Š” ์—ญํ• ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (์ง์ ‘ ๋“œ๋ฆฌ๋Š”๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ์–ด๋–ค ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰)

==> ์—ญํ• ์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— , ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ์‹œํ‚ค๋ฉด ์•ˆ๋œ๋‹ค. (๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)

 

===> ๋ถ„์‚ฐ์ฒ˜๋ฆฌ(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ / ๋™์‹œ์„ฑํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•จ!!

 

Ios๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…(Task)๋ฅผ "๋Œ€๊ธฐํ–‰๋ ฌ(queue)"์— ๋ณด๋‚ด๊ธฐ๋งŒ ํ•˜๋ฉด, ์•Œ์•„์„œ ์—ฌ๋Ÿฌ์“ฐ๋ ˆ๋“œ๋กœ ๋‚˜๋ˆ ์„œ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ(๋™์‹œ์  ์ฒ˜๋ฆฌ)๋ฅผ ํ•œ๋‹ค.

- iOS์—์„œ ์•Œ์•„์„œ ์“ฐ๋ ˆ๋“œ์˜ ์ˆซ์ž(๊ฐœ์ˆ˜)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

==> ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—…์„ ํ๋กœ ๋ณด๋‚ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

iOSํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๋Œ€๊ธฐ์—ด

DispatchQueue โญ๏ธ
(== GCD: Grand Central Dispatch Queue)

OperationQueue

 

 

GCD๋ž€?

  • ์ง์ ‘์ ์œผ๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹Œ, ํ์˜ ๊ฐœ๋…์„ ์ด์šฉํ•˜์—ฌ, ์ž‘์—…์„ ๋ถ„์‚ฐ์ฒ˜๋ฆฌํ•˜๊ณ , OS์—์„œ ์•Œ์•„์„œ ์“ฐ๋ ˆ๋“œ ์ˆซ์ž(๊ฐœ์ˆ˜)๋ฅผ ๊ด€๋ฆฌ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์“ฐ๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์ด ์“ฐ๋ ˆ๋“œ๋ณด๋‹ค ๋†’์€ ๋ ˆ๋ฒจ/์ฐจ์›์ธ OS์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌ
  • ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ์“ฐ๋ ˆ๋“œ์—์„œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๋“ค์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•จ

GCD ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•ด์•ผํ•  ์‚ฌํ•ญ

  1. ๋ฐ˜๋“œ์‹œ ๋ฉ”์ธ ํ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ž‘์—… 
    • UI์™€ ๊ด€๋ จ๋œ ์ž‘์—…์€ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ (๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ์“ฐ๋ ˆ๋“œ๋Š” ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ์ง€ ๋ชปํ•จ)
    • ๋น„๋™๊ธฐ ์ ์ธ ์ž‘์—…๋“ค (ex. ๋„คํŠธ์›Œํฌ ํ†ต์‹ )๋“ค์„ ํ•  ๋•Œ๋„ UI ๊ด€๋ จ๋œ ์ž‘์—…์€ ๋ฐ˜๋“œ์‹œ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•ด์•ผํ•จ
  2. ์ปดํ”Œ๋ฆฌ์…˜ ํ•ธ๋“ค๋Ÿฌ์˜ ์กด์žฌ ์ด์œ  - ์˜ฌ๋ฐ”๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์„ค๊ณ„ (์ฝœ๋ฐฑํ•จ์ˆ˜)
    • ๋น„๋™๊ธฐ์ ์ธ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ• ๋–„๋Š” return์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ญ์ƒ nil๊ฐ’ ๋ฐœ์ƒ -> ํ•ญ์ƒ ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๋ฅผ ์„ค๊ณ„ํ•ด์•ผํ•จ 
    • ๋ฆฌํ„ด๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ปดํ”Œ๋ฆฌ์…˜ ํ•ธ๋“ค๋Ÿฌ(ํด๋กœ์ €)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (๋ฆฌํ„ดํ˜•์ด ์—†์œผ๋ฉด ์„ ์–ธ ๋ถˆํ•„์š”)
  3. weak, strong ์บก์ณ์˜ ์ฃผ์˜
    • ์บก์ณ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ weak self๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ•ํ•œ ์ฐธ์กฐ (strong)
      • ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ 
      • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋”๋ผ๋„ ํด๋กœ์ €์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ํ˜„์ƒ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

 

๋Œ€๊ธฐ์—ด(Queue)์˜ ์ข…๋ฅ˜ 

  • ๋ฉ”์ธํ : DIspatchQueue.main
    • ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ(1๋ฒˆ ์“ฐ๋ ˆ๋“œ)๋ฅผ ์˜๋ฏธ
    • ์œ ์ผํ•จ
    • serialํ
  • ๊ธ€๋กœ๋ฒŒํ : DispatchQueue.global
    • 6๊ฐ€์ง€์˜ ์„œ๋น„์Šค ํ’ˆ์งˆ(Qos)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธ€๋กœ๋ฒŒ(์ „์—ญ) ๋Œ€๊ธฐ์—ด
    • iOS๊ฐ€ ์•Œ์•„์„œ ์šฐ์„ ์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ผ์ž„์„ ์ธ์ง€ํ•˜๊ณ  ์“ฐ๋ ˆ๋“œ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ ๋” ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  CPU์˜ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ง‘์ค‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์„ ๋นจ๋ฆฌ ๋๋‚ด๋„๋ก ํ•˜๋Š” ๊ฐœ๋…\
    • Concurrentํ
    • DispatchQueue.global(qos: "...")
์„œ๋น„์Šคํ’ˆ์งˆ ์ˆ˜์ค€ ์‚ฌ์šฉ ์ƒํ™ฉ ์†Œ์š”์‹œ๊ฐ„
.userInteractive (๊ฐ€์žฅ ๋†’์€ ์ˆ˜์ค€) ์œ ์ €์™€ ์ง์ ‘์  ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ : UI์—…๋ฐ์ดํŠธ ๊ด€๋ จ(์ง์ ‘x), ์• ๋‹ˆ๋ฉ”์ด์…˜, UI๋ฐ˜์‘ ๊ด€๋ จ ์ž‘์—… ๊ฑฐ์˜ ์ฆ‰์‹œ
.userInitiated ์œ ์ €๊ฐ€ ์ฆ‰์‹œ ํ•„์š”ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ์ž‘์—… ๋ช‡ ์ดˆ
.default (== DispatchQueue.global() ) ์ผ๋ฐ˜์  ์ž‘์—…  
.utility ๋ณดํ†ต Progress Indicator์™€ ํ•จ๊ป˜ ๊ธธ๊ฒŒ ์‹คํ–‰๋˜๋Š” ์ž‘์—…, ๊ณ„์‚ฐ ๋ช‡์ดˆ ์ด์ƒ
.background ์œ ์ €๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์ธ์ง€ํ•˜์ง€ ์•Š๊ณ (์‹œ๊ฐ„์ด ์ค‘์š”ํ•˜์ง€ ์•Š์€)์ž‘์—…  
.unspecified (๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€) legacy API ์ง€์› (์“ฐ๋ ˆ๋“œ๋ฅผ ์„œ๋น„์Šคํ’ˆ์งˆ์—์„œ ์ œ์™ธ ์‹œํ‚ด)  
  • ํ”„๋ผ์ด๋น—ํ : DispatchQueue(label: "...")
    • ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์€ serial (๋‹ค๋งŒ concurrent ์„ค์ •๋„ ๊ฐ€๋Šฅ - attributes๋กœ ์„ค์ •)
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ง๋ ฌํ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • Qos์ถ”๋ก  / ์„ค์ • ๊ฐ€๋Šฅ

 

๋น„๋™๊ธฐ(Async)๋ž€?

  • ์ผ์„ ์‹œ์ž‘์‹œํ‚ค๊ณ  , ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ (์ฆ‰์‹œ ๋ฆฌํ„ด(non- blocking) : ๋‹ค๋ฅธ ์ผ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค)

== ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ํ•˜๋„๋ก ์‹œํ‚ค๊ณ , ๊ทธ ์ž‘์—…์ด ๋๋‚˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰

 

๋™๊ธฐ(sync)๋ž€? 

  • ์ผ์„ ์‹œ์ž‘์‹œํ‚ค๊ณ , ์ž‘์—…์ด ๋๋‚ ๋•Œ ๊นŒ์ง€๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ (blocking์ด ์ƒ๊น€ : ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ผ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€)

== ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ํ•˜๋„๋ก ์‹œํ‚ค๊ณ , ๊ทธ ์ž‘์—…์ด ๋๋‚˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰

 

DispatchQueue.global().async {

    // ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ž‘์—…์„ ํด๋กœ์ € ์•ˆ์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค. ( ํด๋กœ์ € ํ•˜๋‚˜๋Š” ์ž‘์—… ํ•˜๋‚˜์˜ ๋ฌถ์Œ : ํด๋กœ์ € ์•ˆ์—์„œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ )

}

 

DispatchQueue.global().sync {

    // ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ž‘์—…์„ ํด๋กœ์ € ์•ˆ์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค.

}

 

๋น„๋™๊ธฐ/๋™๊ธฐ์ ์ธ ํ•จ์ˆ˜ ์ •์˜๋„ ๊ฐ€๋Šฅ ( ํ•จ์ˆ˜ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ /๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. )

func task4() {

    DispatchQueue.global().async {

        print("Task 4 ์‹œ์ž‘")

        sleep(2)

        print("Task 4 ์™„๋ฃŒโ˜…")

    }

}

 

์ง๋ ฌ(Serial) ํ(์ฒ˜๋ฆฌ)๋ž€?

  • ๋ณดํ†ต ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ์‹œํ‚จ ์ž‘์—…์„ ๋‹ค๋ฅธ ํ•œ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ 
  • ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
  • DispatchQueue(label: "serial")
  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ณด๋‚ด๋„ (.async) ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…ํ•จ

 

๋™์‹œ(Cocurrent) ํ(์ฒ˜๋ฆฌ)๋ž€?

  • ๋ณดํ†ต ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ์‹œํ‚จ ์ž‘์—…์„ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ
  • ๊ฐ์ž ๋…๋ฆฝ์ ์ด์ง€๋งŒ ์ค‘์š”๋„๋‚˜ ์ž‘์—…์˜ ์„ฑ๊ฒฉ์ด ์œ ์‚ฌํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
  • DispatchQueue.global()์€ ๋™์‹œํ
  • ๋™๊ธฐ์ ์œผ๋กœ ๋ณด๋‚ด๋ฉด (.sync) ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…ํ•จ

( swift 5.5 ์ดํ›„ ) ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์„ค๊ณ„์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ Async / await ํŒจํ„ด์˜ ๋„์ž…

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๋ฆฌํ„ดํ˜• ๋Œ€์‹  ํด๋กœ์ €๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•จ : ์œ„์— ์„ค๋ช…ํ•จ 
    • ๋‹จ์  : task๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋งˆ์ง€๋ง‰ ์ฏค์— ํด๋กœ์ €๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹ (์ปดํ”Œ๋ฆฌ์…˜ ๋ธ”๋Ÿญ) ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ด์–ด์ ธ ์žˆ์„ ๋–„, ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์—ฐ๊ฒฐ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค ( pyramid of doom : ์ฃฝ์Œ์˜ ํ”ผ๋ผ๋ฏธ๋“œ )
  • async / await
    • func ํ•จ์ˆ˜๋ช… ( ํŒŒ๋ผ๋ฏธํ„ฐ : ํƒ€์ž… ) async throws -> ๋ฆฌํ„ดํƒ€์ž…
    • ํ•จ์ˆ˜์—์„œ async( ๋น„๋™๊ธฐ ํ•จ์ˆ˜ )๋กœ ์ •์˜, ๋ฆฌํ„ด ๋ฐฉ์‹ ์‚ฌ์šฉ 
    • async๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋Š” awaitํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฆฌํ„ด์‹œ์ ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Œ ( ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™” ๊ฐ€๋Šฅ )

๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ์ œ์ 

  • ๊ฒฝ์Ÿ ์ƒํ™ฉ / ๊ฒฝ์Ÿ ์กฐ๊ฑด (race condition) == ๋ฉ”๋ชจ๋ฆฌ ๋™์‹œ ์ ‘๊ทผ ๋ฌธ์ œ
    • Thread-safeํ•˜์ง€ ์•Š์Œ - ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ , ๊ฐ™์€ ์‹œ์ ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ(๋ฐ์ดํ„ฐ + ํž™ ์˜์—ญ)์— ๋™์‹œ์ ‘๊ทผ ํ•˜๋Š” ๋ฌธ์ œ
    • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : Thread- Safe ์ฒ˜๋ฆฌ - ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๊ณ  ์žˆ๋Š” ๋™์•ˆ์—๋Š” ์—ฌ๋Ÿฌ์“ฐ๋ ˆ๋“œ์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ž ๊ธˆ(Lock)
  • ๊ต์ฐฉ ์ƒํƒœ (DeadLock) 
    • 2๊ฐœ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋ฒ ํƒ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด (์„œ๋กœ Tread-safe์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ์ ์œ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด์„œ) ๋ฉ”์„œ๋“œ์˜ ์ž‘์—…์ด ์ข…๋ฃŒํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๋Š” ์ƒํƒœ
    • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ ( Concurrency ํ”„๋กœ๊ทธ๋ž˜๋ฐ )์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ์ œ์  ํ•ด๊ฒฐ ( Thread-Safeํ•˜์ง€ ์•Š์„ ๋•Œ, ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• )

  • ๋™์‹œํ ๋Œ€์‹  ์ง๋ ฌํ(Serial queue)๋กœ ๋ณด๋‚ด๊ธฐ
    • ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ (๋ฉ”๋ชจ๋ฆฌ ๋™์‹œ ์ ‘๊ทผ ๋ฌธ์ œ ํ•ด๊ฒฐ)