Node.js

hyena_leeΒ·2023λ…„ 1μ›” 18일
0

JavaScript

λͺ©λ‘ 보기
4/5
post-thumbnail

πŸ—“οΈ 였늘 배운 λ‚΄μš©

  1. Node.js λͺ¨λ“ˆ μ‚¬μš©λ²•
  2. μ„œλ“œ νŒŒν‹° λͺ¨λ“ˆ(3rd-party module)
  3. Node.js 곡식 λ¬Έμ„œλ₯Ό ν™œμš©ν•˜μ—¬ fs.readFile 이용

πŸŒ–Node.js

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 μ‚¬μš©μ΄μœ 

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)라고 λΆ€λ₯Έλ‹€.

πŸ“ λ…Ό λΈ”λ‘œν‚Ή I/O

이벀트 루프λ₯Ό 잘 ν™œμš©ν•˜λ©΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.
μž‘μ—…μ—λŠ” 두 가지 μ’…λ₯˜κ°€ μžˆλŠ”λ° λ™μ‹œμ— 싀행될 수 μžˆλŠ” μž‘μ—…κ³Ό λ™μ‹œμ— 싀행될 수 μ—†λŠ” μž‘μ—…μ΄λ‹€.
특히 파일 μ‹œμŠ€ν…œ μ ‘κ·Ό, λ„€νŠΈμ›Œν¬λ₯Ό ν†΅ν•œ μš”μ²­ μž‘μ—…μ€ μž…λ ₯(Input)/좜λ ₯(Output)의 일쒅이며,
μ΄λŸ¬ν•œ μž‘μ—…μ„ ν•  λ•Œ λ…Έλ“œλŠ” 비동기 λ°©μ‹μœΌλ‘œ λΈ”λ‘œν‚Ήμ„ λ§Œλ“€μ§€ μ•Šκ²Œ 끔(λ…Ό λΈ”λ‘œν‚Ή) μ²˜λ¦¬ν•œλ‹€.
λΉ„λ™κΈ°μ΄λž€ 이전 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜μ§€ μ•Šκ³  λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
λ°˜λŒ€λ‘œ λ™κΈ°λŠ” 이전 μž‘μ—…μ΄ λλ‚˜μ•Όλ§Œ λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
μžμ„Έν•˜κ²Œ ν’€μ–΄μ„œ μ•„μ•ΌκΈ°ν•˜λ©΄ ν•¨μˆ˜ 호좜 μ‹œ λ‹Ήμž₯ μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ(λ™κΈ°β†’λΈ”λ‘œν‚Ή) 일단 μ–΄λŠ 곳에 μŒ“μ•„ 놓고 λ™μ‹œμ— μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ (비동기→논 λΈ”λ‘œν‚Ή) μš”μ²­μ΄ μ™„λ£Œλœ μˆœμ„œλŒ€λ‘œμ²˜λ¦¬(μŠ€νƒ 이용) ν•œλ‹€λŠ” 말이닀.

πŸ“ μ‹±κΈ€ μŠ€λ ˆλ“œ

이벀트 기반, λ…Ό λΈ”λ‘œν‚Ή λͺ¨λΈκ³Ό λ”λΆˆμ–΄ λ…Έλ“œλ₯Ό μ„€λͺ…ν•˜λŠ” ν‚€μ›Œλ“œ 쀑 ν•˜λ‚˜λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ΄λ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” λ™μ‹œμ— 싀행될 수 μ—†λŠ”λ° κ·Έ μ΄μœ λŠ” λ…Έλ“œκ°€ μ‹±κΈ€ μŠ€λ ˆλ“œ 기반이기 λ•Œλ¬Έμ΄λ‹€.

