๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

GCD(Grand Central Dispatch)๋ž‘ Dispatch Queue๋ž‘ ๊ฐ™์€๊ฑฐ์•ผ?

์ด ํฌ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ "์šฐ๋ฆฌ๋Š” ์™œ Dispatch Queue๋ฅผ GCD๋ผ๊ณ  ํ• ๊นŒ?"๋ผ๋Š” ์˜๋ฌธ์ด ๋จผ์ € ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ GCD์™€ Dispatch Queue๋Š” ๋‚ด์šฉ์ด ๋‹ค๋ฅด๋”๋ผ๊ตฌ์š”. ๋จผ์ € ์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๊ณ  Dispatch Queue์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ’กDispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.

๊ณต์‹๋ฌธ์„œ๋Š” GCD๋ฅผ ์œ„์ฒ˜๋Ÿผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GCD๋Š” ๋ฉ€ํ‹ฐ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ๋™์‹œ์„ฑ ์‹คํ–‰์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์š”์†Œ, ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—„๋ฐ€ํ•˜๊ฒŒ ๋งํ•˜๋ฉด GCD ์™€ Dispatch Queue๋Š” ๋™์น˜๊ฐ€ ์•„๋‹ˆ๊ณ , GCD์˜ ๊ฐœ๋…์œผ๋กœ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ์Šค์œ„ํ”„ํŠธ์˜ API๊ฐ€ Dispatch Queue์ธ ๊ฒƒ์ด์ฃ !

 

 ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Dispatch Queue๋ฅผ ๊ณต๋ถ€ํ•ด๋ณผ๊นŒ์š”?

๋™์‹œ์„ฑ ์‹คํ–‰? ๊ทธ๊ฑฐ ๋‚ด๊ฐ€ ํ•ด์ค€๋‹ค..!

์ž๋ฐ”๋‚˜ C๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด์•ผํ•  ์ž‘์—…๋„ ํŠน์ •ํ•œ ์Šค๋ ˆ๋“œ์— ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์ž์˜ ์ฑ…์ž„์ด ๋งŽ์•„์ง€๋Š” ๊ตฌ์กฐ์˜€์ฃ . ๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋„ ์ง์ ‘ ํ•ด์ฃผ์–ด์•ผํ–ˆ๊ตฌ์š”.

ํ•˜์ง€๋งŒ Dispatch Queue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•  ์ผ์€ ํ•˜๋‚˜๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ •์˜ํ•ด์„œ Dispatch Queue์— ๋„ฃ์–ด์ฃผ๋Š” ์ผ์ด์ฃ . ์šด์˜์ฒด์ œ๋Š” Dispatch  Queue์— ์žˆ๋Š” ์ž‘์—…๋“ค์„ ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์ด ๋“ฑ๋กํ•œ ์ž‘์—…์ด ์–ด๋–ค ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ ์ง€ ์•Œ ์ˆ˜ ์—†์ฃ .

 

์‚ฌ์‹ค ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๋“ค์ด ๋ช‡๊ฐ€์ง€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค๊ฑธ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ๊ธฐ๋ณธ์ ์ธ Dispatch Queue์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค!

 

Dispatch Queue ์‚ฌ์šฉํ•˜๊ธฐ

DispatchQueue๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ํ์˜ ์ข…๋ฅ˜, qos ์šฐ์„ ์ˆœ์œ„, sync, async๋ฅผ ์„ค์ •ํ•ด์„œ ์ง€์ •ํ•œ ์ž‘์—…์„ DispatchQueue๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์Šค๋ ˆ๋“œ, ํ˜น์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Serial vs. Concurrent

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜๋“ค์„ ์•Œ์•„๋ณด๊ธฐ์ „์—, Dispatch Queue๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋‘ ํŠน์„ฑ์— ๋Œ€ํ•ด ๋จผ์ € ์ •๋ฆฌํ•ด๋ณด๊ณ˜์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € Serial์€ ํ์— ๋“ฑ๋ก๋œ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ 0, 1, 2, 3, 4 ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜๋Š”๋ฐ์š”, ๊ทธ ์ด์œ ๊ฐ€ Serial ํ๋กœ ๋งŒ๋“ค์–ด์ง„ Dispatch Queue์ด๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ๋“ค์–ด์˜จ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด์•ผ ํ์— ์žˆ๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•œ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์˜ ์ˆœ์„œ๊ฐ€ ์–ธ์ œ๋‚˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— concurrent ํ๋Š” ์ด๋ฆ„์ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์‹œ์— ์—ฌ๋Ÿฌ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ๋Š” Dispatch Queue์—์„œ ๊บผ๋‚ด์˜จ ํ˜„์žฌ ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ์ž‘์—…์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•ด์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์‹คํ–‰๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ Dispatch Queue๋ฅผ concurrent๋กœ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•˜๋ฉด,

