← λͺ©λ‘μœΌλ‘œ
React Fiber Architecture

React Element and Fiber Node

λ¦¬μ•‘νŠΈμ˜ λ Œλ”λ§ 과정은 λ¦¬μ•‘νŠΈ μ—˜λ¦¬λ¨ΌνŠΈμ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€.
λ¦¬μ•‘νŠΈ μ—˜λ¦¬λ¨ΌνŠΈλŠ” μž„μ‹œμ μ΄κ³  μƒνƒœκ°€ μ—†μŠ΅λ‹ˆλ‹€. 반면 νŒŒμ΄λ²„ λ…Έλ“œλŠ” μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  수λͺ…이 κΉλ‹ˆλ‹€.

createFiberFromTypeAndProps ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ λ¦¬μ•‘νŠΈ μ—˜λ¦¬λ¨ΌνŠΈλ‘œλΆ€ν„° νŒŒμ΄λ²„ λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ μƒμ„±λœ νŒŒμ΄λ²„ λ…Έλ“œλŠ” μ‹€μ œ μž‘μ—… λ‹¨μœ„λ‘œ, λ¦¬μ•‘νŠΈμ˜ λ‚΄λΆ€ μΈμŠ€ν„΄μŠ€μ™€ μ—°κ²°λ©λ‹ˆλ‹€.

Render Phase

λ¦¬μ•‘νŠΈλŠ” work loopλ₯Ό 톡해 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
이 κ³Όμ •μ—μ„œ beginWorkλŠ” νŒŒμ΄λ²„ 트리λ₯Ό μˆœνšŒν•˜λ©΄μ„œ μ—…λ°μ΄νŠΈκ°€ ν•„μš”ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ°Ύκ³  더티 체크λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

트리 끝에 λ„λ‹¬ν•˜λ©΄ completeWork ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄μ„œ λ°˜λŒ€λ‘œ μˆœνšŒν•˜λ©΄μ„œ μƒˆ 가상 DOM을 μƒμ„±ν•©λ‹ˆλ‹€.
이 λ•Œμ—λŠ” μ‹€μ œ DOM을 μ‘°μž‘ν•˜λŠ” κ²ƒμ²˜λŸΌ DOM μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό μΆ”κ°€ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μ˜€ν”„μŠ€ν¬λ¦° λ Œλ”λ§ ν”„λ‘œμ„ΈμŠ€ κΈ°μˆ μ„ μ΄μš©ν•΄ ν˜„μž¬ 화면에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  화면을 μ—…λ°μ΄νŠΈν•˜λŠ” 것을 λ Œλ”λ§ 과정이라 ν•©λ‹ˆλ‹€.
λ Œλ”λ§ 과정은 비동기적이며 쀑단/μ·¨μ†Œλ  수 μžˆμŠ΅λ‹ˆλ‹€.

Commit Phase

λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ—…λ°μ΄νŠΈλœ 가상 DOM을 μ‹€μ œ 화면에 λ°˜μ˜ν•˜λŠ” 과정을 컀밋 과정이라고 ν•©λ‹ˆλ‹€. 컀밋 과정은 동기적이라 μ·¨μ†Œκ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

컀밋 과정은 두 λ‹¨κ³„λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

  • λ³€ν˜• 단계(Mutation): μ‹€μ œ DOM을 μ‘°μž‘ν•˜λŠ” ν–‰μœ„λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. DOM을 μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œ λ˜λŠ” μœ„μΉ˜ μ‘°μ • λ“±μ˜ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • λ ˆμ΄μ•„μ›ƒ 단계(Layout): DOM λ³€κ²½ ν›„ λ ˆμ΄μ•„μ›ƒ 계산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

React Scheduler and Concurrent Mode

"λ°±κ·ΈλΌμš΄λ“œ"λΌλŠ” 말은 μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—λŠ” λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€μŠ€λ ˆλ“œμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ¦¬μ•‘νŠΈ μŠ€μΌ€μ€„λŸ¬λŠ” Time Slicing 기법을 μ‚¬μš©ν•΄ μ•½ 5λ°€λ¦¬μ΄ˆλ§ˆλ‹€ 메인 μŠ€λ ˆλ“œμ—κ²Œ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όμ–΄ 화면이 λ©ˆμΆ”μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

