useEffect vs useLayoutEffect

2025. 10. 27. 21:25·Frontend/React

리액트에서 사이드 이펙트를 다루기 위해 자주 사용하는 훅이 useEffect와 useLayoutEffect이다. 둘 다 컴포넌트가 마운트된 후 동작하지만, 실행 시점과 사용 목적이 다르다.

 

1. 기본 개념

훅 실행 시점 특징 주로 사용하는 상황
useEffect 화면 렌더링 후 비동기적으로 실행 데이터 요청, 구독, 이벤트 등록 등, 화면 깜빡임이 크게 문제되지 않는 작업
useLayoutEffect 화면 렌더링 직전 동기적으로 실행 DOM 측정, 레이아웃 조정 등, 화면이 그려지기 전에 처리해야 하는 작업

 

핵심 포인트

  • 둘 다 마운트 후 동작하지만, useLayoutEffect는 화면 그리기 전에 실행되어 레이아웃을 수정해도 깜빡임이 발생하지 않음.
  • useEffect는 화면 렌더링 이후 실행되므로, 화면이 먼저 그려지고 나서 사이드 이펙트가 발생함.

 

2. 사용 사례와 코드 예시

useEffect

주로 ‘비동기 사이드 이펙트’ 처리에 사용하며, 화면 렌더링 후 실행되므로 화면 깜빡임이 문제가 되지 않는 작업에 적합하다.

 

1. 데이터 요청 / API 호출

  • 컴포넌트가 마운트될 때 서버에서 데이터를 가져와 상태를 업데이트
  • 화면 렌더링 후 실행되므로 초기 화면이 바로 그려짐
useEffect(() => {
  fetch("/api/posts")
    .then(res => res.json())
    .then(data => setPosts(data));
}, []);

 

2. 구독 / 이벤트 등록

  • 브라우저 이벤트, WebSocket 구독 등
  • useEffect에서 반환함수로 정리(cleanup) 가능
useEffect(() => {
  const handleResize = () => setWidth(window.innerWidth);
  window.addEventListener("resize", handleResize);
  return () => window.removeEventListener("resize", handleResize);
}, []);

 

3. 로컬 스토리지, 로그 기록, Analytics

  • UI 렌더링에 직접 영향을 주지 않는 작업
  • 화면 깜빡임 없이 안전하게 수행 가능

정리: 화면이 먼저 그려져도 문제 없는 ‘비동기적, 렌더링 비의존적’ 작업 처리용

 

useLayoutEffect

주로 ‘동기 사이드 이펙트’ 처리에 사용하며, 화면이 그려지기 직전에 실행되어 레이아웃, DOM 측정, 스타일 조정 등 렌더링 직전 작업에 적합하다.

1. DOM 크기/위치 측정

  • getBoundingClientRect() 등으로 요소 위치, 크기 측정
  • 화면 깜빡임 없이 즉시 상태에 반영 가능
useLayoutEffect(() => {
  if (boxRef.current) {
    setHeight(boxRef.current.getBoundingClientRect().height);
  }
}, []);

 

2. 스크롤 위치 조정

  • 모달 오픈 시 스크롤을 특정 위치로 이동
  • 화면이 잠깐이라도 잘못 그려지면 UX 문제 발생 → useLayoutEffect 사용

3. 스타일 / 애니메이션 초기 설정

  • 렌더링 전에 DOM 스타일을 변경하거나 트랜지션 초기화
  • 화면 깜빡임 없이 사용자 경험 제공

정리: 화면 렌더링 전에 ‘동기적, 렌더링 의존적’ 작업 처리용

'Frontend > React' 카테고리의 다른 글

React Context API vs Redux: 언제, 무엇을 써야할까?  (0) 2025.10.27
상태(stateful) & 비상태(stateless) 컴포넌트  (0) 2025.10.25
React에서 비동기 처리 최적화하기  (0) 2025.10.25
useRef 자세히 알아보기  (0) 2025.10.24
useEffect의 cleanup 함수 알아보기  (0) 2025.10.24
'Frontend/React' 카테고리의 다른 글
  • React Context API vs Redux: 언제, 무엇을 써야할까?
  • 상태(stateful) & 비상태(stateless) 컴포넌트
  • React에서 비동기 처리 최적화하기
  • useRef 자세히 알아보기
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;)
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
        • Web Development
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • React
        • Next.js
        • Flutter
        • Testing
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test
        • LeetCode
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML & CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    testing
    이벤트
    Time complexity and Space complexity
    CPU scheduling algorithm
    leetcode
    Javascript Essentials
    프론트엔드 성능 최적화 가이드
    모던 자바스크립트 Deep Dive
    Threads and Multithreading
    js pattern
    Shared resources
    mobile app
    커리어
    polylingo
    TCP/IP
    VoiceJournal
    Binary Tree BFS
    database
    need a database
    Network
    DOM
    Operating System
    How memory manage data
    스코프
    indie hacker
    자바스크립트
    structure of os
    딥다이브
    Data Structure
    자바스크립트 딥다이브
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
useEffect vs useLayoutEffect
상단으로

티스토리툴바