λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

React

React 18 변경점 정리

 

μ˜€λŠ˜μ€ React19 release version이 λ‚˜μ˜€κΈ° 전에 React 18의 큰 변경점에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄λ €κ³  ν•œλ‹€.

ν˜„μž¬ κΈ°μ€€ React κ°€μž₯ μ΅œμ‹  버전은 18.3.1 이닀.(2024λ…„ 4μ›” 26일) 

그리고 React18은 2022λ…„ 3μ›” 29일에 정식 릴리즈 λ˜μ—ˆλ‹€.

 

 

 

 

 

 

 

 

1. λ™μ‹œ λ Œλ”λ§(Concurrent Rendering)

 

λ™μ‹œ λ Œλ”λ§(Concurrent Rendering)은 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)λ₯Ό 더 μœ μ—°ν•˜κ³  효율적으둜 λ Œλ”λ§ν•  수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯으둜, 전톡적인 λ Œλ”λ§ λ°©μ‹μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬κ°€ 변경될 λ•Œ, λ³€κ²½ 사항이 ν•œ λ²ˆμ— λ Œλ”λ§λ˜λ©΄μ„œ 였랜 μ‹œκ°„μ΄ μ†Œμš”λ˜λ©° UIκ°€ λ©ˆμΆ”λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€λ‹€. λ™μ‹œ λ Œλ”λ§(Concurrent Rendering)은 μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Reactκ°€ ν•„μš”ν•œ μž‘μ—…μ„ μ€‘λ‹¨ν•˜κ±°λ‚˜ μš°μ„ μˆœμœ„λ₯Ό μ‘°μ •ν•˜λ©΄μ„œ λ Œλ”λ§ μž‘μ—…μ„ λ³‘λ ¬λ‘œ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°λŠ₯이닀.

 

- μž‘μ—… 쀑단 및 재개 κ°€λŠ₯: 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν•œ λ²ˆμ— λͺ¨λ‘ μ²˜λ¦¬ν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ 경우 μ§„ν–‰μ€‘μ΄λ˜ μž‘μ—…μ„ 쀑단 ν–ˆλ‹€κ°€ λ‚˜μ€‘μ— λ‹€μ‹œ μž¬κ°œν•  수 μžˆλ‹€.

 

- μš°μ„ μˆœμœ„ 기반 μž‘μ—… μŠ€μΌ€μ€„λ§: λ Œλ”λ§ μž‘μ—…μ˜ μš°μ„ μˆœμœ„λ₯Ό μ„€μ •ν•˜μ—¬ μ‚¬μš©μž μΈν„°λ ‰μ…˜μ΄ 더 μ€‘μš”ν•œ μƒν™©μ—μ„œλŠ” ν•΄λ‹Ή μž‘μ—…μ„ λ¨Όμ € μ²˜λ¦¬ν•˜κ³ , 그렇지 μ•Šμ€ μž‘μ—…μ€ λ‚˜μ€‘μ— μ‹€ν–‰ν•œλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλ‘œ ν•˜μ—¬κΈˆ 더 μΎŒμ ν•œ κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ‹€.

 

- Suspense 및 Lazy Loading과의 톡합: λ™μ‹œ λ Œλ”λ§(Concurrent Rendering)을 μ‚¬μš©ν•˜λ©΄ Suspense와 React.lazyλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈκ°€ λ‘œλ”© 쀑일 λ•Œ λΉ„λ™κΈ°μ μœΌλ‘œ UIλ₯Ό ν‘œμ‹œν•  수 μžˆλ‹€. 이 λ°©μ‹μœΌλ‘œ λŒ€κΈ°μ‹œκ°„μ„ 쀄이고 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯상 μ‹œν‚¬ 수 μžˆλ‹€.

 

