66651
πŸ‘€
66651
  • λΆ„λ₯˜ 전체보기 (57)
    • note (28)
    • log (13)
    • error (9)
    • etc (7)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
66651

πŸ‘€

[Deep Dive] 42μž₯ 비동기 ν”„λ‘œκ·Έλž˜λ°
note

[Deep Dive] 42μž₯ 비동기 ν”„λ‘œκ·Έλž˜λ°

동기 μ²˜λ¦¬μ™€ 비동기 처리

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ‹€ν–‰ν•  수 μžˆλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. μ‹±κΈ€ μŠ€λ ˆλ“œ 방식은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ‹€ν–‰ν•  수 있기 λ•Œλ¬Έμ— μ²˜λ¦¬μ— μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” νƒœμŠ€ν¬λ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 λΈ”λ‘œν‚Ή(μž‘μ—… 쀑단)이 λ°œμƒν•œλ‹€. ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œν•  λ•ŒκΉŒμ§€ λ‹€μŒμ— 싀행될 νƒœμŠ€ν¬κ°€ λŒ€κΈ°ν•˜λŠ” 방식을 동기 처리라고 ν•œλ‹€.

 

setTimeout ν•¨μˆ˜λŠ” 일정 μ‹œκ°„μ΄ κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€λ§Œ setTimeout μ΄ν›„μ˜ νƒœμŠ€ν¬λ₯Ό λΈ”λ‘œν‚Ήν•˜μ§€ μ•Šκ³  κ³§λ°”λ‘œ μ‹€ν–‰ν•œλ‹€. ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œλ˜μ§€ μ•Šμ€ μƒνƒœλΌ 해도 λ‹€μŒ νƒœμŠ€ν¬λ₯Ό κ³§λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” 방식을 λΉ„동기 처리라고 ν•œλ‹€. setTimeoutκ³Ό setInterval, HTTPμš”μ²­, 이벀트 ν•Έλ“€λŸ¬λŠ” 비동기 처리 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

setTimeout(() => console.log("setTimeout"), 1000);
console.log("test");

// console
// setTimeout (1초 ν›„)

 

 

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

μ‹±κΈ€ μŠ€λ ˆλ“œ 방식은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ νƒœμŠ€ν¬λ§Œ μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•˜μ§€λ§Œ λΈŒλΌμš°μ €κ°€ λ™μž‘ν•˜λŠ” 것을 μ‚΄νŽ΄λ³΄λ©΄ λ§Žμ€ νƒœμŠ€ν¬κ°€ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§„λ‹€. 이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μ‹œμ„±μ„ μ§€μ›ν•˜λŠ” 것이 λ°”λ‘œ 이벀트 루프닀. 이벀트 λ£¨ν”„λŠ” λΈŒλΌμš°μ €μ— λ‚΄μž₯λ˜μ–΄ μžˆλŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‹€.

 

λΈŒλΌμš°μ € ν™˜κ²½

  • 콜 μŠ€νƒ : μ†ŒμŠ€μ½”λ“œ 평가 κ³Όμ •μ—μ„œ μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³  μ œκ±°λ˜λŠ” μŠ€νƒ 자료ꡬ쑰인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄ λ°”λ‘œ 콜 μŠ€νƒμ΄λ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 순차적으둜 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜μ–΄ 순차적으둜 μ‹€ν–‰λœλ‹€. μ΅œμƒμœ„ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ)κ°€ μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ 제거되기 μ „κΉŒμ§€λŠ” λ‹€λ₯Έ μ–΄λ–€ νƒœμŠ€ν¬λ„ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
  • νž™ : 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀. μ½œμŠ€νƒμ˜ μš”μ†ŒμΈ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” νž™μ— μ €μž₯된 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.
  • νƒœμŠ€ν¬ 큐 : 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­μ΄λ‹€.
    (νƒœμŠ€ν¬ νμ™€λŠ” λ³„λ„λ‘œ ν”„λ‘œλ―ΈμŠ€μ˜ 후속 처리 λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 큐도 μ‘΄μž¬ν•œλ‹€.)
  • 이벀트 루프 : 이벀트 λ£¨ν”„λŠ” 콜 μŠ€νƒμ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μžˆλŠ”μ§€, 그리고 νƒœμŠ€νŠΈ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ λ°˜λ³΅ν•΄μ„œ ν™•μΈν•œλ‹€. λ§Œμ•½ 콜 μŠ€νƒμ΄ λΉ„μ–΄ 있고 νƒœμŠ€ν¬ 큐에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλ‹€λ©΄ 이벀트 λ£¨ν”„λŠ” 순차적으둜 μ½œμŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚¨λ‹€. 이 λ•Œ 콜 μŠ€νƒμœΌλ‘œ μ΄λ™ν•œ ν•¨μˆ˜λŠ” μ‹€ν–‰λœλ‹€. 즉, νƒœμŠ€ν¬ 큐에 μΌμ‹œ λ³΄κ΄€λœ ν•¨μˆ˜λ“€μ€ 비동기 처리 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ‹¨μˆœνžˆ νƒœμŠ€ν¬κ°€ μš”μ²­λ˜λ©΄ 콜 μŠ€νƒμ„ 톡해 μž‘μ—…μ„ 순차적으둜 μ‹€ν–‰ν•  뿐이닀. 비동기 μ²˜λ¦¬μ—μ„œ μ†ŒμŠ€μ½”λ“œμ˜ 평가와 싀행을 μ œμ™Έν•œ λͺ¨λ“  μ²˜λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 κ΅¬λ™ν•˜λŠ” ν™˜κ²½μΈ λΈŒλΌμš°μ € λ˜λŠ” Node.jsκ°€ λ‹΄λ‹Ήν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•˜μ§€λ§Œ λΈŒλΌμš°μ €λŠ” λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ™μž‘ν•œλ‹€.

 

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

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

setTimeout(foo, 0);
bar();

// bar
// foo

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

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
    'note' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Next.js] import κ²½λ‘œμ— @별칭 μ‚¬μš©ν•˜κΈ°
    • Node.js둜 CRA μ‹œ κΈ°λ³Έ 파일과 폴더 ν•œ λ²ˆμ— μ„ΈνŒ…ν•˜κΈ°
    • [Deep Dive] 22μž₯ this
    • [Deep Dive] 16μž₯ ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ
    66651
    66651
    always awake

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”