Recent Posts
Recent Comments
Link
Β«   2024/11   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

kohigowild

async / await κ°œλ… 정리 (Feat. 동기, 비동기) λ³Έλ¬Έ

mitmitwiki

async / await κ°œλ… 정리 (Feat. 동기, 비동기)

kohi β˜• 2023. 4. 15. 02:42

 

πŸ“‘ 동기와 비동기


동기(synchronous)λž€, μ–΄λ–€ μž‘μ—…μ„ μ‹€ν–‰ν•  λ•Œ κ·Έ μž‘μ—…μ΄ λλ‚˜κΈ°λ₯Ό κΈ°λ‹€λ¦¬λŠ” 방식을 μ˜λ―Έν•œλ‹€. 즉, μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€μŒ μ½”λ“œμ˜ 싀행을 λ©ˆμΆ”κ³  κΈ°λ‹€λ¦¬λŠ” 것이닀. μ΄λŸ¬ν•œ 방식은 μž‘μ—…μ˜ μˆœμ„œλ₯Ό 보μž₯ν•˜κ³ , μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦¬λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

비동기(asynchronous)λž€, μ–΄λ–€ μž‘μ—…μ„ μ‹€ν–‰ν•  λ•Œ κ·Έ μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šλ”λΌλ„ λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 방식을 μ˜λ―Έν•œλ‹€. 즉, μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šμ•˜λ”λΌλ„ κ²°κ³Όλ₯Ό 기닀리지 μ•Šκ³  λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이닀. μ΄λŸ¬ν•œ 방식은 μž‘μ—…μ΄ 였래 κ±Έλ¦¬λŠ” 경우 μ‹œκ°„μ„ μ ˆμ•½ν•˜κ³ , 병렬적인 μž‘μ—… μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

동기 λ°©μ‹μœΌλ‘œ νŒŒμΌμ„ μ½λŠ”λ‹€λ©΄ νŒŒμΌμ„ 읽기 μ‹œμž‘ν•œ 이후에 λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šκ³  파일이 μ½ν˜€μ§€κΈ°λ₯Ό κΈ°λ‹€λ¦°λ‹€. λ°˜λ©΄μ— 비동기 λ°©μ‹μœΌλ‘œ νŒŒμΌμ„ μ½λŠ”λ‹€λ©΄ νŒŒμΌμ„ μ½λŠ” μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

πŸ“‘ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ 비동기 처리


μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ(Single Thread) 기반의 ν”„λ‘œκ·Έλž˜λ° 언어이닀. ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ λͺ¨λ“  μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ λ˜μ–΄ 있기 λ•Œλ¬Έμ—, ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μ²˜λ¦¬ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 동기 λ°©μ‹μœΌλ‘œ 처리λ₯Ό ν•˜κ²Œ 되면, 이전 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€μŒ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μ—†λ‹€. μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 비동기 μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€.

function test() {
    for (let i = 0; i < 10000; i++) {
        console.log(1);
    }
    console.log(2);
}
  • μ½˜μ†”μ— 2κ°€ 찍히렀면 1만 번의 1이 찍힐 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•œλ‹€.



비동기 처리λ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œλ„ λ³‘λ ¬μ μœΌλ‘œ μ—¬λŸ¬ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ„€νŠΈμ›Œν¬ 톡신을 비동기 λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄, μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό λ°›μ•„μ˜€λŠ” λ™μ•ˆμ—λ„ λ‹€λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있으며, 데이터λ₯Ό λ°›μ•„μ˜€λŠ” μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ ν•΄λ‹Ή μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

πŸ“‘ μ™œ 비동기 μ²˜λ¦¬κ°€ ν•„μš”ν•œκ°€?


μ›Ή νŽ˜μ΄μ§€μ˜ λ°˜μ‘μ„± ν–₯상: μ‚¬μš©μžκ°€ μš”μ²­ν•œ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 것은 μ‚¬μš©μž κ²½ν—˜μ„ μ €ν•΄μ‹œν‚¨λ‹€. λ”°λΌμ„œ, 비동기 처리λ₯Ό 톡해 μ‚¬μš©μžμ˜ μš”μ²­μ— λΉ λ₯΄κ²Œ λ°˜μ‘ν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

