아래의 코드에서 최초 마운트 및 버튼 클릭 시, console.log가 어떤 순서로 출력되는지 설명해주세요. 🙂
import { useState, useEffect } from 'react';
function Parent() {
const [count, setCount] = useState(0);
console.log('1');
useEffect(() => {
console.log('2');
return () => {
console.log('3');
};
}, [count]);
return (
<div>
<p>카운트: {count}</p>
<button onClick={() => setCount((prev) => prev + 1)}>+1</button>
<Child value={count} />
</div>
);
}
function Child({ value }) {
console.log('4');
useEffect(() => {
console.log('5');
return () => {
console.log('6');
};
}, []);
return <p>자식 값: {value}</p>;
}
export default Parent;
답변 보기
최초 마운트 시
1 -> 4 -> 5 -> 2
Parent 함수가 실행되면서 "1"이 출력됩니다.
Parent 실행 도중 내부의 Child 함수가 호출되므로 "4"가 출력됩니다.
이후, 마운트 후 실행되는 useEffect 콜백들이 실행됩니다. 먼저 Child의 useEffect 콜백이 실행되어 "5"가 출력됩니다.
이어서 Parent의 useEffect 콜백이 실행되어 "2"가 출력됩니다
버튼 클릭 시
1 -> 4 -> 3 -> 2
사용자가 버튼을 클릭하면 setCount를 통해 count 상태가 변경되고, Parent 컴포넌트가 다시 렌더링됩니다. 이때 console.log의 흐름은 다음과 같습니다.
Parent 함수가 다시 실행되어 "1"이 출력됩니다.
Parent 내부 Child 함수도 다시 실행되어 "4"가 출력됩니다.
그후 Parent의 useEffect 콜백이 실행되기 전에 cleanup 함수가 먼저 호출되어 "3"이 출력됩니다.
그런 다음 Parent의 useEffect 콜백이 다시 실행되며 "2"가 출력됩니다.
Child의 useEffect는 빈 배열을 의존성으로 가지고 있으므로 처음 마운트될 때만 실행되고, 리렌더시에는 실행되지 않습니다. 따라서 "5"이나 "6"은 출력되지 않습니다.
'Spring & Backend' 카테고리의 다른 글
| Spring MVC의 실행 흐름에 대해 설명해주세요. (0) | 2025.09.16 |
|---|---|
| 예상치 못하게 외부 라이브러리의 버그로 인해 기능에 문제가 생겼다면, 어떤 절차로 해결하실 건가요? (0) | 2025.09.16 |
| Filter와 Interceptor의 차이점을 말해주세요. (0) | 2025.09.15 |
| 바이브코딩 Canva AI[일정관리, 감사일기장 , MBTI 만들기] (4) | 2025.09.14 |
| 전자정부 프레임워크 현황 고찰 (0) | 2025.09.12 |
