λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/translates

(λ²ˆμ—­) λΈŒλΌμš°μ €κ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ 타이머λ₯Ό μŠ€λ‘œν‹€λ§(throttle) ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

by HandHand 2025. 10. 23.

 

 

원문: https://nolanlawson.com/2025/08/31/why-do-browsers-throttle-javascript-timers

 

 

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό κ½€ 였래 μ‚¬μš©ν•΄ μ™”λ‹€κ³  ν•˜λ”λΌλ„ setTimeout(0)이 μ‹€μ œλ‘œλŠ” setTimeout(0)이 μ•„λ‹ˆλΌλŠ” 사싀에 λ†€λž„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 이것은 4ms 이후에 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

const start = performance.now()
setTimeout(() => {
  // μ•„λ§ˆλ„ 4ms
  console.log(performance.now() - start)
}, 0)

 

거의 10λ…„ μ „ Microsoft Edge νŒ€μ— μžˆμ—ˆμ„ λ•Œ, λΈŒλΌμš°μ €κ°€ 이런 방식을 μ±„νƒν•œ μ΄μœ λŠ” "λ‚¨μš©"을 λ°©μ§€ν•˜κΈ° μœ„ν•¨μ΄λΌκ³  λ“€μ—ˆμŠ΅λ‹ˆλ‹€. 즉, setTimeout을 κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” μ›Ήμ‚¬μ΄νŠΈκ°€ 많기 λ•Œλ¬Έμ—, μ‚¬μš©μžμ˜ 배터리 μ†Œλͺ¨λ₯Ό 막고 μƒν˜Έμž‘μš©μ„ μ°¨λ‹¨ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ λΈŒλΌμš°μ €κ°€ 4msλΌλŠ” νŠΉλ³„ν•œ "μ œν•œλœ" μ΅œμ†Œ μ‹œκ°„κ°’μ„ μ„€μ •ν•œλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

μ΄λŠ” 일뢀 λΈŒλΌμš°μ €κ°€ 배터리 전원을 μ‚¬μš©ν•˜λŠ” 기기에 λŒ€ν•œ μŠ€λ‘œν‹€λ§μ„ λ†’μ΄κ±°λ‚˜(ꡬ버전 Edge의 경우 16ms) λ°±κ·ΈλΌμš΄λ“œ 탭에 λŒ€ν•œ μŠ€λ‘œν‹€λ§μ„ 훨씬 더 곡격적으둜 λ†’μ΄λŠ” 이유(Chrome의 경우 1초!)λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€.

 

그런데 ν•œ κ°€μ§€ 의문이 항상 μ €λ₯Ό κ΄΄λ‘­ν˜”μŠ΅λ‹ˆλ‹€. setTimeout이 κ·Έλ ‡κ²Œ λ‚¨μš©λœλ‹€λ©΄, μ™œ λΈŒλΌμš°μ €λŠ” setImmediate(RIP), Promises, 심지어 scheduler.postTask() 같은 μƒˆλ‘œμš΄ 타이머λ₯Ό 계속 λ„μž…ν–ˆμ„κΉŒμš”? λ§Œμ•½ setTimeout의 μ„±λŠ₯을 μ˜λ„μ μœΌλ‘œ μ œν•œν•΄μ•Ό ν–ˆλ‹€λ©΄, κ²°κ΅­ 이런 타이머듀도 같은 운λͺ…을 λ§žμ΄ν•˜κ²Œ λ˜λŠ” 것 μ•„λ‹κΉŒμš”?

 

