- Node.js λͺ¨λ μ¬μ©λ²
- μλ νν° λͺ¨λ(3rd-party module)
- Node.js 곡μ λ¬Έμλ₯Ό νμ©νμ¬ fs.readFile μ΄μ©
Chrome V8 JavaScript μμ§μΌλ‘ λΉλ λ JavaScript λ°νμ
- Node.jsλ JavaScriptλ₯Ό μλ²μμλ μ¬μ©ν μ μλλ‘ λ§λ νλ‘κ·Έλ¨μ΄λ€.
- Node.jsλ V8μ΄λΌλ JavaScript μμ§ μμμ λμνλ μλ°μ€ν¬λ¦½νΈ λ°νμ(νκ²½)μ΄λ€.
- Node.jsλ μλ²μ¬μ΄νΈ μ€ν¬λ¦½νΈ μΈμ΄κ° μλλ€. νλ‘κ·Έλ¨(νκ²½)μ΄λ€.
- Node.jsλ μΉμλ²μ κ°μ΄ νμ₯μ± μλ λ€νΈμν¬ νλ‘κ·Έλ¨μ μ μνκΈ° μν΄ λ§λ€μ΄μ‘λ€.
Node.jsλ νμ₯μ±μ΄ μλ λ€νΈμν¬ μ΄ν리μΌμ΄μ
κ°λ°μ μ¬μ©λλ μννΈμ¨μ΄ νλ«νΌμ΄λ€. νΉν μλ²μ¬μ΄νΈμμ λ§μ΄ μ¬μ©λκ³ μλ€.
μ¬μ©λλ μΈμ΄λ‘λ μλ°μ€ν¬λ¦½νΈ(Javascript)λ₯Ό νμ©νλ©°, Non-blocking I/Oμ λ¨μΌ μ€λ λ μ΄λ²€νΈ 루νλ₯Ό ν΅ν λμ μ²λ¦¬ μ±λ₯μ κ°μ§κ³ μλ κ²μ΄ νΉμ§μ΄λ€.
λ΄μ₯ HTTP μλ² λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬ν¨νκ³ μμ΄ μΉ μλ²μμ μνμΉ λ±μ λ³λ μννΈμ¨μ΄ μμ΄ λμνλ κ²μ΄ κ°λ₯νλ©°, μ΄λ₯Ό ν΅ν μΉ μλ²μ λμμ μμ΄ λ λ§μ ν΅μ μμ λ²μ΄λ μ¬λ¬ κ°μ§ κΈ°λ₯μ κ°λ₯νκ² νλ€.
μ¦, Node.jsλ₯Ό ν΅ν΄ μΉμ΄ν리μΌμ΄μ μ΄ λμ± λ°μ νκ² λμμΌλ©°, μ μ μΈ ννμ΄μ§ λΏλ§ μλλΌ μΌνλͺ°, ν°μΌ μ맀μ¬μ΄νΈ, λΈλ‘κ·Έ λ± λ°μ΄ν°κ° λ³ν΄κ°λ μ¬μ΄νΈλ₯Ό λ§λ€ μ μμΌλ©°, μ¬λ¬ κ°λ°μκ° λ§λ νλ‘κ·Έλ¨κ³Ό κ²μμ μΉμμμ ꡬλμμΌ μλλ‘μ΄λν°, μμ΄ν°, μλμ°PC, λ§₯ λ± νλ«νΌμ μ μ½μμ λ²μ΄λ μ΄λλ μκ΄μμ΄ μ€ν κ°λ₯νκ² ν΄μ€λ€.
λ¬Όλ‘ λ¨μν μΉμμ μ€ν κ°λ₯ν κ²μμ λ§λ€λ €λ©΄ JavaScript λ§μΌλ‘λ κ°λ₯νμ§λ§ μ’ λ μ§ν λ νλ‘κ·Έλ¨μΌλ‘ μ€μκ° μ¨λΌμΈ μ±ν , μ€μκ° μ¨λΌμΈ κ²μ λ± μ€μκ° κΈ°λ₯μ λ£κ±°λ, λ‘κ·ΈμΈ κΈ°λ₯μ λ£μ΄ μ μ λ₯Ό κ΄λ¦¬νκ³ μ μλ₯Ό κ΄λ¦¬νλ λ°μ΄ν°λ² μ΄μ€ κΈ°λ₯μ Node.jsλ₯Ό ν΅ν΄ λ§λ€ μκ° μλ€.
Node.jsλ₯Ό μ¬μ©νλ €λ©΄ λ¨Όμ JavaScriptλ₯Ό λ°°μμΌνλ€.
Node.jsλ JavaScriptλ₯Ό μ¬μ©νκΈ° μν΄ λ§λ€μ΄μ§ κ²μ΄κΈ° λλ¬Έμ΄λ€.
JavaScriptλ C/C++, Java μ κ°μ νλ‘κ·Έλλ° μΈμ΄μ΄λ€.
νμ§λ§ μ΄λ¦μμ μ μ μλ― JavaScriptλ λ 립μ μΈ μΈμ΄κ° μλ μ€ν¬λ¦½νΈ μΈμ΄μ΄λ€.
μ€ν¬λ¦½νΈ μΈμ΄λ νΉμ ν νλ‘κ·Έλ¨ μμμ λμνλ νλ‘κ·Έλ¨μ΄κΈ° λλ¬Έμ μΉ λΈλΌμ°μ νλ‘κ·Έλ¨ μμμλ§ λμμ νλ€.
μ¦, μΉ λΈλΌμ°μ (ν¬λ‘¬, μ¬ν리, μ΅μ€νλ‘λ¬, νμ΄μ΄νμ€ λ±)κ° μμΌλ©΄ μ¬μ©ν μ μλ νλ‘κ·Έλ¨μ΄λ€.
μ¬κΈ°μ Node.jsκ° λμ€λ μ΄μ κ° λλ€.
μ¦, JavaScript λ₯Ό μΉ λΈλΌμ°μ μμ λ 립μν¨ κ²μΌλ‘ Node.jsλ₯Ό μ€μΉνκ² λλ©΄ ν°λ―Έλνλ‘κ·Έλ¨(μλμ°μ cmd, λ§₯μ terminal λ±)μμ Node.jsλ₯Ό μ λ ₯νμ¬ λΈλΌμ°μ μμ΄ λ°λ‘ μ€νν μ μλ€.
νμ§λ§ JavaScriptμμ λΆλ¦¬λ μΈμ΄μ΄κΈ° λλ¬Έμ λ¬Έλ²μ κ°λ€.
μ΄λ κ² Node.jsλ₯Ό μ΄μ©νμ¬ μΉ λΈλΌμ°μ μ 무κ΄ν νλ‘κ·Έλ¨μ λ§λ€ μ μκ² λμλ€.
μ€μν κ²μ Node.jsλ₯Ό μ΄μ©νμ¬ μλ²λ₯Ό λ§λ€ μ μλ€λ κ²μ΄λ€.
μ€μν μ΄μ λ μ΄μ κΉμ§ Server-Client μΉμ¬μ΄νΈλ₯Ό λ§λ€ λ μΉμμ νμλλ λΆλΆμ JavaScript λ₯Ό μ¬μ©νμ¬ λ§λ€μ΄μΌλ§ νμΌλ©°, μλ²λ Reby, Java λ± λ€λ₯Έ μΈμ΄λ₯Ό μ¨μ λ§λ€μμ΄μΌ νλλ° λ§μΉ¨λ΄ ν κ°μ§ μΈμ΄λ‘ μ 체 μΉ νμ΄μ§λ₯Ό λ§λ€ μ μκ² λ κ²μ΄λ€.
λ°νμμ΄λ νΉμ μΈμ΄λ‘ λ§λ νλ‘κ·Έλ¨μ μ€νν μ μλ νκ²½μ λ»νλ€.
λ°λΌμ λ
Έλλ μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ μ»΄ν¨ν°μμ μ€νν μ μκ² νλ μλ°μ€ν¬λ¦½νΈ μ€νκΈ°μ΄λ€.
νΉν 2008λ
ꡬκΈμ΄ V8 μμ§μ μ¬μ©νμ¬ ν¬λ‘¬μ μΆμνκ³ V8 μμ§μ λ€λ₯Έ μλ°μ€ν¬λ¦½νΈ μμ§κ³Ό λ¬λ¦¬ λ§€μ° λΉ¨λΌ λΌμ΄μΈ λ¬(Ryan Dahl)μ 2009λ
V8 μμ§ κΈ°λ°μ λ
Έλ νλ‘μ νΈλ₯Ό μμνλ©° μΈμμ λμλ€.
λ
Έλλ V8κ³Ό λλΆμ΄ libuvλΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€.
libuv λΌμ΄λΈλ¬λ¦¬λ λ
Έλμ νΉμ±μΈ μ΄λ²€νΈ κΈ°λ°, λ
Ό λΈλ‘νΉ I/O λͺ¨λΈμ ꡬννκ³ μλ€.
μ΄λ²€νΈ κΈ°λ°(Event-driven)μ΄λ μ΄λ²€νΈκ° λ°μν λ 미리 μ§μ ν΄λ μμ
μ μννλ λ°©μμ μλ―Ένλ€.
μ¦, μ΄λ²€νΈ κΈ°λ° μμ€ν
μμλ νΉμ μ΄λ²€νΈκ° λ°μν λ 무μμ ν μ§ λ―Έλ¦¬ λ±λ‘ν΄λκ³ , μ΄λ₯Ό μ΄λ²€νΈ 리μ€λμ μ½λ°±ν¨μλ₯Ό λ±λ‘νλ€.
μ΄ν μ΄λ²€νΈκ° λ°μνλ©΄ 리μ€λμ λ±λ‘ν΄λ μ½λ°±ν¨μλ₯Ό νΈμΆνλ©°, μ΄λ²€νΈκ° λλ ν λ
Έλλ λ€μ μ΄λ²€νΈκ° λ°μν λκΉμ§ λκΈ°νλ€.
μ΄λ²€νΈ 루ν(event loop)λ μ¬λ¬ μ΄λ²€νΈκ° λμμ λ°μνμ λ μ΄λ€ μμλ‘ μ½λ°±ν¨μλ₯Ό νΈμΆ ν μ§λ₯Ό μ΄λ²€νΈ 루νκ° νλ¨νλ€.
λ
Έλλ μ΄λ²€νΈκ° μ’
λ£λ λκΉμ§ μ΄λ²€νΈ μ²λ¦¬λ₯Ό μν μμ
μ λ°λ³΅νλ―λ‘ λ£¨ν(loog)λΌκ³ λΆλ₯Έλ€.
μ΄λ²€νΈ 루νλ₯Ό μ νμ©νλ©΄ μ€λ 걸리λ μμ
μ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλ€.
μμ
μλ λ κ°μ§ μ’
λ₯κ° μλλ° λμμ μ€νλ μ μλ μμ
κ³Ό λμμ μ€νλ μ μλ μμ
μ΄λ€.
νΉν νμΌ μμ€ν
μ κ·Ό, λ€νΈμν¬λ₯Ό ν΅ν μμ² μμ
μ μ
λ ₯(Input)/μΆλ ₯(Output)μ μΌμ’
μ΄λ©°,
μ΄λ¬ν μμ
μ ν λ λ
Έλλ λΉλκΈ° λ°©μμΌλ‘ λΈλ‘νΉμ λ§λ€μ§ μκ² λ(λ
Ό λΈλ‘νΉ) μ²λ¦¬νλ€.
λΉλκΈ°μ΄λ μ΄μ μμ
μ΄ μλ£λ λκΉμ§ λκΈ°νμ§ μκ³ λμμ μμ
μ μννλ€.
λ°λλ‘ λκΈ°λ μ΄μ μμ
μ΄ λλμΌλ§ λ€μ μμ
μ μννλ€.
μμΈνκ² νμ΄μ μμΌκΈ°νλ©΄ ν¨μ νΈμΆ μ λΉμ₯ μ€ννλ κ²μ΄ μλλΌ(λκΈ°βλΈλ‘νΉ) μΌλ¨ μ΄λ κ³³μ μμ λκ³ λμμ μμ²μ μ²λ¦¬νκ³ (λΉλκΈ°βλ
Ό λΈλ‘νΉ) μμ²μ΄ μλ£λ μμλλ‘μ²λ¦¬(μ€ν μ΄μ©) νλ€λ λ§μ΄λ€.
μ΄λ²€νΈ κΈ°λ°, λ
Ό λΈλ‘νΉ λͺ¨λΈκ³Ό λλΆμ΄ λ
Έλλ₯Ό μ€λͺ
νλ ν€μλ μ€ νλλ μ±κΈ μ€λ λμ΄λ€.
μλ°μ€ν¬λ¦½νΈ μ½λλ λμμ μ€νλ μ μλλ° κ·Έ μ΄μ λ λ
Έλκ° μ±κΈ μ€λ λ κΈ°λ°μ΄κΈ° λλ¬Έμ΄λ€.
νλ‘μΈμ€ : μ΄μ체μ μμ ν λΉνλ μμ
μ λ¨μμ΄λ€. λ
Έλλ μΉ λΈλΌμ°μ κ°μ νλ‘κ·Έλ¨μ κ°λ³μ μΈ νλ‘μΈμ€μ΄λ€. νλ‘μΈμ€ κ°μλ λ©λͺ¨λ¦¬ λ±μ μμμ 곡μ νμ§ μλλ€.
μ€λ λ : μ€λ λλ νλ‘μΈμ€ λ΄μμ μ€νλλ νλ¦μ λ¨μμ΄λ€. νλ‘μΈμ€λ μ€λ λλ₯Ό μ¬λ¬ κ° μμ±ν΄ μ¬λ¬ μμ
μ λμμ μ²λ¦¬ν μ μλ€. μ€λ λλ€μ λΆλͺ¨ νλ‘μΈμ€μ μμμ 곡μ νλ€. κ°μ μ£Όμμ λ©λͺ¨λ¦¬μ μ κ·Ό κ°λ₯νλ―λ‘ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ€.
Node.jsλ μ±κΈμ€λ λ, λ
Ό λΈλ‘νΉ λͺ¨λΈλ‘ μ±κΈ μ€λ λκ° νΌμμ μΌμ μ²λ¦¬νμ§λ§ λ€μ΄μ€λ μμ² μμκ° μλ λ
Ό λΈλ‘νΉ λ°©μμΌλ‘ μ΄μ μμ
μ΄ μλ£λ λκΉμ§ λκΈ°νμ§ μκ³ λ€μ μμ
μ μννλ€.
λ
Έλλ κΈ°λ³Έμ μΌλ‘ μ±κΈ μ€λ λ, λ
Ό λΈλ‘νΉ λͺ¨λΈμ μ±μ©νλ―λ‘ I/O μμ²μ΄ λ§μ΄ λ°μνλ©΄ λ
Έλλ₯Ό μλ²λ‘ μ¬μ©νλ κ²μ΄ μ’λ€.
νμ§λ§ λ
Έλλ CPU λΆνκ° ν° μμ
μλ μ ν©νμ§ μλ€.
μ°λ¦¬κ° μμ±νλ μ½λλ λͺ¨λ μ€λ λ νλμμ μ²λ¦¬λκΈ° λλ¬Έμ μ½λκ° CPU μ°μ°μ λ§μ΄ μꡬνλ©΄ μ€λ λ νλκ° νΌμμ κ°λΉνκΈ° μ΄λ ΅λ€.
μ¦, κ°μλ λ§μ§λ§ ν¬κΈ°λ μμ λ°μ΄ν°λ₯Ό μ€μκ°μΌλ‘ μ£Όκ³ λ°λλ° λ Έλλ μ ν©νλ€. μλ₯Ό λ€μ΄ λ€νΈμνΈλ λ°μ΄ν°λ² μ΄μ€, λμ€ν¬ μμ κ°μ I/Oμ νΉνλμ΄μλ€. μ€μκ° μ±ν μ ν리μΌμ΄μ , μ£Όμ μ°¨νΈλ ν¬ν¨λλ€.
κ²°λ‘ μ μΌλ‘ λ Έλμ μ₯μ μ 첫 μ§Έ, λ©ν° μ€λ λ λ°©μμ λΉν΄ μ μ μ»΄ν¨ν° μμμ μ¬μ©νλ€. λ μ§Έ, I/O μμ μ΄ λ§μ μλ²λ‘ μ ν©νλ€. μ μ§Έ, μΉ μλ²κ° λ΄μ₯λμ΄ μμ΄ λ³λμ μΉμλ²λ₯Ό μ€μΉν νμκ° μλ€. λ· μ§Έ, μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νκΈ° λλ¬Έμ JSON νμκ³Ό μ½κ² νΈνλλ€.
곡μλ¬Έμμμ ν΄λΉ λ΄μ₯ λͺ¨λμ μ¬μ©λ² μμ§νκ³ νμΌ μ΅μλ¨μ λͺ¨λμ require()λ‘ λΆλ¬μ΄
-> Node.js κ° μ€μΉλλ©΄ λͺ¨λλ μ€μΉλ μν(λΉνΈμΈ)
cf. λͺ¨λ : νλμ κΈ°λ₯μ μννλ κ²μΌλ‘, 쑰립νμ¬ μ¬μ©ν μ μμ
3rd-party λͺ¨λ
곡μμ μΈ λΉνΈμΈ λͺ¨λμ΄ μλ μΈλΆ λͺ¨λμ μλ―Έ
-> npmμΌλ‘ λ€μ΄λ‘λ, μ€μΉ νμ
File System λͺ¨λ
νμΌμ μ½κ±°λ μ μ₯νλ κΈ°λ₯μ νλ λͺ¨λ
readFile()
-> λΉλκΈ°μ μΌλ‘ νμΌμ μ½μ
cf. readFileSync() λ λκΈ°μ μΌλ‘ νμΌμ μ½μ
π΄Promiseμ resolve, rejectμ μ°¨μ΄
: Promiseμ μ λ¬νλ μ½λ°±ν¨μ(executor)μ μ λ¬μΈμλ‘ resolveλ μμ²μ΄ μ±κ³΅ν λ μνλλ©°, rejectλ μλ¬κ° λ°μνλ λ±μ μμ²μ΄ κ±°λΆλμμ λ μν
π‘resolve(), reject() μ μ λ¬μΈμ
: executorμ μλ£ νΉμ μ€ν¨ν κ²½μ° λ¦¬ν΄κ°μΌλ‘ μ λ¬λλ κ°μ μλ―Έ
-> μ΄μ΄μ§λ νλ‘λ―Έμ€ λ©μλμ μ λ¬μΈμλ‘ μ¬μ©
π΅Promise μΈμ€ν΄μ€μ μλ λ©μλ μ’ λ£μ μ©λ**
then : resolve() ->μ±κ³΅μ μνλλ λ΄μ©
catch : reject() -> μ€λ₯ λ°μμ μνλλ λ΄μ©
finally : μ΄μ΄μ§ μμ μ€μ μ€λ₯κ° λ°μνλλΌλ μνλλ λ΄μ© μ¦, executorμ μ½λλ€μ μ μμ²λ¦¬ μ¬λΆμ μκ΄μμ΄ μν!!
π Promiseμ 3κ°μ§ μν
pending : λκΈ° μ€, νΉμ reject() , resolve()κ° μλ μν
fulfilled : μ΄ν μ±κ³΅
rejected : μ΄ν μ€ν¨
πΉawait ν€μλ λ€μμ λ±μ₯νλ ν¨μ
: Promiseλ₯Ό λ°ννλ ννμ ν¨μ
-> callback λ°©μμΌλ‘ μ μν ν¨μμλ await μ μλ―Έκ° λ°μλμ§ μμ
πΊawait ν€μλλ₯Ό μ¬μ©ν λ 리ν΄λλ κ°
: Promiseκ° μλ resolve() λ reject() μ μ λ¬μΈμκ° λ°ν
callback λ°©μμΌλ‘ Error μ²λ¦¬
-> callbackμ μ λ¬μΈμλ₯Ό null μ²λ¦¬
Promiseλ₯Ό λ°ννλ λ©μλλ₯Ό νμ©νμ¬ 2κ°μ§ νμΌμ λ΄μ©μ λ°°μ΄μ λ΄μμ λ°ννλ ν¨μ
getDataFromFilePromise()λ₯Ό μ΄μ©ν΄, user1.json, user2.json νμΌ λΆλ¬μ€κΈ°
μ λ¬μΈμλ‘ νμΌμ κ²½λ‘λ₯Ό μ¬μ©
νμΌμ λ΄κΈ΄ λ΄μ©μ JSON νμ -> νμ± κ³Όμ νμ
λ°°μ΄μ μμκ° κ°μ²΄μΈ κ°μ λ°ν
Promise.all() μ μ©νμ¬ λ°°μ΄ λ°ν
νμΌμ λ΄κΈ΄ λ΄μ©μ JSON νμ -> νμ± κ³Όμ νμ
Promise.all() μ μ λ¬μΈμ
Promiseλ₯Ό μμλ‘ κ°λ μ μ¬ λ°°μ΄
λ°νκ° : Promise κ°μ²΄
Promise.all() μ μ°κ²°λ then(), catch() μ 맀κ°λ³μμ νν
: λ¨μΌ λ°°μ΄μ΄ μ λ¬λλ©° Promise.all() μ΄ μ±κ³΅μ μΌλ‘ μνλλ©΄ then() μ κ°μ΄ μ λ¬λκ³ , μ€λ₯κ° λ°μν κ²½μ° catch() μ κ°μ΄ μ λ¬
JSONμ κ°μ²΄
μλ²μμ ν΅μ μΌλ‘ λ°μ JSON λ°μ΄ν°λ λ¬Έμμ΄λ‘ μ λ¬λμ΄ ν΄λΌμ΄μΈνΈμμ μμ²ν λ°μ΄ν°λ₯Ό νμ©νκΈ° μν΄ JSON κ°μ²΄λ‘ λ³νν΄μΌν¨. ν΄λΌμ΄μΈνΈμμ μλ²λ‘ λ°μ΄ν°λ₯Ό μ μ‘ν λλ JSON λ°μ΄ν°λ₯Ό λ¬Έμμ΄λ‘ λ³νν΄μ 보λ΄μΌνλλ° λ¨μν κ°μ²΄λ₯Ό λ¬Έμμ΄λ‘ λ³ννλ λ©μλλ₯Ό μ¬μ©ν κ²½μ° JSONμΌλ‘μμ μν μ νκΈ° μ΄λ €μ
JSON.parse() -> μλ²μμ λ°μ λ°μ΄ν°μ μ μ©
JSON.stringify() -> μλ²λ‘ μμ² λ³΄λΌ λ°μ΄ν°μ μ μ©
JSON.parse()
JSON ννμ λ¬Έμμ΄μ μ
λ ₯λ°μ κ°μ²΄λ‘ λ³ν
-> λ¬Έμμ΄μΈ λ°μ΄ν°λ₯Ό μλ²μ μ£Όκ³ λ°μ λ μ¬μ©
β JSON.stringify() : κ°μ²΄λ₯Ό JSON λ¬Έμμ΄λ‘ λ³ν
Promise.all()
μ¬λ¬κ°μ Promiseκ° μ λ¬λ λ νλ²μ μ€νν μ μλ λ°©λ²
: Promise μ¬λ¬κ°λ₯Ό λ°°μ΄ ννλ‘ μ λ¬λ°μ λ¨μΌ λ°°μ΄ νν(Promise)λ‘ λ°ν
μ λ¬μΈμ : λ°°μ΄ νν(μμ -> Promise)
then(), catch() μλ λ°°μ΄ ννλ‘ μ λ¬
Promiseκ° μλ λΉ λ°°μ΄μ μ
λ ₯λ°μ κ²½μ°, then() μΌλ‘ [] λΉ λ°°μ΄μ΄ μ λ¬
-> fulfilled μν(λκΈ°μ μΌλ‘ μν)
reject λ Promiseλ₯Ό 1κ°λΌλ λ°λ κ²½μ°, rejected μνμ Promiseλ₯Ό λ°ν
-> then() λ‘ λ€μ μμ
μ μ΄μ΄κ°μΌ νλ κ²½μ° resolve λ Promiseλ₯Ό λ΄μ λ°°μ΄μ μ λ¬ λ°μμΌν¨