[ Node.js ] #01-2 How Node.js works

Haileeยท2021๋…„ 1์›” 14์ผ
0

[ node.js ]

๋ชฉ๋ก ๋ณด๊ธฐ
1/3
post-thumbnail

๋…ธ๋“œ?

๐Ÿ‘‰๐Ÿป ๋น„๋™๊ธฐ(Asynchronous) ์ด๋ฒคํŠธ-๊ธฐ๋ฐ˜(event-driven) Javascript ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

1. ๋น„๋™๊ธฐ (Asynchronous)

์†๋‹˜์ด ์™”์„ ๋•Œ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

  • ๋™๊ธฐ
    ๐Ÿ‘‰๐Ÿป ์ปคํ”ผ๋ฅผ ๋‚ด๋ฆฐ๋‹ค ๐Ÿ‘‰๐Ÿป ์ฒญ์†Œ๋ฅผ ํ•œ๋‹ค ๐Ÿ‘‰๐Ÿป ๋นจ๋ž˜๋ฅผ ํ•œ๋‹ค

  • ๋น„๋™๊ธฐ
    ๐Ÿ‘‰๐Ÿป ์ปคํ”ผ๋ฅผ ๋‚ด๋ฆฌ๋ฉด์„œ ์ฒญ์†Œ๋„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋นจ๋ž˜๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค
    ๐Ÿ‘‰๐Ÿป ๋ฌด์–ธ๊ฐ€ ๋„์™€์ฃผ๋Š” ์กด์žฌ๊ฐ€ ์žˆ๋‹ค.
    ๐Ÿ‘‰๐Ÿป ๋‚ด๊ฐ€, ํ˜น์€ ๋‹ค๋ฅธ ์กด์žฌ๊ฐ€ ์ผ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.


์˜ˆ์‹œ 1.

๋งŒ์•ฝ ๋™๊ธฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์ž๋ฉด

'๋‚˜'๋ผ๋Š” ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๋“ค์„ ๊ฐ€์ง„๋‹ค.
laundy๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์šฐ์„ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, while ๋ฌธ์„ ๋‹ค ๋๋‚ด๊ณ  ๋‚˜์„œ ์ฐจ๋ก€๋Œ€๋กœ ๋‹ค์Œ ํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค.
์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๐Ÿ‘‰๐Ÿป

์˜ˆ์‹œ 2.

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์ž๋ฉด,

promise ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ธ์ž๋กœ resolve, reject๋ฅผ ๊ฐ€์ง„๋‹ค.
์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๐Ÿ‘‰๐Ÿป

intervalId๋ฅผ const๋กœ ์„ ์–ธํ•œ ์ด์œ ๋Š”? -> ๋ฐ”๋€” ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ

ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” let์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ž˜ ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํ•œ๋ฒˆ ์„ ์–ธํ•œ ๊ฐ’์€ ์ž˜ ๋ฐ”๊พธ์ง€ ์•Š๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ


fetch ํ•จ์ˆ˜ -> ๋น„๋™๊ธฐ์  ์ผ์„ ํ•œ๋‹ค.

then, async, await๋ฅผ ๊ฑธ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ๋Š”๋‹ค.
๐Ÿ‘‰๐Ÿป ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ!/promise ๊ฐ์ฒด๊ฐ€ resolve ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ!

then, async, await๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ๋‹ค๋Š” ๋œป!
๐Ÿ‘‰๐Ÿป

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด
ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ node์— ๋น„๋™๊ธฐ์  ๊ฐœ๋…์ด ๋„์ž…๋œ ๊ฒƒ!


๋น„๋™๊ธฐ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ์—ญํ• ์ด ๋ฌด์กฐ๊ฑด ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. node์—์„œ ์ผ์„ ๋‚˜๋ˆ„์–ด์„œ ํ•ด์ฃผ๋Š” ๊ทธ ๋ถ€๋ถ„์€ ์–ด๋””์ผ๊นŒ?
๐Ÿ‘‰๐Ÿป Internal C++ thread pool
๐Ÿ‘‰๐Ÿป C++๋กœ ์งœ์—ฌ์ง„, ์ผ์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ์กด์žฌ๊ฐ€ ์žˆ์–ด์„œ ๋น„๋™๊ธฐ์  ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ!

์ด๋ฒคํŠธ์— ๊ธฐ๋ฐ˜ํ•œ(event-driven : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๊ธฐ๋ฐ˜ํ•œ), ํ•œ ์‹œ์ ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
๐Ÿ‘‰๐Ÿป ๋…ธ๋“œ์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ํ•œ ์‹œ์ ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ!(C++ ์“ฐ๋ ˆ๋“œ ํ’€์ด ์ž์›์ด ๋งŽ์ด ๋“œ๋Š” ์ผ์„ ๊ฐ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ๋ฐฉํ•ด๋ฅผ ๋ฐ›์ง€ ์•Š์Œ)


