๋ฌด์ฌ์ฝ ์ฌ์ฉํ๋ ๋ง์ ๋น๋๊ธฐ ํจ์๋ค์ ์ฌ์ค ๋ณํ์ ๊ณผ์ ์ ๊ฒช์ ๊ฒฐ๊ณผ๋ค์ด๋ค. ๋คํธ์ํฌ 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๋ผ๊ณ ๋น๊ตํด ๋ณผ ์ ์๊ฒ ๋ค.