01 · Concept

Hooks 라이프사이클

React 함수형 컴포넌트에서 훅이 실행되는 순서와 타이밍을 이해합니다.

함수형 컴포넌트는 클래스 컴포넌트의 라이프사이클 메서드 대신 useEffect, useLayoutEffect 등의 훅으로 사이드 이펙트를 관리합니다. 각 훅이 Mount, Update, Unmount 단계에서 어떤 순서로 실행되는지 정확히 아는 것이 면접에서 자주 출제되는 핵심 주제입니다.

02 · Interactive Demo

훅 실행 순서 시각화

각 라이프사이클 단계를 실행하여 훅이 어떤 순서로 호출되는지 확인하세요.

컴포넌트가 DOM에 최초 삽입될 때
1useState (초기값 설정)state 초기값이 설정됨
2useMemo (초기 계산)메모이제이션된 값 최초 계산
3Render (JSX 반환)컴포넌트 함수 실행, JSX 반환
4DOM 업데이트React가 실제 DOM에 반영
5useLayoutEffectDOM 변경 직후, 브라우저 페인트 전 동기 실행
6브라우저 Paint브라우저가 화면에 픽셀을 그림
7useEffect브라우저 페인트 후 비동기 실행
03 · Code Example

코드 예시

실제 코드로 동작 원리를 확인하세요.

function Timer() {
  const [count, setCount] = useState(0);

  // 1. 마운트 시에만 실행 (빈 의존성 배열)
  useEffect(() => {
    console.log('마운트됨');
    const id = setInterval(() => {
      setCount(c => c + 1);
    }, 1000);

    // 언마운트 시 클린업
    return () => {
      console.log('언마운트 - 타이머 정리');
      clearInterval(id);
    };
  }, []);  // [] → componentDidMount + componentWillUnmount

  // 2. count가 변경될 때마다 실행
  useEffect(() => {
    document.title = `Count: ${count}`;
    console.log(`count 변경: ${count}`);
  }, [count]);  // [count] → count 변경 시마다 실행

  // 3. 매 렌더마다 실행 (의존성 배열 없음)
  useEffect(() => {
    console.log('매 렌더마다 실행');
  });  // 의존성 배열 생략 → 모든 렌더 후 실행

  return <div>{count}</div>;
}
04 · Interview Point

면접 핵심 질문

useEffect 브라우저가 화면을 페인트한 후 비동기적으로 실행됩니다. 의존성 배열에 따라 실행 시점이 달라집니다: 빈 배열 []이면 마운트 시 1회, 의존성이 있으면 해당 값 변경 시마다, 배열을 생략하면 매 렌더 후 실행됩니다. 클린업 함수는 다음 이펙트 실행 전 또는 언마운트 시 호출됩니다.
useEffect는 브라우저 페인트 후 비동기 실행되고,useLayoutEffect는 DOM 변경 직후 페인트 전 동기 실행됩니다.useLayoutEffect는 DOM 측정이나 레이아웃 기반 업데이트에 적합하며, 깜빡임(flicker) 없이 동기적으로 DOM을 조작할 수 있습니다. 대부분의 경우 useEffect를 사용하고, 레이아웃 측정이 필요한 경우에만 useLayoutEffect를 사용합니다.
클린업 함수는 useEffect에서 반환하는 함수로,이전 이펙트를 정리하는 역할을 합니다. 타이머 해제(clearInterval), 이벤트 리스너 제거, 구독 해제, 네트워크 요청 취소 등에 사용됩니다. 컴포넌트가 언마운트되거나 의존성이 변경되어다음 이펙트가 실행되기 전에 호출됩니다. 클린업을 누락하면 메모리 누수나 예상치 못한 동작이 발생할 수 있습니다.
React의 렌더링은 렌더 단계커밋 단계로 나뉩니다. 렌더 단계에서는 Virtual DOM을 생성하고 이전과 비교(diffing)합니다. 이 단계는 순수하고 부수효과가 없어야 합니다.

커밋 단계에서는 실제 DOM에 변경을 적용하고, useLayoutEffect → DOM 업데이트 → 브라우저 페인트 → useEffect 순서로 실행됩니다. Fiber 아키텍처에서 렌더 단계는 중단 가능하지만, 커밋 단계는 동기적으로 한 번에 실행됩니다.
클린업 함수는 두 가지 시점에 실행됩니다: 1. 컴포넌트가 언마운트될 때 2. 의존성이 변경되어 다음 이펙트가 실행되기 직전

필요한 이유: 타이머(setInterval), 이벤트 리스너, 구독(subscription), WebSocket 연결 등외부 리소스를 정리하지 않으면 메모리 누수가 발생합니다. 또한 이전 이펙트의 상태가 남아 stale closure 문제를 일으킬 수 있습니다.