์ด๋ ‡๊ฒŒ ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์ด ๋๋‚˜๋Š”๋Œ€๋กœ ์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋„ ๊ทธ๋ฆผ์œผ๋กœ ์‚ดํŽด๋ณด์ฃ !

์‹ค์ œ๋กœ๋Š” ๋‹น์—ฐํžˆ ๋” ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์–ด์„œ ๋ชจ๋“  ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ฒ ์ง€๋งŒ ๊ฐœ๋…์ ์œผ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ํ•œ ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•„๋„ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

Main Queue, Global Queue, Custom Queue

Dispatch Queue๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์„ธ ์ข…๋ฅ˜์˜ ํ๋ฅผ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Main Queue

Main Queue๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ๋ณด๊ด€ํ•˜๊ณ  ์ˆ˜ํ–‰ํ•˜๋Š” ํ์ž…๋‹ˆ๋‹ค. Main Queue๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ , Serial ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ . ์ฆ‰, ํ์— ์Œ“์ด๋Š” ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์•ฑ๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๋ฉด์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ์ž„๋ฌด๋ฅผ ๋ถ€์—ฌ๋ฐ›๋Š”๋ฐ์š”, ๋ฐ”๋กœ UI์˜ ์—…๋ฐ์ดํŠธ ์ž…๋‹ˆ๋‹ค. 

 

ํ™”๋ฉด ์œ„์— ๋ณด์—ฌ์ง€๋Š” ์•ฑ ์š”์†Œ๋“ค์€ ๋ชจ๋‘ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๊ทธ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ UI์—…๋ฐ์ดํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์€ ๋‹ค๋ฅธ ํ๊ฐ€ ์•„๋‹Œ Main Queue์— ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์ œ๋ฅผ Main Queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ผ ์ฒ˜์Œ์— ๋ณด์•˜๋˜ ๋ผˆ๋Œ€ ์ฝ”๋“œ์—์„œ ํ ์ข…๋ฅ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์— main์„ ๋„ฃ์–ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด, Main Queue๋Š” Serialํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋‚˜ 0, 1, 2, 3, 4๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Global Queue

Global Queue๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— concurrent ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…์ด ๋ถ„์‚ฐ๋˜์–ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Global Queue๋Š” ์ฝ”๋“œ๋กœ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” concurrent ํŠน์„ฑ์— ๋”ฐ๋ผ ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ์˜ ์ถœ๋ ฅ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Custom Queue

Custom Queue๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํŠน์„ฑ์˜ ํ๋กœ Dispatch Queue๋ฅผ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ๋Š” Serial์„ ๊ฐ€์ง€๊ณ ์žˆ์ง€๋งŒ, ์ƒ์„ฑ์‹œ์— attributes ์ธ์ž๋ฅผ ํ†ตํ•ด concurrent๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ฃ .

์ด๋ ‡๊ฒŒ DispatchQueue๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๋ผ๋ฒจ์„ ์ฃผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ธ Serial ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” ํ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ ,

์ธ์ž๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๋ฉด concurrent๋กœ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Quality of Service - QOS

์‚ฌ์‹ค Custom Dispatch Queue์™€ Global Dispatch Queue์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ํ•˜๋‚˜ ๋” ์žˆ๋Š”๋ฐ์š”, ๋ฐ”๋กœ qos ๋กœ ๋ถˆ๋ฆฌ๋Š” quality of service ์ž…๋‹ˆ๋‹ค. Concurrent ํ•˜๊ฒŒ ์ž‘์—…์ด ๋ถ„์‚ฐ๋˜์–ด ์‹คํ–‰๋  ๋•Œ, ์–ด๋–ค ์ž‘์—…์˜ ์ค‘์š”๋„๋ฅผ ์„ค์ •ํ•ด์„œ ์‹คํ–‰์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ํ๋Š” ๋” ๋งŽ์€ ์Šค๋ ˆ๋“œ์— ์ž‘์—…์€ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ , ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์Šค๋ ˆ๋“œ์— ์ž‘์—…์„ ๋ถ„์‚ฐ์‹œํ‚ต๋‹ˆ๋‹ค.

 

