๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 3.1

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ ํ‚ค์›Œ๋“œ (1.0)
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ ๊ฒฝํ—˜ ์œ„์ฃผ๋กœ (2.0)
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ ์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ (3.0)
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ (3.1) 230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ‚ค์›Œ๋“œ

๋™๊ธฐํ™”

  • ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์Šค๋ ˆ๋“œ๋“ค์ด ์ˆ˜ํ–‰๋˜๋Š” ์‹œ์ ์„ ๋งž์ถ”๊ณ  ์„œ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ
  • ํฌ๊ฒŒ ์ˆœ์„œ ๊ฐœ๋…์˜ ๋™๊ธฐํ™”๊ฐ€ ์žˆ๊ณ  ๊ณต์œ  ์ž์›์— ํ•œ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์ ‘๊ทผํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐœ๋…์˜ ๋™๊ธฐํ™”๊ฐ€ ์žˆ๋‹ค.
  • ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ ๋“ฑ์ด ์žˆ๋‹ค.

๋น„๋™๊ธฐ ์ž…๋ ฅ

  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์ ์ ˆํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปค๋„์— I/O ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • ์ปค๋„์—์„œ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋Š” ์ปค๋„์ด I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์Šค๋ ˆ๋“œ์— ์•Œ๋ฆด ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์•Œ๋ฆผ์ด ์˜ค๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ I/O ์ž‘์—…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
  • ๊ธฐ์กด์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(blocking)์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(non-blocking)์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

๋น„๋™๊ธฐ

  • ๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ฒƒ(asynchronous)
  • non-blocking์œผ๋กœ ํ…Œ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋ณ‘๋ ฌ์ ์œผ๋กœ ํ…Œ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.(์š”์ฒญํ•œ ๊ทธ ์ž๋ฆฌ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.)
  • ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ทธ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋™๊ธฐ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.(์„ค๊ณ„๊ฐ€ ํž˜๋“ค๋‹ค.)
  • blocking ๋‹ค์Œ non-blocking ๋‹ค์Œ์œผ๋กœ ๋“ฑ์žฅํ•œ ๋ฐฉ๋ฒ•
  • ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, ์ด ๋•Œ์˜ ๋™์‹œ๋ž€ ์š”์ฒญ๊ณผ ๋ฐ˜ํ™˜์ด ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

node.js์˜ event emitter

  • web์—๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋“ฏ์ด, nodejs์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด์ž ํด๋ž˜์Šค
const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

// ์ด๋ฒคํŠธ ์ด๋ฆ„๊ณผ ๊ทธ ์ด๋ฒคํŠธ ํ˜ธ์ถœ ์‹œ ๋ถˆ๋Ÿฌ์˜ฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
eventEmitter.on('start', () => {
  console.log('started');
});

// start๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
eventEmitter.emit('start');
  • ์ด๋Ÿฐ eventEmitter๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ธ nodejs๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๋กœ ์ž‘์šฉํ•œ๋‹ค.
    • ๋Œ€๋ถ€๋ถ„์˜ nodejs์˜ ๋น„๋™๊ธฐ api๋“ค์ด eventEmitter๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค.(๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ )

์ฐธ๊ณ ์ž๋ฃŒ

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

๋ฏธ์…˜์€ ์—ฌ์ „ํžˆ ๊ฐ์ด ์•ˆ์žกํžˆ์ง€๋งŒ, ๋‚˜๋ฆ„ ๊ทธ๋™์•ˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ๋“ค๊ณผ ํ•ด์˜จ ๋ฏธ์…˜๋“ค์„ ์ •๋ฆฌํ–ˆ๋”๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ๊ฐœ์šดํ•ด์กŒ๋‹ค. ์•ž์œผ๋กœ ์–ด๋–ค ๊ฑธ ๋” ์ค‘์ ์ ์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ์—ฐ์Šตํ•ด์•ผํ• ์ง€ ๋ช…ํ™•ํ•ด์ง„๋“ฏํ•ด์„œ ๊ธฐ๋ถ„์ด ์ข‹๋‹ค.
์•„ ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐโ€ฆ ํ•˜ ๋ญ”๊ฐ€ ์•Œ๊ฒ ๋Š”๋ฐ, ๋˜ ๋ณด๋ฉด ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์ฐธโ€ฆ ๊ณ„์† ์Šต๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์†์— ์ต์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค. ๋˜ ํ•˜๋ฉด ๋‹ค ๋œ๋‹ค.

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

  • ๊ทธ๋™์•ˆ ๋ฏธ์…˜ ์ •๋ฆฌ๋ฅผ ํ†ตํ•ด ๋จธ๋ฆฌ ๋ง‘๊ฒŒ ํ•œ ์ 
  • ๋น„๋™๊ธฐ ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ดํ•ดํ•œ ์ 
  • ๋ฏธ์…˜ 1 ๋ผ์šด๋“œ ๋กœ๋นˆ์œผ๋กœ๋ผ๋„ ์ผ๋‹จ ๊ตฌํ˜„ํ•œ ์ 
  • ๊ธˆ์š”์ผ์ž„์—๋„ ๋งˆ์Œ ํ”๋“ค๋ฆฌ์ง€ ์•Š๊ณ  ํ•˜๋ฃจ ์—ด์‹ฌํžˆ ๋ณด๋‚ธ ์ !!!(์ง„์งœ ๋ฟŒ๋“ฏ)

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•™์Šต ๊ณ„ํšโ€ฆ ์–ผ๋ฅธ ์„ธ์šฐ์ž!