Node.js

[Node.js] DAY 1. λ…Έλ“œμ˜ 핡심 κ°œλ…

lado 2021. 6. 23. 01:32

🐱‍πŸ’» γ€ŽNode.js κ΅κ³Όμ„œγ€(μ‘°ν˜„μ˜, 2020)을 ν•œ μž₯μ”© μ½μŠ΅λ‹ˆλ‹€.

  μ„œλ²„ μ‚¬μ΄λ“œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κΈ° μœ„ν•΄ Node.jsλ₯Ό μ‚¬μš©ν•œλ‹€λŠ”λ°, μ„œλ²„λž€ λ¬΄μ—‡μΈκ°€μš”?  


μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ

μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈμ˜ 관계λ₯Ό 식당 주인과 μ†λ‹˜μ΄λΌκ³  μƒκ°ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° 쉽닀. 식당 μ†λ‹˜μ€ 식당 μ£ΌμΈμ—κ²Œ μ–΄λ–€ μŒμ‹μ„ μš”μ²­ν•˜κ³  식당 주인은 μš”μ²­ 받은 μŒμ‹μ„ μ œκ³΅ν•œλ‹€. 이와 같이 ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ—κ²Œ μ •λ³΄λ‚˜ μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•˜κ³ , μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μš”μ²­ 받은 μ •λ³΄λ‚˜ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•œλ‹€. μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ν•˜κ³ , μ œκ³΅ν•˜λŠ” 역할에 따라 λΆ™μ—¬μ§„ 이름이닀. 초λ°₯μ§‘ 사μž₯λ‹˜λ„ κΉ€λ°₯집에 κ°€μ„œ κΉ€λ°₯을 μ‹œν‚€λ©΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 상황에 따라 ν΄λΌμ΄μ–ΈνŠΈλŠ” λΈŒλΌμš°μ €μΌ μˆ˜λ„ 있고, λ°μŠ€ν¬ν†± ν”„λ‘œκ·Έλž¨μΌ μˆ˜λ„ 있고, λͺ¨λ°”일 앱일 μˆ˜λ„ 있고, λ‹€λ₯Έ μ„œλ²„μ— μš”μ²­μ„ λ³΄λ‚΄λŠ” μ„œλ²„ 컴퓨터일 μˆ˜λ„ μžˆλ‹€.


  μ™œ λ‹€λ₯Έ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ꡳ이 λ…Έλ“œλ₯Ό μ‚¬μš©ν•΄ μ„œλ²„λ₯Ό λ§Œλ“œλ‚˜μš”?  


λ…Έλ“œμ˜ νŠΉμ„±

 

1. Javascript Runtime

  Node.jsβ“‡λŠ” Chrome V8 Javascript μ—”μ§„μœΌλ‘œ λΉŒλ“œλœ Javascript λŸ°νƒ€μž„  


λŸ°νƒ€μž„μ€ νŠΉμ • μ–Έμ–΄λ‘œ λ§Œλ“  ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ λ§ν•œλ‹€. κΈ°μ‘΄μ—λŠ” λΈŒλΌμš°μ €μ—λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ΄ λ‚΄μž₯λ˜μ–΄ μžˆμ—ˆκΈ° λ•Œλ¬Έμ—, μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž¨μ€ μ›Ή λΈŒλΌμš°μ € μœ„μ—μ„œλ§Œ μ‹€ν–‰ν•  수 μžˆμ—ˆλ‹€. ꡬ글이 λ‹€λ₯Έ μ—”μ§„κ³Ό λ‹€λ₯΄κ²Œ 맀우 λΉ λ₯Έ V8 엔진을 μΆœμ‹œν•˜λ©΄μ„œ Ryan Dahl은 2009λ…„ V8 μ—”μ§„ 기반의 λ…Έλ“œ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν–ˆλ‹€. 이제 λ…Έλ“œλΌλŠ” λŸ°νƒ€μž„ ν™˜κ²½μ„ 톡해 λΈŒλΌμš°μ € λ°–μ—μ„œλ„ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λͺ¨λ“  κ±Έ ν•  수 있게 λ˜μ—ˆλ‹€.

2. Event Driven