λ„€νŠΈμ›Œν¬ ν†΅μ‹ : μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ„œλ²„μ™€μ˜ 데이터 톡신이 ν•„μš”ν•˜λ‹€. 동기적인 처리λ₯Ό ν•˜κ²Œ 되면 응닡을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ›Ή νŽ˜μ΄μ§€μ˜ λ°˜μ‘μ„±μ΄ λ–¨μ–΄μ§ˆ 수 μžˆλ‹€. λ”°λΌμ„œ, λΉ„λ™κΈ°μ μœΌλ‘œ 데이터λ₯Ό λ°›μ•„μ˜€λŠ” 것이 μ›Ή νŽ˜μ΄μ§€μ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ”λ° 도움이 λœλ‹€.

병렬 μ²˜λ¦¬: 비동기 처리λ₯Ό 톡해 μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬ν•  수 있으며, 결과적으둜 전체 μž‘μ—… μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚¨λ‹€.

μ—λŸ¬ μ²˜λ¦¬: λΉ„λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•  λ•Œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄, ν•΄λ‹Ή μ—λŸ¬λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€. μ—λŸ¬ λ°œμƒ μ‹œ, μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” 콜백 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜, μ—λŸ¬λ₯Ό μΊμΉ˜ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆμ–΄ ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€.

 

πŸ“‘ async와 await


async와 awaitλŠ” ES2017(ECMAScript 8)λΆ€ν„° μΆ”κ°€λœ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 비동기 처리 방식 쀑 ν•˜λ‚˜μ΄λ‹€. async와 awaitλ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 μ½”λ“œλ₯Ό 동기 μ½”λ“œμ²˜λŸΌ μž‘μ„±ν•  수 μžˆμ–΄, 가독성이 쒋아지고 μ—λŸ¬ μ²˜λ¦¬κ°€ 간단해진닀.

 

asyncλŠ” ν•¨μˆ˜μ˜ μ•žμ— λΆ™μ—¬μ„œ ν•΄λ‹Ή ν•¨μˆ˜κ°€ 비동기 ν•¨μˆ˜μž„μ„ λ‚˜νƒ€λ‚΄λ©°, awaitλŠ” 비동기 ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦¬λŠ” ν‚€μ›Œλ“œμ΄λ‹€. async ν•¨μˆ˜ μ•ˆμ—μ„œ await ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄, ν•΄λ‹Ή 비동기 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ½”λ“œ 싀행을 μΌμ‹œ μ€‘μ§€ν•˜κ³  κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦° λ‹€μŒ, ν•΄λ‹Ή κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

async function getData() {
  const response = await fetch('/api');
  const data = await response.json();
  return data;
}

ν•΄λ‹Ή ν•¨μˆ˜λŠ” async ν•¨μˆ˜ getDataλ₯Ό μ •μ˜ν•˜κ³ , fetch ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ URLμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€κ³ , ν•΄λ‹Ή 데이터λ₯Ό JSON으둜 νŒŒμ‹±ν•˜λŠ” μž‘μ—…μ„ λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰ν•œλ‹€. awaitλ₯Ό μ‚¬μš©ν•˜μ—¬ fetch와 json() λ©”μ„œλ“œλ₯Ό 기닀리고, 데이터λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

async function getData() {
  try {
    const response = await fetch('/api');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error(error);
  }
}

 

await ν‚€μ›Œλ“œλŠ” Promise 객체가 μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ½”λ“œ 싀행을 μΌμ‹œ μ€‘μ§€ν•˜λ―€λ‘œ, try-catch 블둝 μ•ˆμ—μ„œ μ‚¬μš©ν•˜μ—¬ μ—λŸ¬ 처리λ₯Ό ν•  수 μžˆλ‹€. fetchμ—μ„œ λ„€νŠΈμ›Œν¬ μ—λŸ¬κ°€ λ°œμƒν•  경우, await μ΄ν›„μ˜ μ½”λ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©°, catch λΈ”λ‘μœΌλ‘œ μ œμ–΄κ°€ λ„˜μ–΄κ°€ μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.