πŸ“š ν•™μŠ΅ λ²”μœ„

이벀트 λ£¨ν”„λž€ 무엇인가?

πŸ“† ν•™μŠ΅ λ‚ μ§œ

2023 / 12 / 22 (금)

πŸ‘¨πŸ»β€πŸ’» ν•™μŠ΅ ν›„ μ•Œκ²Œ 된 λ‚΄μš©

🎯 이벀트 λ£¨ν”„λž€ 무엇인가

이벀트 λ£¨ν”„λž€ μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ μ™ΈλΆ€μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 비동기 싀행을 돕기 μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μž₯μΉ˜λΌκ³ ν•œλ‹€.

🎯 호좜 μŠ€νƒ(call stack)κ³Ό 이벀트 루프

호좜 μŠ€νƒ(call stack)은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•  μ½”λ“œλ‚˜ ν•¨μˆ˜λ₯Ό 순차적으둜 λ‹΄μ•„λ‘λŠ” μŠ€νƒμ΄λΌκ³ ν•œλ‹€.

<script>
function bar() {
	console.log('bar')
}

function baz() {
	console.log('baz')
}

function foo() {
	console.log('foo')
    bar()
    baz()
}

foo()
</script>

μœ„ μ½”λ“œλŠ” fooλ₯Ό ν˜ΈμΆœν•˜κ³ , λ‚΄λΆ€μ—μ„œ bar,bazλ₯Ό 순차적으둜 ν˜ΈμΆœν•˜λŠ” ꡬ쑰둜 돼 μžˆλ‹€.
이 μ½”λ“œλ“€μ€ λŒ€λž΅ λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ 호좜 μŠ€νƒμ— μŒ“μ΄κ³  λΉ„μ›Œμ§€κ²Œ λœλ‹€.

1️⃣ foo()κ°€ 호좜 μŠ€νƒμ— λ¨Όμ € 듀어감
2️⃣ foo() λ‚΄λΆ€μ—μ„œ console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
3️⃣ 2번 싀행이 μ™„λ£Œλ˜λ©΄ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°(아직 foo()λŠ” μ‘΄μž¬ν•¨)
4️⃣ bar()κ°€ ν˜ΈμΆœμŠ€νƒμ— 듀어감
5️⃣ bar()내뢀에 console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
6️⃣ 5번 싀행이 μ™„λ£Œλ˜λ©΄ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°(아직 foo() , bar() μ‘΄μž¬ν•¨)
7️⃣ 더 이상bar()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ 제거됌(아직 foo()λŠ” 쑴재)
8️⃣ baz()κ°€ 호좜 μŠ€νƒμ— 듀어감
9️⃣ baz() 내뢀에 console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
πŸ”Ÿ 9번이 μ‹€ν–‰ μ™„λ£Œλ˜λ©΄ λ‹€μŒμ½”λ“œλ‘œ λ„˜μ–΄κ°(아직 foo() , baz() μ‘΄μž¬ν•¨)
1️⃣1️⃣ 더이상 baz()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ 제거됌(아직 foo()λŠ” 쑴재)
1️⃣2️⃣ 더이상 foo()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ 제거됌
1️⃣3️⃣ 더이상 호좜 μŠ€νƒμ— μ‘΄μž¬ν•˜λŠ”κ²Œ μ—†μŒ 

호좜 μŠ€νƒμ΄ λΉ„μ–΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 확인 ν•˜λŠ” 것이 λ°”λ‘œ 이벀트 λ£¨ν”„λΌκ³ ν•œλ‹€.
이벀트 λ£¨ν”„λŠ” λ‹¨μˆœνžˆ 이벀트 λ£¨ν”„λ§Œμ˜ 단일 μŠ€λ ˆλ“œ λ‚΄λΆ€μ—μ„œ 이 호좜 μŠ½νƒ 내뢀에 μˆ˜ν–‰ν•΄μ•Ό ν•  μž‘μ—…μ΄ μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , μˆ˜ν–‰ν•΄μ•Ό ν•  μ½”λ“œκ°€ μžˆλ‹€λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 μ΄μš©ν•΄ μ‹€ν–‰ν•œλ‹€. μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것과 호좜 μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 것 λͺ¨λ‘κ°€ 단일 μŠ€λ ˆλ“œμ—μ„œ μΌμ–΄λ‚œλ‹€κ³ ν•œλ‹€. 즉, 두 μž‘μ—…μ€ λ™μ‹œμ— 일어날 수 μ—†μœΌλ©° μŠ€λ ˆλ“œμ—μ„œ 순차적으둜 μ‹€ν–‰λœλ‹€κ³ ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 비동기 μž‘μ—…μ€ μ–΄λ–»κ²Œ μ‹€ν–‰λ˜λŠ” κ²ƒμΌκΉŒ?