이벀트 κΈ°λ°˜μ΄λž€ μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ 미리 μ§€μ •ν•΄λ‘” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 방식을 λ§ν•œλ‹€. 이벀트 λ¦¬μŠ€λ„ˆμ— 콜백 ν•¨μˆ˜λ₯Ό 등둝해놓고 μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œλ§ˆλ‹€ 콜백 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ²Œ ν•˜λŠ” 것이닀. μ—¬λŸ¬ μ΄λ²€νŠΈκ°€ λ™μ‹œμ— λ°œμƒν–ˆμ„ λ•ŒλŠ”, 이벀트 루프가 μ–΄λ–€ μˆœμ„œλ‘œ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• μ§€ νŒλ‹¨ν•΄μ„œ 호좜 μŠ€νƒμ— μŒ“μ•„λ†“λŠ”λ‹€. 호좜 μŠ€νƒμ— μŒ“μΈ ν•¨μˆ˜κ°€ 싀행될 λ•Œ, νƒ€μ΄λ¨Έλ‚˜ 이벀트 λ¦¬μŠ€λ„ˆμ˜ 콜백 ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— 싀행될 수 μžˆλŠ” λ°±κ·ΈλΌμš΄λ“œλ‘œ 보낸닀. 타이머 μ‹œκ°„μ΄ λ‹€ λ˜κ±°λ‚˜ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œλŠ” νƒœμŠ€ν¬ 큐둜 νƒ€μ΄λ¨Έλ‚˜ 이벀트 λ¦¬μŠ€λ„ˆμ˜ 콜백 ν•¨μˆ˜λ₯Ό 보낸닀. 이벀트 λ£¨ν”„λŠ” 호좜 μŠ€νƒμ— μžˆλŠ” ν•¨μˆ˜κ°€ λ‹€ μ‹€ν–‰λ˜μ–΄ 호좜 μŠ€νƒμ΄ λΉ„μ–΄ 있으면 νƒœμŠ€ν¬ νμ—μ„œ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ”© 가져와 호좜 μŠ€νƒμœΌλ‘œ 올렀 μ‹€ν–‰ν•œλ‹€.

3. Non-Blocking I/O

I/Oλž€ μž…λ ₯(Input)κ³Ό 좜λ ₯(Output)으둜, μ»΄ν“¨ν„°μ—μ„œ νŒŒμΌμ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 읽고 μ“°κ±°λ‚˜ λ„€νŠΈμ›Œν¬μ— μš”μ²­μ„ ν•˜κ³  응닡을 λ°›μ•„ μ˜€λŠ” λ“±μ˜ 행동을 λ§ν•œλ‹€. λ…Ό λΈ”λ‘œν‚Ήμ΄λž€ 이전 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜μ§€ μ•Šκ³  λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것을 λ§ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ΄κΈ° λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” λ™μ‹œμ— 싀행될 수 μ—†λ‹€. ν•˜μ§€λ§Œ λ…Έλ“œλŠ” I/O μž‘μ—…μ„ λ°±κ·ΈλΌμš΄λ“œλ‘œ λ„˜κ²¨ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ‹€. μ½”λ“œλ₯Ό λ…Ό λΈ”λ‘œν‚ΉμœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ 'setTimeout(콜백 ν•¨μˆ˜, 타이머 μ‹œκ°„)'μ΄λ‚˜ 'setImmediate(콜백 ν•¨μˆ˜)'λ₯Ό μ‚¬μš©ν•œλ‹€. λ…Ό λΈ”λ‘œν‚Ή λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€κ³  λͺ¨λ“  μž‘μ—…μ΄ λ™μ‹œμ— 싀행될 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. λ™μ‹œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•œ μž‘μ—…μ„ λ…Ό λΈ”λ‘œν‚Ή μ²˜λ¦¬ν•΄μ•Ό λ™μ‹œμ— μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€. λ…Ό λΈ”λ‘œν‚Ήμ€ 비동기 κ°œλ…κ³Ό μœ μ‚¬ν•˜λ‹€.

4. Single Thread

