티스토리 뷰
React에서 useEffect
훅의 적절한 이해와 사용은 효과적인 컴포넌트 생명주기 관리의 핵심입니다. 이 포스팅은 useEffect
의 실행 시점, 컴포넌트의 마운트, 리렌더링, 그리고 마운트 해제 과정에서 useEffect
가 어떻게 작동하는지에 대한 세밀한 이해를 제공합니다. 또한, React의 렌더링과 마운트 과정에 대한 기본적인 이해도 함께 다룹니다.
useEffect의 기본
useEffect
는 함수형 컴포넌트에서 사이드 이펙트를 처리하기 위해 사용되는 React 훅입니다. 사이드 이펙트에는 데이터 fetching, 구독 설정 및 해제, 수동 DOM 조작 등이 포함됩니다. 이 훅은 컴포넌트 렌더링 결과가 DOM에 반영된 후에 실행되어, 컴포넌트 로직과 부수 효과 로직을 분리할 수 있게 해 줍니다.
useEffect의 기본 구조
useEffect(() => {
// 부수 효과를 실행할 코드
}, [dependencies]); // 의존성 배열
useEffect는 React 컴포넌트가 렌더링될 때마다 특정 작업을 수행할 수 있도록 해주는 훅입니다. 첫 번째 인자로는 실행할 콜백 함수를, 두 번째 인자로는 의존성 배열(dependencies array)을 받습니다. 의존성 배열을 통해 특정 상태나 props가 변경될 때만 효과를 실행할 수 있습니다.
useEffect는 언제 실행될까?
1. 마운트(Mounting) 시점
- 렌더링: React 컴포넌트의 렌더링 과정은 컴포넌트 함수/클래스의 실행으로 시작됩니다. 이때, JSX 코드가 React 엘리먼트로 변환되고, 결과적으로 가상 DOM이 생성됩니다.
- 마운트: 마운트는 컴포넌트가 처음으로 DOM에 삽입되는 과정을 의미합니다. 이 과정에서
useEffect
는 컴포넌트의 첫 렌더링이 완료되고 실제 DOM 업데이트가 이루어진 직후에 실행됩니다. 즉, 사용자에게 UI가 표시된 직후에 부수 효과를 수행합니다.
마운트 시점에서 useEffect의 실행
React 컴포넌트의 마운트는 크게 두 단계로 나눌 수 있습니다. 렌더링 단계와 커밋 단계입니다. 렌더링 단계에서는 React가 JSX를 평가하여 가상 DOM을 생성하고, 커밋 단계에서는 변경 사항을 실제 DOM에 반영합니다. useEffect는 이 과정의 맨 마지막에, 즉 커밋 단계가 완료된 후에 실행됩니다.
- 렌더링 단계: 컴포넌트의 JSX가 평가되어 가상 DOM이 생성됩니다. 이 단계에서는 아직 useEffect가 실행되지 않습니다.
- 커밋 단계: 변경 사항이 실제 DOM에 반영됩니다. 모든 DOM 업데이트가 완료되면, 마운트가 완료된 것으로 간주됩니다.
- useEffect 실행: 커밋 단계 이후, React는 등록된 모든 useEffect 함수를 비동기적으로 실행합니다.
2. 업데이트(Updating) 및 리렌더링
- 업데이트: 컴포넌트의 상태(state)나 속성(props)이 변경될 때 발생합니다. 이러한 변경은 컴포넌트의 재평가와 재렌더링을 유발합니다.
- 리렌더링:
useEffect
는 의존성 배열에 명시된 변수가 변경될 때마다 리렌더링 후에 다시 실행됩니다. 의존성 배열이 비어 있으면 컴포넌트가 리렌더링될 때마다 실행되지 않으며, 배열이 전혀 제공되지 않으면 매 렌더링 후에 실행됩니다.
3. 언마운트(Unmounting) 시점
- 언마운트: 컴포넌트가 DOM에서 제거되는 것을 말합니다.
useEffect
내부에서 반환한 클린업 함수는 컴포넌트가 언마운트될 때 호출되어, 이벤트 리스너 제거나 타이머 해제 등의 정리 작업을 수행합니다.
useEffect의 자세한 실행 시점 - 렌더링, 커밋, 마운트 과정과 관련하여
React에서의 렌더링, 커밋, 마운트 과정과 관련하여 `useEffect`의 실행 시점을 좀더 자세하게 알아보겠습니다. 이 과정들은 React가 UI를 생성하고 업데이트하는 방식을 이해하는 데 중요합니다.
렌더링(Rendering)
- 정의: 렌더링은 React가 JSX나 컴포넌트로부터 가상 DOM을 생성하는 과정입니다. 이 과정에서 React는 컴포넌트의 상태(state)와 속성(props)을 바탕으로 UI를 어떻게 표시할지 결정합니다. 이를 "버츄얼 렌더링"이라고 할 수 있습니다.
- 비교: 렌더링은 실제 DOM에 아직 반영되지 않았기 때문에, 사용자는 이 단계에서의 변화를 볼 수 없습니다. 이는 마치 화면에 그려질 그림을 스케치하는 단계와 비슷합니다.
커밋(Commit)
- 정의: 커밋 단계는 React가 렌더링 과정에서 생성한 가상 DOM의 변경 사항을 실제 DOM에 반영하는 과정입니다. 이 단계에서 변경 사항이 실제로 적용되어 사용자가 UI의 변화를 볼 수 있게 됩니다.
- 비교: 커밋은 버츄얼 렌더링된 결과를 실제 화면에 그리는 단계입니다. 가상 DOM과 실제 DOM의 차이를 비교하고, 필요한 최소한의 DOM 업데이트를 수행하여 성능을 최적화합니다.
마운트(Mounting)
- 정의: 마운트는 컴포넌트가 처음으로 DOM에 삽입되는 과정을 의미합니다. 이는 컴포넌트가 처음으로 화면에 그려지는 순간입니다.
- 비교: 마운트는 컴포넌트의 생명주기에서 초기 렌더링 단계에 해당합니다. 컴포넌트가 처음으로 사용자에게 보여지는 순간이며, 이 때 useEffect의 코드가 실행됩니다(의존성 배열이 없거나 지정된 경우).
useEffect의 실행 시점은?
- 실행 시점: useEffect는 커밋 단계가 완료된 후에 실행됩니다. 즉, 변경 사항이 실제 DOM에 반영되고 나서, 그리고 사용자가 최신의 UI를 볼 수 있게 된 후에 useEffect 내의 코드가 실행됩니다.
- 비교: useEffect는 React가 UI를 실제 화면에 그린 직후에 부수 효과를 처리하기 위해 설계되었습니다. 이는 데이터 fetching, 이벤트 리스너 설정, 그리고 기타 필요한 사이드 이펙트를 안전하게 수행할 수 있는 시점입니다.
이러한 과정을 통해 React는 효율적인 UI 업데이트와 성능 최적화를 달성합니다. 렌더링에서 커밋, 그리고 마운트에 이르기까지 각 단계는 React 애플리케이션의 생명주기를 구성하며, `useEffect`는 이 생명주기에 맞춰 부수 효과를 관리하는 데 핵심적인 역할을 합니다.
서로 다른 useEffect의 실행 순서
React는 useEffect 호출을 등록한 순서대로 실행합니다. 즉, 한 컴포넌트 내에서 여러 useEffect가 있을 경우, useEffect
는 컴포넌트 내에서 정의된 순서대로 실행됩니다. 소스코드 상으로는 위에서부터 아래로 실행된다는 것을 의미합니다. 이는 개발자가 코드를 통해 실행 순서를 예측하고 제어할 수 있게 해 줍니다. 다만, 서로 다른 컴포넌트 간의 useEffect
실행 순서는 동일한 순서로 보장되지 않습니다.
이러한 실행 시점과 순서의 이해는 useEffect
를 통해 다양한 부수 효과를 효과적으로 관리하고, React 애플리케이션의 성능을 최적화하는 데 중요합니다. useEffect
의 적절한 사용은 컴포넌트의 생명주기를 명확하게 관리하고, 예측 가능한 UI 업데이트를 보장하는 데 필수적입니다.
'Programming' 카테고리의 다른 글
[React.js] useEffect를 사용하면 안되는 대표적인 케이스 (0) | 2024.02.10 |
---|