μ‹±κΈ€μŠ€λ ˆλ“œμ™€ μ΄λ²€νŠΈλ£¨ν”„

8/12/2022

μž‘μ„±μž : 홍원배

” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λŸ°νƒ€μž„ν™˜κ²½μ€ μ‹±κΈ€ μ“°λ ˆλ“œ 기반이며 λ…Ό λΈ”λ‘œν‚Ή λ°©μ‹μ˜ 비동기적인 λ™μ‹œμ„± 언어이며 콜 μŠ€νƒ, 이벀트 루프와 콜백 큐 그리고 μ—¬λŸ¬κ°€μ§€ λ‹€λ₯Έ API듀을 κ°€μ§€κ³  μžˆλ‹€. β€œ
μ‹±κΈ€μŠ€λ ˆλ“œμ΄κΈ° λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•˜λ‚˜μ˜ μ½œμŠ€νƒμ„ κ°€μ§€κ³  μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. 그렇기에 μ½œμŠ€νƒμ— 연산이 였래 걸리면 UIκ°€ 멈좜 μš°λ €κ°€ μžˆλ‹€.
  • μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ μŠ€νƒμ„ κ°€μ§„λ‹€ (μ½”λ“œ, 데이타, νž™μ€ 곡유)
  • ?? μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ‹€ν–‰λ§₯락이 없을 λ•Œ (μ •ν™•ν•˜κ²ŒλŠ” μ½œμŠ€νƒκ³Ό 마이크둜 νƒœμŠ€ν¬ 큐가 λΉ„μ–΄μ Έ μžˆμ„λ•Œ) λ Œλ”λ§ 엔진이 μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μœΌλ‘œλΆ€ν„° μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ•„(λ Œλ”λ§ μ‹œν€€μŠ€λΌ ν‘œν˜„λ˜κΈ°λ„ ν•œλ‹€) 화면에 κ·Έλ €μ€€λ‹€. λ Œλ”λ§ 엔진은 μ½œμŠ€νƒμ΄ λΉ„μ–΄μ§€λŠ” 잠깐 잠깐 μ œμ–΄κΆŒμ„ λ°›μ•„ 화면을 κ·Έλ¦¬λŠ” 것이닀. 그렇기에 μŠ€νƒμ— μž‘μ—…μ΄ λ§Žμ•„ 블둝킹 되면 UIκ°€ 렉을 먹을 μˆ˜λ„ μžˆλŠ” 것이닀
Β 
λ Œλ”λ§ μ‹œν€€μŠ€μ˜ 쑴재
λ Œλ”λ§ μ‹œν€€μŠ€μ˜ 쑴재
Β 

νƒœμŠ€ν¬ 큐

마이크둜 νƒœμŠ€ν¬ 큐에 observerAPI도 μΆ”κ°€λ‘œ κΈ°μ–΅ν•΄λ‘μž
마이크둜 νƒœμŠ€ν¬ 큐에 observerAPI도 μΆ”κ°€λ‘œ κΈ°μ–΅ν•΄λ‘μž
μž‘μ—… νλŠ” 마이크둜 νƒœμŠ€ν¬ν, μ• λ‹ˆλ©”μ΄μ…˜ ν…ŒμŠ€ν¬ 큐, 맀크둜 νƒœμŠ€ν¬ν λ“±μœΌλ‘œ λ‚˜λ‰˜λ©°,
  • 마이크둜 νƒœμŠ€ν¬ νλŠ” 콜 μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ” 경우 μ΅œμš°μ„ μœΌλ‘œ μž‘μ—…λ˜μ–΄ μΌκ΄„μ μœΌλ‘œ ν•˜λ‚˜μ”© μ½œμŠ€νƒμ— μŒ“μ΄λ©° 큐가 λΉ„μ–΄μ§ˆλ•ŒκΉŒμ§€ μ‹€ν–‰λœλ‹€. (μƒˆλ‘œ μΆ”κ°€λ˜λŠ” κ²ƒκΉŒμ§€ λ‹€.. μ΅œμš°μ„ !)
  • μ• λ‹ˆλ©”μ΄μ…˜ νƒœμŠ€ν¬ νλŠ” 마이크둜 νƒœμŠ€ν¬ 큐 λ‹€μŒμœΌλ‘œ 이벀트 λ£¨ν”„μ—κ²Œ μ‹€ν–‰λ˜λ©° 후에 λ Œλ”λ§ μ—”μ§„κ³Ό ν•¨κ»˜ λ™μž‘ν•˜λ©° (λ Œλ”νŠΈλ¦¬-λ¦¬ν”Œλ‘œμš°-리페인트) 화면을 κ·Έλ €μ€€λ‹€
  • 맀크둜 νƒœμŠ€ν¬ νλŠ” 콜 μŠ€νƒμ΄ λΉ„μ–΄μ Έ μžˆλŠ” 경우 ν•œλ²ˆμ— ν•˜λ‚˜λ§Œ μ½œμŠ€νƒμ— 담겨 μ‹€ν–‰λ˜κ³  λ‹€μŒ λ£¨ν”„λ‘œ μ „ν™˜λœλ‹€
