[Node.js] DAY 1. λ Έλμ ν΅μ¬ κ°λ
π±π» γ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μ²λΌ μ μ νμΌ μ 곡, λ‘λ λ°Έλ°μ±μ νΉνλ μΉ μλ²μ λΉν΄μ μλκ° λ리λ€.