🦁_21.12.27 TIL

BoriΒ·2021λ…„ 12μ›” 29일
2
post-thumbnail

21λ…„ 12μ›” 27일

πŸ“ μ½”λ“œλΌμ΄μ–Έ - 일단 λ§Œλ“œλŠ” node.js

πŸ“ƒ Chapter_2 Node.js와 μΉœν•΄μ§€κΈ°

πŸ“Ž node.js

  • Javascript λŸ°νƒ€μž„
    => λŸ°νƒ€μž„: ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ κ΅¬λ™λ˜λŠ” ν™˜κ²½
  • 이벀트 기반, non-blocking I/O λͺ¨λΈμ„ μ‚¬μš©
    => 가볍고 효율적

node.js의 λ“±μž₯ 이전

  • λΈŒλΌμš°μ € λ‚΄μ—μ„œ JavaScriptκ°€ λ…μ μ μœΌλ‘œ μ΄μš©ν•  수 μžˆμ—ˆμœΌλ‚˜, λΈŒλΌμš°μ € λ‚΄μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ ν™•μž₯성이 쒋지 μ•Šμ•˜λ‹€.
  • node.js의 λ“±μž₯으둜 λΈŒλΌμš°μ € 뿐만 μ•„λ‹ˆλΌ μ„œλ²„, λ¨Έμ‹ λŸ¬λ‹ λ°μŠ€ν¬νƒ‘ μ•± λ“± JavaScriptλΌλŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ ꡬ동될 수 μžˆλŠ” ν™˜κ²½μ΄ ν™•μž₯λ˜μ—ˆλ‹€.
    => JavaScriptλ₯Ό μ΄μš©ν•  수 μžˆλŠ” λΆ„μ•Όλ₯Ό λ„“νž˜

πŸ“Ž 이벀트 기반 : 이벀트 λ°œμƒ μ‹œ 미리 지정해둔 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 방식

// μ„€λͺ…을 μœ„ν•œ μ˜ˆμ‹œ μ½”λ“œ
function delay() {
  // μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…
  console.log("μž‘μ—… 끝");
}

console.log("μ‹œμž‘");
setTimeout(delay(), 3000); // λ”œλ ˆμ΄ λ˜λŠ” 지점
console.log("끝");
  1. μ‹€ν–‰ μˆœμ„œλŒ€λ‘œ ν˜ΈμΆœμŠ€νƒμ— μŒ“κΈ°
    ν˜ΈμΆœμŠ€νƒ : [μ‹œμž‘, delay(), 끝]

  2. λ°±κ·ΈλΌμš΄λ“œ ν•„μš”μž‘μ—…μ€ λ°±λ“œλΌμš΄λ“œλ‘œ 이동
    setTimeout()ν•¨μˆ˜λŠ” λ°±λ“œλΌμš΄λ“œκ°€ ν•„μš”ν•˜λ‹€
    => delay()ν•¨μˆ˜ λ°±κ·ΈλΌμš΄λ“œλ‘œ 이동

  3. λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ νƒœμŠ€ν¬ 큐둜 이동
    νƒœμŠ€ν¬ 큐 : [μž‘μ—… 끝]
    => νƒœμŠ€ν¬ νμ—μ„œ 계속 λŒ€κΈ°λ₯Ό ν•˜κ³  μžˆλ‹€κ°€

  4. ν˜ΈμΆœμŠ€νƒλ“€μ΄ λ‹€ μ™„λ£Œλ˜λ©΄ 이벀트 루프가 νƒœμŠ€ν¬ 큐에 μžˆλŠ” μž‘μ—…μ„ 호좜 μŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚€λ©΄μ„œ 호좜 μŠ€νƒμ— μžˆλŠ” μž‘μ—…μ΄ μ‹€ν–‰λœλ‹€.
    ν˜ΈμΆœμŠ€νƒ : [μž‘μ—… 끝]

=> 호좜 μŠ€νƒ, λ°±κ·ΈλΌμš΄λ“œ, νƒœμŠ€ν¬ 큐, 이벀트 λ£¨ν”„λΌλŠ” 이벀트 기반 μ‹œμŠ€ν…œμ„ ν†΅ν•΄μ„œ μ½”λ“œλ“€μ„ 더 효과적이고 효율적으둜 μ‹€ν–‰μ‹œν‚€λ„λ‘ λ§Œλ“€μ–΄ μ€€λ‹€.

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