- 점진적 ν•˜μ΄λ“œλ ˆμ΄μ…˜ (Progressive Hydration): μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§(SSR)κ³Ό κ²°ν•©ν•˜μ—¬ Reactκ°€ νŽ˜μ΄μ§€μ˜ μ€‘μš”ν•œ λΆ€λΆ„λΆ€ν„° μˆ˜ν™”λ₯Ό μ‹œμž‘ν•˜μ—¬ 초기 λ‘œλ”© μ‹œκ°„μ„ μ€„μ΄λŠ” λ°©μ‹μœΌλ‘œ, νŽ˜μ΄μ§€κ°€ λ‘œλ“œλ˜μ§€λ§ˆμž μƒν˜Έμž‘μš©μ΄ ν•„μš”ν•œ λΆ€λΆ„λΆ€ν„° μ²˜λ¦¬ν•˜κ³  λ‚˜λ¨Έμ§€ 뢀뢄은 λ‚˜μ€‘μ— μ²˜λ¦¬ν•˜μ—¬ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆλ‹€.

 

* κΈ°μ‘΄μ—λŠ” JavaScriptνŠΉμ„±μƒ λ™μ‹œ λ Œλ”λ§ 방식이 λΆˆκ°€λŠ₯ν–ˆλ‹€. JavaScript의 단일 μŠ€λ ˆλ“œ ꡬ쑰와 React의 초기 λ Œλ”λ§ 방식(동기적 λ Œλ”λ§ 방식)λ•Œλ¬Έμ΄μ—ˆλ‹€. React 16μ—μ„œ Fiber 아킀텍쳐가 λ„μž…λ˜λ©΄μ„œ 비동기적 λ Œλ”λ§ λ°©μ‹μœΌλ‘œμ˜ λ³€ν™”κ°€ κ°€λŠ₯ν•΄μ‘Œκ³ , 이λ₯Όν†΅ν•΄ λ™μ‹œ λͺ¨λ“œ(Concurrent Mode)λΌλŠ” μƒˆλ‘œμš΄ 방식이 λ„μž… 될 수 μžˆμ—ˆλ‹€. 

 

 

 

2. μžλ™ λ°°μΉ­(Automatic Batching)

 

μ—¬λŸ¬ μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό μžλ™μœΌλ‘œ ν•˜λ‚˜μ˜ 배치둜 λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•΄μ€€λ‹€. 이전 λ²„μ „μ—μ„œλŠ” 이벀트 ν•Έλ“€λŸ¬ λ‚΄μ—μ„œλ§Œ 배칭이 μ΄λ£¨μ–΄μ‘Œμ§€λ§Œ, μ΄μ œλŠ” 비동기 ν•¨μˆ˜λ‚˜ 타이머 λ“±μ—μ„œλ„ μžλ™μœΌλ‘œ 배칭이 μ μš©λœλ‹€.

 

import { useState } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState('');

  const handleClick = async () => {
    setCount(count + 1);
    setText('Updated');

    await new Promise(resolve => setTimeout(resolve, 1000));

    setCount(count + 2);
    setText('Updated again');
  };

  return (
    <div>
      <p>Count: {count}</p>
      <p>Text: {text}</p>
      <button onClick={handleClick}>Update</button>
    </div>
  );
}

 

μœ„ μ½”λ“œμ—μ„œ hadleClick을 μ‹€ν–‰ν•˜λ©΄, count와 text의 μƒνƒœ μ—…λ°μ΄νŠΈκ°€ 두 번 λ°œμƒν•˜μ§€λ§Œ React 18μ—μ„œλŠ” ν•œ 번의 λ Œλ”λ§λ§Œ λ°œμƒν•œλ‹€. 비동기 μž‘μ—… μ•ˆμ—μ„œλ„ μžλ™ 배칭이 적용되기 λ•Œλ¬Έμ΄λ‹€. 

 

 

 

 

3. μ „ν™˜(Transitions)

 

