๋ฌด์‹ฌ์ฝ” ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์€ ์‚ฌ์‹ค ๋ณ€ํ™”์˜ ๊ณผ์ •์„ ๊ฒช์€ ๊ฒฐ๊ณผ๋“ค์ด๋‹ค. ๋„คํŠธ์›Œํฌ I/O API๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”๋˜์–ด ์™”๋Š”์ง€ ์•Œ์•„๋ณด์ž.

ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

network API๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋ ˆ ๋จธ๋ฆฌ์— ์ด๋Ÿฐ ๊ทธ๋ฆผ์ด ๋– ์˜ค๋ฅธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ Network์—์„œ๋งŒ ๊ตญํ•œ๋˜์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. Network API๋Š” ๊ฒฐ๊ตญ I/O API์— ์†ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํฐ ๋งฅ๋ฝ์—์„œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, ๋‘๊ฐœ์˜ ์ž‘๋Œ€๊ธฐ๋ฅผ ์™ผ์ชฝ์€ User Level, ์˜ค๋ฅธ์ชฝ์€ Kernel Level์ด๋ผ๊ณ  ํ•ด๋„ ์ถฉ๋ถ„ํžˆ ๋ง์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ์ด ๊ณผ์ •์€ Network์— ๊ตญํ•œ๋˜๊ธฐ ๋ณด๋‹ค๋Š”, ์‹œ์Šคํ…œ์˜ ๋ฐœ์ „ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๋ผ ๋ณด๋Š” ๊ฒƒ์ด ๋” ํƒ€๋‹นํ•˜๊ฒ ๋‹ค. ์‹ค์ œ๋กœ Sync์™€ Async์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณธ๋‹ค๋ฉด ์ด์ „ ๊ธ€์ธ Request-Driven, Event-Driven์™€ ์ƒ๋‹นํžˆ ๋น„์Šทํ•œ idea๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Sync/Blocking

Sync/Blocking ๋ฐฉ์‹์€ ๊ฑฐ์˜ thread๋ฅผ ๋‚˜๋ˆˆ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ž‘์—…์˜ ๋…๋ฆฝ์ ์ธ ํ๋ฆ„์˜ ๋‹จ์œ„๊ฐ€ thread์ธ๋ฐ, ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ข…์†๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, 1๋ฒˆ thread์—์„œ 2๋ฒˆ thread๋กœ ์ž‘์—…์„ ์š”์ฒญํ–ˆ์„ ์‹œ, 2๋ฒˆ thread์—์„œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ 1๋ฒˆ thread๋Š” ์•„๋ฌด์ผ๋„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค(block)๋Š” ๋ง์ด๋‹ค.

๋งŒ์•ฝ 1๋ฒˆ์ด client, 2๋ฒˆ์ด server๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, TCP ์—ฐ๊ฒฐ์„ ์œ„ํ•œ 3-way handshaking ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ client๋Š” ์•„๋ฌด ์ž‘์—…๋„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ด๋‹ค. ์ฆ‰, App์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค. ์ดˆ๊ธฐ BSD Socket API๊ฐ€ ์ด๋Ÿฐ ํ˜•ํƒœ์˜€๋‹ค.

Sync/Non-Blocking

์ด๊ฒŒ ์ง€๋‚˜์น˜๊ฒŒ ๋ถˆํŽธํ•˜๋‹ค๋Š” ์ ์—์„œ ๊ฐœ์„ ๋œ ํ˜•ํƒœ์ด๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ง„์ •ํ•œ ์˜๋ฏธ์˜ thread๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์š”์ฒญ์„ ํ•˜๋ฉด, ์š”์ฒญ์„ ๋ฐ›์€ thread์—์„œ ์ž‘์—…์„ ํ•˜๋˜, ์š”์ฒญํ•œ thread๋ฅผ blockํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ฆฌํ„ด(non-block)ํ•˜์—ฌ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด ๋•Œ, ์ƒํƒœ๋ฅผ ๊ฐ™์ด ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์š”์ฒญํ•œ thread๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์š”์ฒญํ•œ thread๋Š” ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฌผ์–ด๋ณผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฌผ์–ด๋ณผ ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๋งŒ์„ ์ „๋‹ฌ ๋ฐ›๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ์ดํ›„ ์‹œ์ ์— ์งˆ๋ฌธํ•˜์˜€๋‹ค๋ฉด ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ดํ›„ ์š”์ฒญ thread๋Š” ๋กœ์ง์— ๋”ฐ๋ผ ์ถ”๊ฐ€์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. BSD Socket์€ ์—ฌ์ „ํžˆ Sync/Blocking๊ณผ Sync/Non-Blocking ๋ฐฉ์‹ ๋ชจ๋‘๋ฅผ ํ•˜์œ„ํ˜ธํ™˜์„ ์œ„ํ•ด ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด์ œ๋Š” ๊ฑฐ์˜ ๋‚จ์•„์žˆ์ง€ ์•Š๋‹ค.

