πŸ”₯ React 18의 μƒˆλ‘œμš΄ κΈ°λŠ₯ πŸ”₯

J-USERΒ·2021λ…„ 6μ›” 21일
5
post-thumbnail

React 18

( μ’‹μ•„μš” ν•œλ²ˆ κΎΉ λˆŒλŸ¬μ£Όμ„Έμš” 😊 )

Automatic Batching ( μžλ™ 일괄 처리)

μ΄μ „μ˜ μ²˜λ¦¬κ³Όμ •

React의 일괄 μ²˜λ¦¬λŠ” μ—¬λŸ¬ μƒνƒœ μ—…λ°μ΄νŠΈκ°€ ν•˜λ‚˜μ˜ 단일 λ¦¬λ Œλ”λ§μœΌλ‘œ 처리λ₯Ό ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ ν•œ ν•¨μˆ˜ μ•ˆμ— 아무리 λ§Žμ€ μƒνƒœ μ—…λ°μ΄νŠΈ ( ex. setState...) λ₯Ό ν˜ΈμΆœν•΄λ„ λ¦¬λ Œλ”λ§μ€ 단 ν•œλ²ˆλ§Œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. (⚠️promise , callback() , timeout() μ œμ™Έ!)
μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ λ¦¬μ—‘νŠΈμ—μ„œ λΆˆν•„μš”ν•œ λ Œλ”λ§μ„ 쀄일 수 μžˆμ–΄μ„œ 큰 이점 μ΄μ—ˆλŠ”λ°μš”.

18 λ²„μ „μ˜ 처리 κ³Όμ •

이번 18 λ²„μ „μ—μ„œ λΆ€ν„°λŠ” React.createRootλ₯Ό μ‚¬μš©ν•˜λ©΄ 이전에 μ œμ™Έ λ˜μ—ˆλ˜ κΈ°λŠ₯듀도 일괄 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€!!!

πŸ™‹ : μ•„λ‹ˆ 근데 κ·Έκ±Έ μ™œ 같이 μ²˜λ¦¬ν•˜λ„λ‘ ν•œκ±΄κ°€μš”?? λ Œλ”λ§ μ‹œκ°„μ΄ μ¦κ°€ν•˜λŠ”κ±° μ•„λ‹Œκ°€μš”?!

πŸ€– : λ¬Όλ‘  μ˜λ„ν•˜μ§€ μ•Šκ³  νƒ€μž„μ•„μ›ƒμ΄λ‚˜ 비동기 ν•¨μˆ˜λ₯Ό κΈ°λ‹€λ¦¬λ©΄μ„œ 처리λ₯Ό ν•˜λ©΄ μ‹œκ°„μ΄ λŠ˜κ² μ§€λ§Œ, μ•„λž˜μ™€ 같이 진행이 λœλ‹€λ©΄ λ‘λ²ˆμ˜ λ¦¬λ Œλ”λ§μ„ ν•˜κ²Œ λ©λ‹ˆλ‹€.


fetch(...).then(() =>{
	setCount(count+1);
	setClicked(true);
}) 

κ·Έλž˜μ„œ 상황에 관계없이 일괄 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

πŸ™‹ : 그러면 μ €λŠ” μžλ™μœΌλ‘œ ν•˜κΈ° μ‹«κ³  λ”°λ‘œ μ²˜λ¦¬ν•˜κ³  μ‹ΆμœΌλ©΄ μ–΄λ–‘ν•˜λ‚˜μš”???

πŸ€– : ReactDOM.flushSync()λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹Ή. μ‚¬μš©ν•˜κ²Œ 되면 ν•΄λ‹Ή μƒνƒœ μ—…λ°μ΄νŠΈ ν˜ΈμΆœμ„ 배치 λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€!

import { flushSync } from 'react-dom'; // Note: react-dom, not react

function handleClick() {
  flushSync(() => {
    setCounter(c => c + 1);
  });
  // React has updated the DOM by now
  flushSync(() => {
    setFlag(f => !f);
  });
  // React has updated the DOM by now
 }

Transitions (μš°μ„ μˆœμœ„)