<script>
function bar() {
	console.log('bar')
}

function baz() {
	console.log('baz')
}

function foo() {
	console.log('foo')
	setTimeout(bar(),0) // setTimeout만 μΆ”κ°€ν–ˆλ‹€.
    baz()
}

foo()
</script>

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ³Έ 개발자라면 μ•žμ„  μ˜ˆμ œμ™€ λ‹€λ₯΄κ²Œ setTimeout으둜 인해 foo ,baz, bar순으둜 좜λ ₯λ˜λŠ” 것을 μ•Œκ³  μžˆμ„κ²ƒμ΄λ‹€.
μ‹€μ œλ‘œ 호좜 μŠ€νƒ λ‚΄λΆ€μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 일이 λ°œμƒν•œλ‹€.

1️⃣ foo()κ°€ 호좜 μŠ€νƒμ— λ¨Όμ € 듀어감
2️⃣ foo() λ‚΄λΆ€μ—μ„œ console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
3️⃣ 2번 싀행이 μ™„λ£Œλ˜λ©΄ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°(아직 foo()λŠ” μ‘΄μž¬ν•¨)
4️⃣ setTimeout(bar(),0)κ°€ ν˜ΈμΆœμŠ€νƒμ— 듀어감
5️⃣ 4λ²ˆμ— λŒ€ν•΄ 타이머 μ΄λ²€νŠΈκ°€ μ‹€ν–‰ 되며 νƒœμŠ€ν¬ 큐둜 λ“€μ–΄κ°€κ³ ,κ·Έ λŒ€μ‹  λ°”λ‘œ μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
6️⃣ baz()κ°€ 호좜 μŠ€νƒμ— 듀어감
7️⃣ baz() 내뢀에 console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
8️⃣ 7번 싀행이 μ™„λ£Œλ˜λ©΄ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°(아직 foo(),baz()λŠ” μ‘΄μž¬ν•¨)
9️⃣ 더아상 baz()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ 제거(아직 foo()λŠ” μ‘΄μž¬ν•¨)
πŸ”Ÿ 더 이상 foo()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ μ œκ±°ν•¨
1️⃣1️⃣ 더이상 호좜 μŠ€νƒμ— μ‘΄μž¬ν•˜λŠ”κ²Œ μ—†μŒ 
1️⃣2️⃣ 이벀트 루프가 호좜 μŠ€νƒμ΄ λΉ„μ›Œμ Έ μžˆλ‹€λŠ” 것을 ν™•μΈν•˜κ³  이후에 νƒœμŠ€ν¬ 큐λ₯Ό ν™•μΈν•˜λ‹ˆ 4λ²ˆμ— λ“€μ–΄κ°”λ˜ λ‚΄μš©μ΄ μžˆμ–΄ bar()λ₯Ό 호좜 μŠ€νƒμ— λ„£μŒ
1️⃣3️⃣bar() 내뢀에 console.logκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 호좜 μŠ€νƒμ— 듀어감
1️⃣4️⃣ 13번 싀행이 λλ‚˜λ©΄ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ° (아직 bar()쑴재)
1️⃣5️⃣ 더이상 bar()에 남은 것이 μ—†μœΌλ―€λ‘œ 호좜 μŠ€νƒμ—μ„œ μ œκ±°ν•¨

μœ„ μ½”λ“œλ₯Ό 보면 ,setTimeot(()=>{},0)이 μ •ν™•ν•˜κ²Œ 0초 뒀에 μ‹€ν–‰λœλ‹€λŠ” 것을 보μž₯ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 것을 μ΄ν•΄ν•˜κ²Œ 될것이닀.

