🚧

node.jsλž€ 무엇이고 node.jsλ₯Ό μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

purpplee 2021. 11. 1. 17:54

Node.js λž€?

Node.js λž€ Chrome V8 JavaScript μ—”μ§„μœΌλ‘œ λΉŒλ“œλœ JavaScript λŸ°νƒ€μž„μ΄λ‹€. μ—¬κΈ°μ„œλŠ” V8 엔진이 λ‹€λ₯Έ JS 엔진보닀 속도가 λΉ λ₯΄λ‹€λŠ” κ²ƒλ§Œ κΈ°μ–΅ν•˜λ„λ‘ ν•˜κ³ , λŸ°νƒ€μž„μ— μ΄ˆμ μ„ λ§žμΆ”μž. λŸ°νƒ€μž„μ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ κ΅¬λ™λ˜λŠ” ν™˜κ²½μ„ λ§ν•œλ‹€. 즉, Node.js λŠ” JavaScript λ₯Ό κ΅¬λ™μ‹œν‚€λŠ” ν™˜κ²½μ΄λ‹€.

 

Node.js 탄생 λ°°κ²½

μ΄μ „κΉŒμ§€λŠ” JavaScript λŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œλ§Œ 싀행됐고, μ„œλ²„ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λ €λ‹ˆ 느린 속도가 발λͺ©μ„ μž‘μ•˜λ‹€. 이후 V8μ—”μ§„μ˜ λ“±μž₯으둜 속도가 빨라진 덕뢄에 μ›Ή λΈŒλΌμš°μ € μ™Έμ˜ ν™˜κ²½μ—μ„œ μ“Έ 수 μžˆλ„λ‘ ν‘œμ€€μ„ λ§Œλ“€μžλŠ” 말이 λ§Žμ•„μ‘Œκ³ , κ·Έ λ…Έλ ₯으둜 λ§Œλ“€μ–΄μ§„ 것이 λ°”λ‘œ Node.jsλ‹€. Node.js λ₯Ό μ„€μΉ˜ν•˜λ©΄ 우리의 μ»΄ν“¨ν„°μ—μ„œ JavaScript 둜 μž‘μ„±λœ μ½”λ“œλ₯Ό κ΅¬λ™μ‹œν‚¬ 수 μžˆλ‹€.

 

Node.js λŠ” μ›Ήμ„œλ²„λ‹€?

Node.js λŠ” JavaScriptλ₯Ό μ„œλ²„ ν™˜κ²½μ—μ„œλ„ μ‚¬μš©λ  수 μžˆλ„λ‘ κ³ μ•ˆλœ λŸ°νƒ€μž„μ΄λ‹€. λ”°λΌμ„œ JavaScript 둜 μž‘μ„±λœ μ„œλ²„λ₯Ό κ΅¬λ™μ‹œν‚¬ 수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•΄μ€€λ‹€. 즉, μ›Ήμ„œλ²„ μžμ²΄κ°€ μ•„λ‹ˆλΌ μ›Ήμ„œλ²„λ₯Ό λ§Œλ“€ 수 μžˆλŠ” ν™˜κ²½μ΄λ‹€. λ‚΄μž₯ HTTP 라이브러리λ₯Ό λ‚΄μž₯ν•˜κ³  μžˆλŠ” 데닀 λ‹€μ–‘ν•œ μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ μžˆμ–΄μ„œ λ”°λ‘œ μ›Ήμ„œλ²„λ₯Ό λ„μš°μ§€ μ•Šμ•„λ„ λœλ‹€.

* μ›Ήμ„œλ²„λž€ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° HTTP μš”μ²­μ„ 받아듀이고 정적 λ¬Έμ„œ(HTML λ¬Έμ„œ λ“±) 을 λ°˜ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. λŒ€ν‘œμ μœΌλ‘œ Aphach, Nginx κ°€ μžˆλ‹€. 일반적으둜 동적인 처리λ₯Ό ν•΄μ£ΌλŠ” WAS의 μ•žλ‹¨μ— λ°°μΉ˜λœλ‹€.

 

Node.js 의 νŠΉμ§•

Non-Blocking, Single-Thread

 