λ Œλ”λ§ κ³Όμ • 쀑에 μœ μ €μ˜ 클릭 μ΄λ²€νŠΈμ™€ 같은 μš°μ„ μˆœμœ„κ°€ 높은 μž‘μ—…μ΄ λ°œμƒν•˜λ©΄ ν˜„μž¬ λ Œλ”λ§μ΄ 폐기되고 μš°μ„ μˆœμœ„κ°€ 높은 μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.

Effect 처리

컀밋 κ³Όμ •μ—μ„œ effect와 passive effectκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • Effect: λΈŒλΌμš°μ €μ˜ νŽ˜μΈνŒ… 이전 μ‹œμ μ— μ‹€ν–‰λ˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€. useLayoutEffectκ°€ 여기에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  • Passive Effect: λΈŒλΌμš°μ € νŽ˜μΈνŒ…μ΄ μΌμ–΄λ‚œ 후에 μ‹€ν–‰λ˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€. useEffectκ°€ 여기에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  • useLayoutEffect: DOM μΈ‘μ •κ³Ό 같이 ν™”λ©΄ 그리기 전에 ν•„μš”ν•œ μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.
  • useEffect: λ„€νŠΈμ›Œν¬ μš”μ²­κ³Ό 같이 ν™”λ©΄ μ—…λ°μ΄νŠΈλ₯Ό μ§€μ—°μ‹œν‚€μ§€ μ•Šμ•„λ„ λ˜λŠ” μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.

μ΅œμ ν™”λž€ μ–΄λ””κΉŒμ§€ μ˜λ―Έκ°€ μžˆλ‚˜

λ¦¬μ•‘νŠΈμ˜ λ Œλ”λ§μ΄λž€ μ‹€μ œ 화면에 λ°˜μ˜λ˜λŠ” 과정이 μ•„λ‹ˆλ©° λ¦¬μ•‘νŠΈ λ‚΄λΆ€μ—μ„œ μ˜€ν”„μŠ€ν¬λ¦° λ Œλ”λ§μœΌλ‘œ λ™μž‘ν•˜λ©° μ–Έμ œλ“ μ§€ 쀑단 될 수 μžˆμŠ΅λ‹ˆλ‹€.

그렇기에 λ¦¬λ Œλ”λ§ λ˜λŠ”κ²ƒμ΄ λ°˜λ“œμ‹œ ν™”λ©΄ μ„±λŠ₯에 영ν–₯을 μ£ΌλŠ” 것이 μ•„λ‹ˆλ©°

일차적으둜 beginWork κ³Όμ •μ—μ„œ μ‹€μ œ 변경이 ν•„μš”ν•œ μ—˜λ¦¬λ¨ΌνŠΈκ°€ 더티 체크되고
completeWork κ³Όμ •μ—μ„œ 변경사항이 μ—…λ°μ΄νŠΈ λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ˜€ν”„μŠ€ν¬λ¦° λ Œλ”λ§ λ°©μ‹μœΌλ‘œ μ‹€μ œ DOM에 영ν–₯을 μ£Όμ§€ μ•Šλ”λΌλ„ μ—˜λ¦¬λ¨ΌνŠΈκ°€ λ§Žμ•„μ§€κ³  λ§Žμ€ λ¦¬λ Œλ”λ§μ΄ λ°œμƒν•˜λ©΄ λΆˆν•„μš”ν•œ 더티체크 연산이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

그렇기에 λ³΅μž‘ν•˜κ³  λ§Žμ€ DOM μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό κ°€μ§„ ν™”λ©΄μ—μ„œ λ Œλ”λ§ κ³Όμ •μ˜ μ΅œμ ν™”λŠ” ν•„μš”ν•©λ‹ˆλ‹€.
특히 λͺ¨λ°”일 ν™˜κ²½μ—μ„œλŠ” λΆˆν•„μš”ν•œ 연산이 λΉ λ₯Έ 배터리 μ†Œλͺ¨λ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.