Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 큐
- 4기
- pintos
- 사이드프로젝트
- HTML
- defee
- 자바
- 리액트
- CSS
- userprog
- Flutter
- 코드트리
- 스택
- 모션비트
- JavaScript
- 크래프톤 정글
- 시스템콜
- 티스토리챌린지
- 오블완
- Java
- corou
- 나만무
- 백준
- 크래프톤정글
- 알고리즘
- 자바스크립트
- Vue.js
- TiL
- 핀토스
- 소켓
Archives
- Today
- Total
미새문지
리액트 성능 최적화 방법 본문
728x90
리액트에서 성능 최적화를 위해 적용할 수 있는 방법
컴포넌트 렌더링 최적화
React.memo를 사용한 컴포넌트 메모이제이션
- React.memo는 함수형 컴포넌트를 메모이제이션하여 불필요한 렌더링을 방지한다.
- 사용 예시:
const MyComponent = React.memo((props) => {
return <div>{props.value}</div>;
});
- 렌더링 비용이 큰 컴포넌트나, 부모 컴포넌트의 재렌더링이 자식 컴포넌트의 렌더링을 불필요하게 유발할 때 사용된다.
useCallback으로 함수 메모이제이션
- useCallback은 동일한 함수를 재사용하여 자식 컴포넌트가 불필요하게 렌더링되지 않도록 한다.
- 사용 예시:
const handleClick = useCallback(() => {
console.log('Button clicked');
}, []);
- 함수가 자식 컴포넌트에 props로 전달될 때 사용된다.
useMemo로 계산 결과 메모이제이션
- useMemo는 계산 비용이 높은 연산 결과를 메모이제이션하여, 필요할 때만 재계산한다.
- 사용 예시:
const expensiveCalculation = useMemo(() => {
return someHeavyComputation(inputValue);
}, [inputValue]);
- 연산이 복잡하거나 빈번히 호출될 때 사용된다.
상태 관리 최적화
상태의 지역화
- 상위 컴포넌트에 모든 상태를 두기보다는, 하위 컴포넌트에서 개별적으로 관리할 수 있게 제한하여 렌더링 범위를 줄인다.
불변성 유지
- 상태를 직접 수정하지 않고 새 객체를 반환하여 변경사항을 관리한다.
const newArray = [...oldArray, newItem];
배치 업데이트
- React 18 이후로 배치 업데이트가 기본 동작이지만, flushSync를 활용하여 필요한 경우 동기화 업데이트를 사용할 수도 있다고 한다.
렌더링 제어
키 속성을 활용한 리스트 렌더링
- 리스트를 렌더링할 때 고유한 key를 사용하여 React가 변경된 항목만 업데이트하도록 한다.
// 잘못된 예시
{items.map((item, index) => <div key={index}>{item.name}</div>)}
// 올바른 예시
{items.map((item) => <div key={item.id}>{item.name}</div>)}
불필요한 렌더링 방지
- shouldcomponentupdate (클래스형 컴포넌트) 또는 React.memo를 사용하여 렌더링 조건을 제어할 수 있다.
코드 스플리팅
초기 로드 시간 단축
- React의 React.lazy와 Suspense를 사용하여 필요한 컴포넌트만 동적으로 로드한다.
- 사용 예시:
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
라우트별 코드 분리
- React Router와 함께 사용하여 페이지별로 필요한 코드만 로드한다.
- 예시:
const Home = React.lazy(() => import('./Home'));
const About = React.lazy(() => import('./About'));
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
이미지 및 리소스 최적화
이미지 최적화
- ebP, AVIF 같은 최신 포맷 사용
- 적절한 크기로 이미지 리사이징
- react-lazyload 라이브러리로 이미지 지연 로드
정적 리소스 캐싱
- 브라우저 캐싱 및 CDN(Content Delivery Network)을 활용
기타 성능 최적화 기법
이벤트 핸들러 최적화
- 이벤트 핸들러를 필요한 요소에만 적용하고, 이벤트 위임을 활용할 수 있다.
브라우저 최적화
- requestAnimationFrame과 debounce, throttle을 사용하여 스크롤 및 입력 이벤트를 최적화할 수 있다.
렌더링 우선순위 설정
- React 18의 useTransition을 사용하여 낮은 우선순위 작업을 비동기로 처리할 수 있다.
const [isPending, startTransition] = useTransition();
const handleClick = () => {
startTransition(() => {
setState(expensiveComputation());
});
};
728x90
'개발 TIL' 카테고리의 다른 글
www.google.com를 입력하면 발생하는 일 (0) | 2025.01.18 |
---|---|
브라우저 렌더링 파이프라인 (0) | 2025.01.17 |
Controlled Component와 Uncontrolled Component (0) | 2025.01.14 |
Props와 State (0) | 2025.01.13 |
이벤트 루프 (Event Loop) (0) | 2025.01.10 |