반응형
✅ useLayoutEffect란?
📌 컴포넌트가 화면에 그려지기 직전에 동작하는 리액트 훅입니다.
🕒 실행 타이밍:
훅 실행 시점
useEffect | 화면에 렌더링된 후 (비동기) |
useLayoutEffect | DOM 업데이트 전 (동기) |
❓언제 useLayoutEffect를 써야 해?
✅ DOM의 크기나 위치를 측정하거나
✅ 애니메이션 라이브러리(예: GSAP)를 사용할 때!
이유는:
- useEffect는 화면이 그려진 후에 실행되기 때문에, 애니메이션 시작 전에 깜빡임(flicker)이 생길 수 있음
- useLayoutEffect는 렌더링 직후, 브라우저가 화면에 반영하기 전에 실행돼서 더 자연스럽게 애니메이션 작동
💡 예제 비교
import { useEffect, useLayoutEffect } from "react";
import { gsap } from "gsap";
function MyComponent() {
// 애니메이션: 화면 렌더 후 실행 (깜빡임 생길 수 있음)
useEffect(() => {
gsap.to(".box", { x: 200 });
}, []);
// 애니메이션: 화면에 반영되기 전에 실행 (더 부드러움)
useLayoutEffect(() => {
gsap.to(".box", { x: 200 });
}, []);
return <div className="box">Hello</div>;
}
⛔ 주의사항
- useLayoutEffect는 동기로 실행되기 때문에, 너무 무거운 작업을 하면 앱이 버벅일 수 있습니다.
- Server Side Rendering(예: Next.js)에서는 useLayoutEffect가 경고를 띄울 수 있어요.
- 이런 경우엔 조건문으로 typeof window !== 'undefined'로 감싸거나, 동적 import로 처리합니다.
✅ 정리 요약
항목useEffectuseLayoutEffect
실행 시점 | 화면 렌더 후 | 화면 렌더 직전 |
적합한 용도 | API 요청, 로깅 | DOM 크기 측정, 애니메이션 |
GSAP 쓸 때 | ❌ 깜빡임 발생 | ✅ 부드럽게 실행됨 |
서버 환경 (Next.js) | 안전 | 주의 필요 (조건문 필수) |
서버 렌더링에서 useLayoutEffect 사용하기
//useIsomorphicLayoutEffect 훅을 사용
import { useEffect, useLayoutEffect } from 'react';
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
export default useIsomorphicLayoutEffect;
서버일 경우 useLayoutEffect를 useEffect로 변경
😊참조:https://www.howdy-mj.me/react/useEffect-and-useLayoutEffect
++ useLayoutEffect vs useGSAP
항목 useLayoutEffect useGSAP (@gsap/react)
사용 난이도 | 👨🔧 일반적 (직접 제어) | 🧠 최적화됨 (React 친화적) |
성능 최적화 | 직접 해야 함 | 자동으로 처리 (권장!) |
동기 실행 | ✅ 가능 | ✅ 가능 (자동 관리) |
GSAP context 관리 | ❌ 수동으로 해야 함 | ✅ 자동 context 생성 및 cleanup |
복잡한 애니메이션 | 😰 힘듦 | 😎 편함 |
✅ 정리: 언제 어떤 걸 쓰면 좋을까?
👉 useGSAP 추천 상황
- React에서 gsap을 자주/여러 곳에서 쓴다
- ScrollTrigger, ScrollSmoother, Timeline 등을 활용할 예정
- 컴포넌트가 많고 관리가 필요한 구조
👉 useLayoutEffect 써도 괜찮은 상황
- 정말 간단한 애니메이션 1~2개
- 프로젝트 전체에 gsap 사용이 거의 없음
- context 관리할 자신 있음
728x90
반응형
'React' 카테고리의 다른 글
배포된 리액트 소스 가리기 (0) | 2025.06.05 |
---|---|
useRef (0) | 2025.06.04 |
react에서 modal (0) | 2025.06.04 |
GSAP (0) | 2025.05.23 |
리액트 비디오 (0) | 2025.05.20 |