Async/Non-Blocking

์š”์ฆ˜์˜ API๋Š” ๋Œ€๋ถ€๋ถ„ ์ด ๊ตฌ์กฐ์ด๋‹ค. ์–ด๋–ค context, ์ฆ‰, ์–ด๋Š thread์—์„œ ์š”์ฒญํ•˜๋“  ๊ฐ„์—, ์ฆ‰์‹œ returnํ•˜๊ณ  Callback function์„ ํ•จ๊ป˜ ๋„˜๊ฒจ์ฃผ์–ด, ์ž‘์—…์ด ๋๋‚œ ์‹œ์ ์— ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ํ˜น์€ delegate๋ฅผ ๋„˜๊ฒจ, ์ž‘์—…์ด ๋๋‚œ ์‹œ์ ์— ์œ„์ž„ ๊ฐ์ฒด๊ฐ€ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” thread๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, UI update์™€ ๊ฐ™์€ ๋™์ž‘๋“ค์„ main thread์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ผ์ด ํ•„์š”ํ•˜๋‹ค. ํ˜น์€ thread๋ฅผ ์„ค์ •์„ ์ž˜๋ชปํ•˜์—ฌ, ์ƒํ˜ธ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฌดํ•œ์ • ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋™์ž‘์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

Async/Blocking

์ด๋Ÿฐ API๋Š” ์‚ฌ์‹ค ๋ณธ ์ ์ด ์—†๋‹ค. ๊ตฌ๋ถ„ ์ƒ์œผ๋กœ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋‚˜, ์‚ฌ์‹ค์ƒ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ๊ทธ ์ด์œ ๋Š”, ์ œ์–ด๊ถŒ์ด ์š”์ฒญํ•œ thread๋กœ ๋„˜์–ด์™”์Œ์—๋„ ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ตณ์ด return์„ ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. ๊ฒฐ๊ตญ์€ sync/blocking ๋ฐฉ์‹๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ์ ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฐฉ์‹์ด๋‹ค.

Note!

๊ฒฐ๊ตญ ์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ๋ณด๊ฒŒ ๋œ๋‹ค๋ฉด, ์–ด๋–ค thread๊ฐ€ ์ด ๋™์ž‘์˜ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ƒ๋กœ ์ง๊ฒฐ๋œ๋‹ค. ์ฆ‰, Sync์˜ ๊ฒฝ์šฐ, ๊ฒฐ๊ตญ 1๋ฒˆ thread๊ฐ€ ํ๋ฆ„ ์ œ์–ด์™€ ๊ฐ™์ด ๋ณด๋‹ค ์ฒ˜๋ฆฌ๋ฅผ ์ฃผ๋„ํ•˜๊ณ  ์žˆ๋‹ค. Async์˜ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ์˜ ์™„๋ฃŒ ์‹œ์ ์— ๋”ฐ๋ผ ๋กœ์ง์ด ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, 2๋ฒˆ thread๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ฃผ๋„ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ์€ ์ด์ „ ๊ธ€์—์„œ ๋ณด์•˜๋˜Request-Driven, Event-Driven๊ณผ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•œ๋ฐ, Request์ชฝ์—์„œ ์ฃผ๋„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ Sync, Event์ชฝ์—์„œ ์ฃผ๋„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ Async๋ผ๊ณ  ๋น„๊ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.