๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒ์ฆ๋ React ์ฑ๋ฅ ์ต์ ํ ๊ธฐ์ ์ ์์๋ณด์ธ์. ์ด ๊ฐ์ด๋๋ ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ด์ ์ ๋ง์ถฐ ๋ฉ๋ชจ์ด์ ์ด์ , ์ฝ๋ ๋ถํ , ๊ฐ์ํ๋ ๋ชฉ๋ก ๋ฑ์ ๋ค๋ฃน๋๋ค.
React ์ฑ๋ฅ ์ต์ ํ: ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ๊ฐ๋ ฅํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ๋๋ฆฌ ์ฑํ๋๊ณ ์์ต๋๋ค. React๋ ๋ง์ ์ฅ์ ์ ์ ๊ณตํ์ง๋ง, ์ ์ ํ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ฑ๋ฅ์ด ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ์๋, ํจ์จ์ฑ ๋ฐ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๊ธฐ ์ํ ์ค์ ์ ์ธ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ๋ ค ์ฌํญ๋ ํฌํจํฉ๋๋ค.
React ์ฑ๋ฅ ์ดํดํ๊ธฐ
์ต์ ํ ๊ธฐ์ ์ ๋ฐ์ด๋ค๊ธฐ ์ ์ React ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์์ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง: React๋ ์ปดํฌ๋ํธ์ props๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค. ํนํ ๋ณต์กํ ์ปดํฌ๋ํธ์์ ๊ณผ๋ํ ๋ฆฌ๋ ๋๋ง์ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๊ฑฐ๋ํ ์ปดํฌ๋ํธ ํธ๋ฆฌ: ๊น์ด ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ๊ณ์ธต์ ๋ ๋๋ง ๋ฐ ์ ๋ฐ์ดํธ ์๋๋ฅผ ์ ํ์ํฌ ์ ์์ต๋๋ค.
- ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ: ์ปดํฌ๋ํธ ๋ด์์ ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ํฐ ๋ฒ๋ค ํฌ๊ธฐ: ํฐ JavaScript ๋ฒ๋ค ํฌ๊ธฐ๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ฆ๊ฐ์์ผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ ๋๋ก ์ต์ ํ๋์ง ์๊ฑฐ๋ ๊ณผ๋ํ๊ฒ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ API ํธ์ถ์ ํนํ ๋ค๋ฅธ ์ง๋ฆฌ์ ์์น์ ์๋ ์ฌ์ฉ์์๊ฒ ๋๋ฆด ์ ์์ต๋๋ค.
์ฃผ์ ์ต์ ํ ์ ๋ต
1. ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ
๋ฉ๋ชจ์ด์ ์ด์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ณ ๋์ผํ ์ ๋ ฅ์ด ๋ค์ ๋ฐ์ํ ๋ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ์ ์ ๋๋ค. React๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ํ ์ฌ๋ฌ ๋ด์ฅ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค:
- React.memo: ์ด ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค. props์ ์์ ๋น๊ต๋ฅผ ์ํํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
const MyComponent = React.memo(function MyComponent(props) {
// Component logic
return <div>{props.data}</div>;
});
์์: ์ฌ์ฉ์์ ํ๋กํ ์ ๋ณด๋ฅผ ํ์ํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ฌ์ฉ์ ํ๋กํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํ ํ์๊ฐ ์์ต๋๋ค. React.memo๋ ์ด ์๋๋ฆฌ์ค์์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- useMemo: ์ด ํ ์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค. ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๊ฐ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
const memoizedValue = useMemo(() => {
// Expensive calculation
return computeExpensiveValue(a, b);
}, [a, b]);
์์: ๋ณต์กํ ์ํ ๊ณต์์ ๊ณ์ฐํ๊ฑฐ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. useMemo๋ ์ด ๊ณ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ๋งค ๋ ๋๋ง ์ ๋ค์ ๊ณ์ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- useCallback: ์ด ํ ์ ํจ์ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค. ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ณ๊ฒฝ๋๋ ํจ์์ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๋ฒ์ ์ ๋ฐํํฉ๋๋ค. ์ด๋ ์ฐธ์กฐ ๋๋ฑ์ฑ์ ์์กดํ๋ ์ต์ ํ๋ ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ์ ์ ๋ฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
const memoizedCallback = useCallback(() => {
// Function logic
doSomething(a, b);
}, [a, b]);
์์: ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ React.memo๋ฅผ ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ ์ ๋ฌํฉ๋๋ค. useCallback์ด ์์ผ๋ฉด ํจ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ๋ค์ ์์ฑ๋์ด, ์์ ์ปดํฌ๋ํธ์ props๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. useCallback์ ์์ ์ปดํฌ๋ํธ๊ฐ ํจ์์ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ๋ฐ์ดํฐ ํ์ ๋ฐ ๋ ์ง/์๊ฐ ๊ณ์ฐ์ด ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ธ์. ์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ ๋ด์์ ๋ก์ผ์ผ๋ณ ๋ ์ง ํ์์ ์ฌ์ฉํ๋ฉด ๋ก์ผ์ผ์ด ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์๋์น ์๊ฒ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ๊นจ์ง ์ ์์ต๋๋ค. ๋น๊ต๋ฅผ ์ํ ์ผ๊ด๋ props๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ํ์์ ์ ๊ทํํ์ธ์.
2. ์ฝ๋ ๋ถํ ๋ฐ ์ง์ฐ ๋ก๋ฉ
์ฝ๋ ๋ถํ ์ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ๋ฒ๋ค๋ก ๋๋๋ ํ๋ก์ธ์ค์
๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค. React๋ ๋์ ์ํฌํธ์ React.lazy ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ์ ์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค.
const MyComponent = React.lazy(() => import('./MyComponent'));
function MyComponentWrapper() {
return (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
์์: ์ฌ๋ฌ ํ์ด์ง๊ฐ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ํ์ด์ง์ ์ฝ๋๋ฅผ ํ๊บผ๋ฒ์ ๋ก๋ํ๋ ๋์ , ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ก ์ด๋ํ ๋๋ง ๊ฐ ํ์ด์ง์ ์ฝ๋๋ฅผ ๋ก๋ํ๋๋ก ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
React.lazy๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ํฌํธ๋ฅผ ์ผ๋ฐ ์ปดํฌ๋ํธ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ์ฝ๋ ๋ถํ ํฉ๋๋ค. Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ฐ ๋ก๋๋๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ธ์์ง๋ ๋์ ๋์ฒด UI(์: ๋ก๋ฉ ํ์๊ธฐ)๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์ฝ๋ ๋ฒ๋ค์ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌํ๊ธฐ ์ํด CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. CDN์ ์ ์ธ๊ณ ์๋ฒ์ ์์ฐ์ ์บ์ํ์ฌ ์ฌ์ฉ์๊ฐ ์์น์ ๊ด๊ณ์์ด ๋น ๋ฅด๊ฒ ๋ค์ด๋ก๋ํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ํ, ๊ฐ ์ง์ญ์ ์ธํฐ๋ท ์๋ ๋ฐ ๋ฐ์ดํฐ ๋น์ฉ์ ์ผ๋์ ๋์ธ์. ํ์ ์ฝํ ์ธ ๋ฅผ ๋จผ์ ๋ก๋ํ๊ณ ์ค์ํ์ง ์์ ๋ฆฌ์์ค์ ๋ก๋๋ฅผ ์ฐ๊ธฐํ๋ ๊ฒ์ ์ฐ์ ์์๋ก ์ผ์ผ์ธ์.
3. ๊ฐ์ํ๋ ๋ชฉ๋ก ๋ฐ ํ ์ด๋ธ
ํฐ ๋ชฉ๋ก์ด๋ ํ
์ด๋ธ์ ๋ ๋๋งํ ๋ ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ ๋ ๋๋งํ๋ ๊ฒ์ ๊ทน๋๋ก ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ๊ฐ์ํ ๊ธฐ์ ์ ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. react-window ๋ฐ react-virtualized์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฐ ๋ชฉ๋ก ๋ฐ ํ
์ด๋ธ ๋ ๋๋ง์ ์ํ ์ต์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>
Row {index}
</div>
);
function MyListComponent() {
return (
<FixedSizeList
height={400}
width={300}
itemSize={50}
itemCount={1000}
>
{Row}
</FixedSizeList>
);
}
์์: ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒ ๊ฐ์ ์ ํ ๋ชฉ๋ก์ ํ ๋ฒ์ ๋ ๋๋งํ๋ฉด ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. ๊ฐ์ํ๋ ๋ชฉ๋ก์ ์ฌ์ฉ์ ๋ทฐํฌํธ์ ํ์ฌ ๋ณด์ด๋ ์ ํ๋ง ๋ ๋๋งํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ๋ชฉ๋ก ๋ฐ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ๋ค์ํ ๋ฌธ์ ์งํฉ๊ณผ ํ ์คํธ ๋ฐฉํฅ์ ์ผ๋์ ๋์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด์ ๋ฌธํ๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ฐ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตญ์ ํ(i18n) ๋ฐ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ๋ ์ด์์์ ์ง์ํ๋์ง ํ์ธํ์ธ์.
4. ์ด๋ฏธ์ง ์ต์ ํ
์ด๋ฏธ์ง๋ ์ข ์ข ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ํฌ๊ธฐ์ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. ์ด๋ฏธ์ง ์ต์ ํ๋ ์ฑ๋ฅ ํฅ์์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ์ด๋ฏธ์ง ์์ถ: ImageOptim, TinyPNG, Compressor.io์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ง ์ ํ ์์ด ์ด๋ฏธ์ง๋ฅผ ์์ถํ์ธ์.
- ๋ฐ์ํ ์ด๋ฏธ์ง:
<picture>์์ ๋๋<img>์์์srcset์์ฑ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ฅ์น ๋ฐ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ๊ณตํ์ธ์. - ์ง์ฐ ๋ก๋ฉ:
react-lazyload์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ค์ดํฐ๋ธloading="lazy"์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๊ฐ ๋ทฐํฌํธ์ ๋ํ๋๊ธฐ ์ง์ ์๋ง ๋ก๋ํ์ธ์. - WebP ํ์: JPEG ๋ฐ PNG์ ๋นํด ์ฐ์ํ ์์ถ๋ฅ ์ ์ ๊ณตํ๋ WebP ์ด๋ฏธ์ง ํ์์ ์ฌ์ฉํ์ธ์.
<img src="image.jpg" loading="lazy" alt="My Image"/>
์์: ์ ์ธ๊ณ ๋ชฉ์ ์ง์ ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ์ฌํ ์น์ฌ์ดํธ๋ ์ด๋ฏธ์ง ์ต์ ํ๋ก๋ถํฐ ํฐ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ , ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ง์ฐ ๋ก๋ฉ์ ํตํด ์น์ฌ์ดํธ์ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ๊ฐ ์ง์ญ์ ๋ฐ์ดํฐ ๋น์ฉ์ ์ผ๋์ ๋์ธ์. ๋์ญํญ์ด ์ ํ์ ์ด๊ฑฐ๋ ๋ฐ์ดํฐ ์๊ธ์ ๊ฐ ๋น์ผ ์ฌ์ฉ์๋ฅผ ์ํด ์ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ์ธ์. ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ฐ ์ฅ์น์์ ๋๋ฆฌ ์ง์๋๋ ์ ์ ํ ์ด๋ฏธ์ง ํ์์ ์ฌ์ฉํ์ธ์.
5. ๋ถํ์ํ ์ํ ์ ๋ฐ์ดํธ ๋ฐฉ์ง
์ํ ์ ๋ฐ์ดํธ๋ React์์ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ๋ถํ์ํ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ต์ํํ๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ง ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ๋๋ก ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ธ์. Immer ๋ฐ Immutable.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- setState ๋ฐฐ์น: React๋ ์ฌ๋ฌ
setStateํธ์ถ์ ๋จ์ผ ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๋ก ๋ฌถ์ด ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์ฝ๋(์:setTimeout,fetch) ๋ด์setStateํธ์ถ์ ์๋์ผ๋ก ๋ฐฐ์น๋์ง ์์์ ์ ์ํ์ธ์. - ํจ์ํ setState: ์ ์ํ๊ฐ ์ด์ ์ํ์ ์์กดํ ๋
setState์ ํจ์ํ ํ์์ ์ฌ์ฉํ์ธ์. ์ด๋ ํนํ ์ ๋ฐ์ดํธ๊ฐ ๋ฐฐ์น๋ ๋ ์ฌ๋ฐ๋ฅธ ์ด์ ์ํ ๊ฐ์ผ๋ก ์์ ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
this.setState((prevState) => ({
count: prevState.count + 1,
}));
์์: ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ๋ผ ์ํ๋ฅผ ์์ฃผ ์
๋ฐ์ดํธํ๋ ์ปดํฌ๋ํธ๋ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ setState์ ํจ์ํ ํ์์ ์ฌ์ฉํ๋ฉด ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋ ๋๋ง ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๊ณ , ์
๋ฐ์ดํธ๊ฐ ํจ์จ์ ์ผ๋ก ์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ๋ค์ํ ์ธ์ด์ ๋ค๋ฅธ ์ ๋ ฅ ๋ฐฉ์๊ณผ ํค๋ณด๋ ๋ ์ด์์์ ์ผ๋์ ๋์ธ์. ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ด ๋ค๋ฅธ ๋ฌธ์ ์งํฉ๊ณผ ์ ๋ ฅ ํ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ธ์.
6. ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง
๋๋ฐ์ด์ฑ๊ณผ ์ค๋กํ๋ง์ ํจ์ ์คํ ์๋๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์คํฌ๋กค ์ด๋ฒคํธ๋ ์ ๋ ฅ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ด ์์ฃผ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋๋ฐ์ด์ฑ: ํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋ ํ์์ผ ํจ์ ์คํ์ ์ง์ฐ์ํต๋๋ค.
- ์ค๋กํ๋ง: ์ง์ ๋ ์๊ฐ ๋ด์ ํจ์๋ฅผ ์ต๋ ํ ๋ฒ๋ง ์คํํฉ๋๋ค.
function debounce(func, delay) {
let timeout;
return function(...args) {
const context = this;
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(context, args), delay);
};
}
const handleInputChange = debounce((event) => {
// Perform expensive operation
console.log(event.target.value);
}, 250);
์์: ๋ชจ๋ ํค ์ ๋ ฅ๋ง๋ค API ํธ์ถ์ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ ์ ๋ ฅ ํ๋๋ ๋๋ฐ์ด์ฑ์ ์ฌ์ฉํ์ฌ ์ต์ ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์งง์ ์๊ฐ ๋์ ํ์ดํ์ ๋ฉ์ถ ๋๊น์ง API ํธ์ถ์ ์ง์ฐํจ์ผ๋ก์จ ๋ถํ์ํ API ํธ์ถ ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ๋ค์ํ ์ง์ญ์ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ์ง์ฐ ์๊ฐ์ ์ผ๋์ ๋์ธ์. ์ต์ ํ๋์ง ์์ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ ๋ฐ์์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง ์ง์ฐ ์๊ฐ์ ์ ์ ํ ์กฐ์ ํ์ธ์.
7. ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง
React Profiler๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ์์๋ ์๊ฐ์ ๊ธฐ๋กํ๊ณ ๋ถ์ํ์ฌ ์ต์ ํ๊ฐ ํ์ํ ์์ญ์ ์ ํํ ์ฐพ์๋ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
React Profiler ์ฌ์ฉ ๋ฐฉ๋ฒ:
- React ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๋กํ์ผ๋ง์ ํ์ฑํํฉ๋๋ค (๊ฐ๋ฐ ๋ชจ๋ ๋๋ ํ๋ก๋์ ํ๋กํ์ผ๋ง ๋น๋ ์ฌ์ฉ).
- ํ๋กํ์ผ๋ง ์ธ์ ๊ธฐ๋ก์ ์์ํฉ๋๋ค.
- ๋ถ์ํ๋ ค๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํฉ๋๋ค.
- ํ๋กํ์ผ๋ง ์ธ์ ์ ์ค์งํฉ๋๋ค.
- ํ๋กํ์ผ๋ง ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ๋๋ฆฐ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ์๋ณํฉ๋๋ค.
ํ๋กํ์ผ๋ฌ ๋ฐ์ดํฐ ํด์:
- ์ปดํฌ๋ํธ ๋ ๋๋ง ์๊ฐ: ๋ ๋๋ง์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํฉ๋๋ค.
- ๋ฆฌ๋ ๋๋ง ๋น๋: ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํฉ๋๋ค.
- Prop ๋ณ๊ฒฝ: ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ๋ props๋ฅผ ๋ถ์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ ๋ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ์ฅ์น ๊ธฐ๋ฅ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ๋ค์ํ ์ง์ญ ๋ฐ ์ฅ์น์์์ ์ฑ๋ฅ์ ๋ํ ํ์ค์ ์ธ ๊ทธ๋ฆผ์ ์ป๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
8. ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๋ฐ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๋ฐ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์๊ฐ๊ณผ SEO๋ฅผ ํฅ์์ํฌ ์ ์๋ ๊ธฐ์ ์ ๋๋ค.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR): ์๋ฒ์์ React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ์์ ํ ๋ ๋๋ง๋ HTML์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ๊ฒ์ ์์ง์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ํฌ๋กค๋งํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ ์ ์ฌ์ดํธ ์์ฑ(SSG): ๋น๋ ์ ๊ฐ ํ์ด์ง์ HTML์ ์์ฑํฉ๋๋ค. ์ด๋ ๋น๋ฒํ ์ ๋ฐ์ดํธ๊ฐ ํ์ ์๋ ์ฝํ ์ธ ์ค์ฌ ์น์ฌ์ดํธ์ ์ด์์ ์ ๋๋ค.
Next.js ๋ฐ Gatsby์ ๊ฐ์ ํ๋ ์์ํฌ๋ SSR ๋ฐ SSG๋ฅผ ์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: SSR ๋๋ SSG๋ฅผ ์ฌ์ฉํ ๋ CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)์ ์ฌ์ฉํ์ฌ ์์ฑ๋ HTML ํ์ด์ง๋ฅผ ์ ์ธ๊ณ ์๋ฒ์ ์บ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ์์น์ ๊ด๊ณ์์ด ์น์ฌ์ดํธ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ํ, ์ ์ ์ฝํ ์ธ ๋ฅผ ์์ฑํ ๋ ๋ค์ํ ์๊ฐ๋์ ํตํ๋ฅผ ์ผ๋์ ๋์ธ์.
9. ์น ์์ปค
์น ์์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์ธ ์ค๋ ๋์ ๋ณ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ JavaScript ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ UI๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: someData });
worker.onmessage = (event) => {
console.log('Received data from worker:', event.data);
};
// worker.js
self.onmessage = (event) => {
const data = event.data.data;
// Perform computationally intensive task
const result = processData(data);
self.postMessage(result);
};
์์: ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณต์กํ ๋ฐ์ดํฐ ๋ถ์ ๋๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด UI๊ฐ ๋ฉ์ถ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์น ์์ปค๋ฅผ ์ฌ์ฉํ ๋ ๋ค์ํ ๋ณด์ ์ ํ ๋ฐ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ธ์งํ์ธ์. ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ฐ ์ฅ์น์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ธ์.
10. ๋ชจ๋ํฐ๋ง ๋ฐ ์ง์์ ์ธ ๊ฐ์
์ฑ๋ฅ ์ต์ ํ๋ ์ง์์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ์ด ํ์ํ ์์ญ์ ์๋ณํ์ธ์.
- ์ค์ ์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง(RUM): Google Analytics, New Relic, Sentry์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ถ์ ํ์ธ์.
- ์ฑ๋ฅ ์์ฐ: ํ์ด์ง ๋ก๋ ์๊ฐ ๋ฐ ์ฒซ ๋ฐ์ดํธ๊น์ง์ ์๊ฐ๊ณผ ๊ฐ์ ์ฃผ์ ์งํ์ ๋ํ ์ฑ๋ฅ ์์ฐ์ ์ค์ ํ์ธ์.
- ์ ๊ธฐ ๊ฐ์ฌ: ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ธ ์ฑ๋ฅ ๊ฐ์ฌ๋ฅผ ์ํํ์ธ์.
๊ฒฐ๋ก
์ฑ๋ฅ์ ์ํด React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ ๊ฒ์ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ , ์ฌ์ฉ์์ ์์น๋ ์ฅ์น์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ๊ฒฝํ์ ์ฐ์ ์ํ๊ณ , ์ฒ ์ ํ ํ ์คํธํ๋ฉฐ, ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ฑ๋ฅ ์ต์ ํ ๋ ธ๋ ฅ์ ๊ธ๋ก๋ฒ ์ํฅ์ ๊ณ ๋ คํจ์ผ๋ก์จ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๋ฐฐ๊ฒฝ๊ณผ ๋ฌธํ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ํฌ๊ด์ ์ด๊ณ ์ ๊ทผ ๊ฐ๋ฅํ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.