2018년에 μžλ°”μŠ€ν¬λ¦½νŠΈ 타이머에 λŒ€ν•œ κΈ΄ 글을 μ“΄ 적이 μžˆμ§€λ§Œ, μ΅œκ·ΌκΉŒμ§€ 이 μ§ˆλ¬Έμ„ λ‹€μ‹œ κΊΌλ‚΄λ³Ό λ§Œν•œ λšœλ ·ν•œ μ΄μœ λŠ” μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‹€ IndexedDB APIλ₯Ό 순수 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ΅¬ν˜„ν•œ fake-indexeddb μž‘μ—…μ„ ν•˜λ˜ 쀑 이 질문이 λ– μ˜¬λžμŠ΅λ‹ˆλ‹€. μ•Œκ³  λ³΄λ‹ˆ, IndexedDBλŠ” 이벀트 루프에 남아 μžˆλŠ” μž‘μ—…μ΄ 없을 λ•Œ νŠΈλžœμž­μ…˜μ„ μžλ™ μ»€λ°‹ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μ‹œ 말해 λͺ¨λ“  λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬κ°€ λλ‚œ ν›„, 그리고 μ–΄λ– ν•œ μž‘μ—…(슬쩍 'λ§€ν¬λ‘œνƒœμŠ€ν¬'라고 λΆˆλŸ¬λ„ λ κΉŒμš”?)도 μ‹œμž‘λ˜κΈ° μ „ κ·Έ μ‹œμ μ„ λ…Έλ¦¬λŠ” 것이죠.

 

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ fake-indexeddbλŠ” Node.jsμ—μ„œλŠ” setImmediateλ₯Ό μ‚¬μš©ν•˜κ³ (μ΄λŠ” κ΅¬ν˜• λΈŒλΌμš°μ € 버전과 μœ μ‚¬ν•¨), λΈŒλΌμš°μ €μ—μ„œλŠ” setTimeout을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. Nodeμ—μ„œ setImmediateλŠ” κ½€ 이상적인데, λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ 이후에 λ‹€λ₯Έ νƒœμŠ€ν¬λ“€λ³΄λ‹€ λ°”λ‘œ μ•žμ„œ μ‹€ν–‰λ˜κ³ , μ œν•œ(clamping)도 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ λΈŒλΌμš°μ €μ—μ„œλŠ” setTimeout이 κ½€ λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. ν•œ λ²€μΉ˜λ§ˆν¬μ— λ”°λ₯΄λ©΄, Nodeμ—μ„œλŠ” 300ms 걸리던 μž‘μ—…μ΄ Chrome에선 무렀 4.8sλ‚˜ κ±Έλ ΈμŠ΅λ‹ˆλ‹€(16λ°° 느린 속도!).

 

ν•˜μ§€λ§Œ 2025λ…„μ˜ 타이머 κΈ°μˆ μ„ μ‚΄νŽ΄λ³΄λ©΄, μ–΄λ–€ 것을 선택해야 ν• μ§€ λͺ…ν™•ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λͺ‡ κ°€μ§€ μ„ νƒμ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

  • setImmediate – κ΅¬ν˜• Edge와 IEμ—μ„œλ§Œ μ§€μ›λ˜λ―€λ‘œ, μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • MessageChannel.postMessageafterframeμ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.
  • window.postMessage – 쒋은 μ•„μ΄λ””μ–΄μ§€λ§Œ, νŽ˜μ΄μ§€μ˜ λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈκ°€ λ™μΌν•œ APIλ₯Ό μ‚¬μš©ν•  경우 μΆ©λŒμ„ μΌμœΌν‚¬ 수 μžˆμ–΄ λ‹€μ†Œ λΆˆμ•ˆμ •ν•©λ‹ˆλ‹€. κ·Έλž˜λ„ setImmediate ν΄λ¦¬ν•„μ—μ„œλŠ” 이 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • scheduler.postTask – κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄, 이것이 μ΅œμ’… μ„ νƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ™œ κ·ΈλŸ°μ§€ μ„€λͺ…ν•΄ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€!

 

