React18์์์ Concurrent, Transition
Concurrent, Transition์ ๋ํ์ฌ
Mar 25, 2023
๋ค์ด๊ฐ๋ฉฐ
React18์ด ๋์จ์ง 1๋ ์ด ๋์ด๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ฌ ํ๋ก์ ํธ์์ React18์ ์ฌ์ฉํ๊ณ ์์ง๋ ์์ง๋ง 18๋ฒ์ ์์ React ํ์ด ์ค์ํ๊ฒ ์๊ฐํ๋ ์ ๋ฐ์ดํธ ๋ด์ฉ๊ณผ ์ด๋ค ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋์ง ์๊ฐํ๋ ๊ณต์ ๋ธ๋ก๊ทธ ๊ธ์ ์๊ฐํ๋ฉด์ ์ ์ฉํ ๊ธฐ๋ฅ์ธ useTransition๋ ๊ฐ์ด ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
๋์์ฑ
React18์์ ๊ฐ์ฅ ์ค์ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋์์ฑ์ ๋๋ค. ๋์์ฑ์ ๊ทธ ์์ฒด๋ก ๊ธฐ๋ฅ์ด ์๋๋๋ค. React๊ฐ ๋์์ ์ฌ๋ฌ ๋ฒ์ ์ UI๋ฅผ ์ค๋นํ ์ ์๋๋ก ํ๋ ์๋ก์ด ๋ฐฐํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. (์ค๋ต) React ๊ฐ๋ฐ์๊ฐ React ๋ด๋ถ์์ ๋์์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ถ๊ธํด ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง๋ ์์ต๋๋ค. React์์ ๋์์ฑ์ ํต์ฌ ๋ ๋๋ง ๋ชจ๋ธ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ฐ์ดํธ์ ๋๋ค. ๋ฐ๋ผ์ ๋์์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๋๊ฒ์ด ๋งค์ฐ ์ค์ํ์ง๋ ์์ง๋ง ๋์ ์์ค์์ ๋์์ฑ์ด ๋ฌด์์ธ์ง ์๋ ๊ฒ์ ์ถฉ๋ถํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
Concurrent React์ ํต์ฌ ์์ฑ์ ๋ ๋๋ง์ ์ค๋จํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. React 18๋ก ์ฒ์ ์ ๊ทธ๋ ์ด๋ํ๋ฉด ๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ ์ ์ ๋ฐ์ดํธ๊ฐ ์ด์ ๋ฒ์ ์ React์ ๋์ผํ๊ฒ ์ค๋จ๋์ง ์๋ ๋จ์ผ ๋๊ธฐ ํธ๋์ญ์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ๋๊ธฐ์ ๋ ๋๋ง์ ์ฌ์ฉํ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ๋ ๋๋ง์ ์์ํ๋ฉด ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ ๋๊น์ง ์๋ฌด๊ฒ๋ ์ค๋จํ ์ ์์ต๋๋ค.
๋์ ๋ ๋๋ง์์๋ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. React๋ ์ ๋ฐ์ดํธ ๋ ๋๋ง์ ์์ํ๊ณ ์ค๊ฐ์ ์ผ์ ์ค์งํ ๋ค์ ๋์ค์ ๊ณ์ํ ์ ์์ต๋๋ค. ์งํ ์ค์ธ ๋ ๋๋ง์ ์์ ํ ํฌ๊ธฐํ ์๋ ์์ต๋๋ค. React๋ ๋ ๋๋ง์ด ์ค๋จ๋๋๋ผ๋ UI๊ฐ ์ผ๊ด๋๊ฒ ํ์๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ ์ฒด ํธ๋ฆฌ๊ฐ ํ๊ฐ๋๋ฉด ๋๋ ๋๊น์ง DOM ๋ณํ์ ์ํํ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํตํด React๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ํ๋ฉด์ ์ค๋นํ ์ ์์ต๋๋ค. ์ด๋ UI๊ฐ ๋๊ท๋ชจ ๋ ๋๋ง ์์ ์ค์ ์๋๋ผ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฆ์ ์๋ตํ์ฌ ์ ๋์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์์ฑํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์๋ React18์์ ๋์์ฑ์ ์ค๋ช ํ๋ ๊ธ์ธ๋ฐ์ ์์ฝํด๋ณด์๋ฉด React18์์๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ UI๊ฐ ์ผ๊ด๋๊ฒ ๋ณด์ฌ์ง๋ ๊ฒ์ ์ ์งํ๋ฉด์ ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ ๋๋ง์ ์ค์งํ๊ฑฐ๋ ์์ ํ ํฌ๊ธฐํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํฉ๋๋ค. useTransition์ ํตํด ์ด๋ค ๊ธฐ๋ฅ์ธ์ง ์ ํํ ์์๋ณผ๊น์?
Transition
์ ํ(Transition)์ ๊ธด๊ธ ์ ๋ฐ์ดํธ์ ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ React์ ์๋ก์ด ๊ฐ๋ ์ ๋๋ค.
- ๊ธด๊ธ ์ ๋ฐ์ดํธ๋ ์ ๋ ฅ, ํด๋ฆญ, ๋๋ฅด๊ธฐ ๋ฑ๊ณผ ๊ฐ์ ์ง์ ์ ์ธ ์ํธ ์์ฉ์ ๋ฐ์ํฉ๋๋ค.
- ์ ํ ์ ๋ฐ์ดํธ๋ UI๋ฅผ ํ๋์ ๋ทฐ์์ ๋ค๋ฅธ ๋ทฐ๋ก ์ ํํฉ๋๋ค.
ํ์ดํ, ํด๋ฆญ ๋๋ ๋๋ฅด๊ธฐ์ ๊ฐ์ ๊ธด๊ธ ์ ๋ฐ์ดํธ๋ ๋ฌผ๋ฆฌ์ ๊ฐ์ฒด์ ์๋ ๋ฐฉ์์ ๋ํ ์ง๊ด๊ณผ ์ผ์นํ๋๋ก ์ฆ๊ฐ์ ์ธ ์๋ต์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ฉ์๋ค์ โํ๋ ธ๋คโ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ(transition)์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ๋ชจ๋ ๊ฐ์ด ํ์๋๊ธฐ ์ ์ ๋ณด์ฌ์ง๋ ์ค๊ฐ๊ฐ์ ์ต์ข ๊ฐ์ผ๋ก ๊ธฐ๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฆ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ต์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด์๋ ๋จ์ผ ์ฌ์ฉ์ ์ ๋ ฅ์ผ๋ก ๊ธด๊ธ ์ ๋ฐ์ดํธ์ ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๊ฐ ๋ชจ๋ ๋ฐ์ํด์ผ ํฉ๋๋ค. ์ ๋ ฅ ์ด๋ฒคํธ ๋ด์์ startTransition API๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ์ ๋ฐ์ดํธ๊ฐ ๊ธด๊ธํ๊ณ โ์ ํ(transition)โ์ธ์ง React์ ์๋ฆด ์ ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ๋ธ๋ก๊ทธ์ ์๊ฐ๋ Transition์ ๊ดํ ์ค๋ช ์ด์๋๋ฐ์ ํต์ฌ์ ์ต์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด์๋ ์ด๋ค ์ ๋ฐ์ดํธ๊ฐ ๊ธด๊ธํ์ง ์ ํ(transition)์ธ์ง ์๋๊ฒ ํ์ํ๋ฉฐ React18์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ ๋ฅผ ๊ตฌํํด๋ณด๋ฉด์ ํ๋ฒ ๋ ์ดํดํด ๋ณผ๊น์?
์์ (๊ฒ์)
1๋ง๊ฐ์ ๋๋ฏธ ๋ฐ์ดํฐ๊ฐ ์๊ณ input value๋ฅผ ํตํด filter๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฒ 1๋ง๊ฐ์ ๋ฐ์ดํฐ ์์ ์ ์ง์ ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง๋ ์๊ฒ ์ง๋ง (ํ์ด์ง ๋ค์ด์ ์ด์ฉ, ํน์ ์๋ฒ์ธก์์ ํํฐ ์์ )
React18์์๋ ํด๋ผ์ด์ธํธ ์ธก์์ useTransition์ ์ด์ฉํด ์ด๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ฑ์ ํตํด ์ํํ ์ ์์ต๋๋ค.
์์ ์์ ํ์ธ ํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ
์์ ๊ฐ code-sandbox๋ก ๊ตฌํ๋์ด์ ์๋ฒฝํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ธก์ ํ๊ธฐ ์ํ ํ๊ฒฝ์ ์๋์ง๋ง ๊ฒ์์ฐฝ์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์ง์ฐ๋ฉด ๋ฌธ์ ๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค.
1๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก filter ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ํ๋๋ฐ ๋๋ ์ด๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ input์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์ง์ฐ๊ธฐ ์ํด delete ๋ฒํผ์ ๋๋ฅด๋ ํ์๋ ์์์ ์ค๋ช ํ urgent update(๊ธด๊ธ ์ ๋ฐ์ดํธ)์ ํด๋นํ๋ ์ก์ ์ด๋ฉฐ ์ด๋ฐ ์ก์ ์์์ ๋๋ ์ด ๋ฐ์์ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์์ ์์ ๊ฐ์ ํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ
์์์ ์ค๋ช ํ Transition์ ์ฌ์ฉํ์ฌ React์๊ฒ ์ด๋ค ์ ๋ฐ์ดํธ๊ฐ urgent update์ธ์ง Transition์ธ์ง ์๋ ค์ค ์ ์์ต๋๋ค.
์์ ์์ urgent update๋ input์์ ๋ฐ์ํ๋ ์ก์ ์ด๊ณ urgent update์ ํด๋นํ์ง ์๋ ๋ก์ง์ input์์ ๋ฐ์ ๊ฐ์ ํตํด filtering ํด์ฃผ๋ ๋ก์ง์ ๋๋ค.
์ฐ๋ฆฌ๋ filtering ํด์ฃผ๋ ๋ก์ง์ React์๊ฒ urgent update๊ฐ ์๋๋ผ๊ณ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค.
import { useTransition } from "react";
const [isPending, startTransition] = useTransition();
startTransition(() => {
setFilterTerm(e.target.value);
});
isPending์ urgent update๊ฐ ์๋๋ผ๊ณ ์ ์ํ ๋ก์ง์ด ์ฌ์ ํ ์คํ ๋ณด๋ฅ์ค ์ธ์ง ์๋์ง ์๋ ค์ฃผ๋ boolean ๊ฐ์ ๋๋ค. useTransition hook์ ์ฌ์ฉํด์ผ๋ง isPending ๊ฐ์ ์ป์ ์ ์๋๋ฐ
๋ง์ฝ hook์ ์ฌ์ฉํ์ง ์๊ฒ ๋ค๊ณ ํ๋ฉด React์์ ์๋ ์ฒ๋ผ startTransition๋ง importํ ์ ์์ต๋๋ค.
import { startTransition } from 'react';
startTransition(() => {
setFilterTerm(e.target.value);
});
๊ฐ์ ํ์ธ
๊ฐ์ ์ , ๊ฐ์ ํ ์ ์ฐจ์ด์
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ input์ ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๋ฆฌ์คํธ์ ์ ๋ฐ์ดํธ๊ฐ ๋๊ธฐํ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. React์๊ฒ filterTerm์ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๊ฐ ๋ฎ๋ค๊ณ ์๋ ค์ฃผ๊ณ input์ ์ ๋ฐ์ดํธ๊ฐ urgent update๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ฆฌ์คํธ ์ ๋ฐ์ดํธ์ ์๋๊ฐ input ๋ณด๋ค๋ ์ง์ฐ๋์ด ์ ๋ฐ์ดํธ ๋ฉ๋๋ค.
์ด๋ฐ ๋ถ๋ถ์ด React18์์ ์ด์ผ๊ธฐ ํ๋ ๋์์ฑ์ ํ ๋ถ๋ถ์ ๋๋ค.
์ ํ์ด ์ฌ์ฉ์์ ์ํด ์ค๋จ๋๋ฉด(์: ์ฌ๋ฌ ๋ฌธ์๋ฅผ ์ฐ์์ผ๋ก ์ ๋ ฅ) React๋ ์๋ฃ๋์ง ์์ ์ค๋๋ ๋ ๋๋ง ์์ ์ ์ ๊ฑฐํ๊ณ ์ต์ ์ ๋ฐ์ดํธ๋ง ๋ ๋๋งํฉ๋๋ค.
์ด๋ ๊ธ ์ด๋ฐ์ ๋์จ
Concurrent React์ ํต์ฌ ์์ฑ์ ๋ ๋๋ง์ ์ค๋จํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ด์ฉ์ ํด๋นํฉ๋๋ค.
์ฃผ์
ํ์ง๋ง ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ๋ชจ๋ ๋ถ๋ถ์์ useTransition์ ์ฌ์ฉํด์ผ ํ ๊น์? ๊ทธ๋ ์ง ์์ต๋๋ค.
ํน๋ณํ๊ฒ ๋๋ฆฐ ๋ก์ง์์ ์ค๋๋ ๊ธฐ๊ธฐ์ ๋์ํด์ผ ํ๊ณ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด ์์๋ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ ์์ ๋ useTransition์ ์ฌ์ฉ ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ๊ธฐ ์ํ
๊ทน๋จ์ ์ธ ์์ผ ๋ฟ์ด๋ฉฐ ๋ค๋ฅธ ์๋ฃจ์ ์ ํตํด์ ์ถฉ๋ถํ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค. useMemo์ useCallback์ ๋ชจ๋ ๋ถ๋ถ์์ ์ฌ์ฉํ ํ์๊ฐ ์๋ ๊ฒ ์ฒ๋ผ
useTransition ๋ํ React๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ํํ๋ ๋ก์ง ์ค ํ๋์ด๋ฏ๋ก ์คํ๋ ค ์ฌ์ฉํ์ง ์์์ผ ๋ ๊ณณ์ ๋ชจ๋ ์ฌ์ฉํ๋ค๋ฉด ๋ ๋๋ ค์ง ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
React18์์ ์ฃผ์ ์ ๋ฐ์ดํธ ๋ด์ฉ์ธ ๋์์ฑ๊ณผ useTransition์ ๋ํด ์ดํด๋ดค์ต๋๋ค. ์ด๋ฒ ์ ๋ฐ์ดํธ๊ฐ ๋ฉ์ด์ ํ ์ ๋ฐ์ดํธ๋ ์๋์์ง๋ง
์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ ๋๋ ์ ์๋ React ํ์ ์๊ฐ์ ์ฟ๋ณผ ์ ์์์ต๋๋ค.
๋ํ ๋๋๋ก์ด๋ฉด ์์ ๋ code-sandbox๊ฐ ์๋ ๋ก์ปฌ์์ ์ง์ ๊ตฌ๋ํด ๋ณด์๋ฉด์ ์งํํ์๊ธธ ๋ถํ๋๋ฆฝ๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.