μš΄μ˜μ²΄μ œμ—μ„œ μ—¬λŸ¬κ°€μ§€ ν”„λ‘œκ·Έλž¨μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜κ²Œ 되면 ν”„λ‘œκ·Έλž¨λ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€κ°€ ν• λ‹Ήλœλ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨κ³Ό λΉ„μŠ·ν•˜λ‹€κ³  보면 λœλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ 사싀 컴퓨터가 λΉ λ₯Έ μ†λ„λ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν• λ‹Ήν•˜λ©΄μ„œ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” 것이닀.
μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” νλ¦„μ˜ λ‹¨μœ„μ΄λ‹€. ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 일손과 같은 κ°œλ…μ΄λ‹€. ν•œ ν”„λ‘œμ„ΈμŠ€μ— 3개의 μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜μ–΄ μžˆλ‹€λ©΄ ν•œ 식당에 점원이 3λͺ… μžˆλŠ” 것과 κ°™λ‹€. ν”„λ‘œμ„ΈμŠ€ μ—¬λŸ¬ 개λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” κ²ƒμ²˜λŸΌ μŒμ•…μ„ μž¬μƒν•˜λŠ” μŠ€λ ˆλ“œ, νŒŒμΌμ„ μ£Όκ³  λ°›λŠ” μŠ€λ ˆλ“œ, μŠ€νŠΈλ¦¬λ°μ„ ν•˜λŠ” μŠ€λ ˆλ“œ λ“± μ›ν•˜λŠ” κΈ°λŠ₯λ§ˆλ‹€ κ°œλ³„μ μΈ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ ν•œ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ—¬λŸ¬κ°€μ§€ μŠ€λ ˆλ“œλ₯Ό λ™μ‹œλ‹€λ°œμ μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•  수 μžˆλ‹€.

μ—„λ°€νžˆ λ§ν•˜λ©΄ λ…Έλ“œλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ 직접 μ œμ–΄ν•  수 μžˆλŠ” μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜λΏμ΄κΈ° λ•Œλ¬Έμ— μ‹±κΈ€ μŠ€λ ˆλ“œλΌκ³  여겨진닀. κ·Έλž˜μ„œ λ…Έλ“œλŠ” I/O μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μ’‹μ§€λ§Œ CPU μž‘μ—…(연산이 λ§Žμ€ μž‘μ—…)을 μ²˜λ¦¬ν•˜κΈ°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€. ν•˜μ§€λ§Œ λ…Έλ“œμ˜ 'μ›Œμ»€ μŠ€λ ˆλ“œ'λΌλŠ” κΈ°λŠ₯으둜 λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•  수 있게 λ˜μ—ˆκΈ° λ•Œλ¬Έμ— CPU μž‘μ—…μ€ μ›Œμ»€ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
μ‹±κΈ€ μŠ€λ ˆλ“œ, λΈ”λ‘œν‚Ή λͺ¨λΈμ€ 점원이 ν•œ λͺ… 있고, 이전 μ†λ‹˜ μš”λ¦¬κ°€ λ‚˜μ™€μ•Ό λ‹€μŒ μ†λ‹˜ μš”λ¦¬μ˜ 주문을 λ°›λŠ” 식당에 λΉ„μœ ν•  수 μžˆλ‹€. μ‹±κΈ€ μŠ€λ ˆλ“œ, λ…Ό λΈ”λ‘œν‚Ή λͺ¨λΈμ€ μ—¬μ „νžˆ 점원은 ν•œ λͺ… μžˆμ§€λ§Œ, 점원이 이전 μ†λ‹˜ μš”λ¦¬κ°€ λλ‚˜κΈ°κΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” λŒ€μ‹  주문이 λ“€μ–΄μ™”λ‹€λŠ” μ‚¬μ‹€λ§Œ 주방에 계속 μ•Œλ €μ£Όκ³  μš”λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ μ™„λ£Œλœ μˆœμ„œλŒ€λ‘œ μ†λ‹˜μ—κ²Œ μ„œλΉ™ν•˜λŠ” 식당에 λΉ„μœ ν•  수 μžˆλ‹€. λ©€ν‹° μŠ€λ ˆλ“œλŠ” μ†λ‹˜ ν•œ λͺ…이 올 λ•Œλ§ˆλ‹€ 점원도 ν•œ λͺ…μ”© λΆ™μ–΄ 주문을 λ°›κ³  μ„œλΉ™ν•˜λŠ” 식당에 λΉ„μœ ν•  수 μžˆλ‹€.