λ…Ό λΈ”λ‘œν‚Ή I/O (Non-blocking Input/Output)

  1. 이전 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³ , λ‹€μŒ μž‘μ—…λ“€μ„ μˆ˜ν–‰
  2. 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 처리

μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 처리λ₯Ό ν•˜κ³ , μž‘μ—…μ„ μš”μ²­ν•˜λŠ” λ™μ•ˆ ν΄λΌμ΄μ–ΈνŠΈλŠ” κ³„μ†ν•΄μ„œ μš”μ²­μ„ 보낼 수 μžˆλ‹€.
=> μ„œλ²„μ—μ„œ μš”μ²­μ΄ μ™„λ£Œλ˜λŠ” μ¦‰μ‹œ λ°”λ‘œ 응닡
=> 기닀리지 μ•Šκ³  μš”μ²­κ³Ό 응닡을 ν•  수 μžˆλŠ” ꡬ쑰

λΈ”λ‘œν‚Ή I/O

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ—κ²Œ 3뢄정도 κ±Έλ¦¬λŠ” μš”μ²­μ„ ν–ˆλ‹€κ³  κ°€μ •
=> μ„œλ²„κ°€ 3λΆ„ λ™μ•ˆ 일을 μ²˜λ¦¬ν•˜κ³ , κ·Έ 3λΆ„ λ™μ•ˆ ν΄λΌμ΄μ–ΈνŠΈλŠ” μžμ‹ μ˜ μž‘μ—…μ„ 쀑지해야 ν•œλ‹€.
=> μ„œλ²„κ°€ 일을 마치면, κ·Έ 응닡 값을 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ£Όκ³  μš”μ²­κ³Ό 응닡이 λλ‚˜κ²Œ λœλ‹€.

  • 치λͺ…적인 단점 : ν΄λΌμ΄μ–ΈνŠΈκ°€ 3μ‹œκ°„ μ •λ„μ˜ κΈ΄ μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μš”μ²­μ„ ν–ˆμ„ 경우, ν΄λΌμ΄μ–ΈνŠΈλŠ” 3μ‹œκ°„ λ™μ•ˆ λŒ€κΈ°λ₯Ό ν•΄μ•Όν•œλ‹€. μ„œλ²„κ°€ κ·Έ μž‘μ—…μ„ 끝내지 μ•Šμ€ 경우, λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†λ‹€.
    μ˜ˆμ‹œ) snsμ—μ„œ μ‹€μˆ˜λ‘œ μ’‹μ•„μš”λ₯Ό λˆŒλ €λŠ”λ° 이 μž‘μ—…μ΄ 30λΆ„ 정도 κ±Έλ¦°λ‹€κ³  κ°€μ •
    => 30λΆ„ λ™μ•ˆ 움직이지 μ•ŠλŠ” sns μ„œλΉ„μŠ€λ₯Ό λ³΄λ©΄μ„œ λŒ€κΈ°λ₯Ό ν•΄μ•Όν•œλ‹€.

=> μ‹œκ°„μ΄ κΈΈμ–΄μ§€λŠ” μž‘μ—…μ˜ 경우 νš¨μœ¨μ μ΄μ§€ λͺ»ν•œ ꡬ쑰λ₯Ό 가짐
=> 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Ό λΈ”λ‘œν‚Ή I/Oκ°€ λ“±μž₯ν•˜κ²Œ 됨

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

  • 주어진 μž‘μ—…μ„ ν•œ 개의 μŠ€λ ˆλ“œκ°€ μ²˜λ¦¬ν•˜λŠ” 방식
    => μŠ€λ ˆλ“œ : μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” λ‹¨μœ„

    λΈŒλΌμš°μ €μ—μ„œ μŠ€λ ˆλ“œλ‘œ μš”μ²­μ„ 보내고, μŠ€λ ˆλ“œλŠ” μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ λΈŒλΌμš°μ €λ‘œ 응닡을 λ³΄λ‚΄λŠ” 방식

μ‹±κΈ€μŠ€λ ˆλ“œ

  1. 주어진 μž‘μ—…μ„ 혼자 μ²˜λ¦¬ν•˜λŠ” 방식
  2. μŠ€λ ˆλ“œμ— λ¬Έμ œκ°€ 생길 μ‹œ 전체에 λ¬Έμ œκ°€ 생길 κ°€λŠ₯성이 있음
  3. λ©”λͺ¨λ¦¬λ‚˜ 기타 μžμ›μ„ 효율적으둜 μ‚¬μš© κ°€λŠ₯

