프론트엔드/리액트

[React] 라이프 사이클 - 단방향 데이터 흐름, 컴포넌트 마운트와 클린업

miniberry 2026. 4. 6. 18:55

이번에 React 공부하면서 가장 크게 이해가 정리된 부분이 두 가지였다.
하나는 단방향 데이터 흐름, 다른 하나는 컴포넌트의 마운트클린업(useEffect)이다.
겉으로 보면 단순한 개념인데, 직접 코드로 부딪혀보니까 생각보다 중요한 포인트들이 많이 숨어 있었다.


1. 단방향 데이터 흐름 – React의 기본 철학

React는 기본적으로 데이터가 위에서 아래로 흐르는 구조를 가진다.
부모 컴포넌트가 state를 가지고 있고, 그걸 자식에게 props로 내려준다.

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

	return <Child count={count} onClick={() => setCount(count + 1)} />;
}
 

여기서 중요한 점

  • 데이터는 부모 → 자식
  • 이벤트는 자식 → 부모 (콜백 함수 호출)

처음에는 “왜 이렇게 번거롭게 하지?” 싶었는데, 이 구조 덕분에 데이터 흐름이 항상 예측 가능해진다는 걸 느꼈다.
특히 디버깅할 때 “이 값 어디서 바뀌었지?”를 추적하기 쉬워진다.


2. 조건부 렌더링 = 컴포넌트 생명주기

라이프사이클은 다음과 같다

  • 마운트 (Mount, 탄생): 컴포넌트가 페이지에 처음 렌더링될 때
  • 업데이트 (Update, 갱신): State나 Props의 값이 바뀌거나 부모 컴포넌트가 리렌더해 자신도 리렌더될 때
  • 언마운트 (Unmount, 사망): 더 이상 페이지에 컴포넌트가 렌더링되지 않을 때

이번에 가장 크게 깨달은 점

{count % 2 === 0 && <Even />}

 

이 한 줄이 단순한 조건문이 아니라,

  • 짝수 → 컴포넌트 생성 (마운트)
  • 홀수 → 컴포넌트 제거 (언마운트)

  즉, 렌더링 조건 자체가 생명주기를 결정한다

이걸 이해하고 나니까 React가 “컴포넌트 기반 UI”라는 말이 훨씬 와닿았다.


3. useEffect와 클린업 함수의 진짜 의미

처음에는 이 코드가 헷갈렸다.

useEffect(() => {
	return () => {
		console.log("Even 컴포넌트 언마운트");
	};
}, []);

“이게 왜 마운트냐 언마운트냐” 혼란이 왔는데, 핵심은

  • useEffect 자체는 마운트 시 실행
  • return 함수는 언마운트 시 실행 (cleanup)

즉,

→ 마운트할 때 “나중에 정리할 함수”를 등록해두는 구조

이걸 이해하고 나니까 흐름이 완전히 정리됐다.

마운트 → effect 실행 → cleanup 등록
언마운트 → cleanup 실행
 

4. 클린업 함수는 왜 존재할까

클린업 함수는 단순히 로그 찍는 용도가 아니라,
남아있는 작업을 정리하는 역할이다.

예를 들어:

  • 이벤트 리스너 제거
  • setInterval 정리
  • API 요청 취소

이걸 안 하면 실제로 메모리 누수나 버그로 이어진다.

그래서 React는 아예 구조적으로

effect를 만들면 반드시 정리도 같이 생각해라

 

라는 패턴을 강제하고 있는 느낌이었다.


5. 이번에 느낀 핵심 요소

이번 학습에서 가장 좋았던 건
이 세 개가 따로 노는 개념이 아니라 하나로 연결된다는 것이었다.

  • 단방향 데이터 흐름
  • 조건부 렌더링
  • useEffect + cleanup

상태(state)가 바뀌면

→ 렌더링 구조 변경
→ 컴포넌트 마운트/언마운트
→ 그에 따라 effect와 cleanup이 실행


6. 한 줄 정리

React는 단순히 UI를 그리는 라이브러리가 아니라,
상태 변화 → 컴포넌트 생명주기 → 부수 효과 관리까지 연결된 구조이다.