ν”„λ‘œμ„ΈμŠ€ : μš΄μ˜μ²΄μ œμ—μ„œ ν• λ‹Ήν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„μ΄λ‹€. λ…Έλ“œλ‚˜ μ›Ή λΈŒλΌμš°μ € 같은 ν”„λ‘œκ·Έλž¨μ€ κ°œλ³„μ μΈ ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. ν”„λ‘œμ„ΈμŠ€ κ°„μ—λŠ” λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ›μ„ κ³΅μœ ν•˜μ§€ μ•ŠλŠ”λ‹€.
μŠ€λ ˆλ“œ : μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” νλ¦„μ˜ λ‹¨μœ„μ΄λ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” μŠ€λ ˆλ“œλ₯Ό μ—¬λŸ¬ 개 생성해 μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ‹€. μŠ€λ ˆλ“œλ“€μ€ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ κ³΅μœ ν•œλ‹€. 같은 μ£Όμ†Œμ˜ λ©”λͺ¨λ¦¬μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ―€λ‘œ 데이터λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€.
Node.jsλŠ” μ‹±κΈ€μŠ€λ ˆλ“œ, λ…Ό λΈ”λ‘œν‚Ή λͺ¨λΈλ‘œ μ‹±κΈ€ μŠ€λ ˆλ“œκ°€ ν˜Όμžμ„œ 일을 μ²˜λ¦¬ν•˜μ§€λ§Œ λ“€μ–΄μ˜€λŠ” μš”μ²­ μˆœμ„œκ°€ μ•„λ‹Œ λ…Ό λΈ”λ‘œν‚Ή λ°©μ‹μœΌλ‘œ 이전 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜μ§€ μ•Šκ³  λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

🌎 결둠

λ…Έλ“œλŠ” 기본적으둜 μ‹±κΈ€ μŠ€λ ˆλ“œ, λ…Ό λΈ”λ‘œν‚Ή λͺ¨λΈμ„ μ±„μš©ν•˜λ―€λ‘œ I/O μš”μ²­μ΄ 많이 λ°œμƒν•˜λ©΄ λ…Έλ“œλ₯Ό μ„œλ²„λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
ν•˜μ§€λ§Œ λ…Έλ“œλŠ” CPU λΆ€ν•˜κ°€ 큰 μž‘μ—…μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.

μš°λ¦¬κ°€ μž‘μ„±ν•˜λŠ” μ½”λ“œλŠ” λͺ¨λ‘ μŠ€λ ˆλ“œ ν•˜λ‚˜μ—μ„œ 처리되기 λ•Œλ¬Έμ— μ½”λ“œκ°€ CPU 연산을 많이 μš”κ΅¬ν•˜λ©΄ μŠ€λ ˆλ“œ ν•˜λ‚˜κ°€ ν˜Όμžμ„œ κ°λ‹Ήν•˜κΈ° μ–΄λ ΅λ‹€.

즉, κ°œμˆ˜λŠ” λ§Žμ§€λ§Œ ν¬κΈ°λŠ” μž‘μ€ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ£Όκ³ λ°›λŠ”λ° λ…Έλ“œλŠ” μ ν•©ν•˜λ‹€. 예λ₯Ό λ“€μ–΄ λ„€νŠΈμ›ŒνŠΈλ‚˜ λ°μ΄ν„°λ² μ΄μŠ€, λ””μŠ€ν¬ μž‘μ—… 같은 I/O에 νŠΉν™”λ˜μ–΄μžˆλ‹€. μ‹€μ‹œκ°„ μ±„νŒ… μ• ν”Œλ¦¬μΌ€μ΄μ…˜, 주식 μ°¨νŠΈλ„ ν¬ν•¨λœλ‹€.

결둠적으둜 λ…Έλ“œμ˜ μž₯점은 첫 μ§Έ, λ©€ν‹° μŠ€λ ˆλ“œ 방식에 λΉ„ν•΄ 적은 컴퓨터 μžμ›μ„ μ‚¬μš©ν•œλ‹€. λ‘˜ μ§Έ, I/O μž‘μ—…μ΄ λ§Žμ€ μ„œλ²„λ‘œ μ ν•©ν•˜λ‹€. μ…‹ μ§Έ, μ›Ή μ„œλ²„κ°€ λ‚΄μž₯λ˜μ–΄ μžˆμ–΄ λ³„λ„μ˜ μ›Ήμ„œλ²„λ₯Ό μ„€μΉ˜ν•  ν•„μš”κ°€ μ—†λ‹€. λ„· μ§Έ, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— JSON ν˜•μ‹κ³Ό μ‰½κ²Œ ν˜Έν™˜λœλ‹€.


πŸŒ– Node.js λͺ¨λ“ˆ μ‚¬μš©λ²•