이 선택지듀을 λΉ„κ΅ν•˜κΈ° μœ„ν•΄ μ €λŠ” κ°„λ‹¨ν•œ 벀치마크λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. 이 λ²€μΉ˜λ§ˆν¬μ— λŒ€ν•œ λͺ‡ κ°€μ§€ μ€‘μš”ν•œ 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

  1. setTimeout(및 μœ μ‚¬ν•œ APIλ“€)의 μ œν•œ(clamping) λ™μž‘μ„ μ œλŒ€λ‘œ νŒŒμ•…ν•˜λ €λ©΄, μ—¬λŸ¬ 번 반볡 싀행해봐야 ν•©λ‹ˆλ‹€.
    κΈ°μˆ μ μœΌλ‘œλŠ”, HTML λͺ…세에 따라 4ms μ œν•œμ€ setTimeout이 5번 이상 쀑첩 싀행될 λ•ŒλΆ€ν„°(즉, ν•œ setTimeout이 λ‹€λ₯Έ setTimeout을 ν˜ΈμΆœν•˜λŠ” 경우) μ μš©λ©λ‹ˆλ‹€.
  2. 배터리 μ‚¬μš© ν˜Ήμ€ 전원 μ—°κ²° μ—¬λΆ€, λͺ¨λ‹ˆν„°μ˜ μ£Όμ‚¬μœ¨, νƒ­μ˜ λ°±κ·ΈλΌμš΄λ“œ/ν¬κ·ΈλΌμš΄λ“œ μ—¬λΆ€ 등이 μ œν•œ λ™μž‘μ— 영ν–₯을 쀄 수 μžˆλ‹€λŠ” 건 μ•Œκ³  μžˆμ§€λ§Œ, κ·Έ λͺ¨λ“  쑰합을 μ „λΆ€ ν…ŒμŠ€νŠΈν•΄ λ³Έ 건 μ•„λ‹™λ‹ˆλ‹€. 저도 삢이 있고, μ‹€ν—˜μ‹€ κ°€μš΄μ„ μž…κ³  λͺ‡ κ°€μ§€ μ‹€ν—˜μ„ ν•˜λŠ” 것도 μž¬λ°Œμ§€λ§Œ, ν† μš”μΌ λ‚΄λ‚΄ κ·Έκ±Έ ν•˜κ³  μ‹Άμ§„ μ•ŠμŠ΅λ‹ˆλ‹€.

 

μ–΄μ¨Œλ“ , μΈ‘μ •λœ μˆ˜μΉ˜λ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. (λ‹¨μœ„: ms, 2021λ…„ν˜• 16인치 λ§₯뢁 ν”„λ‘œμ—μ„œ 101회 반볡 μΈ‘μ •μ˜ 쀑앙값)

 

λΈŒλΌμš°μ € setTimeout MessageChannel.postMessage window.postMessage scheduler.postTask
Chrome 139 4.2 0.05 0.03 0.00
Firefox 142 4.72 0.02 0.01 0.01
Safari 18.4 26.73 0.52 0.05 κ΅¬ν˜„λ˜μ§€ μ•ŠμŒ

 

μ°Έκ³ : 이 λ²€μΉ˜λ§ˆν¬λŠ” μž‘μ„±ν•˜κΈ°κ°€ κ½€ κΉŒλ‹€λ‘œμ› μŠ΅λ‹ˆλ‹€! μ²˜μŒμ—λŠ” Promise.all을 μ‚¬μš©ν•΄ λͺ¨λ“  타이머λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν–ˆλŠ”λ°, 이 방식이 Safari의 쀑첩 νœ΄λ¦¬μŠ€ν‹±μ„ 무λ ₯ν™”μ‹œν‚€λŠ” λ“―ν–ˆκ³ , Firefoxμ—μ„œλŠ” 타이머가 λΆˆκ·œμΉ™ν•˜κ²Œ λ™μž‘ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ§€κΈˆμ€ 각 타이머λ₯Ό λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰ν•˜λ„λ‘ 벀치마크λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

 

μ •ν™•ν•œ μˆ«μžμ— λ„ˆλ¬΄ μ§‘μ°©ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ€‘μš”ν•œ 점은 Chromeκ³Ό Firefoxμ—μ„œλŠ” setTimeout이 4ms둜 μ œν•œ(clamp)λœλ‹€λŠ” 것이고, λ‚˜λ¨Έμ§€ μ„Έ κ°€μ§€ μ˜΅μ…˜μ€ λŒ€μ²΄λ‘œ λΉ„μŠ·ν•œ μ„±λŠ₯을 λ³΄μΈλ‹€λŠ” μ μž…λ‹ˆλ‹€. ν₯λ―Έλ‘­κ²Œλ„ Safariμ—μ„œλŠ” setTimeout이 훨씬 더 κ°•ν•˜κ²Œ μ œν•œλ˜λ©°, MessageChannel.postMessageλŠ” window.postMessage보닀 μ•½κ°„ λŠλ¦½λ‹ˆλ‹€ (λ¬Όλ‘  μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μ΄μœ λ“€ λ•Œλ¬Έμ— window.postMessageλŠ” μ—¬μ „νžˆ λ‹€μ†Œ λΆˆμ•ˆμ •ν•œ λ°©μ‹μž…λ‹ˆλ‹€).

 