λ©€ν‹°μŠ€λ ˆλ“œ

  1. μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œκ°€ 일을 λ‚˜λˆ  처리
  2. ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ 문제 생겨도 λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ λŒ€μ²΄ κ°€λŠ₯
  3. μŠ€λ ˆλ“œ κ°„μ˜ μž‘μ—… μ „ν™˜ λΉ„μš©, 놀고 μžˆλŠ” μŠ€λ ˆλ“œ 문제 λ°œμƒ

πŸ“Ž λ…Έλ“œμ˜ μž₯단점

μž₯점

  • μ‹±κΈ€ μŠ€λ ˆλ“œ, λ…Ό λΈ”λ‘œν‚Ή I/O에 λ”°λ₯Έ λΉ λ₯Έμ†λ„
  • 컴퓨터 μžμ›μ„ 덜 μ‚¬μš©
  • I/O μž‘μ—…μ΄ λ§Žμ€ μ„œλ²„λ‘œ 적합(μ±„νŒ…, 슀트리밍)
  • JavasSriptλ₯Ό μ‚¬μš©ν•˜κΈ°μ— ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ‚¬μš© 용이
  • λΉ λ₯΄κ²Œ 개발이 κ°€λŠ₯ν•˜λ―€λ‘œ 생산성이 λ†’μŒ

단점

  • μ‹±κΈ€ μŠ€λ ˆλ“œ 기반이라 μžμ›μ„ 많이 λ¨ΉλŠ” μž‘μ—…μ΄ 였면 λΆ€ν•˜κ°€ 크게 κ±Έλ¦Ό
  • μ‹±κΈ€ μŠ€λ ˆλ“œλŠ” CPU μ½”μ–΄ ν•œ 개만 μ‚¬μš© => CPU μž‘μ—… λ§Žμ€ μ„œλ²„λ‘œ 뢀적합(κ²Œμž„ μ„œλ²„ λ“±)
  • 둜직이 λ³΅μž‘ν•œ 경우 μ½œλ°±ν•¨μˆ˜μ˜ λŠͺ에 빠질 수 있음
  • μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€ μžμ²΄κ°€ 죽어버림

πŸ“Ž λ…Έλ“œκ°€ μ–΄μšΈλ¦¬λŠ” μ„œλΉ„μŠ€

  1. κ°„λ‹¨ν•œ 둜직으둜 κ΅¬μ„±λœ μ„œλΉ„μŠ€
  2. λΉ λ₯Έ μ‘λ‹΅μ‹œκ°„μ΄ μš”κ΅¬λ˜λŠ” μ„œλΉ„μŠ€
  3. λΉ λ₯Έ 개발이 μš”κ΅¬λ˜λŠ” μ„œλΉ„μŠ€
  4. 비동기 방식에 μ–΄μšΈλ¦¬λŠ” μ„œλΉ„μŠ€(μ±„νŒ…, 슀트리밍 μ„œλΉ„μŠ€)
    => λ„·ν”Œλ¦­μŠ€, νŽ˜μ΄νŒ”, λ§ν¬λ“œμΈ, 페이슀뢁 λ“±μ—μ„œ μ‚¬μš©

πŸ“Ž node.js μ„€μΉ˜


πŸ“ƒ Chapter_3 Node.jsλ₯Ό μœ„ν•œ ES6

πŸ“Ž var, let, const μ•Œμ•„λ³΄κΈ°

var

  • function scopeλ₯Ό 가지고 μžˆλŠ” λ³€μˆ˜ μ„ μ–Έ 방식
    => scope(λ²”μœ„) : λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„
  • JavaScriptλŠ” μœ μ—°ν•œ λ³€μˆ˜ μ„ μ–Έ 방식 가짐
    => λ³€μˆ˜λ₯Ό μ—¬λŸ¬ 번 μ΄ˆκΈ°ν™” ν•˜λŠ” 것 μžμ²΄κ°€ 잘λͺ»λœ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μ‰¬μš°λ―€λ‘œ 이런 방식을 μ§€μ–‘ν•΄μ•Όν•œλ‹€.

=> ES6 이후 μƒˆλ‘œμš΄ λ³€μˆ˜ μ„ μ–Έ 방식 2가지가 생김