์ž ๊น, JS์—์„œ callback์€ ์ •ํ™•ํžˆ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋‚˜์š”?

๐Ÿ‘‰๐Ÿป ํ•œ๋งˆ๋””๋กœ, ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
๊ฐ ํ•จ์ˆ˜๋“ค์ด ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์‹œ์ ์— ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

3. Javascript ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

javascript๋ฅผ chrome V8 ์—”์ง„์œผ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์ฃผ๋ฉด์„œ,
javascript๋„ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ์—์„œ ๋Œ๋ ค๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.


์š”์•ฝ

  • ๋น„๋™๊ธฐ๋Š” ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋ฒคํŠธ-๊ธฐ๋ฐ˜ / ์‹ฑ๊ธ€-์Šค๋ ˆ๋“œ
  • Javascript ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ : C++ Chrome V8 ์—”์ง„
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ,
    ์ด๋ฅผ ์ „๋ถ€ ๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…๋„ ๋™์‹œ์— ์ž‘์—…ํ•œ๋‹ค.
  • ์•”ํ˜ธํ™” ๊ณผ์ • ๋˜ํ•œ ๋น„๋™๊ธฐ๋กœ ์ž‘์—…ํ•œ๋‹ค. (์—ฐ์‚ฐ๋˜๋Š” ์‹œ๊ฐ„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ)

Q & A

  1. ์™œ ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋‚˜์š”?
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์—ญํ• ์€?
    ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—, ์„ ํ–‰๋˜์–ด ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ!

  • JS ์—์„œ๋Š” ํ•จ์ˆ˜๋„ ํ•˜๋‚˜์˜ ๊ฐ’์ด๋‹ค.

  • JS ๋ฟ๋งŒ์ด ์•„๋‹Œ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋„ ๋˜‘๊ฐ™.
    ์›ํ•˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์•ผ.

const sumAndMultiply = (sum) => (multiply) => (a, b) => {
    const sum = add(a, b)
    const result = multiply(a, b)
    
    return [sum, result]
}

๋”ํ•˜๋Š” ํ•จ์ˆ˜, ๊ณฑํ•˜๋Š” ํ•จ์ˆ˜, ๋”ํ•˜๊ณ  ๊ณฑํ•  ์ธ์ž๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐ›๋Š” sumAndMultiply ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€, ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋œ ์ ์ด ์—†๋‹ค.
์ธ์ž๋กœ ํ•จ์ˆ˜๋งŒ์„ ๋„ฃ์–ด์ค˜์„œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ.
a, b๊ฐ€ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ์ˆœ๊ฐ„์—์„œ์•ผ ๊ณ„์‚ฐ์ด ๋œ๋‹ค.

๋ฐฐ์—ด ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์˜ ๊ฒฝ์šฐ

๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์˜ ๊ฒฝ์šฐ


์™œ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” const ๋ณ€์ˆ˜๋ช…, const { ๋ณ€์ˆ˜๋ช… }์ธ์ง€ ๊ถ๊ธˆํ–ˆ๋Š”๋ฐ. ์ด์œ ๋Š” ๋ฐ”๋กœ ์ด๊ฒƒ! ๐Ÿ‘‰๐Ÿป ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

ํ•ด๋‹น object ๋‚ด ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๊ฐ’๋“ค์„ ์ฝ• ์ง‘์–ด์„œ ๊ฐ€์ ธ์˜จ ๋’ค obj๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค! ์งฑ์‹ ๊ธฐ

  1. async ๋„ˆ๋ฌด ๋งŽ์€๋ฐ ๋ฌด์Šจ์ผ์ด์ฃ ? node๊ฐ€ ๋น„๋™๊ธฐ์— ๊ธฐ๋ฐ˜ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๊ฐ€์š”?
  • ๋งž์Šต๋‹ˆ๋‹ค.
  • TypeORM ์‹คํ–‰ ์ „์— await๋ฅผ ๋นผ๊ณ  ์‹คํ–‰ํ•ด๋ณด์„ธ์š”. ์™œ์ธ์ง€ ์•Œ๊ฒŒ ๋ ๊ฑฐ์—์š”.
  1. raw Query VS ORM
  • TypeORM, Sequelize, Prisma... ๋“ฑ ์—ฌ๋Ÿฌ ORM์ด ์žˆ๋Š”๋ฐ JS๋Š” ORM์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ ,
    raw query๋ฅผ 1:1 ๋งคํ•‘๋˜๋„๋ก ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์กฐ๊ฑด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ORM ๋งŽ์ด ์‚ฌ์šฉ
profile
์›น ๊ฐœ๋ฐœ ๐Ÿท๐Ÿ˜Ž๐Ÿ‘Š๐Ÿป๐Ÿ”ฅ

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