Skip to content

Commit

Permalink
Merge pull request #1272 from SebellKo/sebellko
Browse files Browse the repository at this point in the history
42μž₯ 비동기 ν”„λ‘œκ·Έλž˜λ° - κ³ μ„Έμ’…
  • Loading branch information
Ryan-Dia authored Jan 25, 2024
2 parents 629813d + 9058a56 commit 80a840a
Showing 1 changed file with 64 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## πŸ“• 였늘 κ³΅λΆ€ν•œ λ‚΄μš© . βœ’

**였늘 읽은 λ²”μœ„** : 42μž₯

### 42. 비동기 ν”„λ‘œκ·Έλž˜λ°

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ½”λ“œμ˜ μ‹€ν–‰μ‹œ μŠ€μ½”ν”„μ— ν•΄λ‹Ήν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜κ³  푸쉬, 팝의 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.<br>
μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ— ν‘Έμ‹œ λ˜λŠ”κ²ƒμ„ ν•¨μˆ˜μ˜ μ‹€ν–‰μœΌλ‘œ 팝이 λ˜λŠ”κ²ƒμ„ μ‹€ν–‰μ˜ μ’…λ£Œλ‘œ λ™μž‘ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 단 ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ κ°–λŠ”λ°, μ΄λŠ” ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 창ꡬ가 ν•˜λ‚˜μ΄λ©° λ™μ‹œμ— 2개 μ΄μƒμ˜ ν•¨μˆ˜λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•  수 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€.<br>
이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•œλ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ©°, μ²˜λ¦¬μ— μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” νƒœμŠ€ν¬λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 λΈ”λ‘œν‚Ή(μž‘μ—…μ€‘λ‹¨)을 λ°œμƒ μ‹œν‚¨λ‹€.

μ΄λ ‡κ²Œ λΈ”λ‘œν‚Ή μ²˜λ¦¬κ°€ λ˜μ–΄ λ‹€μŒ νƒœμŠ€ν¬κ°€ λŒ€κΈ°ν•˜λŠ” 방식을 동기 처리라고 ν•œλ‹€.

λ°˜λŒ€λ‘œ ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œ λ˜μ§€ μ•Šμ€ μƒνƒœλΌ 해도 λ‹€μŒ νƒœμŠ€ν¬λ₯Ό κ³§λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” 방식을 비동기 처리라고 ν•œλ‹€.
비동기 처리λ₯Ό μˆ˜ν–‰ν•˜λŠ” 비동기 ν•¨μˆ˜λŠ” μ „ν†΅μ μœΌλ‘œ 콜백 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ§€λ§Œ, 이λ₯Ό μœ„ν•œ 콜백 νŒ¨ν„΄μ€ 콜백 헬을 λ°œμƒμ‹œμΌœ 가독성을 μ €ν•˜μ‹œν‚€κ³ <br>
비동기 μ²˜λ¦¬μ€‘ λ°œμƒν•œ μ—λŸ¬μ˜ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ–΄λ ΅λ‹€.

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

---

## 이벀트 루프와 νƒœμŠ€ν¬ 큐

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ ν•œκ°€μ§€ νƒœμŠ€ν¬μ”© μ²˜λ¦¬ν•˜μ§€λ§Œ, λΈŒλΌμš°μ €κ°€ λ™μž‘ν•˜λŠ” 것을 μ‚΄νŽ΄λ³΄λ©΄ λ§Žμ€ νƒœμŠ€ν¬κ°€ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§„λ‹€.<br>
이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μ‹œμ„±μ„ μ§€μ›ν•˜λŠ” 것이 λ°”λ‘œ 이벀트 루프이닀.

이벀트 λ£¨ν”„λŠ” λΈŒλΌμš°μ €μ— λ‚΄μž₯λ˜μ–΄ μžˆλŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μ΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 2개의 μ˜μ—­μœΌλ‘œ ꡬ뢄이 κ°€λŠ₯ν•˜λ‹€.

1. **μ½œμŠ€νƒ**

μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³  μ œκ±°λ˜λŠ” μŠ€νƒ 자료ꡬ쑰인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄λ‹€.<br>
ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 순차적으둜 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ 순차적으둜 μ‹€ν–‰λœλ‹€.<br>
μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 단 ν•˜λ‚˜μ˜ 콜 μŠ€νƒμ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ΅œμƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ 제거되기 μ „κΉŒμ§€λŠ” λ‹€λ₯Έ μ–΄λ–€ νƒœμŠ€ν¬λ„ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

2. **νž™**

νž™μ€ 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀.<br>
콜 μŠ€νƒμ˜ μš”μ†ŒμΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” νž™μ— μ €μž₯된 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.<br>
λ©”λͺ¨λ¦¬μ— 값을 μ €μž₯ν•˜λ €λ©΄ λ¨Όμ € 값을 μ €μž₯ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό κ²°μ •ν•΄μ•Ό ν•œλ‹€. κ°γ„±μ²΄λŠ” μ›μ‹œ κ°’κ³ΌλŠ” 달리 크기가 μ •ν•΄μ Έ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ ν• λ‹Ήν•΄μ•Ό ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό λŸ°νƒ€μž„μ— κ²°μ •ν•΄μ•Ό ν•œλ‹€.<br>
λ”°λΌμ„œ 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간인 νž™μ€ ꡬ쑰화 λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

**λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μš”μ²­λœ μž‘μ—…μ„ 순차적으둜 진행할 뿐이며, 비동기 μ²˜λ¦¬μ—μ„œ μ†ŒμŠ€μ½”λ“œμ˜ 평가와 싀행을 μ œμ™Έν•œ λͺ¨λ“  μ²˜λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 κ΅¬λ™ν•˜λŠ” ν™˜κ²½μΈ λΈŒλΌμš°μ € λ˜λŠ” Node.jsκ°€ λ‹΄λ‹Ήν•œλ‹€.**

이λ₯Ό μœ„ν•΄ λΈŒλΌμš°μ € ν™˜κ²½μ€ νƒœμŠ€ν¬ 큐와 이벀트 루프λ₯Ό μ œκ³΅ν•œλ‹€.

1. **νƒœμŠ€ν¬ 큐**

`setTimeout, setInterval`κ³Ό 같은 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­μ΄λ‹€.<br>
νƒœμŠ€ν¬ νμ™€λŠ” λ³„λ„λ‘œ ν”„λ‘œλ―ΈμŠ€μ˜ 후속 처리 λ©”μ„œλ“œμ˜ μ½œλ°±ν•¨μˆ˜κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐도 μ‘΄μž¬ν•œλ‹€.

2. **이벀트 루프**

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

비동기 ν•¨μˆ˜λŠ” νƒœμŠ€ν¬ 큐에 ν‘Έμ‹œλ˜μ–΄ λŒ€κΈ°ν•˜λ‹€κ°€ 콜 μŠ€νƒμ΄ λΉ„κ²Œ 되면, λ‹€μ‹œ 말해 μ „μ—­ μ½”λ“œ 및 λͺ…μ‹œμ μœΌλ‘œ 호좜된 ν•¨μˆ˜κ°€ λͺ¨λ‘ μ’…λ£Œλ˜λ©΄ λΉ„λ‘œμ†Œ 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ μ‹€ν–‰ λœλ‹€.<br>
μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. μ΄λ•Œ μ‹±κΈ€μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” 것은 λΈŒλΌμš°μ €κ°€ μ•„λ‹ˆλΌ λΈŒλΌμš°μ €μ— λ‚΄μž₯된 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이닀.

λ§Œμ•½ λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œ μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λΉ„λ™κΈ°λ‘œ λ™μž‘ν•  수 μ—†λ‹€.<br>
즉, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜μ§€λ§Œ λΈŒλΌμš°μ €λŠ” λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•œλ‹€.

0 comments on commit 80a840a

Please sign in to comment.