λ©€ν‹° μŠ€λ ˆλ“œκ°€ κΌ­ 쒋은 κ²ƒλ§Œμ€ μ•„λ‹ˆλ‹€. μŠ€λ ˆλ“œκ°€ λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ 정보듀을 κ°œλ³„μ μœΌλ‘œ λ§Œλ“€μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 증가할 수 있고, μŠ€λ ˆλ“œ κ°œμˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μ—¬λŸ¬κ°€μ§€ μŠ€λ ˆλ“œλ₯Ό μŠ€μΌ€μ€„λ§ν•΄μ„œ 순차적으둜 λ‹€ 기회λ₯Ό μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ„μš©μ΄ λ°œμƒν•œλ‹€. 또, μ—¬λŸ¬κ°€μ§€ μŠ€λ ˆλ“œκ°€ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ— μžˆλŠ” κ³΅ν†΅λœ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜κ²Œ 되면 μ–΄λ–€ μŠ€λ ˆλ“œκ°€ μ—…λ°μ΄νŠΈν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” κ·Έ λ¦¬μ†ŒμŠ€λ₯Ό 더이상 μ“Έ μˆ˜κ°€ μ—†λŠ” λ“±μ˜ 일듀이 λ°œμƒν•  수 μžˆλ‹€.

  κ·Έλž˜μ„œ λ…Έλ“œλ‘œ μ„œλ²„λ₯Ό λ§Œλ“€λ©΄ 뭐가 쒋은 κ±΄κ°€μš”?  


μ„œλ²„λ‘œμ„œμ˜ λ…Έλ“œ


μž₯점

  • μ„œλ²„μ—λŠ” I/O μš”μ²­μ΄ 많이 λ°œμƒν•˜λ―€λ‘œ, I/O 처리λ₯Ό μž˜ν•˜λŠ” λ…Έλ“œλ₯Ό μ„œλ²„λ‘œ μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€.
  • λ„€νŠΈμ›Œν¬λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€, λ””μŠ€ν¬ μž‘μ—…κ³Ό 같은 I/O에 νŠΉν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ— κ°œμˆ˜λŠ” λ§Žμ§€λ§Œ ν¬κΈ°λŠ” μž‘μ€ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ£Όκ³  λ°›λŠ” 데에 μ ν•©ν•˜λ‹€.
    • (μ˜ˆμ‹œ) μ‹€μ‹œκ°„ μ±„νŒ… μ• ν”Œλ¦¬μΌ€μ΄μ…˜, 주식 차트, JSON 데이터λ₯Ό μ œκ³΅ν•˜λŠ” API μ„œλ²„
  • λ©€ν‹° μŠ€λ ˆλ“œ 방식보닀 μƒλŒ€μ μœΌλ‘œ μ‰¬μš°λ―€λ‘œ μ‰½κ²Œ μž…λ¬Έν•  수 μžˆλ‹€.
  • μ›Ή μ„œλ²„κ°€ λ‚΄μž₯λ˜μ–΄ μžˆμ–΄ μž…λ¬Έμžκ°€ μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° 떄문에 ν•˜λ‚˜μ˜ μ–Έμ–΄λ‘œ μ›Ή μ‚¬μ΄νŠΈλ₯Ό κ°œλ°œν•  수 μžˆμ–΄ 개발 생산성을 획기적으둜 높일 수 μžˆλ‹€.
  • JSON을 μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 


단점

  • μ½”λ“œκ°€ λͺ¨λ‘ μŠ€λ ˆλ“œ ν•˜λ‚˜μ—μ„œ 처리되기 λ•Œλ¬Έμ— CPU λΆ€ν•˜κ°€ 큰 μž‘μ—…(이미지, λΉ„λ””μ˜€ 처리, λŒ€κ·œλͺ¨ 데이터 처리)μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.
  • μ›Œμ»€ μŠ€λ ˆλ“œ κΈ°λŠ₯으둜 λ©€ν‹° μŠ€λ ˆλ“œ μž‘μ—…μ„ ν•  μˆ˜λŠ” μžˆμ§€λ§Œ λ©€ν‹° μŠ€λ ˆλ“œ ν”„λž˜κ·Έλž˜λ°μ„ ν•˜λ”λΌλ„ C, C++, Rust, Go와 같은 언어에 λΉ„ν•΄ 속도가 많이 λŠλ¦¬λ‹€.
  • ν•˜λ‚˜λΏμΈ μŠ€λ ˆλ“œκ°€ μ—λŸ¬λ‘œ 인해 λ©ˆμΆ”μ§€ μ•Šλ„λ‘ 잘 관리해야 ν•œλ‹€.
  • Go처럼 비동기에 강점을 λ³΄μ΄λŠ” μ–Έμ–΄λ‚˜ nginx처럼 정적 파일 제곡, λ‘œλ“œ λ°ΈλŸ°μ‹±μ— νŠΉν™”λœ μ›Ή μ„œλ²„μ— λΉ„ν•΄μ„œ 속도가 λŠλ¦¬λ‹€.