이벀트 λ£¨ν”„λŠ” Microtask Queueλ‚˜ Animation Framesλ₯Ό λ°©λ¬Έν•  λ•ŒλŠ”, 큐 μ•ˆμ— μžˆλŠ” λͺ¨λ“  μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•˜μ§€λ§Œ, Task Queueλ₯Ό λ°©λ¬Έν•  λ•ŒλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ call stack으둜 μ „λ‹¬ν•˜κ³  λ‹€λ₯Έ Queueλ₯Ό μˆœνšŒν•œλ‹€.
Β 

그럼 μ–΄λ–»κ²Œ λ©€ν‹°μŠ€λ ˆλ“œλ‘œ μž‘λ™ν•  수 μžˆλŠ”κ°€?

  1. WebAPIλ₯Ό 톡해 λΈŒλΌμš°μ €μ—κ²Œ 비동기적 μž‘μ—…μ„ μœ„(일)μž„
// setTimeout의 경우 setTimeout(() => console.log('μ•ˆλ…•ν•˜μ„Έμš” μ›λ°°λ‹˜', 1000); 1. μ½œμŠ€νƒμ— setTimeout이 μŒ“μΈλ‹€ 2. μ‹€ν–‰λ˜λ©΄μ„œ idλ₯Ό μ½œλ°±ν•¨μˆ˜λ‘œ 등둝해 놓고 WebAPIλ₯Ό 톡해 λΈŒλΌμš°μ €μ—κ²Œ μΌμž„ 3. 1000msκ°€ μ§€λ‚˜λ©΄ 맀크둜 νƒœμŠ€ν¬ 큐에 μŒ“μ΄κ³  μ½œμŠ€νƒμ΄ λΉ„μ–΄μ Έμžˆμ„ λ•Œ λ‹€μ‹œ μ‹€ν–‰λœλ‹€
WebAPIλ₯Ό 톡해 λ©€ν‹°μŠ€λ ˆλ“œμ²˜λŸΌ λ™μž‘ν•˜λŠ” 예제
… κ·Έλž˜μ„œ fetch() ν•¨μˆ˜ μžμ²΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„κ³Ό λ³„κ°œλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ–΄μ©Œλ©΄ multi Thread ν˜•μ‹μ²˜λŸΌ 보일 수 μžˆλ‹€.κ·ΈλŸ¬λ‚˜ Javascript μžμ²΄κ°€ Single Thread둜 λ™μž‘ν•˜λ‹€ λ³΄λ‹ˆ, μ„œλ²„μ— μš”μ²­ν•˜κ³  응닡을 λ°›λŠ”μ§€μ— λŒ€ν•œ Tracking을 μ—¬μ „νžˆ μ§„ν–‰ν•˜κ²Œ λœλ‹€. μ΄λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ λ¦¬μ†ŒμŠ€λ₯Ό λΆ„λͺ…νžˆ μ“°κ³  있으며 μ„±λŠ₯에 영ν–₯을 끼치고 μžˆμŒμ€ ν™•μ‹€ν•˜λ‹€. Javascriptκ°€ ν›Œλ₯­ν•œ Event LoopλΌλŠ” μš”μ†Œλ‘œ 비동기 둜직 처리λ₯Ό 잘 μ œμ–΄ν•˜κ³  μžˆμ§€λ§Œ,Β μ—¬μ „νžˆΒ μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ ν•œκ³„λ₯Ό κ°€μ§€κ³  μžˆμ„ μˆ˜λ°–μ— μ—†λŠ” μš”μ†Œμ΄λ‹€.
β‡’ 비동기 처리λ₯Ό μœ„ν•œ 기본ꡬ성이며 λ©€ν‹°μŠ€λ ˆλ“œ 인척 ν•˜λŠ” 것이닀
Β 
  1. WebWorkerλ₯Ό ν†΅ν•΄μ„œ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ›ν• ν•˜κ²Œ 비동기 μž‘μ—…μ„ μˆ˜ν–‰
      • WebWorkerλ₯Ό μ‚¬μš©ν•΄μ„œ 비동기 ν•¨μˆ˜μ— worker μ“°λ ˆλ“œλ₯Ό ν•˜λ‚˜μ”© 직접 ν• λ‹Ήν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€
      • 비동기 μž‘μ—…μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μΈ 경우 WebWorker을 μ‚¬μš©ν•΄μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€
      • ServiceWorkerλŠ” λΈŒλΌμš°μ €μ°½μ΄ 꺼져도 μ‹€ν–‰λ˜λ©°, cors와 httpsμ—μ„œλ§Œ μž‘λ™κ°€λŠ₯ν•œ μ œμ•½μ‘°κ±΄λ“€μ΄ μžˆλ‹€