qos์˜ ์ข…๋ฅ˜๋Š” ์ด 5๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”!

  1. userInteractive: ๊ฐ€์žฅ ๋†’์Œ! ์‚ฌ์šฉ์ž์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๊ณง๋ฐ”๋กœ ์‘๋‹ต์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, UI ์—…๋ฐ์ดํŠธ ๋“ฑ์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€์ฃ .
  2. userInitiated: ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ณง๋ฐ”๋กœ ๋ฐ›์•„์•ผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ด๋ฉ”์ผ ๋‚ด์šฉ์„ ๋กœ๋“œํ•  ๋•Œ, ์ด qos๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. default: ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
  4. utility: ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ง‰์ง€ ์•Š๋Š” ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด qos๋Š” ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์˜ค๋žœ์‹œ๊ฐ„๋™์•ˆ ์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. background: ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” qos์ด๊ณ , ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰์ค‘์ผ ๋•Œ ์ง„ํ–‰ํ•˜๋Š” ์ž‘์—…์— ์ด qos๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sync vs. Async

๋งˆ์ง€๋ง‰์œผ๋กœ Sync ์™€ Async๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! Sync๋Š” ํ์— ์ž‘์—…์„ ๋“ฑ๋กํ•œ ์ดํ›„์— ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋” ์ด์ƒ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , Async๋Š” ํ์— ์ž‘์—…์„ ๋“ฑ๋กํ•˜๋ฉด ์ž‘์—…์˜ ์™„๋ฃŒ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ณ„์† ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

serial, concurrent์—์„œ ๋™์‹œ์„ฑ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ ๋™๊ธฐ, ๋น„๋™๊ธฐ๊ฐ€ ๋‚˜์˜ค๋‹ˆ๊นŒ ํ—ท๊ฐˆ๋ฆฌ์‹œ์ฃ ? Sync, Async๋Š” Dispatch Queue์— ์ž‘์—…์„ ๋“ฑ๋กํ•˜๋Š” ์ฃผ์ฒด์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. concurrent, serial์€ ์ด๋ฏธ ํ์— ๋“ค์–ด์˜จ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ƒ์— ๋Œ€ํ•œ ์„ค์ •์ด์—ˆ์ฃ . ๊ทธ๋ž˜์„œ sync / async, serial / concurrent๋ฅผ ๋ชจ๋‘ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜๋‚˜์”ฉ ์ง์ ‘ ํ•ด๋ด…์‹œ๋‹ค!

Sync + Serial

๋จผ์ € Sync์™€ Serial์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Sync๋กœ ์„ค์ •ํ–ˆ์œผ๋‹ˆ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ Serial Dispatch Queue์— ์ž‘์—…์„ ํ•˜๋‚˜ ๋“ฑ๋กํ•˜๋ฉด, ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์ฃ ? ๊ทธ๋ฆฌ๊ณ  Dispatch Queue ์ชฝ์—์„œ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ํ•ด๋‹น ์ž‘์—…์„ ๋ณด๋‚ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ฝ”๋“œ๋กœ๋Š” 

์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด

์ด๋ ‡๊ฒŒ ์ง„ํ–‰์ด ๋˜๊ฒ ์ฃ ? ๊ฒฐ๊ตญ ํ์—๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ๋“ค์–ด๊ฐ€๊ณ , ์ด ์ž‘์—…์€ ํ•ญ์ƒ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ main.sync ๋ฉˆ์ถฐ!

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” Custom Queue๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”, Serial ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” Main Dispatch Queue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์ด๋ ‡๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ ๋ง™๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Serial Queue์™€ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์— ์žˆ๋Š”๋ฐ์š”, Main DispatchQueue์—์„œ sync๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์ง„ํ–‰์„ ๋ฉˆ์ถ”๊ณ  ๋“ฑ๋กํ•œ ์ž‘์—…์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ํ์— ๋“ฑ๋ก๋œ ์ž‘์—…์€ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋กœ ํ• ๋‹น๋˜์ฃ . ํ•˜์ง€๋งŒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ด๋ฏธ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํ์— ๋“ฑ๋ก๋œ ์ž‘์—…์€ ์‹œ์ž‘์ด ๋˜์ง€ ๋ชปํ•˜๊ณ  ์˜์›ํžˆ ์‹คํ–‰๋˜์ง€๋„, ์ž‘์—…์ด ๋๋‚˜์ง€๋„ ์•Š๋Š” ๋ฐ๋“œ๋ฝ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

