
리액트 애플리케이션에서 렌더링이란, 컴포넌트가 현재 가지고 있는 props와 state 값을 기반으로 UI를 구성하고 이를 DOM에 반영하는 과정을 의미합니다. 이 과정은 브라우저가 HTML과 CSS 리소스를 기반으로 웹페이지 UI를 그리는 전통적인 렌더링과 구별됩니다. 이번 블로그에서는 리액트의 렌더링 과정과 이를 최적화하는 방법을 예제를 통해 살펴보겠습니다.
리액트의 렌더링 과정은 크게 두 가지로 나눌 수 있습니다: 렌더 단계와 커밋 단계.
렌더링이 발생하는 주요 시점은 다음과 같습니다:
setState가 실행되는 경우: setState 호출을 통해 상태가 변경되면 리렌더링이 발생합니다.forceUpdate가 실행되는 경우: 상태나 props가 아닌 다른 값에 의해 렌더링이 필요할 때 강제로 리렌더링을 발생시킵니다.useState의 setter가 실행되는 경우: useState의 두 번째 배열 요소인 setter 함수가 실행되면 리렌더링이 발생합니다.useReducer의 dispatch가 실행되는 경우: useReducer의 dispatch 함수가 실행되면 리렌더링이 발생합니다.key props가 변경되는 경우: key는 리렌더링 동안 컴포넌트를 고유하게 식별하는 값으로, key가 변경되면 리렌더링이 발생합니다.렌더링 과정을 최소화하고 최적화하는 것은 사용자 경험을 향상시키는 중요한 요소입니다. 리액트에서 제공하는 다양한 최적화 기법 중 일부를 살펴보겠습니다.
메모이제이션은 동일한 입력에 대해 함수의 결과를 저장하여 불필요한 계산을 피하는 기술입니다. 리액트에서는 React.memo와 useMemo 훅을 사용하여 컴포넌트와 함수의 메모이제이션을 구현할 수 있습니다.
React.memoReact.memo는 함수 컴포넌트를 메모이제이션하여 동일한 props로 재호출될 때, 리렌더링을 방지합니다.
import React from 'react';
const MyComponent = React.memo(({ value }) => {
console.log('렌더링 발생');
return <div>{value}</div>;
});
export default MyComponent;
useMemouseMemo는 함수의 결과를 메모이제이션하여 불필요한 계산을 방지합니다.
import React, { useState, useMemo } from 'react';
function ExpensiveComponent({ value }) {
const expensiveCalculation = useMemo(() => {
console.log('비싼 계산 수행');
return value * 2;
}, [value]);
return <div>{expensiveCalculation}</div>;
}
export default ExpensiveComponent;
shouldComponentUpdate와 React.PureComponent클래스 컴포넌트에서 shouldComponentUpdate 메서드를 사용하여 리렌더링 여부를 제어할 수 있습니다. React.PureComponent를 사용하면 기본적으로 shouldComponentUpdate 메서드에서 얕은 비교를 수행하여 리렌더링을 최적화합니다.
import React, { PureComponent } from 'react';
class MyPureComponent extends PureComponent {
render() {
console.log('렌더링 발생');
return <div>{this.props.value}</div>;
}
}
export default MyPureComponent;
모든 부분을 최적화하려는 시도는 오히려 코드의 복잡성을 증가시키고 유지보수를 어렵게 만들 수 있습니다. 따라서 꼭 필요한 부분에만 메모이제이션을 추가하는 것이 좋습니다.
렌더링 비용이 높은 애플리케이션의 경우, 최적화를 통해 성능을 크게 향상시킬 수 있습니다. 모든 부분에 메모이제이션을 적용하여 불필요한 렌더링을 방지하는 것도 하나의 방법입니다.
리액트 애플리케이션의 렌더링 과정을 이해하고 이를 최적화하는 것은 사용자 경험을 향상시키는 중요한 요소입니다. 메모이제이션을 통해 불필요한 렌더링을 방지하고, 필요한 경우에만 최적화를 적용하여 성능을 향상시킬 수 있습니다.