Β 

λΉ„λ™κΈ°μ˜ 처리 방법

  1. μ½œλ°±ν•¨μˆ˜
  1. Promise 객체λ₯Ό 이용 + then
    1. Promiseκ°μ²΄λŠ” μ•½μ†λœ 결과값이닀. 결과의 μƒνƒœκ°€ fulfilled둜 μ΄ν–‰λ˜μ–΄μ Έμ„ λ•Œ then을 톡해 promiseκ°€ μ „λ‹¬λ˜κ³  μ½œλ°±ν•¨μˆ˜μ²˜λŸΌ κ²°κ³Όλ₯Ό ν•Έλ“€λ§ν•΄λ‚˜κ°ˆ 수 μžˆλ‹€
  1. 비동기 ν•¨μˆ˜ (asyncν•¨μˆ˜)
      • ES6(ES2015)μ—μ„œ 처음 λ‚˜μ˜¨ κ°œλ…
      • 비동기적인 μž‘λ™μ„ ν•˜λŠ” fetch λ“±κ³Ό ν•¨κ»˜ 비동기식 μ½”λ“œλ₯Ό λ™κΈ°μ‹μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€
      • promise객체λ₯Ό μ΄μš©ν•œλ‹€
비동기 ν•¨μˆ˜(asyncν•¨μˆ˜)λŠ” λΉ„λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜ (ex setTimeout)와 λ‹€λ₯Έ κ°œλ…μ΄μ§€λ§Œ λ¬Άμ—¬μ„œ 비동기 ν•¨μˆ˜λΌ λΆˆλŸ¬μ§€κΈ°λ„ ν•œλ‹€
Β 

μ½œμŠ€νƒμ— μž¬κ·€ν•¨μˆ˜κ°€ λ¬΄ν•œμ • μŒ“μ΄κ²Œ 되면

Maximum call stack size exceeded 였λ₯˜ λ°œμƒ
Β 

μŠ€ν¬λ‘€μ„ ν•˜κ²Œ 되면 μ–΄λ–€ 일이?

μ½œμŠ€νƒμ— μ—„μ²­ μŒ“μ΄κ²Œ 되고 μ„±λŠ₯에 영ν–₯을 μ£Όκ² μ§€, μ“°λ‘œν‹€λ§μ΄ ν•„μš”ν•˜λ‹€.
Β 

이벀트 λ£¨ν”„λž€?

μ½œμŠ€νƒμ΄ λΉ„μ–΄μ Έμžˆμ„ λ•Œ νƒœμŠ€ν¬ 큐에 μžˆλŠ” μ½œλ°±ν•¨μˆ˜λ“€μ„ λΆˆλŸ¬μ™€μ„œ μ½œμŠ€νƒμ— λ„£μ–΄μ£ΌλŠ” λΈŒλΌμš°μ €μ˜ λ™μž‘μž₯치 (JSμ—”μ§„ κΈ°λŠ₯이 μ•„λ‹ˆλΌ λŸ°νƒ€μž„ν™˜κ²½ κΈ°λŠ₯)
Β 

좜처