이번 μ‹€ν—˜μ„ 톡해 μ œκ°€ λ‹Ήλ©΄ν•œ μ§ˆλ¬Έμ— λŒ€ν•œ 닡을 얻을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. fake-indexeddbλŠ” 기본적으둜 scheduler.postTaskλ₯Ό μ‚¬μš©ν•˜κ³ (μ‚¬μš©μ„± μΈ‘λ©΄μ—μ„œ μ œκ°€ μ„ ν˜Έν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€), κ·Έ μ™Έμ—λŠ” MessageChannel.postMessageλ‚˜ window.postMessageλ₯Ό λŒ€μ²΄ μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ μ ˆν•΄ λ³΄μ˜€μŠ΅λ‹ˆλ‹€.
(postTask에 λ‹€μ–‘ν•œ μš°μ„ μˆœμœ„λ₯Ό μ μš©ν•΄ μ‹€ν—˜ν•΄ λ΄€μ§€λ§Œ, μ„±λŠ₯은 λŒ€λΆ€λΆ„ λ™μΌν–ˆμŠ΅λ‹ˆλ‹€. fake-indexeddb의 μ‚¬μš© λͺ©μ μ—λŠ” κΈ°λ³Έ μš°μ„ μˆœμœ„μΈ 'user-visible'이 κ°€μž₯ μ μ ˆν•΄ λ³΄μ˜€κ³ , μ‹€μ œ λ²€μΉ˜λ§ˆν¬μ—μ„œλ„ 이 값을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.)

 

ν•˜μ§€λ§Œ 이 λͺ¨λ“  μ‹€ν—˜λ„ μ œκ°€ μ›λž˜ κΆκΈˆν–ˆλ˜ μ§ˆλ¬Έμ— λŒ€ν•œ 닡이 λ˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. μ›Ή κ°œλ°œμžλ“€μ΄ μ–΄μ°¨ν”Ό scheduler.postTaskλ‚˜ MessageChannel 같은 λ‹€λ₯Έ 방법을 μ“Έ 수 μžˆλ‹€λ©΄, λΈŒλΌμš°μ €λŠ” μ™œ ꡳ이 setTimeout을 μ œν•œν•˜λ €κ³  ν• κΉŒμš”? μ €λŠ” μ΄λŸ¬ν•œ "κ°œμž…"에 λŒ€ν•œ λ…Όμ˜κ°€ ν™œλ°œνžˆ μ§„ν–‰λ˜λ˜ λ‹Ήμ‹œ μ›Ή μ„±λŠ₯ μ›Œν‚Ή 그룹의 곡동 의μž₯μ΄μ—ˆλ˜ 제 친ꡬ Todd Reifsteckμ—κ²Œ λ¬Όμ—ˆμŠ΅λ‹ˆλ‹€.

 

κ·ΈλŠ” μ‹€μ§ˆμ μœΌλ‘œ 두 κ°€μ§€ μ§„μ˜μ΄ μ‘΄μž¬ν–ˆλ‹€κ³  λ§ν–ˆμŠ΅λ‹ˆλ‹€. ν•œμͺ½μ€ μ›Ή κ°œλ°œμžλ“€μ΄ 슀슀둜λ₯Ό ν•΄μΉ˜μ§€ μ•Šλ„λ‘ 타이머λ₯Ό μ œν•œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆκ³ , λ‹€λ₯Έ μͺ½μ€ κ°œλ°œμžλ“€μ΄ 슀슀둜의 μ–΄λ¦¬μ„μŒμ„ μžκ°ν•˜λ„λ‘ λ‘μžλ©°, 이런 λ―Έλ¬˜ν•œ μ œν•œ(νœ΄λ¦¬μŠ€ν‹±)은 였히렀 ν˜Όλž€λ§Œ μ•ΌκΈ°ν•œλ‹€κ³  μ£Όμž₯ν–ˆμŠ΅λ‹ˆλ‹€.

 

