๐งฉ ๋์์ฑ(Concurrency)
**๋์์ฑ(Concurrency)**์ด๋ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋จ์ผ CPU ํ๊ฒฝ์์ **๋น ๋ฅธ ์ ํ(Context Switching)**์ ํตํด ์ฌ๋ฌ ์์ ์ด ๋์์ ์งํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๊ธฐ๋ฒ์ผ๋ก, CPU๊ฐ ํ์๊ฐ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ์ง๋ง, ๋น ๋ฅธ ์ ํ ์๋๋ก ๋ง์น ์ฌ๋ฌ ์์ ์ด ๊ฒน์ณ ์คํ๋๋ ๋ฏํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
์ฆ ๋์์ฑ์ ์ค์ ๋ก ์ฌ๋ฌ ์์ ์ด ๋์์ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, **์์ ์ โ์งํ ์์๋ฅผ ์กฐ์จโ**ํจ์ผ๋ก์จ ๋์์ ์ฒ๋ฆฌ๋๋ ๋ฏํ ํจ๊ณผ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋์์ฑ์ โ์ผ์ ํ ์๊ฐ ๋จ์ ๋ด์์ ์ฌ๋ฌ ์ผ์ ์กฐ์จํ๋ ๋ฅ๋ ฅ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๐ ๋ณ๋ ฌ์ฑ(Parallelism)๊ณผ์ ์ฐจ์ด์ ?
๋ณ๋ ฌ์ฑ์ ์ฌ๋ฌ ์์ ์ ์ค์ ๋ก ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฌ๋ฌ CPU ๋๋ ์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ (๋ฌผ๋ฆฌ์ ์ผ๋ก) ์ฌ๋ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ค. ๊ฐ๊ฐ์ ์์ ์ ๋ณ๋์ ํ๋ก์ธ์ค๋ ์ค๋ ๋์์ ์คํ๋๋ฉฐ, ์ด๋ฌํ ์์ ๋ค์ ๊ฐ๊ฐ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์๋ก ์ํฅ์ ์ฃผ์ง ์๋๋ค.
| ๊ตฌ๋ถ | ์ค๋ช | ์์ |
|---|---|---|
| ๋์์ฑ(Concurrency) | ์ฌ๋ฌ ์์ ์ ๋์์ ๊ฒน์ณ์ ์ฒ๋ฆฌํ๋, ์ค์ CPU๋ ํ๋์ฉ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ฒ๋ฆฌ | ํ ์ฌ๋์ด ์ ํ, ๋ฉ์ผ, ์ฑํ ์ ๋ฌด๋ฅผ ๋ฒ๊ฐ์ ๊ฐ๋ฉด์ ์ฒ๋ฆฌ |
| ๋ณ๋ ฌ์ฑ(Parallelism) | ์ฌ๋ฌ ์์ ์ ๋์์ ์ฌ๋ฌ CPU ์ฝ์ด์์ ์ํ | 3๋ช ์ด ๊ฐ๊ฐ ์ ํ, ๋ฉ์ผ, ์ฑํ ์ ๋ฌด๋ฅผ ๋ฐ์์ ๋์์ ์ฒ๋ฆฌ |
๐ฆ ํ๋ก ํธ์๋์์ ๋์์ฑ
๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์ ์ํธ์์ฉ๊ณผ ๋ค์ํ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ฅผ ๋์์ ๋ค๋ค์ผ ํ๋ค.
- ์ฌ์ฉ์์ ์ ๋ ฅ ์ด๋ฒคํธ (Click, Typing input values ๋ฑ)
- ๋คํธ์ํฌ ํต์ (API ์์ฒญ)
- ์ ๋๋ฉ์ด์ ๋ ๋๋ง (CSS, requestAnimationFrame)
- ํ์ด๋จธ (setTimeout, setInterval)
- React์ ์ํ ์ ๋ฐ์ดํธ
์ด๋ฌํ ์์ ์ ๋์์ ์งํํ๋ฉด์ ์๋ก ์ํฅ์ ์ฃผ์ง ์๊ณ ๋งค๋๋ฝ๊ฒ ๋์ํ์ฌ ์ฌ์ฉ์์ UX์ ๋ถ์ ์ ์ธ ์ํฅ์ด ๊ฐ์ง ์๋๋ก ํ๊ฒ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ฆ, ๋จ์ผ ์ค๋ ๋ ํ๊ฒฝ์ธ ๋ธ๋ผ์ฐ์ ์์ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ค์ผ์ค๋งํ์ฌ โ์ฌ์ฉ์ ์ํธ์์ฉ(User Interaction)๊ณผ ๋ ๋๋ง์ด ๊ฒฝ์ํ์ง ์๋๋กโ ํด์ผ ํ๋ค.
๐ ๋์์ฑ์ด ์ค์ํ ๋ช ๊ฐ์ง ์ฌ๋ก (Cases)
๐ฌ ๊ฒ์ ์๋์์ฑ / ํํฐ๋ง UI
- Situation:
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋๋ง๋ค ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก API ์์ฒญ
- ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ํ์ดํ ์ ์ด์ ์์ฒญ์ ๋ํ ์๋ต์ด ๋์์ค๊ธฐ ์ ์ ์๋ก์ด ์์ฒญ ๋ฐ์
- ๋์ค์ ์ฒ๋ฆฌ๋ ์ด์ ์์ฒญ์ ์๋ต์ด ์๋ก์ด ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฎ์ด์ฐ๋ ์ํฉ ๋ฐ์
- Problem:
- UI๊ฐ ์ต์ ์ํ๋ฅผ ๋ฐ์ํ์ง ๋ชปํจ
- ๋ค๋ฆ์ ์๋ต์ด ์ต์ ์ ๋ ฅ์ ๋ฎ์ด๋ฒ๋ฆฌ๋ Race Condition ๋ฐ์
- How to solve?
AbortController๋ก ์ด์ ์์ฒญ์ ๋ํ ์ค๋จ์ ํตํด Race Condition ๋ฐฉ์ง- Concurrent Rendering:
useTransition์ ์ฌ์ฉํด ์ ๋ ฅ(์ฐ์ ์์ High) vs. ๋ ๋๋ง(์ฐ์ ์์ Low) ๊ตฌ๋ถ์ง์ด ์ฐ์ ์์ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝ์ฌํญ ์ฒ๋ฆฌ
๐ ํญ ์ ํ + API ์์ฒญ
- Situation:
- ์ฌ์ฉ์๊ฐ ํญ์ ์ ํํ๋ ์๊ฐ, ์ด์ ํญ์ ๋ฐ์ดํฐ ์์ฒญ์ด ์์ง ์๋ฃ๋์ง ์์์ ๊ฒฝ์ฐ
- ์ ํ ํ ์ด์ ํญ ์ ํ ์ ํธ์ถํ๋ ์์ฒญ์ ๋ํ ์๋ต ๋์ฐฉ โ ์๋ก์ด ํญ์ UI๋ฅผ ์ด์ ์์ฒญ์ ๋ํ ์๋ต์ด ๋ฎ์ด์
- Problem:
- ์ํ ๊ผฌ์ (State inconsistency)
- ์ฌ์ฉ์ ๊ฒฝํ ์ ํ (์๋ชป๋ ๋ฐ์ดํฐ ํ์ ๋๋ UI ๊น๋นก๊ฑฐ๋ฆผ ๋ฐ์)
- How to solve?
AbortController๋๋ React Query์cancelQueries()๋ก ์ด์ ์์ฒญ ์ทจ์- React์ Concurrent Rendering ํ์ฉ
startTransition์ ์ด์ฉํด ์ ํ ๋ ๋๋ง์ ๋ฎ์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌ
๐ ๋๋ ๋ฐ์ดํฐ ๋ ๋๋ง + ์ฌ์ฉ์ ์ ๋ ฅ
- Situation:
- ๋ช ๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ์ค์ ์ฌ์ฉ์์ ์ ๋ ฅ ๋ฐ์
- ๋ ๋๋ง์ด ๋๋๊ธฐ ์ ๊น์ง ์ฌ์ฉ์์ ์ ๋ ฅ์ด UI์ ๋ฐ์๋์ง ์์ (์ ๋ ฅ์ด โ๋จนํตโ์ฒ๋ผ ๋ณด์)
- Problem:
- ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ ๋๋ง์ผ๋ก ์ ์ ๋์ด ์ ๋ ฅ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์ง์ฐ
- How to solve?
- Virtualization (
react-window,react-virtualized) - React Concurrent Mode๋ก ๋ ๋๋ง์ ๋๋์ด โํ๋ ์ ๋จ์โ๋ก ๋ถํ ์ฒ๋ฆฌ
- Virtualization (
โ๏ธ ์๋ ์ ์ฅ(Auto Save) + ์ฌ์ฉ์ ์ ๋ ฅ
- Situation:
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ์ค์ผ ๋ ์ผ์ ์ฃผ๊ธฐ๋ก ์๋ ์ ์ฅ API ํธ์ถ
- ๋คํธ์ํฌ๊ฐ ๋๋ฆด ๊ฒฝ์ฐ ์ด์ ์ ๋ ฅ ๊ฐ์ผ๋ก ๋ฎ์ด์จ๋ฒ๋ฆผ
- Problem:
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ํ ๋ถ์ผ์น (Stale data)
- ์ ๋ ฅ ์ค๋จ์ด๋ ๊น๋นก์ ๋ฐ์
- How to solve?
- ํด๋ผ์ด์ธํธ์ ๋ฒ์ ํค(version key) ๊ด๋ฆฌ
- ์์ฒญ ์๋ฃ ์์ ๊ธฐ์ค์ด ์๋ ์ ๋ ฅ ํ์์คํฌํ ๊ธฐ์ค์ผ๋ก ๋ฐ์
useDeferredValue๋ก ์ ๋ ฅ๊ฐ์ ๋ฆ๊ฒ ๋ฐ์ํด ์ถฉ๋ ๋ฐฉ์ง
๐จ ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌ + API ํธ์ถ
- Situation:
- ์คํฌ๋กค ์ ๋๋ฉ์ด์ , ๋ชจ์ ํจ๊ณผ๊ฐ ์๋ ์ํ์์ fetch ์์ฒญ์ด ๋์์ ์ผ์ด๋จ
- ๋ ๋๋ง ์ฑ๋ฅ ๋จ์ด์ง๋ฉด์ ํ๋ ์ ๋๋(Frame drop) ๋ฐ์
- Problem:
- ๋์์ฑ ๋ถํ๋ก ์ธํด ์ ๋๋ฉ์ด์ ์ด ๋๊น
- How to solve?
requestIdleCallback์ผ๋ก idle ํ์์ ๋น๋๊ธฐ ํธ์ถ- Concurrent Rendering์ผ๋ก ๋ ๋๋ง๊ณผ ์ ๋๋ฉ์ด์ ์ค์ผ์ค๋ง ๋ถ๋ฆฌ
๐งฉ React์ Concurrent Rendering ์ด์ ์ ๋์์ฑ ์ ์ด
React 18 ์ดํ๋ถํฐ๋ React์์ **React ๋ด๋ถ ์ค์ผ์ค๋ฌ(Fiber Scheduler)**๊ฐ ๋ ๋๋ง ์ฐ์ ์์๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ์ฌ ๋์์ฑ ์ ์ด๋ฅผ ์ง์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด React๊ฐ ์ด๋ฌํ ์ ์ด๋ฅผ ํ๊ธฐ ์ด์ ์๋ ํ๋ก ํธ์๋์ ์ฌ์ฉ์ ์ ๋ ฅ ์ง์ฐ ๋ฌธ์ , API ๊ฒฝ์ ์ํ(Race Condition) ๋ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์๊น?
๐งฉ ์๋์ ์ธ ์ ์ด ๋ฐฉ์
React 18 ์ด์ ์๋ ๋ชจ๋ ์ํ ์ ๋ฐ์ดํธ์ ๋ ๋๋ง์ด **๋๊ธฐ์ (Synchronous)**์ผ๋ก ์งํ๋์๋ค.
์ฆ ์
๋ ฅ ์ด๋ฒคํธ, API ํธ์ถ, ๋ ๋๋ง์ด ๋ชจ๋ ๊ฐ์ ์ฐ์ ์์๋ก ์คํ๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์
๋ ฅ ์ค์๋ UI๊ฐ ๋ฒ๋ฒ
์ด๊ฑฐ๋, ์ด์ ์์ฒญ์ด ๋์ค์ ๋์ฐฉํ๋ฉด์ ์ต์ ์ํ๋ฅผ ๋ฎ์ด์ฐ๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์ debounce, throttle, request cancellation ๋ฑ ์๋์ ์ธ ์ ์ด ๋ฐฉ์์ ํ์ฉํ๋ค.
โ๏ธ Throttle and Debounce
debounce ํจ์ ๊ตฌํ ์์
โ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ๋ฉ์ถ๊ณ ์ผ์ ์๊ฐ(delay) ๋์ ์๋ฌด ์ ๋ ฅ์ด ์์ ๋๋ง ์์ฒญ์ ๋ณด๋
function debounce(fn, delay) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); };}
// ๊ฒ์ APIconst handleSearch = debounce((value) => { fetch(`/api/search?q=${value}`);}, 500);
<input onChange={(e) => handleSearch(e.target.value)} />throttle ํจ์ ๊ตฌํ ์์
โ 200ms ๋จ์๋ก ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ์คํํ๋๋ก ์ ํ
function throttle(fn, limit) { let inThrottle; return (...args) => { if (!inThrottle) { fn(...args); inThrottle = true; setTimeout(() => (inThrottle = false), limit); } };}
// ์คํฌ๋กค ์ด๋ฒคํธwindow.addEventListener( 'scroll', throttle(() => console.log(window.scrollY), 200));| ํจ์ | ์๋ ๋ฐฉ์ | ๋ํ ์ฌ๋ก | ํจ์์ ์คํ ๋ชฉ์ |
|---|---|---|---|
| debounce | ๋ง์ง๋ง ์ด๋ฒคํธ ์ดํ ์ผ์ ์๊ฐ ๋์ ์ถ๊ฐ ์ด๋ฒคํธ ์งํ์ด ์์ ๋ ์คํ | ๊ฒ์ ์๋์์ฑ | โ๋ง์ง๋ง ์ ๋ ฅ๋ง ๋ฐ์โ โ ๋ถํ์ํ API ํธ์ถ ๋ฐฉ์ง |
| throttle | ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ๋ง๋ค ํ ๋ฒ๋ง ์คํ | ์คํฌ๋กค/resize ์ด๋ฒคํธ | โ์ผ์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์คํโ โ CPU ๋ถํ ์ํ |
โ๏ธ AbortController (Request Cancellation - ์์ฒญ ์ทจ์)
fetch ์์ฒญ์ ๋ณด๋ผ ๋ ์ด์ ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ์๋ก์ด ์์ฒญ์ด ๋ฐ์ํ๋ฉด, ์ด์ ์์ฒญ์ ์๋ต์ด ๋์ค์ ๋์ฐฉํ๋ฉด์ UI๊ฐ ์ด์ ์ํ๋ก ๋๋์๊ฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋์ผ๋ก ์์ฒญ ์ ์ด๋ฅผ ํ ์ ์๋ AbortController๋ฅผ ์ฌ์ฉํด ์ด์ ์์ฒญ์ ์ทจ์ํ๋ ๋ฐฉ์์ด ๋๋ฆฌ ์ฌ์ฉ๋์๋ค.
function useSearch() { const controllerRef = useRef();
const fetchSearchResults = async (query) => { // ์งํ๋๋ ์์ฒญ ์์ผ๋ฉด ์ทจ์ (abort) if (controllerRef.current) controllerRef.current.abort(); const controller = new AbortController(); controllerRef.current = controller;
try { const res = await fetch(`/api/search?q=${query}`, { signal: controller.signal, // abort controller๋ฅผ ํตํ ํธ์ถ ๊ด๋ฆฌ๋ฅผ ์ํ signal }); const data = await res.json(); console.log('๊ฒฐ๊ณผ:', data); } catch (error) { if (error.name === 'AbortError') { console.log('์์ฒญ์ด ์ทจ์๋์์ต๋๋ค.'); } } };
return { fetchSearchResults };}๐ฅ ์๋์ ์ธ ์ ์ด ๋ฐฉ์์ด ๊ฐ๋ ํ๊ณ์
- UX ๋ถ์์ ์ฑ
- ์ฌ์ฉ์์ ์ ๋ ฅ ํ์ด๋ฐ์ ๋ฐ๋ผ ๋ฐ์์ด ์ง์ฐ๋๊ฑฐ๋, ๋ฐ์์ด ๋๋ ค ๋ณด์ผ ์ ์์
- ์ฌ์ฉ์์ ์ ๋ ฅ ํ์ด๋ฐ์ ์ถ์ธกํ์ฌ ๊ทธ์ ๋ง๋ ์คํ ์๊ฐ์ ๋ํ ๋ณ๋ ์ ์ด๊ฐ ํ์ํจ
- ๋ ๋๋ง๊ณผ์ ๋ถ๋ฆฌ ๋ถ๊ฐ
- ์ด๋ฒคํธ ๋ฐ์ ๋น๋ ์ ์ด๋ ๊ฐ๋ฅํ์ง๋ง, ๋ ๋๋ง ์์ฒด์ ์ฐ์ ์์ ์กฐ์ ์ ๋ถ๊ฐ๋ฅ
- React ๋ด๋ถ ์ํ ์
๋ฐ์ดํธ์ ๋ณ๊ฐ
- React ๋ ๋๋ง ์ฌ์ดํด๊ณผ๋ ๋ฌด๊ดํ๊ฒ ๋์ํ์ฌ ์ํ ๋ถ์ผ์น(stale state) ๊ฐ๋ฅ
- ์ฝ๋ ์ค๋ณต / ๋ณต์ก๋ ์ฆ๊ฐ
- debounce, throttle, abort controller ๋ฑ์ ๋งค ํจ์๋ง๋ค ๋ฐ๋ก ๊ด๋ฆฌ ํ์
๐งฉ React 18 ์ดํ์ ๋ณํ - Concurrent Rendering
โ Concurrent Rendering์ด๋?
Concurrent Rendering์ React 18 ๋ฒ์ ์์ ์ฒ์ ๋์ ๋์ด, React 19์์๋ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์๋ ๋์์ ๋ ๋๋ง(Concurrent Rendering) ๊ธฐ๋ฅ์ด๋ค.
๊ธฐ์กด์ ๋๊ธฐ์ (Synchronous)์ผ๋ก ์งํ๋์๋ ๋ ๋๋ง ์์ ์ ์์ ๋จ์๋ก ๋ถํ ํ์ฌ ์ฐ์ ์์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ผ์ค๋งํ ์ ์๋๋ก ํ๋ฉฐ, ํ์ ์ ์ค๋จ ๋ฐ ์ฌ๊ฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ํ์ฌ **UI์ ๋ฐ์์ฑ(Responsiveness)**์ ์ ์งํ๋ ๋์์ ๋ ๋๋ง ๋ฐฉ์์ด๋ค.
Concurrent Rendering์ ํน์ง
- ๋ณ๊ฒฝ ์ฐ์ ์์์ ๋ฐ๋ฅธ ๋ ๋๋ง (Prioritized Updates): React๋ Fiber ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ ์ฐ์ ์์์ ๋ฐ๋ผ Fiber ๋ ธ๋๋ฅผ ์ค์ผ์ค๋งํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๊ฐ์ โ๊ธด๊ธํ ์ ๋ฐ์ดํธ(high priority)โ๋ ์ฆ์ ์ฒ๋ฆฌํ๊ณ , ๋ฐ์ดํฐ fetch๋ ๋ ๋๋ง๊ณผ ๊ฐ์ โ๋น๊ธด๊ธ ์ ๋ฐ์ดํธ(low priority)โ๋ ๋์ค์ ์ฒ๋ฆฌํ์ฌ ๋น ๋ฅด๊ฒ ๋ฐ์๋์ด์ผ ํ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ ผ ๋ธ๋กํน (Non-Blocking): ๋ ๋๋ง์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์์ ํ ์ ์ ํ์ง ์๊ณ , **์ผ์ ๋จ์๋ง๋ค ์ค๋จ(yield)**ํ์ฌ ์ด๋ฒคํธ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ์ ์๋ ์๊ฐ์ ํ๋ณดํ๋ค. ๋ฐ๋ผ์ ์์ ๋์ด ๋ง๊ณ ๋ณต์กํ ์ ๋ฐ์ดํธ๋ฅผ ์งํํ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ ํ ๋๊น ์์ด ์ฌ์ฉ์๊ฐ ์ํธ์์ฉ ํ ์ ์๋๋ก ํด UX๋ฅผ ์ ํดํ์ง ์์ ์ ์๋ค.
- ์ธ๋ฐํ ์ ์ด (Fine-Grained Control): React๋ Fiber ๋จ์๋ก ๊ฐ ์
๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๊ณ์ฐํด์ ์๋ ์กฐ์ ํ๋ค. ๋ํ ๊ฐ๋ฐ์๋
useTransition,useDeferredValue,Suspense๋ฑ์ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ฐ์ ์์ ํํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ ๋๋ง ํ๋ฆ์ ์ง์ ์ ์ดํ์ง ์๊ณ ๋ UI์ ๋ฐ์์ฑ๊ณผ ๋ ๋๋ง ํจ์จ์ ๊ท ํ ์๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
โ Concurrent Rendering์ React๊ฐ ๋ ๋๋ง ๊ณผ์ ์ **๋๊ธฐ์ (Synchronous)**์์ ์ค์ผ์ค๋ง ๊ฐ๋ฅํ ๋น๋๊ธฐ์ (Asynchronous) ๊ณผ์ ์ผ๋ก ์ ํํจ์ผ๋ก์จ, ๋ณต์กํ UI์์๋ **์ ๋ ฅ ๋ฐ์์ฑ(Responsiveness)**๊ณผ **๋ ๋๋ง ์ ์ฐ์ฑ(Flexibility)**์ ํ๋ณดํ์ฌ ๋๊น ์๋ ์ฌ์ฉ์ ๊ฒฝํ(Seamless UX)๋ฅผ ์ ๊ณตํ ์ ์๋ ํต์ฌ ๊ธฐ์ ์ด๋ค.