κΈ°μ‘΄ μ›Ήμ„œλ²„λŠ” λŒ€λΆ€λΆ„ μŠ€λ ˆλ“œ 기반으둜 I/O λ₯Ό μ²˜λ¦¬ν–ˆλ‹€. Node.js λŠ” λŒ€κ·œλͺ¨ λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλ˜μ–΄ 이벀트 기반으둜 μ²˜λ¦¬ν•œλ‹€.

 

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό λ“€μ–΄ λΉ„κ΅ν•΄λ³΄μžλ©΄ 10λΆ„ κ±Έλ¦¬λŠ” Aμž‘μ—…, 20λΆ„ κ±Έλ¦¬λŠ” Bμž‘μ—…μ΄ μžˆμ„ λ•Œ,

  1. μŠ€λ ˆλ“œ κΈ°λ°˜μ—μ„œλŠ” Aμž‘μ—…μ— λŒ€ν•œ μŠ€λ ˆλ“œμ™€ Bμž‘μ—…μ— λŒ€ν•œ μŠ€λ ˆλ“œλ₯Ό 생성해 λ™μ‹œμ— μ‹€ν–‰ν•œλ‹€. (μž‘μ—…μ„ μŠ€λ ˆλ“œλ‘œ λΉ„λ™κΈ°λ‘œ 처리)
  2. 이벀트 κΈ°λ°˜μ—μ„œλŠ” 각각을 μ€€λΉ„ν•˜λ‹€κ°€ Aμž‘μ—…μ΄ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ A μž‘μ—…μ„ μ‹œμž‘ν•˜κ³  Bμž‘μ—… μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ Bμž‘μ—…μ„ μ‹œμž‘ν•œλ‹€. λ§Œμ•½ Aμž‘μ—… 쀑에 Bμž‘μ—…μ„ ν•΄μ•Όν•œλ‹€λ©΄, Bμž‘μ—… 이벀트λ₯Ό λ°œμƒμ‹œμΌœ Aμž‘μ—…μ„ μž μ‹œ λ©ˆμΆ”κ³  Bμž‘μ—…μ„ μ‹€ν–‰ν•œλ‹€. (μž‘μ—…μ„ 이벀트 기반으둜 λΉ„λ™κΈ°λ‘œ 처리)
* μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄ μ–΄λ–€ μ‹€ν–‰μ˜ 흐름이닀.
* 이벀트 κΈ°λ°˜μ΄λž€ νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•ŒκΉŒμ§€ λŒ€κΈ°ν–ˆλ‹€κ°€, λ°œμƒν•˜λ©΄ μ§€μ •λœ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 방식이닀. 이벀트λ₯Ό λŒ€κΈ°ν•˜λŠ” ν•¨μˆ˜λ₯Ό 이벀트 λ¦¬μŠ€λ„ˆλΌκ³  ν•˜κ³ , μ§€μ •λœ μž‘μ—…κ³Ό κ΄€λ ¨λœ ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  ν•œλ‹€.

μ „μžλŠ” μš”μ²­λ§ˆλ‹€ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λ―€λ‘œ λ§Žμ€ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ 그만큼 λ©”λͺ¨λ¦¬λ₯Ό μž‘μ•„λ¨Ήκ²Œ λœλ‹€. 또 μŠ€λ ˆλ“œλ“€μ΄ λ™μ‹œμ— λ˜‘κ°™μ€ μžμ›μ„ ν•„μš”λ‘œ ν•˜λŠ” 경우 ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ 좩돌이 일어날 수 μžˆλ‹€.(병λͺ©ν˜„상)

 

ν›„μžλŠ” 각 μš”μ²­λ§ˆλ‹€ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ©”λͺ¨λ¦¬λ₯Ό λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ³΄λ‹€ 적게 μž‘μ•„λ¨ΉλŠ”λ‹€. μŠ€λ ˆλ“œκ°€ μ—¬λŸ¬κ°œκ°€ μ•„λ‹ˆλ‹ˆ λ™μ‹œμ— λ˜‘κ°™μ€ μžμ›μ„ ν•„μš”λ‘œν•˜λŠ” 상황도 λ²Œμ–΄μ§€μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ λ§Žμ€ μš”μ²­μ΄ λ“€μ–΄μ˜€λŠ” ν™˜κ²½μ—μ„œ 효율적으둜 λ™μž‘ν•  수 μžˆλ‹€.

 

즉, Node.js λŠ” 이벀트 기반 μ‹œμŠ€ν…œμœΌλ‘œ κ΅¬μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ— 비동기λ₯Ό κ΅¬ν˜„ν•  수 있고, 이 덕뢄에 Non-Blocking 을 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ μˆ˜ν–‰ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€.

* Blocking 은 Node.js ν”„λ‘œμ„ΈμŠ€μ—μ„œ ν•œ μž‘μ—…μ˜ 싀행을 μœ„ν•΄ λ‹€λ₯Έ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λŠ” 방식이고, Non-Blocking 은 κ·Έ λ°˜λŒ€μ΄λ‹€. Aμž‘μ—… 쀑 Bμž‘μ—…μ„ μ‹€ν–‰μ‹œμΌœμ•Όν•  λ•Œ, Blocking 방식이라면 Aμž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κ³ (block) Non-Blocking 방식이라면 Aμž‘μ—…μ΄ λλ‚˜μ§€ μ•Šμ•˜λ”λΌλ„ 기닀리지 μ•Šκ³ (non-block) Bμž‘μ—…μ΄ 싀행될 수 μžˆλ‹€.

 

