πŸ“ŒLanguage/JavaScript

[Deep Dive] 동기와 비동기, 비동기가 처리될 수 μžˆλŠ” 이유

hellohailie 2022. 12. 19. 14:59

βœ”οΈ 이번 정독을 톡해 μ•Œκ²Œ 된 것
동기와 비동기에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.
ν…ŒμŠ€ν¬ 큐가 λ¬΄μ—‡μΈκ°€μš”?
이벀트 루프가 λ¬΄μ—‡μΈκ°€μš”?

 

<λ‹΅ 미리보기>

πŸ€” 동기와 비동기에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄μ£Όμ„Έμš”.

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

 

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

 

πŸ€” ν…ŒμŠ€ν¬ 큐가 λ¬΄μ—‡μΈκ°€μš”?

πŸ€“ setTimeout, setInterval와 같은 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 

 

πŸ€” 이벀트 루프가 λ¬΄μ—‡μΈκ°€μš”?

πŸ€“ μ½œμŠ€νƒμ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μžˆλŠ”μ§€, 그리고 ν…ŒμŠ€νμ— λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ 반볡적으둜 ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ μ½œμŠ€νƒμ΄ λΉ„μ–΄μžˆκ³  ν…ŒμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ 이벀트 λ£¨ν”„λŠ” 순차적으둜 ν…ŒμŠ€ν¬ 큐에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜λ₯Ό μ½œμŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. 

 


βœ”οΈ λ™κΈ° μ²˜λ¦¬μ™€ 비동기 처리

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ μ½”λ“œκ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³ , μ΄λŠ” μ½œμŠ€νƒμ— ν‘Έμ‰¬λ˜κ³  ν•¨μˆ˜ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. ν•¨μˆ˜ μ½”λ“œμ˜ 싀행이 μ’…λ£Œλ˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ½œμŠ€νƒμ—μ„œ νŒλ˜μ–΄ 제거 λ©λ‹ˆλ‹€. 

 

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

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

 

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

 

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

 

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

 


βœ”οΈ 이벀트 루프와 ν…ŒμŠ€ν¬ 큐

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μ‹œμ„±μ„ μ§€μ›ν•˜λŠ” 것이 λ°”λ‘œ 이벀트 루프이닀. 

 

* μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ ꡬ성

1. μ½œμŠ€νƒ

μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³  μ œκ±°λ˜λŠ” μŠ€νƒ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

 

ν•¨μˆ˜ 호좜 → ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 순차적으둜 μ½œμŠ€νƒμ— ν‘Έμ‹œ → 싀행됨

 

2. νž™

객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μž…λ‹ˆλ‹€. μ½œμŠ€νƒμ˜ μš”μ†ŒμΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” νž™μ— μ €μž₯된 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€. 

 


비동기 μ²˜λ¦¬μ—μ„œ μ†ŒμŠ€μ½”λ“œμ˜ 평가와 싀행을 μ œμ™Έν•œ λͺ¨λ“  μ²˜λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 κ΅¬λ™ν•˜λŠ” ν™˜κ²½μΈ λΈŒλΌμš°μ € λ˜λŠ” node.jsκ°€ λ‹΄λ‹Ήν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ ν…ŒμŠ€ν¬ 큐와 이벀트 루프λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 

 

1. ν…ŒμŠ€ν¬ 큐

setTimeout, setInterval와 같은 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 

 

2. 이벀트 루프

μ½œμŠ€νƒμ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μžˆλŠ”μ§€, 그리고 ν…ŒμŠ€νμ— λŒ€κΈ° 쀑인 ν•¨μˆ˜(μ½œλ°±ν•¨μˆ˜, 이벀트 ν•Έλ“€λŸ¬ λ“±)κ°€ μžˆλŠ”μ§€ 반볡적으둜 ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ μ½œμŠ€νƒμ΄ λΉ„μ–΄μžˆκ³  ν…ŒμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ 이벀트 λ£¨ν”„λŠ” 순차적으둜 ν…ŒμŠ€ν¬ 큐에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜λ₯Ό μ½œμŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. μ΄λ•Œ μ½œμŠ€νƒμœΌλ‘œ μ΄λ™ν•œ ν•¨μˆ˜λŠ” μ‹€ν–‰λ©λ‹ˆλ‹€. 

(ν…ŒμŠ€ν¬ 큐에 μΌμ‹œ λ³΄κ΄€λœ ν•¨μˆ˜λ“€μ€ 비동기 처리 λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. )

 

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

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

setTimeout(foo, 0); // 0초(μ‹€μ œλŠ” 4ms) 후에 foo ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
bar();

// fooν•¨μˆ˜μ™€ barν•¨μˆ˜ 쀑 λ¨Όμ € μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λŠ” bar!!

(setTimeout ν•¨μˆ˜λ‘œ 호좜 μŠ€μΌ€μ€„λ§ν•œ 콜백 ν•¨μˆ˜λŠ” μ •ν™•νžˆ μ§€μ—°μ‹œκ°„ 후에 ν˜ΈμΆœλ˜λŠ” 보μž₯이 μ—†λ‹€. 지연 μ‹œκ°„ 이후에 콜백 ν•¨μˆ˜κ°€ ν…ŒμŠ€ν¬ 큐에 ν‘Έμ‹œλ˜μ„œ λŒ€κΈ°ν•˜λŠ”κ±°κ³  λ°”λ‘œ μ‹€ν–‰λ˜λŠ”κ²Œ μ•„λ‹ˆλ‹€!!)

 

πŸ‘‰ 비동기 ν•¨μˆ˜μΈ setTimeout의 콜백 ν•¨μˆ˜λŠ” ν…ŒμŠ€ν¬ 큐에 ν‘Έμ‹œλ˜μ–΄ λŒ€κΈ°ν•˜λ‹€κ°€ μ½œμŠ€νƒμ΄ λΉ„κ²Œ 되면, μ „μ—­ μ½”λ“œλ‚˜ λͺ…μ‹œμ μœΌλ‘œ 호좜된 ν•¨μˆ˜κ°€ λͺ¨λ‘ μ’…λ£Œν•˜λ©΄ λΉ„λ‘œμ†Œ μ½œμŠ€νƒμ— ν‘Έμ‹œλœλ‹€. 

 

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.
μ΄λ•Œ μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” 것은 λΈŒλΌμš°μ €κ°€ μ•„λ‹ˆλΌ λΈŒλΌμš°μ € λ‚΄ μ €μž₯된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μž…λ‹ˆλ‹€. 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜μ§€λ§Œ λΈŒλΌμš°μ €λŠ” λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. 

 

πŸ‘©‍πŸ’» λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Diveλ₯Ό μ •λ…ν•˜κ³  μ œκ°€ μ΄ν•΄ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€ πŸ‘©‍πŸ’»