μš”μ•½ν•˜μžλ©΄, 이것은 μ„±λŠ₯ κ΄€λ ¨ APIλ₯Ό 섀계할 λ•Œ 늘 λ”°λΌμ˜€λŠ” 고전적인 λ”œλ ˆλ§ˆμ˜€μŠ΅λ‹ˆλ‹€.
"μ–΄λ–€ APIλŠ” λΉ λ₯΄μ§€λ§Œ, μ§€λ’°(footgun)도 ν•¨κ»˜ λ”°λΌμ˜¨λ‹€." 즉, 잘λͺ» μ‚¬μš©ν•˜λ©΄ 큰 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

 

이 λ‚΄μš©μ€ μ œκ°€ 이 μ£Όμ œμ— λŒ€ν•΄ κ°–κ³  있던 직관과도 잘 λ“€μ–΄λ§žμŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ € κ°œμž…μ€ 일반적으둜 μ›Ή κ°œλ°œμžκ°€ 쒋은 κΈ°λŠ₯(예: setTimeout)을 λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜κ±°λ‚˜ 더 λ‚˜μ€ μ˜΅μ…˜μ„ μ „ν˜€ μ•Œμ§€ λͺ»ν•˜λŠ” κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€(ν„°μΉ˜ λ¦¬μŠ€λ„ˆ λ…Όλž€μ΄ 쒋은 μ˜ˆμž…λ‹ˆλ‹€). κ²°κ΅­ λΈŒλΌμš°μ €λŠ” μ‚¬μš©μžλ₯Ό λŒ€μ‹ ν•˜μ—¬ ν–‰λ™ν•˜λŠ” "μ‚¬μš©μž μ—μ΄μ „νŠΈ"이며, W3C의 이해관계 μš°μ„ μˆœμœ„ 원칙(Priority of Constituencies)에 λ”°λ₯΄λ©΄ μ΅œμ’… μ‚¬μš©μžμ˜ μš”κ΅¬ 사항이 항상 μ›Ή 개발자의 μš”κ΅¬ 사항보닀 μš°μ„ ν•œλ‹€λŠ” 점을 λΆ„λͺ…νžˆ λ³΄μ—¬μ€λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ΄ 해도, μ›Ή κ°œλ°œμžλ“€μ€ μ’…μ’… μ˜¬λ°”λ₯Έ λ°©μ‹μœΌλ‘œ μž‘μ—…ν•˜κ³  μ‹Άμ–΄ ν•©λ‹ˆλ‹€. (이 λΈ”λ‘œκ·Έ 글도 그런 μ‹œλ„μ˜ μΌν™˜μ΄λΌκ³  μ €λŠ” μƒκ°ν•΄μš”.)
λ‹€λ§Œ, 항상 μ œλŒ€λ‘œ 된 도ꡬ가 μžˆλŠ” 건 μ•„λ‹ˆλΌμ„œ κ²°κ΅­ λˆˆμ•žμ— μžˆλŠ” 아무 λ„κ΅¬λ‚˜ μ§‘μ–΄ λ“€κ³  μ–΅μ§€λ‘œ 문제λ₯Ό ν•΄κ²°ν•˜λ €λ‹€ 더 큰 ν˜Όλž€μ„ μ΄ˆλž˜ν•˜κ³€ ν•©λ‹ˆλ‹€.
μž‘μ—… μ²˜λ¦¬μ™€ μŠ€μΌ€μ€„λ§μ— λŒ€ν•΄ 더 λ§Žμ€ μ œμ–΄κΆŒμ΄ μ£Όμ–΄μ§„λ‹€λ©΄ setTimeout을 μ˜€μš©ν•  ν•„μš”λ„ μ—†μ–΄μ§€κ³ , κ·Έ κ²°κ³Ό 일이 엉망이 λΌμ„œ κ°œμž…μ΄ ν•„μš”ν•œ 상황을 ν”Όν•  수 μžˆμ„ κ²λ‹ˆλ‹€.

 