let

  • 값을 μž¬μ •μ˜ ν•  수 μžˆλŠ” λ³€μˆ˜ μ„ μ–Έ 방식 = λ³€μˆ˜
  • var와 같이 같은 λ³€μˆ˜λͺ…μœΌλ‘œ μ΄ˆκΈ°ν™”λ₯Ό ν•  수 μ—†λ‹€.
  • function scopeκ°€ μ•„λ‹Œ μ€‘κ΄„ν˜Έ scopeλ₯Ό 가짐

const

  • 값을 μž¬μ •μ˜ ν•  수 μ—†λŠ” λ³€μˆ˜ μ„ μ–Έ 방식 = μƒμˆ˜
  • λ³€ν•˜μ§€ μ•ŠλŠ” κ°’μ΄λ―€λ‘œ ν•œ 번 μ •μ˜ν•˜λ©΄ λ°”λ€Œμ§€ μ•ŠλŠ” 값에 μ‚¬μš©
  • μ€‘κ΄„ν˜Έ scopeλ₯Ό 가짐

πŸ“Ž Arrow function

  • function ν‚€μ›Œλ“œ 보닀 κ°„λ‹¨νžˆ ν•¨μˆ˜ ν‘œν˜„ κ°€λŠ₯
// ν•¨μˆ˜ μž‘μ„±
function foo() {
  console.log("arrow function");
}

// ν™”μ‚΄ν‘œ ν•¨μˆ˜ μž‘μ„± 방법
const foo = () => {
  console.log("arrow function");
};

foo(); // arrow function

// λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 경우
const foo = (x) => {
  return x;
};

// λ§€κ°œλ³€μˆ˜κ°€ 1개인 경우 μ†Œκ΄„ν˜Έ μƒλž΅ κ°€λŠ₯
const foo = x => {
  return x;
};

// ν•¨μˆ˜κ°€ λ°”λ‘œ 값을 λ°˜ν™˜ν•  경우 μ€‘κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯
// ν•¨μˆ˜ λ‚΄μ˜ μ½”λ“œκ°€ μ—¬λŸ¬ 쀄인 경우 μ€‘κ΄„ν˜Έ 이용
const foo = x =>  x;

// λ§€κ°œλ³€μˆ˜κ°€ 2개이고 ν•¨μˆ˜κ°€ λ°”λ‘œ λ°˜ν™˜ν•˜λŠ” 경우
const foo = (x, y) => x + y;

πŸ“Ž 비ꡬ쑰화 ν• λ‹Ή

  • 객체, λ°°μ—΄ μ•ˆμ˜ 값을 μΆ”μΆœν•΄μ„œ λ³€μˆ˜, μƒμˆ˜μ— λ°”λ‘œ μ„ μ–Έν•˜λŠ” 문법
const object = { a: 1, b: 2 };

// 객체 μ•ˆμ˜ ν‚€λ₯Ό 톡해 값을 λ°›μ•„μ˜¬ 수 μžˆλ‹€.
// λ§Œμ•½ 객체에 λ§Žμ€ 갯수의 key 값이 μžˆλ‹€λ©΄ μ•„λž˜μ™€ 같은 방식은 λΉ„νš¨μœ¨μ μ΄λ‹€.
const a = object.a;
const b = object.b;

console.log(a); // 1
console.log(b); // 2

=> 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 비ꡬ쑰화 할당이 생겨남

  • 객체 μ•ˆμ— μžˆλŠ” 값을 μ‰½κ²Œ μƒμˆ˜ λ˜λŠ” λ³€μˆ˜ μ•ˆμ— ν• λ‹Ήμ‹œν‚¬ 수 μžˆλ„λ‘ ν•˜λŠ” 문법
  • 객체 뿐만 μ•„λ‹ˆλΌ λ°°μ—΄μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯
// 객체
const object = { a: 1, b: 2 };

// μ€‘κ΄„ν˜Έ(비ꡬ쑰화 ν• λ‹Ή)λ₯Ό μ΄μš©ν•΄μ„œ object의 keyλ₯Ό λ°”νƒ•μœΌλ‘œ
// keyκ°’ 좜λ ₯ κ°€λŠ₯
const { a, b } = object;

console.log(a); // 1
console.log(b); // 2

// λ°°μ—΄
const arr = [1, 2];

