React ์ค์ผ์ค๋ฌ์ ์์ ๋ฃจํ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ์์ ์คํ ํจ์จ์ฑ์ ๋์ฌ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์ต์ ํ ๊ธฐ์ ์ ๋ฐฐ์๋ณด์ธ์.
React ์ค์ผ์ค๋ฌ ์์ ๋ฃจํ ์ต์ ํ: ์์ ์คํ ํจ์จ์ฑ ๊ทน๋ํ
React์ ์ค์ผ์ค๋ฌ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฐ์ ์์๋ฅผ ์ง์ ํ๋ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ค์ผ์ค๋ฌ์ ์์ ๋ฃจํ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ณ ํจ๊ณผ์ ์ธ ์ต์ ํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ React ์ค์ผ์ค๋ฌ, ์์ ๋ฃจํ, ๊ทธ๋ฆฌ๊ณ ์์ ์คํ ํจ์จ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํ ์ ๋ต์ ๋ํด ์์๋ด ๋๋ค.
React ์ค์ผ์ค๋ฌ ์ดํดํ๊ธฐ
ํ์ด๋ฒ(Fiber) ์ํคํ ์ฒ๋ผ๊ณ ๋ ์๋ ค์ง React ์ค์ผ์ค๋ฌ๋ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฐ์ ์์๋ฅผ ์ง์ ํ๋ React์ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ํ์ด๋ฒ ์ด์ ์๋ React๊ฐ ๋๊ธฐ์ ์ฌ์กฐ์ (reconciliation) ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๊ณ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฐํ ์ ์์์ต๋๋ค. ์ค์ผ์ค๋ฌ๋ ๋์์ฑ(concurrency)์ ๋์ ํ์ฌ React๊ฐ ๋ ๋๋ง ์์ ์ ๋ ์๊ณ ์ค๋จ ๊ฐ๋ฅํ ๋จ์๋ก ๋๋ ์ ์๋๋ก ํฉ๋๋ค.
React ์ค์ผ์ค๋ฌ์ ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ด๋ฒ(Fiber): ํ์ด๋ฒ๋ ์์ ๋จ์๋ฅผ ๋ํ๋ ๋๋ค. ๊ฐ React ์ปดํฌ๋ํธ ์ธ์คํด์ค์๋ ์ปดํฌ๋ํธ, ์ํ, ๊ทธ๋ฆฌ๊ณ ํธ๋ฆฌ ๋ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํด๋น ํ์ด๋ฒ ๋ ธ๋๊ฐ ์์ต๋๋ค.
- ์์ ๋ฃจํ(Work Loop): ์์ ๋ฃจํ๋ ํ์ด๋ฒ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ DOM์ ๋ ๋๋งํ๋ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ์ฐ์ ์์ ์ง์ (Prioritization): ์ค์ผ์ค๋ฌ๋ ๊ธด๊ธ์ฑ์ ๋ฐ๋ผ ๋ค์ํ ์ ํ์ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ์ฌ ์ฌ์ฉ์ ์ํธ์์ฉ๊ณผ ๊ฐ์ ๋์ ์ฐ์ ์์์ ์์ ์ด ์ ์ํ๊ฒ ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋์์ฑ(Concurrency): React๋ ๋ ๋๋ง ์์ ์ ์ค๋จ, ์ผ์ ์ค์ง ๋๋ ์ฌ๊ฐํ ์ ์์ด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
React ์ค์ผ์ค๋ฌ ์์ ๋ฃจํ: ์ฌ์ธต ๋ถ์
์์ ๋ฃจํ๋ React ์ค์ผ์ค๋ฌ์ ์ฌ์ฅ์ ๋๋ค. ํ์ด๋ฒ ํธ๋ฆฌ๋ฅผ ์ํํ๊ณ , ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ๋ณ๊ฒฝ ์ฌํญ์ DOM์ ๋ ๋๋งํ๋ ์ญํ ์ ํฉ๋๋ค. ์์ ๋ฃจํ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ต์ ํ ์ ๋ต์ ๊ตฌํํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์์ ๋ฃจํ์ ๋จ๊ณ
์์ ๋ฃจํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ๋ ๋ ๋จ๊ณ(Render Phase): ๋ ๋ ๋จ๊ณ์์ React๋ ํ์ด๋ฒ ํธ๋ฆฌ๋ฅผ ์ํํ๋ฉฐ DOM์ ์ด๋ค ๋ณ๊ฒฝ์ด ํ์ํ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด ๋จ๊ณ๋ '์ฌ์กฐ์ (reconciliation)' ๋จ๊ณ๋ผ๊ณ ๋ ํฉ๋๋ค.
- ์์ ์์(Begin Work): React๋ ๋ฃจํธ ํ์ด๋ฒ ๋ ธ๋์์ ์์ํ์ฌ ํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ฉฐ ํ์ฌ ํ์ด๋ฒ๋ฅผ ์ด์ ํ์ด๋ฒ(์๋ ๊ฒฝ์ฐ)์ ๋น๊ตํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ์์ ์๋ฃ(Complete Work): React๊ฐ ํธ๋ฆฌ๋ฅผ ๋ค์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ ์ ๋ฐ์ดํธ์ ํจ๊ณผ๋ฅผ ๊ณ์ฐํ๊ณ DOM์ ์ ์ฉํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋นํฉ๋๋ค.
- ์ปค๋ฐ ๋จ๊ณ(Commit Phase): ์ปค๋ฐ ๋จ๊ณ์์ React๋ ๋ณ๊ฒฝ ์ฌํญ์ DOM์ ์ ์ฉํ๊ณ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ (Before Mutation): React๋ `getSnapshotBeforeUpdate`์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
- ๋ณ๊ฒฝ(Mutation): React๋ ์์๋ฅผ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์์ ํ์ฌ DOM ๋ ธ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๋ ์ด์์(Layout): React๋ `componentDidMount` ๋ฐ `componentDidUpdate`์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค. ๋ํ ref๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ ์ด์์ ํจ๊ณผ๋ฅผ ์ค์ผ์ค๋งํฉ๋๋ค.
๋ ๋ ๋จ๊ณ๋ ๋ ๋์ ์ฐ์ ์์์ ์์ ์ด ๋์ฐฉํ๋ฉด ์ค์ผ์ค๋ฌ์ ์ํด ์ค๋จ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปค๋ฐ ๋จ๊ณ๋ ๋๊ธฐ์์ด๋ฏ๋ก ์ค๋จ๋ ์ ์์ต๋๋ค.
์ฐ์ ์์ ์ง์ ๋ฐ ์ค์ผ์ค๋ง
React๋ ์ฐ์ ์์ ๊ธฐ๋ฐ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ๊ฐ ์ฒ๋ฆฌ๋๋ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ ๋ฐ์ดํธ๋ ๊ธด๊ธ์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฐ์ ์์๊ฐ ํ ๋น๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ ์์ ์์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฆ์ ์ฐ์ ์์(Immediate Priority): ์ฌ์ฉ์ ์ ๋ ฅ(์: ํ ์คํธ ํ๋์ ์ ๋ ฅ)๊ณผ ๊ฐ์ด ์ฆ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ธด๊ธ ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ฉ์ ์ฐจ๋จ ์ฐ์ ์์(User Blocking Priority): ์ ๋๋ฉ์ด์ ์ด๋ ์ ํ๊ณผ ๊ฐ์ด ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฐจ๋จํ๋ ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ณดํต ์ฐ์ ์์(Normal Priority): ์ ์ฝํ ์ธ ๋ ๋๋ง์ด๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ์ ๊ฐ์ ๋๋ถ๋ถ์ ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฎ์ ์ฐ์ ์์(Low Priority): ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด๋ ๋ถ์๊ณผ ๊ฐ์ ์ค์ํ์ง ์์ ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ ํด ์ฐ์ ์์(Idle Priority): ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ๋ ๋ณต์กํ ๊ณ์ฐ ์ํ๊ณผ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํด ์ํ๊ฐ ๋ ๋๊น์ง ์ฐ๊ธฐํ ์ ์๋ ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
React๋ `requestIdleCallback` API(๋๋ ํด๋ฆฌํ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฎ์ ์ฐ์ ์์ ์์ ์ ์ค์ผ์ค๋งํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ์ ํผํ ์ ์๋๋ก ํฉ๋๋ค.
ํจ์จ์ ์ธ ์์ ์คํ์ ์ํ ์ต์ ํ ๊ธฐ๋ฒ
React ์ค์ผ์ค๋ฌ์ ์์ ๋ฃจํ๋ฅผ ์ต์ ํํ๋ ค๋ฉด ๋ ๋ ๋จ๊ณ์์ ์ํํด์ผ ํ๋ ์์ ์ ์์ ์ต์ํํ๊ณ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ๋๋๋ก ํด์ผ ํฉ๋๋ค. ๋ค์์ ์์ ์คํ ํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ๋ฒ์ ๋๋ค:
1. ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
๋ฉ๋ชจ์ด์ ์ด์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ํจ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ณ ๋์ผํ ์ ๋ ฅ์ด ๋ค์ ๋ฐ์ํ ๋ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ๋ฒ์ ๋๋ค. React์์๋ ์ปดํฌ๋ํธ์ ๊ฐ ๋ชจ๋์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
`React.memo`
`React.memo`๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ ๋๋ค. props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก `React.memo`๋ props์ ๋ํด ์์ ๋น๊ต๋ฅผ ์ํํฉ๋๋ค. `React.memo`์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉ์ ์ ์ ๋น๊ต ํจ์๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
์์:
import React from 'react';
const MyComponent = React.memo(function MyComponent(props) {
// Component logic
return (
<div>
{props.value}
</div>
);
});
export default MyComponent;
`useMemo`
`useMemo`๋ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ํ ์ ๋๋ค. ๊ฐ์ ๊ณ์ฐํ๋ ํจ์์ ์์กด์ฑ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์ด ํจ์๋ ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ์คํ๋ฉ๋๋ค. ์ด๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ฑฐ๋ ์์ ์ ์ธ ์ฐธ์กฐ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์:
import React, { useMemo } from 'react';
function MyComponent(props) {
const expensiveValue = useMemo(() => {
// Perform an expensive calculation
return computeExpensiveValue(props.data);
}, [props.data]);
return (
<div>
{expensiveValue}
</div>
);
}
`useCallback`
`useCallback`์ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ํ ์ ๋๋ค. ํจ์์ ์์กด์ฑ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์ด ํจ์๋ ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ์์ฑ๋ฉ๋๋ค. ์ด๋ `React.memo`๋ฅผ ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ์ ์ ๋ฌํ ๋ ์ ์ฉํฉ๋๋ค.
์์:
import React, { useCallback } from 'react';
function MyComponent(props) {
const handleClick = useCallback(() => {
// Handle click event
console.log('Clicked!');
}, []);
return (
<button onClick={handleClick}>
ํด๋ฆญํ์ธ์
</button>
);
}
2. ๊ฐ์ํ(Virtualization)
๊ฐ์ํ(windowing์ด๋ผ๊ณ ๋ ํจ)๋ ๊ธด ๋ชฉ๋ก์ด๋ ํ ์ด๋ธ์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋ชจ๋ ํญ๋ชฉ์ ํ ๋ฒ์ ๋ ๋๋งํ๋ ๋์ , ๊ฐ์ํ๋ ํ์ฌ ๋ทฐํฌํธ์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ๋ฉด ์ ํญ๋ชฉ์ด ๋ ๋๋ง๋๊ณ ์ด์ ํญ๋ชฉ์ ์ ๊ฑฐ๋ฉ๋๋ค.
๋ช๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React๋ฅผ ์ํ ๊ฐ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค:
- `react-window`: ๊ธด ๋ชฉ๋ก๊ณผ ํ ์ด๋ธ์ ๋ ๋๋งํ๊ธฐ ์ํ ๊ฒฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- `react-virtualized`: ๋ ๊ด๋ฒ์ํ ๊ฐ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ถ ์ข ํฉ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
`react-window` ์ฌ์ฉ ์์:
import React from 'react';
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>
ํ {index}
</div>
);
function MyListComponent(props) {
return (
<FixedSizeList
height={400}
width={300}
itemSize={30}
itemCount={props.items.length}
>
{Row}
</FixedSizeList>
);
}
3. ์ฝ๋ ๋ถํ (Code Splitting)
์ฝ๋ ๋ถํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
React๋ ์ฝ๋ ๋ถํ ์ ๊ตฌํํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค:
- `React.lazy`์ `Suspense`: `React.lazy`๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๊ณ , `Suspense`๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ๋์ ๊ฐ์ ธ์ค๊ธฐ(Dynamic Imports): ๋์ ๊ฐ์ ธ์ค๊ธฐ(`import()`)๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํ ์ ์์ต๋๋ค.
`React.lazy`์ `Suspense` ์ฌ์ฉ ์์:
import React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>๋ก๋ฉ ์ค...</div>}>
<MyComponent />
</Suspense>
);
}
4. ๋๋ฐ์ด์ฑ(Debouncing)๊ณผ ์ค๋กํ๋ง(Throttling)
๋๋ฐ์ด์ฑ๊ณผ ์ค๋กํ๋ง์ ํจ์๊ฐ ์คํ๋๋ ๋น๋๋ฅผ ์ ํํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ์คํฌ๋กค ์ด๋ฒคํธ๋ ๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ์ ๊ฐ์ด ์์ฃผ ํธ๋ฆฌ๊ฑฐ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋๋ฐ์ด์ฑ(Debouncing): ๋๋ฐ์ด์ฑ์ ํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋ ๋๊น์ง ํจ์ ์คํ์ ์ง์ฐ์ํต๋๋ค.
- ์ค๋กํ๋ง(Throttling): ์ค๋กํ๋ง์ ํจ์๊ฐ ์คํ๋๋ ๋น๋๋ฅผ ์ ํํฉ๋๋ค. ํจ์๋ ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ ๋ด์ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
๋๋ฐ์ด์ฑ์ ์ํ `lodash` ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์์:
import React, { useState, useEffect } from 'react';
import { debounce } from 'lodash';
function MyComponent() {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
};
const debouncedHandleChange = debounce(handleChange, 300);
useEffect(() => {
return () => {
debouncedHandleChange.cancel();
};
}, [debouncedHandleChange]);
return (
<input type="text" onChange={debouncedHandleChange} />
);
}
5. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ํผํ๊ธฐ
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ ๋ฌธ์ ์ ๊ฐ์ฅ ํํ ์์ธ ์ค ํ๋๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋๋ค. ์ด๋ฌํ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ์ ๋ต์ด ์์ต๋๋ค:
- ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Immutable Data Structures): ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค. Immutable.js๋ Immer์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์์ ์ปดํฌ๋ํธ(Pure Components): ํด๋์ค ์ปดํฌ๋ํธ๋ `React.PureComponent`๋ฅผ ํ์ฅํ ์ ์๋๋ฐ, ์ด๋ ๋ฆฌ๋ ๋๋ง ์ ์ props์ state๋ฅผ ์๊ฒ ๋น๊ตํฉ๋๋ค. ์ด๋ ํจ์ํ ์ปดํฌ๋ํธ์ `React.memo`์ ์ ์ฌํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ํค(key)๋ฅผ ๊ฐ์ง ๋ชฉ๋ก: ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ ๋ ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ ํค๊ฐ ์๋์ง ํ์ธํ์ธ์. ์ด๋ ํญ๋ชฉ์ด ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ฌ์ ๋ ฌ๋ ๋ React๊ฐ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ธ๋ผ์ธ ํจ์ ๋ฐ ๊ฐ์ฒด๋ฅผ props๋ก ์ ๋ฌํ์ง ์๊ธฐ: ์ปดํฌ๋ํธ์ ๋ ๋ ๋ฉ์๋ ๋ด์์ ์ธ๋ผ์ธ์ผ๋ก ์ ํจ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋๋ผ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ด๋ฅผ ํผํ๊ธฐ ์ํด `useCallback`๊ณผ `useMemo`๋ฅผ ์ฌ์ฉํ์ธ์.
6. ํจ์จ์ ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ
์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ์ํ๋๋ ์์ ์ ์ต์ํํ์ฌ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ์ธ์. ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ์ง์ ๋ณต์กํ ๊ณ์ฐ์ด๋ DOM ์กฐ์์ ์ํํ๋ ๊ฒ์ ํผํ์ธ์. ๋์ , ์ด๋ฌํ ์์ ์ ๋น๋๊ธฐ ์์ ์ผ๋ก ์ฐ๊ธฐํ๊ฑฐ๋ ๊ณ์ฐ๋์ด ๋ง์ ์์ ์๋ ์น ์์ปค(web worker)๋ฅผ ์ฌ์ฉํ์ธ์.
7. ํ๋กํ์ผ๋ง ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ธฐ์ ์ผ๋ก ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ์ต์ ํ๊ฐ ํ์ํ ๋ถ๋ถ์ ์๋ณํ์ธ์. React ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ์๊ฐ ๊ฒ์ฌ, ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ์๋ณ, ํธ์ถ ์คํ ๋ถ์ ๋ฑ ๊ฐ๋ ฅํ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ํ๊ฒฝ์์ ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ถ์ ํ๊ณ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ธ์.
์ค์ ์ฌ๋ก ๋ฐ ์ผ์ด์ค ์คํฐ๋
์ด๋ฌํ ์ต์ ํ ๊ธฐ๋ฒ์ด ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์ค์ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์์๊ฑฐ๋ ์ํ ๋ชฉ๋ก: ๋ง์ ์ํ ๋ชฉ๋ก์ ํ์ํ๋ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ ๊ฐ์ํ๋ฅผ ํตํด ์คํฌ๋กค ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด ์๋์ด๋ ์ฅ๋ฐ๊ตฌ๋ ์ํ๋ง ๋ณ๊ฒฝ๋ ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ์ธํฐ๋ํฐ๋ธ ๋์๋ณด๋: ์ฌ๋ฌ ์ธํฐ๋ํฐ๋ธ ์ฐจํธ์ ์์ ฏ์ด ์๋ ๋์๋ณด๋๋ ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ์ฌ ํ์ํ ์ปดํฌ๋ํธ๋ง ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ ๋ ฅ ์ด๋ฒคํธ์ ๋๋ฐ์ด์ฑ์ ์ ์ฉํ๋ฉด ๊ณผ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๊ณ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์์ ๋ฏธ๋์ด ํผ๋: ๋ง์ ๊ฒ์๋ฌผ ์คํธ๋ฆผ์ ํ์ํ๋ ์์ ๋ฏธ๋์ด ํผ๋๋ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ด๋ ๊ฒ์๋ฌผ๋ง ๋ ๋๋งํ ์ ์์ต๋๋ค. ๊ฒ์๋ฌผ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ณ ์ด๋ฏธ์ง ๋ก๋ฉ์ ์ต์ ํํ๋ฉด ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React ์ค์ผ์ค๋ฌ์ ์์ ๋ฃจํ๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ค์ผ์ค๋ฌ์ ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ ๋ฉ๋ชจ์ด์ ์ด์ , ๊ฐ์ํ, ์ฝ๋ ๋ถํ , ๋๋ฐ์ด์ฑ, ๊ทธ๋ฆฌ๊ณ ์ ์คํ ๋ ๋๋ง ์ ๋ต๊ณผ ๊ฐ์ ๊ธฐ๋ฒ์ ์ ์ฉํจ์ผ๋ก์จ ์์ ์คํ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ธฐ์ ์ผ๋ก ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ต์ ํ ์ ๋ต์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ค์ํ ์ฅ์น์ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ถ๊ทน์ ์ผ๋ก ์ฌ์ฉ์ ์ฐธ์ฌ๋์ ๋ง์กฑ๋ ์ฆ๊ฐ๋ก ์ด์ด์ง๋๋ค.