μ±κΈμ€λ λμ μ΄λ²€νΈλ£¨ν
8/12/2022
μμ±μ : νμλ°°
β μλ°μ€ν¬λ¦½νΈμ λ°νμνκ²½μ μ±κΈ μ°λ λ κΈ°λ°μ΄λ©° λ Ό λΈλ‘νΉ λ°©μμ λΉλκΈ°μ μΈ λμμ± μΈμ΄μ΄λ©° μ½ μ€ν, μ΄λ²€νΈ 루νμ μ½λ°± ν κ·Έλ¦¬κ³ μ¬λ¬κ°μ§ λ€λ₯Έ APIλ€μ κ°μ§κ³ μλ€. β
μ±κΈμ€λ λμ΄κΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈ μμ§μ νλμ μ½μ€νμ κ°μ§κ³ μμ
μ μννλ€. κ·Έλ κΈ°μ μ½μ€νμ μ°μ°μ΄ μ€λ 걸리면 UIκ° λ©μΆ μ°λ €κ° μλ€.
- μ€λ λλ νλμ μ€νμ κ°μ§λ€ (μ½λ, λ°μ΄ν, νμ 곡μ )
- ?? μλ°μ€ν¬λ¦½νΈμ μ€νλ§₯λ½μ΄ μμ λ (μ ννκ²λ μ½μ€νκ³Ό λ§μ΄ν¬λ‘ νμ€ν¬ νκ° λΉμ΄μ Έ μμλ) λ λλ§ μμ§μ΄ μλ°μ€ν¬λ¦½νΈ μμ§μΌλ‘λΆν° μ μ΄κΆμ λ겨λ°μ(λ λλ§ μνμ€λΌ ννλκΈ°λ νλ€) νλ©΄μ κ·Έλ €μ€λ€. λ λλ§ μμ§μ μ½μ€νμ΄ λΉμ΄μ§λ μ κΉ μ κΉ μ μ΄κΆμ λ°μ νλ©΄μ 그리λ κ²μ΄λ€. κ·Έλ κΈ°μ μ€νμ μμ μ΄ λ§μ λΈλ‘νΉ λλ©΄ UIκ° λ μ λ¨Ήμ μλ μλ κ²μ΄λ€
Β

Β
νμ€ν¬ ν