// arrλΌλŠ” 배열을 λ°›μ•„μ™€μ„œ
// arr의 첫 번째 μžλ¦¬μ— μžˆλŠ” 1을 oneλΌλŠ” μƒμˆ˜μ— ν• λ‹Ή
// arr의 두 번째 μžλ¦¬μ— μžˆλŠ” 2λ₯Ό twoλΌλŠ” μƒμˆ˜μ— ν• λ‹Ή
const [one, two] = arr;

console.log(one); // 1
console.log(two); // 2

πŸ“Ž promise, async, await

  • JavaScript의 κ°€μž₯ 큰 νŠΉμ§• = 비동기
    => 비동기 : νƒœμŠ€ν¬, μ½”λ“œμ˜ 흐름을 기닀리지 μ•Šκ³  각자 μˆ˜ν–‰μ„ ν•œ λ‹€μŒ 결과값을 λλ‚˜λŠ”λŒ€λ‘œ μ•Œλ €μ£ΌλŠ” 방식
    • 동기적 : 1 -> 2 -> 3 μˆœμ„œλŒ€λ‘œ 진행
    • 비동기적 : 1, 2, 3이 λ™μ‹œμ— μž‘λ™ ν›„ λ¨Όμ € λλ‚˜λŠ” μˆœμ„œλŒ€λ‘œ 좜λ ₯
      => 각각의 νƒœμŠ€ν¬κ°€ μ–Έμ œ 끝날지 λͺ¨λ₯΄λŠ” 상황을 λ§žμ΄ν•  수 μžˆλ‹€.
      => νƒœμŠ€νŠΈλ₯Ό 순차적으둜 μ‹€ν–‰ν•˜κ³  싢을 λ•Œ 비동기적인 νŠΉμ„±μ„ κ°€μ§ˆ 경우 이 μˆœμ„œλ₯Ό 보μž₯ν•  수 μ—†λ‹€.

=> ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³  λ°”λ‘œ λ’€λ₯Ό μ΄μ–΄μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ„λ‘ ν•˜λŠ” callback 방식을 μ·¨ν•œλ‹€.

callback

  • μ–΄λ–€ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  λ‚œ ν›„ λ‹€μŒ ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œμΌœ 일련적인 ν”Œλ‘œμš°λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” 역할을 ν•΄μ£Όκ³  μžˆλ‹€.
  • ν•˜μ§€λ§Œ callback ν•¨μˆ˜λ₯Ό λ‚¨λ°œν•  경우
    => callback hell이 λ°œμƒ
A((a) => {
  B(a, (b) => {
    C(b, (c) => {
      console.log("callback hell");
    });
  });
});

=> promise둜 callback hell을 νƒˆμΆœν•  수 μžˆλ‹€.

promise

  • promise의 3가지 μƒνƒœ

    • pending (λŒ€κΈ°μƒνƒœ)
    • pulfilled (μ΄ν–‰μƒνƒœ)
    • refected (μ‹€νŒ¨μƒνƒœ)
function sayHello() {
  // μ„±κ³΅ν–ˆμ„ λ•Œ resolveλ₯Ό 호좜
  // μ‹€νŒ¨ν–ˆμ„ λ•Œ rejextλ₯Ό 호좜
  return new Promise((resolve, reject) => {
    // 성곡
    const hello = "Hello Hello";
    resolve(hello);
  });
}

sayHello().then((resolveData) => {
  console.log(resolveData); // Hello Hello
});
  • sayHelloλΌλŠ” ν•¨μˆ˜λ₯Ό μ •μƒμ μœΌλ‘œ μž‘λ™ ν›„,
  • thenμ΄λΌλŠ” ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©΄μ„œ Promiseλ₯Ό 가동
  • μ„±κ³΅μ μœΌλ‘œ λ°˜ν™˜ν•  κ²ƒμ΄λ―€λ‘œ
  • helloλΌλŠ” μƒμˆ˜κ°’μ„ resolve둜 λ„˜κ²¨μ£Όκ³ ,
  • resolveλ₯Ό 톡해 resolveData에 helloλΌλŠ” string 값이 λ“€μ–΄κ°„λ‹€.
  • 이것을 console.log둜 좜λ ₯
  • λ‹€μŒκ³Ό 같이 primiseλŠ” ν•˜λ‚˜μ˜ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³ 
  • κ·Έ λ‹€μŒ μ—°μ†μ μœΌλ‘œ then을 톡해 일련의 흐름을 μ œμ–΄ν•  수 μžˆλ„λ‘ ν•˜λŠ” μœ μš©ν•œ 문법