μ—¬κΈ°μ„œλΆ€ν„°λŠ” νƒœμŠ€ν¬ νλΌλŠ” μƒˆλ‘œμš΄ κ°œλ…μ΄ λ“±μž₯ν•œλ‹€.
νƒœμŠ€ν¬ νλž€ μ‹€ν–‰ν•΄μ•Ό ν•  νƒœμŠ€ν¬μ˜ 집합을 μ˜λ―Έν•œλ‹€.
이벀트 λ£¨ν”„λŠ” μ΄λŸ¬ν•œ νƒœμŠ€ν¬ 큐λ₯Ό ν•œ 개 이상 κ°€μ§€κ³  μžˆλ‹€.
그리고 μ΄λ¦„κ³ΌλŠ” λ‹€λ₯΄κ²Œ νƒœμŠ€ν¬ νλŠ” 자료 ꡬ쑰의 큐가 μ•„λ‹ˆλΌ set ν˜•νƒœλ₯Ό μ§€λ‹ˆκ³  μžˆλ‹€.
κ·Έ μ΄μœ λŠ” μ„ νƒλœ 큐 μ€‘μ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ κ°€μž₯ 였래된 νƒœμŠ€ν¬ 큐λ₯Ό 가져와야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 자료ꡬ쑰인 νλŠ” 무쑰건 μ•žμ— μžˆλŠ” 것을 FIFOν˜•μ‹μœΌλ‘œ 꺼내와야 ν•˜μ§€λ§Œ νƒœμŠ€ν¬ νλŠ” κ·Έλ ‡μ§€ μ•Šλ‹€. νƒœμŠ€ν¬ νμ—μ„œ μ˜λ―Έν•˜λŠ” μ‹€ν–‰ν•΄μ•Ό ν•  νƒœμŠ€ν¬ λΌλŠ” 것은 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜λ‚˜ 이벀트 ν•Έλ“€λŸ¬ 등을 μ˜λ―Έν•œλ‹€.

즉, 이벀트 λ£¨ν”„μ˜ 역할은 호좜 μŠ€νƒμ— μ‹€ν–‰ 쀑인 μ½”λ“œκ°€ μžˆλŠ”μ§€
νƒœμŠ€ν¬ 큐에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ λ°˜λ³΅ν•΄μ„œ ν™•μΈν•˜λŠ” 역할을 ν•œλ‹€κ³ ν•œλ‹€.

호좜 μŠ€νƒμ΄ λΉ„μ—ˆλ‹€λ©΄ νƒœμŠ€ν¬ νμ—μ„œ λŒ€κΈ° 쀑인 μž‘μ—…μ΄ μžˆλŠ”μ§€ ν™•μΈν•˜κ³ 
μž‘μ—…μ„ μ‹€ν–‰ κ°€λŠ₯ν•œ 였래된 것뢀터 순차적으둜 κΊΌλ‚΄μ™€μ„œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€κ³ ν•œλ‹€.
이 μž‘μ—… λ˜ν•œ λ§ˆμ°¬κ°€μ§€λ‘œ νƒœμŠ€ν¬ 큐가 λΉ„μ–΄μžˆμ„ λ•Œ κΉŒμ§€ μ΄λ£¨μ–΄μ§„λ‹€κ³ ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 비동기 ν•¨μˆ˜λŠ” λˆ„κ°€ μˆ˜ν–‰ν•˜λŠλƒμ΄λ‹€.

nμ΄ˆλ’€μ— setTimeout을 μš”μ²­ν•˜λŠλŠ μž‘μ—…μ€ λˆ„κ°€ μ²˜λ¦¬ν•˜λŠ” κ²ƒμΌκΉŒ?
fetchλ₯Ό 기반으둜 μ‹€ν–‰λ˜λŠ” λ„€νŠΈ μ›Œν¬ μš”μ²­μ€ λˆ„κ°€ 보내고 응닡을 받을 것인가?

μ΄λŸ¬ν•œ μž‘μ—…λ“€μ€ λͺ¨λ‘ νƒœμŠ€ν¬ 큐가 ν• λ‹Ήλ˜λŠ” λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μˆ˜ν–‰λœλ‹€κ³ ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ 싀행은 μ‹±κΈ€ μŠ€λ ˆλ“œ λ‚΄λΆ€μ—μ„œ μ΄λ£¨μ–΄μ§€μ§€λ§Œ μ™ΈλΆ€ Web API등은 λͺ¨λ‘ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ μ™ΈλΆ€μ—μ„œ μ‹€ν–‰λ˜κ³  콜백이 νƒœμŠ€ν¬ 큐둜 λ“€μ–΄κ°€λŠ” κ²ƒμ΄λΌκ³ ν•œλ‹€.

이벀트 λ£¨ν”„λŠ” 호좜 μŠ€νƒμ΄ λΉ„κ³ , 콜백이 μ‹€ν–‰ κ°€λŠ₯ν•œ λ•Œκ°€ 였면 이것을 κΊΌλ‚΄μ„œ μˆ˜ν–‰ν•˜λŠ” 역할을 ν•œλ‹€κ³ ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 비동기 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” νƒœμŠ€ν¬ νλŠ” κ³Όμ—° μ–΄λ–€ ꡬ쑰둜 μž‘λ™ν•˜λŠ”κ²ƒμΌκΉŒ?

➑️ λ‹€μŒ κΈ€μ—μ„œλŠ” νƒœμŠ€ν¬ 큐와 마이크둜 νƒœμŠ€ν¬ 큐에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μž.

profile
β˜„οΈ

0개의 λŒ“κΈ€