제 μ˜ˆμƒμœΌλ‘œλŠ” λ‹ΉλΆ„κ°„ postTaskλ‚˜ postMessageλŠ” μ œν•œ 없이(throttled λ˜μ§€ μ•Šκ³ ) μœ μ§€λ  κ²ƒμž…λ‹ˆλ‹€. Toddκ°€ λ§ν–ˆλ˜ 두 "μ§„μ˜" μ€‘μ—μ„œ, μ„Έλ°€ν•œ νƒœμŠ€ν¬ μŠ€μΌ€μ€„λ§ 도ꡬ듀을 μ œκ³΅ν•˜λŠ” Scheduler API의 쑴재 μžμ²΄κ°€ ν˜„μž¬λŠ” "κ°œλ°œμžμ—κ²Œ 더 λ§Žμ€ μ œμ–΄κΆŒμ„ 주자(pro-control)"λŠ” μ§„μ˜μ΄ μ£Όλ„κΆŒμ„ μ₯κ³  μžˆμŒμ„ μ‹œμ‚¬ν•˜λŠ” λ“―ν•©λ‹ˆλ‹€. ToddλŠ” 이 APIλ₯Ό 두 μ§„μ˜μ˜ μ ˆμΆ©μ•ˆμœΌλ‘œ 보고 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  λ§Žμ€ μ œμ–΄κΆŒμ„ μ œκ³΅ν•˜μ§€λ§Œ, λ¬΄μž‘μœ„μ μΈ νƒ€μž„μ•„μ›ƒμ΄ μ•„λ‹ˆλΌ λΈŒλΌμš°μ €μ˜ μ‹€μ œ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈκ³Ό μ •λ ¬λœ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€λŠ” μ μ—μ„œ μ–΄λŠ 정도 κ· ν˜•μ„ 이루고 μžˆλ‹€λŠ” 것이죠.

 

비관적인 제 마음 ν•œνŽΈμ—μ„œλŠ”, 이 API쑰차도 κ²°κ΅­ 였용될 수 μžˆμ§€ μ•Šμ„κΉŒ ν•˜λŠ” 생각이 λ“­λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, user-blocking μš°μ„ μˆœμœ„λ₯Ό 아무 생각 없이 λͺ¨λ“  곳에 μ‚¬μš©ν•˜λŠ” μ‹μœΌλ‘œμš”.
μ–΄μ©Œλ©΄ λ―Έλž˜μ—λŠ” μ–΄λ–€ 진취적인 λΈŒλΌμš°μ € 벀더가 μŠ€λ‘œν‹€λ§ μ œμ–΄λ₯Ό 더 κ°•ν™”ν•˜κ²Œ 될지도 λͺ¨λ¦…λ‹ˆλ‹€. 그리고 그둜 인해 μ›Ήμ‚¬μ΄νŠΈλ“€μ΄ 더 λΉ λ¦ΏλΉ λ¦Ών•˜κ³  λ°˜μ‘μ„±λ„ μ’‹μœΌλ©° 배터리 μ†Œλͺ¨λ„ μ€„μ–΄λ“€μ—ˆλ‹€λŠ” 사싀을 λ°œκ²¬ν•˜κ²Œ λœλ‹€λ©΄, λ˜λ‹€μ‹œ "λΈŒλΌμš°μ € κ°œμž…(intervention)"의 물결이 μ°Ύμ•„μ˜¬ μˆ˜λ„ 있겠죠. (κ·Έλ•Œκ°€ 되면, μ•„λ§ˆ 우리 λͺ¨λ‘λ₯Ό κ·Έ ν˜Όλž€μ—μ„œ ꡬ해쀄 scheduler2 API 같은 게 ν•„μš”ν•΄μ§ˆμ§€λ„ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€!)

 