이번 μ—…λ°μ΄νŠΈμ—μ„œ κ°€μž₯ 큰 변화라고 λ§Žμ€ μ‚¬λžŒλ“€μ΄ 꼽은 κΈ°λŠ₯μž…λ‹ˆλ‹€ μ€‘μš”ν•˜λ‹ˆκΉŒ ⭐️⭐️⭐️!
νŠΈλžœμ§€μ…˜μ„ μ‚¬μš©ν•¨μœΌλ‘œμ„œ λ¦¬μ—‘νŠΈλŠ” " μ–΄λ–€ μ—…λ°μ΄νŠΈκ°€ κΈ΄κΈ‰ν•˜κ±°λ‚˜ 그렇지 μ•Šμ€μ§€ " λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€!

예λ₯Ό λ“€μ–΄ 리슀트 필터링 검색 μž…λ ₯의 경우λ₯Ό 예λ₯Ό 듀어보죠.!
λ§Œμ•½ 검색 μž…λ ₯을 μ—…λ°μ΄νŠΈ ν•˜λŠ” 경우 μž…λ ₯ ν•  λ•Œ 값이 λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ μž…λ ₯에 toκ°€ λλ‚˜λ©΄ ,

μ΄λ ‡κ²Œ λ‚˜μ™€μ•Όν•˜μ£ . κ·Έλž˜μ„œ μž…λ ₯창을 urgent updates 둜 ν‘œμ‹œν•  수 있으며, μ•„λž˜ ν•­λͺ©λ“€μ„ 보쑰둜 ν•„ν„°λ§ν•˜λŠ” μ „ν™˜ μ—…λ°μ΄νŠΈλ‘œ ꡬ뢄 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ‚˜μ˜¨ μš©μ–΄λ₯Ό μ •λ¦¬ν•˜μžλ©΄,

  1. Urgent updates: λ²„νŠΌ 클릭, ν‚€λ³΄λ“œ μž…λ ₯κ³Ό 같이 μ§κ΄€μ μœΌλ‘œ λ³΄μ•˜μ„ λ•Œ μ—…λ°μ΄νŠΈκ°€ μ¦‰κ°μ μœΌλ‘œ μΌμ–΄λ‚˜λŠ” 것을 κΈ°λŒ€ν•˜λŠ” μƒνƒœ 값듀을 λŒ€μƒμœΌλ‘œ ν•©λ‹ˆλ‹€.

  2. Transition updates: μ‚¬μš©μžκ°€ μƒνƒœ κ°’μ˜ 변화에 λ”°λ₯Έ λͺ¨λ“  μ—…λ°μ΄νŠΈκ°€ 뷰에 μ¦‰κ°μ μœΌλ‘œ μΌμ–΄λ‚˜λŠ” 것을 κΈ°λŒ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” 일반적으둜 μœ„μ˜ μ˜ˆμ‹œμ™€ 같은 검색창을 μ‚¬μš©ν• λ•Œ 일반적으둜 μ•„λž˜ μžλ™μ™„μ„± κΈ°λŠ₯이 ꡳ이 λ°”λ‘œλ°”λ‘œ μ¦‰κ°μ μœΌλ‘œ μ•ˆλ˜μ–΄λ„ μžμ—°μŠ€λŸ½κ²Œ '흠 그럴 수 μžˆμ§€' λΌλŠ” λŠλ‚ŒμœΌλ‘œ λ„˜μ–΄κ°€κ³€ ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ§Œμ•½ μž…λ ₯창에 λ‚΄κ°€ μΉ˜λŠ” 검색어가 느리게 μž…λ ₯이 되면....참을 수 μ—†μŠ΅λ‹ˆλ‹€ πŸ˜„

κ·Έλž˜μ„œ μ–΄λ–»κ²Œ μ“°λŠ”λ°!?

이번 18 λ²„μ „μ—μ„œλŠ” startTransition ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μš°μ„ μˆœμœ„λ₯Ό 정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€ !!!

import { startTransition } from 'react';

// Urgent: Show what was typed
setInputValue(input);

// Mark any state updates inside as transitions
startTransition(() => {
  // Transition: Show the results
  setSearchQuery(input);
});

startTransition()에 μŒ“μΈ 뢀뢄이 μš°μ„ μˆœμœ„κ°€ 높은 μƒνƒœκΈ° λ•Œλ¬Έμ— μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•˜κ²Œ λ˜λ©΄λ Œλ”λ§ μ—…λ°μ΄νŠΈκ°€ μ€‘λ‹¨λ˜κ³  ν‚€ μž…λ ₯이 λ‹€ λλ‚œ μ΄ν›„μ˜ μ—…λ°μ΄νŠΈλ§Œ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

