JavaScript πŸ“

동기/비동기

별깅 2022. 12. 10. 12:56
728x90

 

1. 동기 (Synchronous) λž€ λ¬΄μ—‡μΌκΉŒ?

 

- 동기 방식은 μ„œλ²„μ—μ„œ μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ 응닡이 λŒμ•„μ™€μ•Ό λ‹€μŒ λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. 즉, Aμž‘μ—…μ΄ λͺ¨λ‘ μ§„ν–‰ λ λ•ŒκΉŒμ§€ Bμž‘μ—…μ€ λŒ€κΈ°ν•΄μ•Όν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 단 ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ κ°–λŠ”λ‹€.

μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” λͺ¨λ‘ μ‹€ν–‰ λŒ€κΈ° 쀑인 νƒœμŠ€ν¬λ“€μ΄λ‹€.

λŒ€κΈ° 쀑인 νƒœμŠ€ν¬λ“€μ€ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ νŒλ˜μ–΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ 제거되면, λ‹€μ‹œ 말해 ν˜„μž¬ μ‹€ν–‰ 쀑인 ν•¨μˆ˜κ°€ μ’…λ£Œν•˜λ©΄ λΉ„λ‘œμ†Œ μ‹€ν–‰λ˜κΈ° μ‹œμž‘ν•œλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ (single thread) λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

μ‹±κΈ€ μŠ€λ ˆλ“œ 방식은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ‹€ν–‰ν•  수 있기 λ•Œλ¬Έμ— μ²˜λ¦¬μ— μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” νƒœμŠ€ν¬λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 λΈ”λ‘œν‚Ή blocking (μž‘μ—… 쀑단) 이 λ°œμƒν•œλ‹€.

 

//sleep ν•¨μˆ˜λŠ” 일정 μ‹œκ°„ (delay) 이 κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜ (func) λ₯Ό ν˜ΈμΆœν•¨.

function sleep(func, delay) {
    // Date.now() λŠ” ν˜„μž¬ μ‹œκ°„μ„ 숫자 (ms) 둜 λ°˜ν™˜ν•œλ‹€.
    const delayUntil = Date.now() + delay;

    // ν˜„μž¬ μ‹œκ°„ (Date.now()) 에 delay λ₯Ό λ”ν•œ delayUntil 이 ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ μž‘μœΌλ©΄ 계속 λ°˜λ³΅ν•¨
    while (Date.now() < delayUntil);
    // 일정 μ‹œκ°„ (delay) 이 κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜ (func) λ₯Ό ν˜ΈμΆœν•¨
    func();
}

function foo () {
    console.log('foo');
}

function bar () {
    console.log('bar');
}

// sleep ν•¨μˆ˜λŠ” 3초 이상 싀행됨
sleep(foo, 3 * 1000);
// bar ν•¨μˆ˜λŠ” sleep ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ 이후에 ν˜ΈμΆœλ˜λ―€λ‘œ 3초 이상 λΈ”λ‘œν‚Ήλ¨
bar();
// (3초 κ²½κ³Ό ν›„) foo 호좜 -> bar 호좜

 

μœ„ μ½”λ“œμ˜ sleep ν•¨μˆ˜λŠ” 3초 후에 foo ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨.

μ΄λ•Œ bar ν•¨μˆ˜λŠ” sleep ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ 이후에 ν˜ΈμΆœλ˜λ―€λ‘œ 3초 이상 (foo ν•¨μˆ˜μ˜ μ‹€ν–‰ μ‹œκ°„ + 3초) ν˜ΈμΆœλ˜μ§€ λͺ»ν•˜κ³  λΈ”λ‘œν‚Ή (μž‘μ—… 쀑단) 됨!!!

 

ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ‹€μŒμ— 싀행될 νƒœμŠ€ν¬κ°€ λŒ€κΈ°ν•˜λŠ” 방식을 동기(Synchronous) 처리라고 ν•œλ‹€.

동기 처리 방식은 νƒœμŠ€ν¬λ₯Ό μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ”© μ²˜λ¦¬ν•˜λ―€λ‘œ μ‹€ν–‰ μˆœμ„œκ°€ 보μž₯λœλ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, μ•žμ„  νƒœμŠ€ν¬κ°€ μ’…λ£Œν•  λ•ŒκΉŒμ§€ 이후 νƒœμŠ€ν¬λ“€μ΄ λΈ”λ‘œν‚Ήλœλ‹€λŠ” 단점이 있음.

 

 

2. 비동기(asynchronous) λž€ λ¬΄μ—‡μΌκΉŒ?

 

- 비동기 방식은 λ°˜λŒ€λ‘œ μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ 응닡 μƒνƒœμ™€ 상관없이 λ‹€μŒ λ™μž‘μ„ μˆ˜ν–‰ ν•  수 μžˆλ‹€. 즉, Aμž‘μ—…μ΄ μ‹œμž‘ν•˜λ©΄ λ™μ‹œμ— Bμž‘μ—…μ΄ μ‹€ν–‰λœλ‹€. Aμž‘μ—…μ€ 결과값이 λ‚˜μ˜€λŠ”λŒ€λ‘œ 좜λ ₯λœλ‹€.

 

function foo () {
    console.log ('foo');
}

function bar() {
    console.log('bar');
}

// 타이머 ν•¨μˆ˜ setTimeout 은 일정 μ‹œκ°„μ΄ κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜ foo λ₯Ό ν˜ΈμΆœν•¨
// 타이머 ν•¨μˆ˜ setTimeout 은 bar ν•¨μˆ˜λ₯Ό λΈ”λ‘œν‚Ήν•˜μ§€ μ•ŠλŠ”λ‹€.
setTimeout(foo, 3 * 1000);
bar();
// bar 호좜 -> (3초 κ²½κ³Ό ν›„) foo 호좜

 

μœ„ μ½”λ“œμ˜ setTimeout ν•¨μˆ˜λŠ” μ•žμ„œ μ‚΄νŽ΄λ³Έ sleep ν•¨μˆ˜μ™€ μœ μ‚¬ν•˜κ²Œ 일정 μ‹œκ°„μ΄ κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€λ§Œ,

setTimeout ν•¨μˆ˜ μ΄ν›„μ˜ νƒœμŠ€ν¬λ₯Ό λΈ”λ‘œν‚Ήν•˜μ§€ μ•Šκ³  κ³§λ°”λ‘œ μ‹€ν–‰ν•œλ‹€.

ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œλ˜μ§€ μ•Šμ€ μƒνƒœλΌ 해도 λ‹€μŒ νƒœμŠ€ν¬λ₯Ό κ³§λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” 방식을 비동기 (asynchronous) 처리 라고 함.

 

비동기 처리 방식은 ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œλ˜μ§€ μ•Šμ€ μƒνƒœλΌ 해도 λ‹€μŒ νƒœμŠ€ν¬λ₯Ό κ³§λ°”λ‘œ μ‹€ν–‰ν•˜λ―€λ‘œ λΈ”λ‘œν‚Ήμ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, νƒœμŠ€ν¬μ˜ μ‹€ν–‰ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ” 단점이 μžˆλ‹€.

 

타이머 ν•¨μˆ˜μΈ setTimeout κ³Ό setInterval, HTTP  μš”μ²­, 이벀트 ν•Έλ“€λŸ¬λŠ” 비동기 처리 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

비동기 μ²˜λ¦¬λŠ” 이벀트 루프와 νƒœμŠ€ν¬ 큐와 κΉŠμ€ 관계가 μžˆλ‹€.

728x90