μ‚¬μš©μžμ˜ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒνƒœ λ³€ν™” 쀑에 κΈ΄κΈ‰ν•˜μ§€ μ•Šμ€ μž‘μ—…κ³Ό κΈ΄κΈ‰ν•œ μž‘μ—…μ„ ꡬ뢄해 μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯이닀. 이λ₯Ό 톡해 UI μ—…λ°μ΄νŠΈλ₯Ό 더 λΆ€λ“œλŸ½κ²Œ λ§Œλ“€κ³  μ‚¬μš©μžκ°€ λŠλΌλŠ” λ°˜μ‘μ„±μ„ κ°œμ„ ν•  수 μžˆλ‹€. κΈ΄κΈ‰ν•˜μ§€ μ•Šμ€ μž‘μ—…μ„ transition으둜 ν‘œμ‹œν•˜λ©΄ reactλŠ” ν•΄λ‹Ή μž‘μ—…μ„ λ°°κ²½μ—μ„œ μ²˜λ¦¬ν•˜κ³ , μ€‘μš”ν•œ μž‘μ—…μ„ μš°μ„ μˆœμœ„μ— 따라 λ¨Όμ € μ‹€ν–‰ν•œλ‹€.

 

μ „ν™˜(Transition)의 μ£Όμš” κ°œλ… 

- 즉각적인 μ—…λ°μ΄νŠΈ(Urgent Updates): λ²„νŠΌ 클릭, μž…λ ₯ ν•„λ“œ λ“± μ‚¬μš©μž μž…λ ₯에 μ¦‰κ°μ μœΌλ‘œ λ°˜μ‘ν•΄μ•Ό ν•˜λŠ” μ—…λ°μ΄νŠΈ. λ°˜μ‘μ΄ λΉ λ₯΄κ²Œ 이뀄져야 ν•˜λ―€λ‘œ 높은 μš°μ„ μˆœμœ„λ‘œ μ¦‰μ‹œ μ²˜λ¦¬λœλ‹€.

 

- μ „ν™˜ μ—…λ°μ΄νŠΈ(Transition Updates): νŽ˜μ΄μ§€ 이동, 리슀트 필터링 λ“±κ³Ό 같이 μ‹œκ°„ 지연이 ν—ˆμš©λ˜λŠ” μ—…λ°μ΄νŠΈ. μ „ν™˜ μ—…λ°μ΄νŠΈλŠ” μ‚¬μš©μž μž…λ ₯에 즉각적이지 μ•Šμ•„λ„ λ˜λ―€λ‘œ λ°°κ²½μ—μ„œ 처리될 수 μžˆλ‹€.

 

 

4.μ„œμŠ€νŽœμŠ€(Suspense)ν™•μž₯

 

데이터 νŽ˜μΉ­μ„ μœ„ν•œ μ„œμŠ€νŽœμŠ€κ°€ λ”μš± κ°•ν™”λ˜μ—ˆλ‹€. λΉ„λ™κΈ°μ μœΌλ‘œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” λ™μ•ˆ λ‘œλ”© μƒνƒœλ₯Ό μ‰½κ²Œ 관리할 수 있고, μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§κ³Όμ˜ ν˜Έν™˜μ„±λ„ κ°œμ„ λ˜μ—ˆλ‹€. 

 

 

5. 루트 API  (New Root API)

 

ReactDOM.createRoot APIκ°€ λ„μž…λ˜μ–΄ 기쑴의 ReactDOM.render λŒ€μ‹  이λ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ Œλ”λ§ν•  수 μžˆλ‹€. μƒˆλ‘œμš΄ 루트 APIλŠ” λ™μ‹œ λͺ¨λ“œμ™€ 같은 μƒˆλ‘œμš΄ κΈ°λŠ₯듀을 ν™œμš©ν•  수 있게 ν•΄μ€€λ‹€.

 

 

6. useId ν›… (useId hook)

 

κ³ μœ ν•œ IDλ₯Ό μƒμ„±ν•˜μ—¬ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 일관성을 μœ μ§€ν•  수 있게 ν•΄μ€€λ‹€. μ΄λŠ” 특히 μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§μ—μ„œ μœ μš©ν•˜λ©° μ ‘κ·Όμ„± ν–₯상에도 도움을 μ€€λ‹€.

 

