๋ ๋ฒ์งธ ์ฑ
๋๋ ๋์ . ๋ด๊ฐ ๋ฏธ์ณค์ง
์ ๋ฐ์ ์ธ ๋ด์ฉ
๋ง๊ทธ๋๋ก Node.js ์ ๊ทธ๋ฅผ ๊ฐ์ฅ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ค๊ณ ์
์ฆ๋ ๋์์ธ ํจํด๋ค์ ์ค๋ช
ํ๋ ์ฑ
์ด๋ค. ๋ชจ๋, ์ฝ๋ฐฑ, ๋น๋๊ธฐ, ๋์์ธ ํจํด ๋ฑ์ด ์ฃผ์ ํค์๋๊ฐ ๋๊ฒ ๋ค.
์ด์ ๋๊ฐ ๋จธ๋ฆฟ๋ง๊ณผ ๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ ์ง์ํ ๋ด์ฉ์ด๊ณ , ์ฌ์ค ์ฝ์ด๋ด์ผ ๋ฌด์จ ๋ด์ฉ์ธ์ง ์ ๊ฒ ๊ฐ๋ค. ๋์๊ฒ javascript๋ ๋งค์ผ ์ฐ๋ฉด์๋ ๋๋ฌด์ง ์นํด์ง์ง ๋ชปํ ์น๊ตฌ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ ๋ฐ ๊ฑฑ์ ๋ฐ์ด๋ค. ํนํ๋ ๋ชจ๋, ํ๋ผ๋ฏธ์ค, ์คํธ๋ฆผ ๋ฑ์ ์ด๋์ ๊ฐ ๋ง์ด ๋ค์ด๋ณธ, ํ์ง๋ง ๋ป์ ์ ํํ ๋ชจ๋ฅด๋ ๋ด์ฉ๋ค์ ์ด๋ฒ ๊ธฐํ์ ํ์คํ๊ฒ ์ง๊ณ ๋์ด๊ฐ๊ณ ์ถ์ ๋ง์์ด๋ค.
์์ ์ฝ๋ ๊นํ๋ธ ๋งํฌ ๐โโ๏ธ
https://github.com/PacktPublishing/Node.js-Design-Patterns-Third-Edition
๋
์์ ๋ต
- ์ง๋ ๋ฒ ์ฑ
๋ณด๋ค ๋ ๋ํ
์ผํ๊ฒ ํน์ ์คํ์ ์ง์คํ๋ ์ฑ
์ด๊ธฐ ๋๋ฌธ์, ํญ์ ์ฝ๋๋ฅผ ๋ฐ๋ผ ์ณ๋ณผ ์๊ฐ์ด๋ค.
- ์ ์ฌ์๊ฐ ๊ฐ์ ์ํฌ๋ฆฌ ์๊ฐ์ ์ ํ์ฉํ๊ฒ ๋ค.
- ์ญ์๋ ๋
์์ผ์ง๋ ๋ธ๋ก๊ทธ์ ๋จ๊ธฐ๊ฒ ๋ค.
๋ค์ง
์ง๊ธ ๋ค๋๊ณ ์๋ ํ์ฌ์์ ํ๋ ์ผ์ ์ํ๊ธฐ ์ํด์ ๋
ธ๋ ฅํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๊ณต๋ถ๋ค.
์ฐ์ฐํ ์ฝ๊ฒ๋ "๊ฐ๋ฐ์์ ํ์๊ณต๋ถ" ๋ผ๋ ๊ธ์์ ๋ณธ ๋ด์ฉ์ด๋ค. ๊ฒฐ๊ตญ ๋๋ ํ์ฌ์์ javascript ๋ฅผ ๋งจ๋ ์ฐ๋ ์ฌ๋์ด๋๊น, javascript๋ฅผ ์ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ์ฌ๋์ด ๋๊ฒ ๋ค. ํ์ดํ
.
1์ผ์ฐจ
28p ~ 42p
์์ฝ
Node.js ์ฒ ํ
- ๊ฒฝ๋ ์ฝ์ด
- ์ฝ์ด ์์ฒด๋ ์ต์ํ์ ๊ธฐ๋ฅ ์ธํธ.
- ๊ทธ ๋ฐ๊นฅ์ ์ ์ ๋๋ ํน์ ์ ์ ์คํ์ด์ค ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ธ๋ถ ์ํ๊ณ๋ฅผ ํ์ฑํ๊ฒ ๊ตฌ์ฑ
- ๊ฒฝ๋ ๋ชจ๋
- ์ฝ๋์ ์, ๊ธฐ๋ฅ ๋ชจ๋ ๊ฐ๋ฅํ ์๊ฒ. ์ธ๋ถ ๋
ธ์ถ ์ธํฐํ์ด์ค๋ ๊ฐ๋ฅํ ์๊ฒ.
- ํ์ฅ๋๊ธฐ ๋ณด๋ค๋ ์ฌ์ฉ๋๊ธฐ ์ํด ๋ง๋ค์ด ์ง๊ธฐ๋ฅผ ๋ฐ๋.
Node.js๋ ์ด๋ป๊ฒ ์๋ํ๋๊ฐ
๐ ๋น๋๊ธฐ ํน์ฑ์ ํต์ฌ์ธ "Reactor Pattern"
ํต์ฌ์ ์ค๋ ๋ ๋ณ๋ก I/O ์์
์ ๋งก๊ธฐ์ง ์๊ณ , "I/O๋ฅผ ํตํฉ ๊ด๋ฆฌ ํ๋ ํจํด" ์ผ๋ก ๋์ํ๋ค๋ ๊ฒ.
์ฐจ๋ก๋ก ๋น๊ตํด๋ณด๋ฉฐ ์ด์ ์ ์์๋ณด์.
- ๋ธ๋กํน I/O
- I/O ์์
์ ๊ฐ๊ฐ์ ์ค๋ ๋์์ ์ฒ๋ฆฌ
- ๊ฐ ์ค๋ ๋๋ ์์ ์ I/O ์์
์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ๋ธ๋กํน ๋จ
- ๋ค์์ ์ค๋ ๋ ์ฌ์ฉ -> ๋ฉ๋ชจ๋ฆฌ ์๋ชจ, ์ปจํ
์คํธ ์ ํ ๋น์ฉ ๋ฐ์
- ๋
ผ-๋ธ๋กํน I/O
- ๋จ์ผ ์ค๋ ๋์์๋ ์ฌ๋ฌ I/O ์์
์ํ ๊ฐ๋ฅ.
- ๊ฐ I/O ์์
(์์คํ
ํธ์ถ)์ ์ฆ์ ๋ฐํ.
- ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋ ๋ ๊น์ง polling. ์ฆ, busy-wait.
- polling์ ๋๋ ๋ฌด์๋ฏธํ ์ปดํจํ
์์ ๋ญ๋น ๋ฐ์
- ์ด๋ฒคํธ ๋๋ฉํฐํ๋ ์ฑ (์ด๋ฒคํธ ํต์ง ์ธํฐํ์ด์ค)
- ๋
ผ-๋ธ๋กํน I/O์
polling
์ watching
์ผ๋ก ๋์ฒด.
- ๋๋ฉํฐํ๋ ์ ๋ผ๋ I/O ํตํฉ ๊ด๋ฆฌ ์ฃผ์ฒด๋ก ๊ด๋ฆฌ.
- ๋๋ฉํฐํ๋ ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋กํน๋ ์ํ(not-busy-waiting)์์ ์ฌ๋ฌ I/O์์
์ ๊ด์ฐฐํ๊ณ , ์๋ฃ๋ ์์
์ ๋ํด์๋ ์๋ก์ด ์ด๋ฒคํธ๋ฅผ ๋ฐํ.
- ์ฆ, busy-waiting ์ ์ฌ์ฉํ์ง ์๊ณ ๋ '์ฌ๋ฌ I/O ์์
'์ '๋จ์ผ ์ค๋ ๋ ๋ด'์์ ๋ค๋ฃฐ ์ ์์.
๊ทธ๋์ ์ด๋ฅผ ํ์ฉํ๋ Reactor Pattern
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฉํฐํ๋ ์์ I/O ์์ฒญ๊ณผ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ด ์ ๋ฌ.
- ๋๋ฉํฐํ๋ ์๋ '์ด๋ค' I/O๊ฐ ์๋ฃ๋๋ฉด, ํด๋น ์์ฒญ์ ๋ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์๊ฒ ์ด๋ฏธ ์ ๋ฌ๋ฐ์๋ ํธ๋ค๋ฌ์ ํจ๊ป ์๋ก์ด ์ด๋ฒคํธ๋ฅผ ์ด๋ฒคํธ ํ์ ๋ฃ์.
- ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ด๋ฒคํธ ํ์ ํญ๋ชฉ๋ค์ ์ํํ๋ฉฐ ๊ฐ ์ด๋ฒคํธ์ ๊ด๋ จ๋ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋จ.
- ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ ์ผ๋ถ์ธ ํธ๋ค๋ฌ๊ฐ ์คํ๋จ. ์ด ๊ณผ์ ์์ ๋ค์ ๋น๋๊ธฐ ์์
์ด ๋ฐ์ํ๋ค๋ฉด ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ฉํฐํ๋ ์์ ์์ฒญํ๊ฒ ๋จ.
- ํธ๋ค๋ฌ ์คํ์ด ์๋ฃ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ์๊ฒ ๋ค์ ์ ์ด๊ถ์ด ๋๋์๊ฐ.
- ์ด๋ฒคํธ ํ์ ๋ชจ๋ ํญ๋ชฉ์ด ์ฒ๋ฆฌ๋์๋ค๋ฉด, ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ์ด๋ฒคํธ ๋๋ฉํฐํ๋ ์์์ ๋ธ๋กํน ๋จ.
- ์ด๋ฒคํธ ๋ฃจํ๋ ์ฃผ์ฒด๋ผ๊ธฐ ๋ณด๋ค๋ ์ผ๋ จ์ ํ๋ฆ.
- ๋ธ๋กํน I/O์์ ํ๋์ ์ค๋ ๋๊ฐ ํ๋์ I/O ์์
์ ๊ด๋ฆฌํ๊ฒ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ๋๋ฉํฐํ๋ ์์ ์ด๋ฒคํธ ํ ๋ผ๋ ๋ ์ฃผ์ฒด๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ ๋ฆฌ์์ค ์์ฒญ๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋ค๊ณ ์ดํดํ ์ ์๋ค.
๋ฐ์ท
Node.js ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฒคํธ ๋๋ฉํฐํ๋ ์์ ๋ ์ด์ ๋ณด๋ฅ์ค์ธ ์์
์ด ์๊ณ ์ด๋ฒคํธ ํ์ ๋ ์ด์ ์ฒ๋ฆฌ ์ค์ธ ์์
์ด ์์ ๊ฒฝ์ฐ ์ข
๋ฃ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Node.js ์์๋ I/O ์์ฒญ ๋ฟ๋ง ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์
entry๋ถํฐ ์์ํ๋ ๋ชจ๋ ๊ณผ์ ์ด ์ด Reactor Pattern์ ์ํด์ ๋์ํ๋ค๋ ๊ฒ์ธ๊ฐ..??
Reactor ํจํด์ ์ผ๋ จ์ ๊ด์ฐฐ ๋์ ๋ฆฌ์์ค์์ ์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๋ธ๋กํนํ์ฌ I/O๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ฐ ์ด๋ฒคํธ๋ฅผ ๊ด๋ จ๋ ํธ๋ค๋ฌ์ ์ ๋ฌํจ์ผ๋ก์จ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ ๋ค.
๋ฉ๋ชจ
๋ด์ฉ์ ์ดํดํด๋ณด๊ฒ ๋ค๊ณ ๋๋ฌด ํผ์์ ์๊ฐ์ ๋ง์ด ํ ๊ฒ ๊ฐ์๋ฐ, ํน์ ์ด์ํ ๋ด์ฉ์ด ์์๋ค๋ฉด ๋๊ธ์ ๋ถํ๋๋ฆฝ๋๋ค.
๋ด๊ฐ ๋ฏธ์ณค์ง ์ ์๊ณ ๊ฐ๋๋ค.. ์์ข์ขก ~