μμ
νλ λ§μ΄ν¬λ‘ νμ€ν¬ν, μ λλ©μ΄μ
ν
μ€ν¬ ν, λ§€ν¬λ‘ νμ€ν¬ν λ±μΌλ‘ λλλ©°,
- λ§μ΄ν¬λ‘ νμ€ν¬ νλ μ½ μ€νμ΄ λΉμ΄μλ κ²½μ° μ΅μ°μ μΌλ‘ μμ λμ΄ μΌκ΄μ μΌλ‘ νλμ© μ½μ€νμ μμ΄λ©° νκ° λΉμ΄μ§λκΉμ§ μ€νλλ€. (μλ‘ μΆκ°λλ κ²κΉμ§ λ€.. μ΅μ°μ !)
- μ λλ©μ΄μ νμ€ν¬ νλ λ§μ΄ν¬λ‘ νμ€ν¬ ν λ€μμΌλ‘ μ΄λ²€νΈ 루νμκ² μ€νλλ©° νμ λ λλ§ μμ§κ³Ό ν¨κ» λμνλ©° (λ λνΈλ¦¬-리νλ‘μ°-리νμΈνΈ) νλ©΄μ κ·Έλ €μ€λ€
- λ§€ν¬λ‘ νμ€ν¬ νλ μ½ μ€νμ΄ λΉμ΄μ Έ μλ κ²½μ° νλ²μ νλλ§ μ½μ€νμ λ΄κ²¨ μ€νλκ³ λ€μ 루νλ‘ μ νλλ€
μ΄λ²€νΈ 루νλ Microtask Queueλ Animation Framesλ₯Ό λ°©λ¬Έν λλ, ν μμ μλ λͺ¨λ μμ λ€μ μννμ§λ§, Task Queueλ₯Ό λ°©λ¬Έν λλ ν λ²μ νλμ μμ λ§ call stackμΌλ‘ μ λ¬νκ³ λ€λ₯Έ Queueλ₯Ό μννλ€.
Β
κ·ΈλΌ μ΄λ»κ² λ©ν°μ€λ λλ‘ μλν μ μλκ°?
- WebAPIλ₯Ό ν΅ν΄ λΈλΌμ°μ μκ² λΉλκΈ°μ μμ μ μ(μΌ)μ
// setTimeoutμ κ²½μ° setTimeout(() => console.log('μλ νμΈμ μλ°°λ', 1000); 1. μ½μ€νμ setTimeoutμ΄ μμΈλ€ 2. μ€νλλ©΄μ idλ₯Ό μ½λ°±ν¨μλ‘ λ±λ‘ν΄ λκ³ WebAPIλ₯Ό ν΅ν΄ λΈλΌμ°μ μκ² μΌμ 3. 1000msκ° μ§λλ©΄ λ§€ν¬λ‘ νμ€ν¬ νμ μμ΄κ³ μ½μ€νμ΄ λΉμ΄μ Έμμ λ λ€μ μ€νλλ€
β¦ κ·Έλμ fetch() ν¨μ μ체λ μλ°μ€ν¬λ¦½νΈ μμ§κ³Ό λ³κ°λ‘ λμνκΈ° λλ¬Έμ μ΄μ©λ©΄ multi Thread νμμ²λΌ λ³΄μΌ μ μλ€.κ·Έλ¬λ Javascript μμ²΄κ° Single Threadλ‘ λμνλ€ λ³΄λ, μλ²μ μμ²νκ³ μλ΅μ λ°λμ§μ λν Trackingμ μ¬μ ν μ§ννκ² λλ€. μ΄λ μ±κΈ μ€λ λμ 리μμ€λ₯Ό λΆλͺ ν μ°κ³ μμΌλ©° μ±λ₯μ μν₯μ λΌμΉκ³ μμμ νμ€νλ€. Javascriptκ° νλ₯ν Event LoopλΌλ μμλ‘ λΉλκΈ° λ‘μ§ μ²λ¦¬λ₯Ό μ μ μ΄νκ³ μμ§λ§,Β μ¬μ νΒ μ±κΈ μ€λ λμ νκ³λ₯Ό κ°μ§κ³ μμ μλ°μ μλ μμμ΄λ€.
β λΉλκΈ° μ²λ¦¬λ₯Ό μν 기본ꡬμ±μ΄λ©° λ©ν°μ€λ λ μΈμ² νλ κ²μ΄λ€
Β
- WebWorkerλ₯Ό ν΅ν΄μ λ°±κ·ΈλΌμ΄λμμ μν νκ² λΉλκΈ° μμ μ μν
- WebWorkerλ₯Ό μ¬μ©ν΄μ λΉλκΈ° ν¨μμ worker μ°λ λλ₯Ό νλμ© μ§μ ν λΉν΄μ μ¬μ©ν μ μλ€
- λΉλκΈ° μμ μ΄ μ€λ 걸리λ μμ μΈ κ²½μ° WebWorkerμ μ¬μ©ν΄μ μμ μ μνν μ μλ€
- ServiceWorkerλ λΈλΌμ°μ μ°½μ΄ κΊΌμ Έλ μ€νλλ©°, corsμ httpsμμλ§ μλκ°λ₯ν μ μ½μ‘°κ±΄λ€μ΄ μλ€
Β
λΉλκΈ°μ μ²λ¦¬ λ°©λ²
- μ½λ°±ν¨μ
- Promise κ°μ²΄λ₯Ό μ΄μ© + then
Promiseκ°μ²΄λ μ½μλ κ²°κ³Όκ°μ΄λ€. κ²°κ³Όμ μνκ° fulfilledλ‘ μ΄νλμ΄μ Έμ λ thenμ ν΅ν΄ promiseκ° μ λ¬λκ³ μ½λ°±ν¨μμ²λΌ κ²°κ³Όλ₯Ό νΈλ€λ§ν΄λκ° μ μλ€
- λΉλκΈ° ν¨μ (asyncν¨μ)
- ES6(ES2015)μμ μ²μ λμ¨ κ°λ
- λΉλκΈ°μ μΈ μλμ νλ fetch λ±κ³Ό ν¨κ» λΉλκΈ°μ μ½λλ₯Ό λκΈ°μμΌλ‘ μμ±ν μ μλ€
- promiseκ°μ²΄λ₯Ό μ΄μ©νλ€
λΉλκΈ° ν¨μ(asyncν¨μ)λ λΉλκΈ°μ μΌλ‘ μ€νλλ ν¨μ (ex setTimeout)μ λ€λ₯Έ κ°λ μ΄μ§λ§ λ¬Άμ¬μ λΉλκΈ° ν¨μλΌ λΆλ¬μ§κΈ°λ νλ€
Β
μ½μ€νμ μ¬κ·ν¨μκ° λ¬΄νμ μμ΄κ² λλ©΄
Maximum call stack size exceeded
μ€λ₯ λ°μΒ
μ€ν¬λ‘€μ νκ² λλ©΄ μ΄λ€ μΌμ΄?
μ½μ€νμ μμ² μμ΄κ² λκ³ μ±λ₯μ μν₯μ μ£Όκ² μ§, μ°λ‘νλ§μ΄ νμνλ€.
Β
μ΄λ²€νΈ 루νλ?
μ½μ€νμ΄ λΉμ΄μ Έμμ λ νμ€ν¬ νμ μλ μ½λ°±ν¨μλ€μ λΆλ¬μμ μ½μ€νμ λ£μ΄μ£Όλ λΈλΌμ°μ μ λμμ₯μΉ (JSμμ§ κΈ°λ₯μ΄ μλλΌ λ°νμνκ²½ κΈ°λ₯)
Β
μΆμ²
Β
μ°λ λλ?
λ§€ν¬λ‘νμ€ν¬ν λ§μ΄ν¬λ‘νμ€ν¬ν?
λΈλΌμ°μ λ°νμ?
μΉμ컀μ λν μ λ‘μ΄μ κ΄μ
Β
ZeroCho : μ λ μμ²λκ² λ§μ΄ κ²μνλλ°λ ν·κ°λ¦¬λλΌκ³ μ. κ²°κ΅ μ΄μ체μ λμΆ© 곡λΆν νμ κΉ¨λ«κ² λμμ΅λλ€. λΉλκΈ°λλΌλ μ±κΈ μ°λ λμμλ μ±κΈ μ°λ λκ° κ²°κ΅ λͺ¨λ κ²μ μ²λ¦¬ν΄μΌ νκΈ° λλ¬Έμ μλ¬΄λ° μκ° μ΄λμ΄ μλ€λ κ²μμ. λ€λ§ λ€νΈμν¬λ νμΌμμ€ν
μ κ·Όλ§ κ·Έ μκ°λμ λ€λ₯Έ μμ
μ ν μ μμ΄μ μκ° μ΄λμ΄ μμ΅λλ€.
μ΅λͺ
: λ΅λ³ κ°μ¬ν©λλ€! κ·ΈλΌ νλ λ κΆκΈνκ² μμ΅λλ€. λΉλκΈ°λΌ ν¨μ λ¨μν μμ
μ μ°μ μμλ₯Ό λ€λ‘ 미루λ κ²μΈκ°μ? μ±κΈμ°λ λκ° λ©μΈ λ‘μ§ μμ
μ νλ λμ λΉλκΈ° μμ
μ λκ° μΈμ μ΄λμ νκ³ μλ 건κ°μ? νμ€ν¬ νμλ μ½λ°±ν¨μλ§ λ£μ΄μ§λ€κ³ μκ³ μμ΅λλ€. κ·ΈλΌ λΉλκΈ° ν¨μ μ체λ΄μμ μ½λ°±μ νμ€ν¬ νμ λ£κΈ° μ μ λ€λ₯Έ λ‘μ§μ μνμ€μ΄λΌλ©΄ μ΄ λ‘μ§μ λκ° μ€ννλμ§κ° κΆκΈν©λλ€. λΈλΌμ°μ λ node μμ§ μ체μμ λ€λ₯Έ μ°λ λκ° νμ©λκ³ μλ κ±°λΌλ©΄ μ¬μ€μ λΉλκΈ°λ μΉμ컀λ ν° μκ°μ°¨κ° μμ§ μμκΉμ ?
ZeroCho : λ€ μμ
μ μ°μ μμλ₯Ό λ€λ‘ 미루λ κ²λλ€. λ³λ ¬λ‘ μ€νλλ κ² μλλΌμ. λ‘μ§(μ¬λμ΄ μ§μ μμ±ν μ½λ)(async await, observerAPI, process.nextTick())μ λͺ¨λ λ©μΈμ°λ λμμ μ²λ¦¬λ©λλ€. λ€νΈμν¬ μμ²μ΄λ νμΌμμ€ν
μ λλ§ μ΄μ체μ μμ λ©ν°μ°λ λλ‘ μ²λ¦¬ν΄μ£Όκ³ μ. λ°λΌμ κ·Έ μ΄μΈμ λ©μΈ μ°λ λ λ‘μ§(μμμ sleep ν¨μκ°μ)μ΄ μ€λ 걸리면 λΉλκΈ°λΌ νλλΌλ μκ°μ΄ μ€λ μμλ©λλ€. μΉμ컀λ μμ λ€λ₯Έ μ°λ λλ₯Ό μμ±ν΄ λ‘μ§μ κ±°κΈ°μ μ²λ¦¬νλκ±°λΌμ μλμ μ΄λμ λ³Ό μ μμ΅λλ€.
μ±κΈμ½μ΄μΈ κ²½μ° μ컀λ₯Ό μ¬μ©νλλΌλ μ΄λμ λͺ» 보λ κ²λ λ§μ°¬κ°μ§λ‘ μ€λͺ
κ°λ₯ν©λλ€. λ©ν°μ°λ λλ₯Ό λλ €λ μ½μ΄κ° νλλΌμ μ½μ΄μμ μ°λ λ μ ν μμ
μ ν΄μ ν λ²μ νλμ μ°λ λλ§ μ²λ¦¬ν μ μκΈ° λλ¬Έμ
λλ€.