πŸ™‹ : κ·Έλž˜μ„œ κ²°κ΅­ 무슨 이점이 μžˆλ‚˜μš”?

πŸ€– : μ‚¬μš©μžμ—κ²Œ 보여지지 μ•ŠλŠ” κ΄€λ ¨μ—†λŠ” 뢀뢄을 ꡳ이 λ Œλ”λ§ ν•˜λŠ”λ° μžˆμ–΄μ„œ μ‹œκ°„μ„ λ‚­λΉ„ν•  ν•„μš”κ°€ μ—†μ–΄μ§‘λ‹ˆλ‹€!

πŸ™‹ : 그러면 μ € κΈ°λŠ₯은 μ–΄λ–¨λ•Œ 자주 μ“°λ©΄ μ’‹μ•„μš”?

πŸ€– : μœ„μ™€ 같은 이점으둜 λ°±κ·ΈλΌμš΄λ“œλ‘œ μ΄λ™ν•˜λ €λŠ” μ—…λ°μ΄νŠΈμ— μœ μš©ν•©λ‹ˆλ‹€!

Suspense and SSR

λ“±μž₯ λ°°κ²½

React 웹앱을 SSR을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ‹€ν–‰ν•˜λŠ” 경우, μ²˜μŒμ—” 항상 곡백으둜 ν‘œμ‹œκ°€ λ˜λŠ” 것을 보신적 μžˆμœΌμ‹€ κ²λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λΈŒλΌμš°μ €κ°€ 이 웹앱을 μ—΄κΈ° μœ„ν•΄ JSλ₯Ό κ°€μ Έμ™€μ„œ μ½μ–΄ν•˜κΈ° λ•Œλ¬Έμ— κ°€μ Έμ˜€λŠ” κ·Έ 잠깐의 μ‹œκ°„μ— 곡백이 생기기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ SSR을 μ‚¬μš©ν•˜λ©΄ μœ„μ™€ 같은 μƒν˜Έμž‘μš© 없이 JSκ°€ λ‘œλ“œλ˜λŠ” λ™μ•ˆ 앱이 μ–΄λ–»κ²Œ λ³΄μ΄λŠ”μ§€ 직접볼 수 μžˆμŠ΅λ‹ˆλ‹€.

1 )SSR μž‘λ™ 방식은 λ¨Όμ € μ„œλ²„μ—μ„œ λͺ¨λ“  ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•œ λ‹€μŒ,
2 ) HTML 을 λΈŒλΌμš°μ €μ— λ°”λ‘œ return ν•΄μ€λ‹ˆλ‹€.
3 ) κ·Έ ν›„ JS κ°€ ν‰μ†Œμ™€ 같이 λ‘œλ“œκ°€ 되고 Hydrate에 μ˜ν•΄ HTML이 JSκ°€ 적용된 HTML둜 λ³€μ‹ ν•˜κ²Œ λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이 λ°©μ‹μ˜ 주된 λ¬Έμ œμ μ€ JSλ₯Ό λ‘œλ“œν•˜μ§€ μ•ŠλŠ” ν•œ νŽ˜μ΄μ§€μ˜ μƒν˜Έμž‘μš©μ΄ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” λ‹Ήμ—°ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

18 SSR

μœ„μ™€ 같은 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 이번 λ¦¬μ—‘νŠΈ 18μ—μ„œλŠ” SSR에 λŒ€ν•œ 두 가지 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€!

HTML Straming

이 κΈ°λŠ₯은 κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ μ„œλ²„κ°€ ꡬ성 μš”μ†Œμ˜ 일뢀λ₯Ό Suspenseλ₯Ό μ‚¬μš©ν•΄ 보낼 수 μžˆμŒμ„ 의미 ν•©λ‹ˆλ‹€.