Β 
μ“°λ ˆλ“œλž€?
λ§€ν¬λ‘œνƒœμŠ€ν¬ν λ§ˆμ΄ν¬λ‘œνƒœμŠ€ν¬ν?
λΈŒλΌμš°μ € λŸ°νƒ€μž„?
μ›Ήμ›Œμ»€μ— λŒ€ν•œ 제둜초의 관점
Β 
ZeroCho : 저도 μ—„μ²­λ‚˜κ²Œ 많이 κ²€μƒ‰ν–ˆλŠ”λ°λ„ ν—·κ°ˆλ¦¬λ”λΌκ³ μš”. κ²°κ΅­ 운영체제 λŒ€μΆ© κ³΅λΆ€ν•œ 후에 κΉ¨λ‹«κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 비동기더라도 μ‹±κΈ€ μ“°λ ˆλ“œμ—μ„œλŠ” μ‹±κΈ€ μ“°λ ˆλ“œκ°€ κ²°κ΅­ λͺ¨λ“  것을 μ²˜λ¦¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ•„λ¬΄λŸ° μ‹œκ°„ 이득이 μ—†λ‹€λŠ” κ²ƒμ„μš”. λ‹€λ§Œ λ„€νŠΈμ›Œν¬λ‚˜ νŒŒμΌμ‹œμŠ€ν…œ μ ‘κ·Όλ§Œ κ·Έ μ‹œκ°„λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ„ ν•  수 μžˆμ–΄μ„œ μ‹œκ°„ 이득이 μžˆμŠ΅λ‹ˆλ‹€.
읡λͺ… : λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€! 그럼 ν•˜λ‚˜ 더 κΆκΈˆν•œκ²Œ μžˆμŠ΅λ‹ˆλ‹€. 비동기라 함은 λ‹¨μˆœνžˆ μž‘μ—…μ˜ μš°μ„ μˆœμœ„λ₯Ό λ’€λ‘œ λ―Έλ£¨λŠ” κ²ƒμΈκ°€μš”? μ‹±κΈ€μ“°λ ˆλ“œκ°€ 메인 둜직 μž‘μ—…μ„ ν•˜λŠ” λ™μ•ˆ 비동기 μž‘μ—…μ€ λˆ„κ°€ μ–Έμ œ μ–΄λ””μ„œ ν•˜κ³  μžˆλŠ” κ±΄κ°€μš”? νƒœμŠ€ν¬ νμ—λŠ” μ½œλ°±ν•¨μˆ˜λ§Œ λ„£μ–΄μ§„λ‹€κ³  μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. 그럼 비동기 ν•¨μˆ˜ μžμ²΄λ‚΄μ—μ„œ μ½œλ°±μ„ νƒœμŠ€ν¬ 큐에 λ„£κΈ° 전에 λ‹€λ₯Έ λ‘œμ§μ„ μˆ˜ν–‰μ€‘μ΄λΌλ©΄ 이 λ‘œμ§μ„ λˆ„κ°€ μ‹€ν–‰ν•˜λŠ”μ§€κ°€ κΆκΈˆν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €λ‚˜ node μ—”μ§„ μžμ²΄μ—μ„œ λ‹€λ₯Έ μ“°λ ˆλ“œκ°€ ν™œμš©λ˜κ³  μžˆλŠ” 거라면 사싀상 λΉ„λ™κΈ°λ‚˜ μ›Ήμ›Œμ»€λ‚˜ 큰 μ‹œκ°„μ°¨κ°€ μ—†μ§€ μ•Šμ„κΉŒμš” ?
ZeroCho : λ„€ μž‘μ—…μ˜ μš°μ„  μˆœμœ„λ₯Ό λ’€λ‘œ λ―Έλ£¨λŠ” κ²λ‹ˆλ‹€. λ³‘λ ¬λ‘œ μ‹€ν–‰λ˜λŠ” 게 μ•„λ‹ˆλΌμš”. 둜직(μ‚¬λžŒμ΄ 직접 μž‘μ„±ν•œ μ½”λ“œ)(async await, observerAPI, process.nextTick())은 λͺ¨λ‘ λ©”μΈμ“°λ ˆλ“œμ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ μš”μ²­μ΄λ‚˜ νŒŒμΌμ‹œμŠ€ν…œ μ •λ„λ§Œ μš΄μ˜μ²΄μ œμ—μ„œ λ©€ν‹°μ“°λ ˆλ“œλ‘œ μ²˜λ¦¬ν•΄μ£Όκ³ μš”. λ”°λΌμ„œ κ·Έ μ΄μ™Έμ˜ 메인 μ“°λ ˆλ“œ 둜직(μœ„μ—μ„œ sleep ν•¨μˆ˜κ°™μ€)이 였래 걸리면 비동기라 ν•˜λ”λΌλ„ μ‹œκ°„μ΄ 였래 μ†Œμš”λ©λ‹ˆλ‹€. μ›Ήμ›Œμ»€λŠ” μ•„μ˜ˆ λ‹€λ₯Έ μ“°λ ˆλ“œλ₯Ό 생성해 λ‘œμ§μ„ κ±°κΈ°μ„œ μ²˜λ¦¬ν•˜λŠ”κ±°λΌμ„œ 속도에 이득을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
싱글코어인 경우 μ›Œμ»€λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ 이득을 λͺ» λ³΄λŠ” 것도 λ§ˆμ°¬κ°€μ§€λ‘œ μ„€λͺ…κ°€λŠ₯ν•©λ‹ˆλ‹€. λ©€ν‹°μ“°λ ˆλ“œλ₯Ό λŒλ €λ„ μ½”μ–΄κ°€ ν•˜λ‚˜λΌμ„œ μ½”μ–΄μ—μ„œ μ“°λ ˆλ“œ μ „ν™˜ μž‘μ—…μ„ ν•΄μ„œ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μ“°λ ˆλ“œλ§Œ μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
    νƒœκ·Έ :