μ €λŠ” 더 이상 μ›Ή ν‘œμ€€ μž‘μ—…μ— 깊이 κ΄€μ—¬ν•˜μ§€λŠ” μ•Šμ•„μ„œ κ·Έμ € μΆ”μΈ‘λ§Œ ν•  수 μžˆμ„ λΏμž…λ‹ˆλ‹€. 당뢄간은 λŒ€λΆ€λΆ„μ˜ μ›Ή κ°œλ°œμžλ“€μ΄ κ·ΈλŸ¬ν•˜λ“―, ν˜„μž¬ 제 λͺ©ν‘œλ₯Ό λ‹¬μ„±ν•˜λŠ” 데 도움이 λ˜λŠ” APIλ₯Ό μ„ νƒν•˜κ³ , μ•žμœΌλ‘œ λΈŒλΌμš°μ €κ°€ λ„ˆλ¬΄ 많이 λ°”λ€Œμ§€ μ•ŠκΈ°λ₯Ό λ°”λž„ 뿐이죠. μš°λ¦¬κ°€ 쑰금만 μ‹ μ€‘ν•˜κ²Œ μ ‘κ·Όν•˜κ³  λ„ˆλ¬΄ κ³Όν•œ 무리수만 두지 μ•ŠλŠ”λ‹€λ©΄, κ·Έ 정도 λ°”λžŒμ―€μ€ κ³Όν•œ μš”κ΅¬λŠ” μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

 

이 κΈ€μ˜ μ΄ˆμ•ˆμ— ν”Όλ“œλ°±μ„ μ£Όμ‹  Todd Reifsteckμ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

 

μ°Έκ³ : μ œκ°€ setTimeout에 λŒ€ν•΄ λ§ν•œ λͺ¨λ“  λ‚΄μš©μ€ setInterval에도 κ·ΈλŒ€λ‘œ μ μš©λ©λ‹ˆλ‹€. λΈŒλΌμš°μ € κ΄€μ μ—μ„œ 보면, 이 λ‘˜μ€ 거의 λ™μΌν•œ APIμž…λ‹ˆλ‹€.

μ°Έκ³ : μ˜λ―Έκ°€ μžˆμ„μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ, fake-indexeddbλŠ” Safariμ—μ„œ MessageChannelμ΄λ‚˜ window.postMessage λŒ€μ‹  setTimeout을 λŒ€μ²΄ μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ 벀치마크 결과에도 λΆˆκ΅¬ν•˜κ³  μ œκ°€ μ‹€μ œλ‘œ window.postMessageκ°€ λ‹€λ₯Έ 두 방법보닀 더 λ‚˜μ€ μ„±λŠ₯을 보인 건 fake-indexeddb 자체의 λ²€μΉ˜λ§ˆν¬μ—μ„œ λΏμ΄μ—ˆμŠ΅λ‹ˆλ‹€. Safariμ—μ„œλŠ” MessageChannel에 λŒ€ν•΄ λ³„λ„μ˜ 좔가적인 μŠ€λ‘œν‹€λ§(throttling)이 μ μš©λ˜λŠ” 것 κ°™κ³ , μ΄λŠ” μ œκ°€ λ§Œλ“  독립 λ²€μΉ˜λ§ˆν¬μ—μ„œλŠ” ν¬μ°©λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 그리고 window.postMessageλŠ” μ—¬μ „νžˆ μ—λŸ¬ λ°œμƒ κ°€λŠ₯성이 λ†’μ•„ 보이기 λ•Œλ¬Έμ— κ°œμΈμ μœΌλ‘œλŠ” μ‚¬μš©μ„ 꺼리고 μžˆμŠ΅λ‹ˆλ‹€. κΆκΈˆν•œ 뢄듀을 μœ„ν•΄μ„œ 제 벀치마크λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.

 

πŸš€ ν•œκ΅­μ–΄λ‘œ 된 ν”„λŸ°νŠΈμ—”λ“œ 아티클을 λΉ λ₯΄κ²Œ 받아보고 μ‹Άλ‹€λ©΄ Korean FE Article을 κ΅¬λ…ν•΄μ£Όμ„Έμš”!
λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€