κ³΅μ‹λ¬Έμ„œμ—μ„œ ν•΄λ‹Ή λ‚΄μž₯ λͺ¨λ“ˆμ˜ μ‚¬μš©λ²• μˆ™μ§€ν•™κ³  파일 μ΅œμƒλ‹¨μ— λͺ¨λ“ˆμ„ require()둜 뢈러옴
-> Node.js κ°€ μ„€μΉ˜λ˜λ©΄ λͺ¨λ“ˆλ„ μ„€μΉ˜λœ μƒνƒœ(빌트인)
cf. λͺ¨λ“ˆ : ν•˜λ‚˜μ˜ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ, μ‘°λ¦½ν•˜μ—¬ μ‚¬μš©ν•  수 있음

  • require()
    : μ‚¬μš©ν•  λͺ¨λ“ˆμ„ λΆˆλŸ¬μ˜€λŠ” λ°©λ²•μœΌλ‘œ μ „λ‹¬μΈμžμ— λͺ¨λ“ˆ μΆ”κ°€

3rd-party λͺ¨λ“ˆ

곡식적인 빌트인 λͺ¨λ“ˆμ΄ μ•„λ‹Œ μ™ΈλΆ€ λͺ¨λ“ˆμ„ 의미
-> npm으둜 λ‹€μš΄λ‘œλ“œ, μ„€μΉ˜ ν•„μš”

File System λͺ¨λ“ˆ

νŒŒμΌμ„ μ½κ±°λ‚˜ μ €μž₯ν•˜λŠ” κΈ°λŠ₯을 ν•˜λŠ” λͺ¨λ“ˆ

readFile()
-> λΉ„λ™κΈ°μ μœΌλ‘œ νŒŒμΌμ„ 읽음
cf. readFileSync() λŠ” λ™κΈ°μ μœΌλ‘œ νŒŒμΌμ„ 읽음

β˜€οΈ 타이머 API

πŸ”΄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 λ¬Έμžμ—΄λ‘œ λ³€ν™˜

  • νŒŒμ‹± : κ΅¬λ¬Έμ—μ„œ μ›ν•˜λŠ” 데이터λ₯Ό μΆ”μΆœν•˜κ³  κ°€κ³΅ν•˜λŠ” 것
  • JSON(JavaScript Object Notation) : μ„œλ²„μ™€ 데이터λ₯Ό 주고받을 λ•Œ κ΅ν™˜λ˜λŠ” 데이터 폼
    -> key : value 쌍으둜 이루어진 데이터
  • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ‘œ 데이터λ₯Ό μ£Όκ³  받을 λ•Œ λ¬Έμžμ—΄λ‘œ 전달

Promise.all()
μ—¬λŸ¬κ°œμ˜ Promiseκ°€ 전달될 λ•Œ ν•œλ²ˆμ— μ‹€ν–‰ν•  수 μžˆλŠ” 방법
: Promise μ—¬λŸ¬κ°œλ₯Ό λ°°μ—΄ ν˜•νƒœλ‘œ 전달받아 단일 λ°°μ—΄ ν˜•νƒœ(Promise)둜 λ°˜ν™˜

μ „λ‹¬μΈμž : λ°°μ—΄ ν˜•νƒœ(μš”μ†Œ -> Promise)

then(), catch() μ—λŠ” λ°°μ—΄ ν˜•νƒœλ‘œ 전달

Promiseκ°€ μ—†λŠ” 빈 배열을 μž…λ ₯받을 경우, then() 으둜 [] 빈 배열이 전달
-> fulfilled μƒνƒœ(λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰)

reject 된 Promiseλ₯Ό 1κ°œλΌλ„ λ°›λŠ” 경우, rejected μƒνƒœμ˜ Promiseλ₯Ό λ°˜ν™˜
-> then() 둜 λ‹€μŒ μž‘μ—…μ„ 이어가야 ν•˜λŠ” 경우 resolve 된 Promiseλ₯Ό 담은 배열을 전달 받아야함

profile
μ‹€μˆ˜λ₯Ό λ‘λ €μ›Œ 말고 계속 도전 ν•˜λŠ” 개발자의 μ—¬μ •!

0개의 λŒ“κΈ€