관리 메뉴

Daehyunii's Dev-blog

46μž₯ μ œλ„ˆλ ˆμ΄ν„°μ™€ async/await(β€»λ‹¨μˆœ κ°œλ…λ§Œ 정리) λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

46μž₯ μ œλ„ˆλ ˆμ΄ν„°μ™€ async/await(β€»λ‹¨μˆœ κ°œλ…λ§Œ 정리)

Daehyunii 2022. 7. 30. 13:47

46.1 μ œλ„ˆλ ˆμ΄ν„°λž€?

  ES6μ—μ„œ λ„μž…λœ μ œλ„ˆλ ˆμ΄ν„°λŠ” μ½”λ“œ λΈ”λ‘μ˜ 싀행을 μΌμ‹œ μ€‘μ§€ν–ˆλ‹€κ°€ ν•„μš”ν•œ μ‹œμ μ— μž¬κ°œν•  수 μžˆλŠ” νŠΉμˆ˜ν•œ ν•¨μˆ˜λ‹€. 

 

일반 ν•¨μˆ˜μ™€μ˜ 차이점

1. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœμžμ—κ²Œ ν•¨μˆ˜ μ‹€ν–‰μ˜ μ œμ–΄κΆŒμ„ 양도할 수 μžˆλ‹€.

2. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœμžμ™€ ν•¨μˆ˜μ˜ μƒνƒœλ₯Ό 주고받을 수 μžˆλ‹€.

3. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ œλ„ˆλ ˆμ΄ν„° 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

46.2 μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜μ˜ μ •μ˜

  μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” function* ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œλ‹€. 그리고 ν•˜λ‚˜ μ΄μƒμ˜ yield ν‘œν˜„μ‹μ„ ν¬ν•¨ν•œλ‹€. 이것을 μ œμ™Έν•˜λ©΄ 일반 ν•¨μˆ˜ μ •μ˜ν•˜λŠ” 방법과 λ™μΌν•˜λ‹€. μ—μŠ€ν„°λ¦¬μŠ€ν¬(*)의 μœ„μΉ˜λŠ” function ν‚€μ›Œλ“œμ™€ ν•¨μˆ˜ 이름 사이라면 어디든지 상관없닀.

// μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function* genDecFunc(){
    yield 1;
}

// μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜ ν‘œν˜„μ‹
const genExpFunc = function*(){
    yield 1;
};

// μ œλ„ˆλ ˆμ΄ν„° λ©”μ„œλ“œ
const obj = {
    *genObjMethod(){
        yield 1;
    }
};

β€»μ£Όμ˜ν•΄μ•Ό ν•  점

1. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ •μ˜ν•  수 μ—†λ‹€.

2. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μ—†λ‹€.

 

46.3 μ œλ„ˆλ ˆμ΄ν„° 객체

  μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 일반 ν•¨μˆ˜μ²˜λŸΌ ν•¨μˆ˜ μ½”λ“œ 블둝을 μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ œλ„ˆλ ˆμ΄ν„° 객체λ₯Ό 생성해 λ°˜ν™˜ν•œλ‹€. μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ μ œλ„ˆλ ˆμ΄ν„° κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ λ™μ‹œμ— μ΄ν„°λ ˆμ΄ν„°λ‹€. 즉, μ œλ„ˆλ ˆμ΄ν„° κ°μ²΄λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„°μ΄μ§€λ§Œ μ΄ν„°λ ˆμ΄ν„°μ—λŠ” μ—†λŠ” return, throw λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€. 

 