๊ฐ™์€ ํ์—์„œ sync ๋ฉˆ์ถฐ!

ํ•œ ๊ฐ€์ง€ ์กฐ์‹ฌํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ๋˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํ์—์„œ ๊ฐ™์€ ํ๋กœ sync๋ฅผ ๋ณด๋‚ด๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

main.sync๋ฅผ ํ”ผํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋„ ์ดํ•ดํ•˜๊ธฐ ํŽธํ• ํ…๋ฐ์š”, ๊ฐ™์€ ํ์—์„œ ์ž‘์—…์„ ๋“ฑ๋กํ•˜๊ณ , ํ•ด๋‹น ์ž‘์—…์„ ๋™์ผ ํ์— sync๋กœ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜๋ฉด ํ•ญ์ƒ ๊ทธ๋ ‡์ง€๋Š” ์•Š์ง€๋งŒ ์ž˜๋ชปํ•˜๋ฉด ๊ฐ™์€ ์Šค๋ ˆ๋“œ์— ๋‹ค์‹œํ•œ๋ฒˆ ์ž‘์—…์„ ํ• ๋‹นํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์™ธ๋ถ€ Dispatch Queue๊ฐ€ ์Šค๋ ˆ๋“œ1์— ๋‚ด๋ถ€ Dispatch Queue๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋“ฑ๋กํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์Šค๋ ˆ๋“œ1์—์„œ sync๋กœ print(numbers[index])๋ฅผ ํ์— ๋“ฑ๋กํ•˜๊ณ , ์šด์˜์ฒด์ œ๊ฐ€ ๋“ฑ๋ก๋œ ์ถœ๋ ฅ์ž‘์—…์„ ๋‹ค์‹œ ์Šค๋ ˆ๋“œ1์— ํ• ๋‹นํ•˜๋ฉด sync๋œ ์Šค๋ ˆ๋“œ1์€ ์•„๋ฌด์ž‘์—…๋„ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

Serial + Async

serial + async๋Š” ์ž‘์—…์˜ ๋“ฑ๋ก์€ ์ž‘์—… ์™„๋ฃŒ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ณ„์† ์ง„ํ–‰ํ•˜๊ณ , ์ž‘์—…์˜ ์ˆ˜ํ–‰์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ ,

 

๊ทธ๋ฆผ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ฉด

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์ž‘์—…๋“ค์ด ์ž‘์—…์˜ ๊ฒฐ๊ณผ์™€ ์ƒ๊ด€์—†์ด ํ์— ๋“ฑ๋ก๋˜๊ณ , ์ž‘์—…์€ ํ์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์ž‘์—…๋“ค์˜ ๋“ฑ๋ก์ˆœ์„œ์™€ ์ถœ๋ ฅ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

Concurrent + Sync

Concurrent+Sync์—์„œ๋Š” ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋ฉด์„œ, ํ์— ๋“ฑ๋ก๋˜๋Š” ์ž‘์—…๋“ค์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์— ๋ถ„์‚ฐ๋˜์–ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์‹คํ–‰๋˜๋ฉด concurrent ํŠน์„ฑ์„ ๊ฐ€์ง„ queue์ด์ง€๋งŒ, ์ž‘์—…์„ sync๋กœ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์˜ ๋“ฑ๋ก ์ˆœ์„œ์™€ ์ถœ๋ ฅ ์ˆœ์„œ๊ฐ€ ํ•ญ์ƒ ์ผ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Concurrent + Async

๋งˆ์ง€๋ง‰์œผ๋กœ Concurrent + Async๋Š” ์ž‘์—…์„ ์™„๋ฃŒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ณ„์† ๋“ฑ๋กํ•˜๊ณ , ๋“ฑ๋ก๋œ ์ž‘์—…๋“ค์€ ์Šค๋ ˆ๋“œ์— ๋ถ„์‚ฐ๋˜์–ด์„œ ๋™์‹œ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋“ฑ๋ก์ˆœ์„œ์™€ ์ถœ๋ ฅ์ˆœ์„œ๊ฐ€ ํ•ญ์ƒ ์ผ์น˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” GCD์˜ Dispatch Queue์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค! main.sync์˜ ์ด์œ ๋‚˜ qos์— ๋Œ€ํ•ด ๋” ํ™•์‹คํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”! ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด๋‚˜ ์ž๋ฃŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”! ์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)