이게 무슨 말이냐면, 이전 λ²„μ „μ—μ„œλŠ” νŽ˜μ΄μ§€ 전체가 λͺ¨λ‘ μ€€λΉ„λ˜κΈ° μ „κΉŒμ§€λŠ” μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ˜ λ‹€λ₯Έ 뢀뢄을 λ³Ό 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Suspense λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ 전체 νŽ˜μ΄μ§€λ₯Ό 각각 μž‘μ€ 청크둜 λ‚˜λˆ„μ–΄ λ Œλ”λ§μ„ ν•  수 있게 도와주고 초기 λ Œλ”λ§ 속도에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‰΄μŠ€ 기사λ₯Ό λ‘œλ“œν•  경우, μ΄μ „μ—λŠ” μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” λŒ“κΈ€μ„ λ‘œλ“œν•˜κΈ° μ „κΉŒμ§€ κΈ°λ‹€λ €μ•Όν–ˆλŠ”λ°, μ΄μ œλŠ” μ„œμŠ€νŽœμŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 기사λ₯Ό μ—…λ‘œλ“œν•˜κ³  λŒ“κΈ€μ΄ μ€€λΉ„λ˜κΈ° 전에 HTML λΉ„νŠΈλ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

<Navbar/>
<Article/>
<Suspense fallback ={<Loader />}>
	<Comments />
</Suspense>

Selective Hydration

μœ„μ˜ κΈ°λŠ₯을 톡해 μš©λŸ‰μ΄ 큰 μ»΄ν¬λ„ŒνŠΈ λžœλ”λ§μ„ μœ„ν•΄ νŽ˜μ΄μ§€ 전체λ₯Ό 기닀릴 ν•„μš”κ°€ μ—†μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€!! πŸ˜„ κ·ΈλŸ¬λ‚˜ λ§Œμ•½ κ·Ήλ‹¨μ μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈμ˜ μš©λŸ‰μ΄ 크고 λ³΅μž‘ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? κΈ°λ‹€λ¦¬λΌλŠ” μŠ€ν”Όλ‹λ§Œ 계속 보고 μžˆμ„κΉŒμš”..?

그것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨ 것이 Selective Hydration μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ³΅μž‘ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό <Suspense>둜 κ°μ‹Έμ„œ 폴백 값이 λ Œλ”λ§ 되고 μžˆμ–΄λ„ λ³„κ°œλ‘œ 이미 λ‘œλ“œλœ μ»΄ν¬λ„ŒνŠΈλ“€ λ¨Όμ € μ„ νƒμ μœΌλ‘œ hydration을 μ‹œμž‘ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€ 😊

πŸ™‹ : 무슨 λ§μ΄μ—μš”,,, γ… γ… γ… γ… γ… γ… γ… γ… 

πŸ€– : 밭에 물을 μ£Όλ €κ³  ν•˜λŠ”λ° μ›λž˜λŠ” ν•œκΊΌλ²ˆμ— 물을 μ€¬μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ§€κΈˆ μΉœκ΅¬κ°€ 술먹고 λ°­ ν•œμͺ½ 라인에 λˆ„μ›Œμžˆλ„€μš”? λ¬Ό μ£ΌκΈ° λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ μΉœκ΅¬κ°€ λ¬Όμ–΄ μ –κ² μ£ ?? κ·Έλž˜μ„œ μΉœκ΅¬κ°€ μΌμ–΄λ‚˜μ„œ λ°­μ—μ„œ κΊΌμ§€κΈ°κΉŒμ§€ λΆ„λ¬΄κΈ°λ‘œ λ‹€λ₯Έ μ€€λΉ„λœ λ°­λ“€ λ¨Όμ € 물을 주도둝 ν•©λ‹ˆλ‹Ή γ…Žγ…Ž

μ›Ή νŽ˜μ΄μ§€λ₯Ό μ˜ˆμ‹œλ‘œ λ“€λ©΄, λ¨Όμ € λžœλ”λ§λœ λ„€λΉ„κ²Œμ΄μ…˜, μ‚¬μ΄λ“œ λ°”μ˜ κΈ°λŠ₯을 JS κ°€ 적용된 HTMLκΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€!

λ˜ν•œ μ‚¬μš©μžμ˜ 섀정에 따라 μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¨Όμ € hydration μ‹œν‚¬μ§€ μš°μ„ μˆœμœ„ λ₯Ό μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

profile
ν˜ΈκΈ°μ‹¬λ§Žμ€ 개발자

0개의 λŒ“κΈ€