μ„œλ²„ μž…μž₯μ—μ„œ μ„œλ²„κ°€ 잘 μž‘λ™ν•˜λ‹€κ°€ 였λ₯˜κ°€ λ°œμƒν–ˆμ„ 경우, μ—λŸ¬ 핸듀링 ν•„μš”
=> rejectλ₯Ό 톡해 μ—λŸ¬ 핸듀링

function sayHello() {
  // μ„±κ³΅ν–ˆμ„ λ•Œ resolveλ₯Ό 호좜
  // μ‹€νŒ¨ν–ˆμ„ λ•Œ rejextλ₯Ό 호좜
  return new Promise((resolve, reject) => {
    // μ‹€νŒ¨
    reject(new Error());
  });
}

sayHello()
  .then((resolveData) => {
    console.log(resolveData);
  })
  .catch((error) => {
    console.log(error);
  });
  • reject에 errorκ°€ λ°œμƒν•˜κ²Œ 되고,
  • rejectλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ catchκ°€ μ‹€ν–‰λ˜μ–΄ errorλ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.
  • μ΄κ²ƒμœΌλ‘œ μ—λŸ¬ 핸듀링

then을 μ—°μ†μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ°

function sayHello() {
  return new Promise((resolve, reject) => {
    resolve("hello!!!");
  });
}

sayHello()
  .then((resolveData) => {
    console.log(resolveData); // hello!!!
    return resolveData;
  })
  .then((resolveData) => {
    console.log(resolveData); // hello!!!
    return resolveData;
  })
  .then((resolveData) => {
    console.log(resolveData); // hello!!!
    return resolveData;
  })
  .catch((error) => {
    console.log(error);
  });

=> then을 μ΄μš©ν•΄μ„œ callback이 많이 λ§Œλ“€μ–΄μ§€λŠ” 것을 λ°©μ§€ν–ˆμœΌλ‚˜, then도 많이 μ‚¬μš©ν•˜λ©΄ λ³΅μž‘ν•΄ 보일 수 μžˆλ‹€.
=> 이것을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ async와 awaitκ°€ λ“±μž₯!

async와 await

function sayHello() {
  return new Promise((resolve, reject) => {
    resolve("hello!!!");
  });
}

// await을 μ“°κΈ° μœ„ν•΄ function μ•žμ— asyncλ₯Ό μž‘μ„±ν•΄μ€€λ‹€
async function test() {
  // await을 μž‘μ„±ν•˜μ§€ μ•Šμ„ 경우, 밑에 μžˆλŠ” μ½”λ“œλ“€μ΄ λ°”λ‘œ 싀행될 수 μžˆμœΌλ―€λ‘œ
  // sayHello()κ°€ μ‹€ν–‰λ˜κ³  λ‚œ ν›„ λ°”λ‘œ λ°‘μ˜ μ½”λ“œλ“€μ„ μ‹€ν–‰ν•˜κ² λ‹€λŠ” 것을
  // await ν‚€μ›Œλ“œλ₯Ό 톡해 λ™μž‘
  const hello = await sayHello();
  console.log(hello); // hello!!!
}

test();
  • μž₯점
    • 일반적인 μ½”λ“œ μž‘μ„± κ·œμΉ™μ—μ„œ async ν‚€μ›Œλ“œμ™€ awaitν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œ μŠ€νƒ€μΌλ§μ„ ν•  수 μžˆλ‹€.
      => .then을 μ‚¬μš©ν•˜λŠ” 문법은 JavaScript에 νŠΉν™”λœ 문법이기 λ•Œλ¬Έμ— 기쑴의 λ¬Έλ²•κ³ΌλŠ” 차이가 μžˆλ‹€.

마무리

  • μ—‡..! λ…Έλ“œ κ°•μ˜ μ’‹λ‹€!
    => μ—΄μ‹¬νžˆ λ“£κ² μŠ΅λ‹ˆλ‹€μ•„
  • Futurama 과제 ν•˜λŠλΌ μ‹œκ°„μ΄ 정신없이 μ§€λ‚˜κ°”λ‹€.
    => νž˜λ“€μ—ˆμ§€λ§Œ λΏŒλ“―ν–ˆλ‹€μ•„!

0개의 λŒ“κΈ€