46.4 μ œλ„ˆλ ˆμ΄ν„°μ˜ μΌμ‹œ 쀑지와 재개

  μ œλ„ˆλ ˆμ΄ν„°λŠ” yield ν‚€μ›Œλ“œμ™€ next λ©”μ„œλ“œλ₯Ό 톡해 싀행을 μΌμ‹œ μ€‘μ§€ν–ˆλ‹€κ°€ ν•„μš”ν•œ μ‹œμ μ— λ‹€μ‹œ μž¬κ°œν•  수 μžˆλ‹€. 즉 ν•¨μˆ˜ 호좜 이후 μ œμ–΄κΆŒμ„ ν•¨μˆ˜ ν˜ΈμΆœμžμ—κ²Œ μ–‘λ„ν•˜μ—¬ ν•„μš”ν•œ μ‹œμ μ— ν•¨μˆ˜ 싀행을 μž¬κ°œν•  수 μžˆλ‹€. yield ν‚€μ›Œλ“œλŠ” μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜μ˜ 싀행을 μΌμ‹œ μ€‘μ§€μ‹œν‚€κ±°λ‚˜ yield ν‚€μ›Œλ“œ 뒀에 μ˜€λŠ” ν‘œν˜„μ‹μ˜ 평가 κ²°κ³Όλ₯Ό μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜ ν˜ΈμΆœμžμ—κ²Œ λ°˜ν™˜ν•œλ‹€. 

 

  μ œλ„ˆλ ˆμ΄ν„° 객체의 next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ yield ν‘œν˜„μ‹κΉŒμ§€ μ‹€ν–‰λ˜κ³  μΌμ‹œ μ€‘μ§€λœλ‹€. μ΄λ•Œ ν•¨μˆ˜μ˜ μ œμ–΄κΆŒμ΄ 호좜자둜 μ–‘λ„λœλ‹€. 이후 ν•„μš”ν•œ μ‹œμ μ— ν˜ΈμΆœμžκ°€ λ˜λ‹€μ‹œ next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μΌμ‹œ μ€‘μ§€λœ μ½”λ“œλΆ€ν„° 싀행을 μž¬κ°œν•˜κΈ° μ‹œμž‘ν•˜μ—¬ λ‹€μŒ yield ν‘œν˜„μ‹κΉŒμ§€ μ‹€ν–‰λ˜κ³  또 λ‹€μ‹œ μ€‘μ§€λœλ‹€. 

function* genFunc(){
    yield 1;
    yield 2;
    yield 3;
}

const generator = genFunc();

console.log(generator.next()); // {value: 1, done: false}
console.log(generator.next()); // {value: 2, done: false}
console.log(generator.next()); // {value: 3, done: false}
console.log(generator.next()); // {value: undefined, done: true}

이처럼 μ œλ„ˆλ ˆμ΄ν„° ν•¨μˆ˜λŠ” next λ©”μ„œλ“œμ™€ yield ν‘œν˜„μ‹μ„ 톡해 ν•¨μˆ˜ ν˜ΈμΆœμžμ™€ ν•¨μˆ˜μ˜ μƒνƒœλ₯Ό 주고받을 수 μžˆλ‹€. μ΄λŸ¬ν•œ μ œλ„ˆλ ˆμ΄ν„°μ˜ νŠΉμ„±μ„ ν™œμš©ν•˜λ©΄ 비동기 처리λ₯Ό 동기 처리처럼 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

46.6 async/await

  μ œλ„ˆλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 처리λ₯Ό 동기 처리처럼 λ™μž‘ν•˜λ„λ‘ κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ μ½”λ“œκ°€ λ¬΄μ²™μ΄λ‚˜ μž₯황해지고 가독성도 λ‚˜λΉ μ§„λ‹€. ES8μ—μ„œλŠ” μ œλ„ˆλ ˆμ΄ν„°λ³΄λ‹€ κ°„λ‹¨ν•˜κ³  가독성 μ’‹κ²Œ 비동기 처리λ₯Ό 동기 처리처럼 λ™μž‘ν•˜λ„λ‘ κ΅¬ν˜„ν•  수 μžˆλŠ” async/awaitκ°€ λ„μž…λ˜μ—ˆλ‹€.

 

46.6.1 asyncν•¨μˆ˜

  await ν‚€μ›Œλ“œλŠ” λ°˜λ“œμ‹œ async ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. async ν•¨μˆ˜λŠ” async ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•˜λ©° μ–Έμ œλ‚˜ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€. async ν•¨μˆ˜κ°€ λͺ…μ‹œμ μœΌλ‘œ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šλ”λΌλ„ async ν•¨μˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜κ°’μ„ resolveν•˜λŠ” ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

// async ν•¨μˆ˜ μ„ μ–Έλ¬Έ
async function foo(n){return n; }
foo(1).then(v => console.log(v));

// async ν•¨μˆ˜ ν‘œν˜„μ‹
const bar = async function(n){return n;};
bar(2).then(v => console.log(v)); 

// async ν™”μ‚΄ν‘œ ν•¨μˆ˜
const baz = async n => n;
baz(3).then(v => console.log(v));

46.6.2 await ν‚€μ›Œλ“œ

  await ν‚€μ›Œλ“œλ₯Ό ν”„λ‘œλ―ΈμŠ€κ°€ settled μƒνƒœ(비동기 μ²˜λ¦¬κ°€ μˆ˜ν–‰λœ μƒνƒœ)κ°€ 될 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λ‹€κ°€ settled μƒνƒœκ°€ 되면 ν”„λ‘œλ―ΈμŠ€κ°€ resolveν•œ 처리 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. await ν‚€μ›Œλ“œλŠ” λ°˜λ“œμ‹œ ν”„λ‘œλ―ΈμŠ€ μ•žμ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.