๐Ÿ“•[์ฑ…] Node.js ๋””์ž์ธ ํŒจํ„ด ๋ฐ”์ด๋ธ”

์ด๊ฐ•์šฑยท2023๋…„ 6์›” 26์ผ
0

๐Ÿ“•์ฑ…

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

๋‘ ๋ฒˆ์งธ ์ฑ…๋„ˆ๋‘ ๋„์ „. ๋‚ด๊ฐ€ ๋ฏธ์ณค์ง€

์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ

๋ง๊ทธ๋Œ€๋กœ 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๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๊ด€๋ จ๋œ ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌํ•จ์œผ๋กœ์จ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค.

๋ฉ”๋ชจ

๋‚ด์šฉ์„ ์ดํ•ดํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ๋„ˆ๋ฌด ํ˜ผ์ž์„œ ์ƒ๊ฐ์„ ๋งŽ์ด ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ํ˜น์‹œ ์ด์ƒํ•œ ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
I think I think too much.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 7์›” 5์ผ

๋‚ด๊ฐ€ ๋ฏธ์ณค์ง€ ์— ์›ƒ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค.. ์•„์ขŒ์ขก ~

1๊ฐœ์˜ ๋‹ต๊ธ€