import { useId } from 'react';

function MyComponent() {
  const id = useId();
  return <input id={id} />;
}

 

 

7. μƒˆλ‘œμš΄ ν›… μΆ”κ°€

 

- useSyncExternalStore: μ™ΈλΆ€ μ €μž₯μ†Œμ™€μ˜ 동기화λ₯Ό μœ„ν•œ ν›…μœΌλ‘œ, μƒνƒœκ΄€λ¦¬ λΌμ΄λΈŒλŸ¬λ¦¬μ™€μ˜ 톡합을 μš©μ΄ν•˜κ²Œ ν•΄μ€€λ‹€. (Redux, Mobx, zustand λ“±)

- useInsertionEffect: μŠ€νƒ€μΌ λΌμ΄λΈŒλŸ¬λ¦¬μ™€μ˜ 톡합을 μœ„ν•œ ν›…μœΌλ‘œ μŠ€νƒ€μΌ μ‚½μž… μ‹œμ μ„ μ œμ–΄ν•  수 μžˆλ‹€.

 

 

8. μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§ κ°œμ„ (SSR)

 

슀트리밍 SSR이 λ„μž…λ˜μ–΄ 초기 λ‘œλ”© 속도가 빨라쑌으며 μ„œμŠ€νŽœμŠ€λ₯Ό ν™œμš©ν•œ 데이터 페칭이 κ°€λŠ₯ν•΄μ Έ SSRκ³Ό CSR의 경계λ₯Ό λ”μš± μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. (λΉ λ₯Έ 초기 λ‘œλ”© 및 SEOμ΅œμ ν™”, μ‚¬μš©μž κ²½ν—˜ ν–₯상)

 

 

9. 선택적 ν•˜μ΄λ“œλ ˆμ΄μ…˜(Selective Hydration)

 

ν•„μš”ν•œ λΆ€λΆ„λ§Œ ν•˜μ΄λ“œλ ˆμ΄μ…˜ν•˜μ—¬ 초기 λ‘œλ”© μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλ„ 효율적인 λ Œλ”λ§μ΄ κ°€λŠ₯ν•΄μ‘Œλ‹€. (μ„±λŠ₯ μ΅œμ ν™” 및 λ¦¬μ†ŒμŠ€ μ ˆμ•½)

 

 

10. React μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ (React Server Components)

 

μ„œλ²„μ—μ„œλ§Œ μ‹€ν–‰λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•  수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯으둜, ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 양을 쀄이고 μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμ—ˆλ‹€. (λ²ˆλ“€ 크기 κ°μ†Œ 및 λ Œλ”λ§ μ„±λŠ₯ ν–₯상)

 

11. 개발자 도ꡬ 및 디버깅 μ„±λŠ₯ ν–₯상

 

React DevToolsκ°€ μ—…λ°μ΄νŠΈλ˜μ–΄ μƒˆλ‘œμš΄ λ™μ‹œ λͺ¨λ“œ κΈ°λŠ₯κ³Ό μ „ν™˜ μƒνƒœμ— λŒ€ν•œ 지원이 ν–₯μƒλ˜μ—ˆκ³ , 이λ₯Ό 톡해 κ°œλ°œμžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό λ”μš± μ‰½κ²Œ νŒŒμ•…ν•˜κ³  디버깅 ν•  수 μžˆλ‹€.

 

 

12. μ„±λŠ₯ μ΅œμ ν™” 및 버그 μˆ˜μ •

 

λ‹€μ–‘ν•œ λ‚΄λΆ€ μ΅œμ ν™”κ°€ 이루어져 μ „λ°˜μ μΈ μ„±λŠ₯이 ν–₯상 λ˜μ—ˆκ³  κΈ°μ‘΄ λ²„μ „μ—μ„œ 발견된 μ—¬λŸ¬ 버그듀이 μˆ˜μ •λ˜μ—ˆλ‹€.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

🌸 좜처 🌸

 

https://github.com/facebook/react/releases

 

https://react.dev/