참고둜 μ—¬κΈ°μ„œλŠ” μ˜ˆμ‹œλ₯Ό λ“€κΈ° μœ„ν•΄ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν–ˆμ§€λ§Œ, μ‹€μ œλ‘œλŠ” 각 μš”μ²­μ— λŒ€ν•΄ λ‚΄λΆ€μ μœΌλ‘œ 비동기 처리λ₯Ό μœ„ν•œ μŠ€λ ˆλ“œλ₯Ό  μ—¬λŸ¬κ°œ μƒμ„±ν•œλ‹€. 단, μš”μ²­ 처리 μžμ²΄λŠ” 이벀트 λ£¨ν”„λΌλŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ λ‚΄μ—μ„œ 처리되고 κ°œλ°œμžκ°€ μ‘°μž‘ν•  수 μžˆλŠ” μŠ€λ ˆλ“œλ„ 이 이벀트 λ£¨ν”„λΌλŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ 뿐이라 μ‹±κΈ€ μŠ€λ ˆλ“œ ν™˜κ²½μ΄λΌκ³  λΆ€λ₯΄λŠ” 것이닀.

 

μ—¬κΈ°μ„œλŠ” Node.js κ°€ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ μš”μ²­μ„ λ‚΄λΆ€μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ”μ§€λŠ” 닀루지 μ•ŠλŠ”λ‹€. 그건 κΈΈμ–΄μ§ˆ 것 κ°™μœΌλ‹ˆ λ‹€μŒ νŽ˜μ΄μ§€μ—...

 

Node.js λŠ” μ–Έμ œ μ‚¬μš©ν• κΉŒ?

μ„€λͺ…μ—μ„œ λ΄€λ“―, Node.js μ—μ„œ μš”μ²­μ€ μŠ€λ ˆλ“œ ν™˜κ²½κ³Ό 달리 λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬λœλ‹€. λ”°λΌμ„œ 이벀트둜 μ²˜λ¦¬λ˜λŠ” μž‘μ—…μ˜ μ‹œκ°„μ΄ μ§§κ³  이런 μš”μ²­μ΄ μ•„μ£Ό 많이 λ“€μ–΄μ˜€λŠ” μ‹œμŠ€ν…œμ˜ 경우라면 Node.js 의 νŠΉμ§•μ„ 잘 살릴 수 μžˆλ‹€. 반면 CPU μ‹œκ°„μ„ 많이 μž‘μ•„λ¨ΉλŠ”, 즉 처리 μ‹œκ°„μ΄ κΈ΄ μž‘μ—…μ΄ λ§Žμ€ κ²½μš°μ—λŠ” 병렬 처리λ₯Ό ν•˜λŠ” Node.js κ°€ λΆ€μ ν•©ν•˜λ‹€.

 

또 JavaScript λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€. 참고둜 Spring 의 경우 JSON ν˜•μ‹μ˜ 데이터λ₯Ό λ”°λ‘œ νŒŒμ‹±ν•΄μ•Ό ν•˜λ‹ˆ JSON ν˜•μ‹μ˜ 데이터λ₯Ό 많이 μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λΌλ©΄ Node.js κ°€ 적합할 수 μžˆλ‹€.

 

EX) κ°„λ‹¨ν•œ ν…μŠ€νŠΈ/이미지/λ™μ˜μƒ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ£Όκ³ λ°›λŠ” μ±„νŒ… ν”„λ‘œκ·Έλž¨, μ‹€μ‹œκ°„ 주식 차트 ν”„λ‘œκ·Έλž¨...

 

마치며...

μ—¬λŸ¬ 글을 μ°Έκ³ ν•˜μ—¬ μ“΄ 글이라 아직 이해도 λΆ€μ‘±ν•˜κ³  ν‹€λ¦° 정보도 μžˆμ„ 것이닀. 닀듬어야할 뢀뢄도 λ§Žλ‹€. 일단 μ‹œκ°„μ΄ μ§€λ‚˜κ³  λ‹€μ‹œ ν•œλ²ˆ 봀을 땐 또 μƒˆλ‘œμš΄ 것듀이 λ³΄μΌν…Œλ‹ˆ 이후에 λ‹€λ“¬κΈ°λ‘œ...

λ°˜μ‘ν˜•