⚛️ useEffect vs useLayoutEffect 완전 쉬운 차이 설명!
안녕하세요! 리액트를 공부하다 보면 꼭 마주치게 되는 두 훅(Hook)
바로 useEffect와 useLayoutEffect!
"둘 다 렌더링 후 실행되는데 뭐가 다를까?" 라는 궁금증, 지금 완벽히 해결해드릴게요 🔍
🎯 공통점 먼저 정리!
- 둘 다 렌더링 이후 실행됩니다.
- 컴포넌트 안에서 특정 작업(비동기 처리, DOM 접근 등)을 하기 위해 사용됩니다.
그렇다면 🤔 차이는 뭘까요?
⏳ useEffect: 화면이 다 그려진 후 실행!
사용자 눈에 보이는 화면이 완성된 다음에 실행돼요.
그래서 주로 비동기 작업이나 외부 이벤트 처리에 적합해요!
✅ 사용 예시: 데이터 가져오기
useEffect(() => {
fetch('/api/user').then(res => res.json()).then(setUser);
}, []);
📌 데이터 요청은 DOM 렌더링에 영향이 없으니 useEffect가 딱 좋아요!
⚡ useLayoutEffect: 화면이 그리기 직전에 실행!
렌더링은 끝났지만, 브라우저가 실제로 화면에 그리기 전 실행됩니다.
DOM의 크기를 측정하거나, 레이아웃을 조정할 때 필요해요!
✅ 사용 예시: DOM 크기 측정
useLayoutEffect(() => {
const height = ref.current.offsetHeight;
setHeight(height);
}, []);
📌 이걸 useEffect로 하면 깜빡임(flickering) 현상이 생길 수 있어요!
🧠 타이밍 비교 그림
[렌더링 시작]
↓
[렌더링 완료]
↓
👉 useLayoutEffect 실행 (동기)
↓
[화면 표시됨 (그림)]
↓
👉 useEffect 실행 (비동기)
⚠️ 언제 어떤 걸 써야 할까?
상황 추천 훅
API 호출, 이벤트 등록 | ✅ useEffect |
DOM 크기 측정, 위치 조정 | ✅ useLayoutEffect |
기본 사용 | useEffect 사용 후 필요 시 useLayoutEffect로 변경! |
🔍 성능 주의사항
- useLayoutEffect는 동기적으로 블로킹되기 때문에, 무거운 작업을 넣으면 렌더링이 느려질 수 있어요!
- 그래서 기본은 useEffect, 진짜 필요한 순간에만 useLayoutEffect를 쓰는 게 베스트입니다! 🧠
🎉 마무리 정리!
실행 시점 | 화면 표시 후 useEffect | 화면 표시 전 useLayoutEffect |
주 용도 | 비동기 작업, 이벤트 | DOM 측정, 위치 조정 |
성능 영향 | 적음 | 많음 (주의 필요) |
useEffect와 useLayoutEffect의 차이점에 대해서 설명해주세요.
useEffect와 useLayoutEffect는 모두 렌더링된 후에 특정 작업을 수행하기 위해 사용됩니다. 하지만 실행되는 타이밍과 용도가 다릅니다.
먼저, useEffect는 렌더링이 완료되는 시점에 비동기적으로 실행됩니다. 즉, 화면이 실제로 사용자에게 그려진 후에 useEffect가 실행되는 방식입니다. 그래서 useEffect는 보통 데이터를 가져오는 작업이나 이벤트 리스너 추가 등 렌더링 후에 화면에 직접적인 영향을 주지 않는 작업에 주로 사용됩니다.
반면에 useLayoutEffect는 렌더링 후 DOM이 업데이트되기 직전의 시점에 동기적으로 실행됩니다. 여기서 동기적이라는 것은 화면에 내용이 그려지기 전에 모든 레이아웃 관련 작업이 완료된다는 의미입니다. 예를 들어, DOM의 크기를 측정하거나 위치를 조정해야 할 때 useLayoutEffect를 사용하면 즉각적으로 그 변경사항이 반영되어 화면 깜빡임이나 불필요한 재렌더링을 방지할 수 있습니다.
정리하면, 렌더링 후 실행되는 비동기 작업에는 useEffect가 적합하고, 레이아웃 작업이나 DOM 조작과 같이 화면이 그려지기 전에 완료되어야 하는 작업에는 useLayoutEffect가 적합합니다.
예를 들면, useEffect는 사용자 데이터를 API로부터 가져오는 상황에 자주 사용합니다. 데이터가 렌더링 후에 설정되면 화면이 자연스럽게 업데이트되는 것입니다.
useEffect(() => {
fetchData().then(data => setData(data));
}, []);
useLayoutEffect는 DOM의 크기를 측정해서, 다른 요소의 위치를 조정해야 할 때 유용합니다. 예를 들어, 어떤 요소의 높이를 측정해 그 높이에 맞춰 레이아웃을 맞추고 싶을 때 사용합니다
useLayoutEffect(() => {
const height = ref.current.offsetHeight;
setHeight(height);
}, []);
단, useLayoutEffect 사용 시 성능 면에서 주의할 점이 있습니다. useLayoutEffect는 동기적으로 실행되기 때문에 너무 많은 작업이 실행되면 렌더링이 느려질 수 있습니다. 따라서 보통은 useEffect를 기본적으로 사용하고, 화면에 영향을 주는 작업만 useLayoutEffect로 처리하는 것이 좋습니다.
'1일 1CS(Computer Science)' 카테고리의 다른 글
웹 접근성의 개념과 개선 방법에 대해 설명해주세요. (0) | 2025.04.24 |
---|---|
HTTP 메서드에서 멱등성이란 무엇인가요? (0) | 2025.04.24 |
사용자가 웹사이트에 처음 접근했을 때 발생하는 일련의 과정에 대해 설명해 주세요. (0) | 2025.04.24 |
자바스크립트에서 어떻게 호이스팅이 가능한지에 대해서 설명해주세요. (0) | 2025.04.24 |
리액트에서 index를 key값으로 사용하면 안되는 이유에 대해서 설명해주세요. (0) | 2025.04.24 |