소프트웨어 개발에서의 생애 주기
어떤 프로그램이 실행되고 종료되는 과정을 나타내기 위해서
이런 단어를 자주 사용하게 된다ComponentDidMount
ComponentDidUpdate
ComponentWillUnmount
리액트의 이런 컴포넌트의 생애주기를 제어한다는 것 : 각각 과정에서 어떤 작업을 수행시킬 수 있다 (= 라이프 사이클을 제어한다 또는 이용한다라고 이야기할 수 있음)
소프트웨어 개발을 더욱 견고하고 효율적으로 개발하기 위해서는 이렇게 자신이 사용하는 기술의 라이프 사이클을 온전히 이해하고 이용할 수 있어야 함
React Hooks
라 부르게 되었다.useEffect는 클래스형 컴포넌트에서 쓰던 리액트의 라이프사이클을 제어하는 메서드를 훔쳐올 수 있는 기능을 가진 Hook
이다.그런데 왜 굳이 기본적으로 모든 기능을 사용할 수 있는 클래스형 컴포넌트가 아니라 React Hooks라는 기능까지 사용해가면서 함수형 컴포넌트를 쓰는 걸까? 👀
import React, { useEffect } from "react";
useEffect( () => {}, []);
() => {}
콜백 함수[]
=> Dependency Array(의존성 배열), 이 배열 내에 들어있는 값이 변화하면 콜백함수가 수행된다.src/App.js
import Lifecycle from "./Lifecycle"; // 추가
return (
<div className="App">
<Lifecycle /> // 추가
</div>
);
src/Lifecycle.js
// Hooks import
import React, { useEffect, useState } from "react";
const LifeCycle = () => {
// counter와 text input의 state 관리
const [count, setCount] = useState(0); // default 0
const [text, setText] = useState(""); // default 빈칸
// console 확인
useEffect(() => { console.log("Mount!"); }, []);
useEffect(() => { console.log("Update!"); });
// count change > update (변화 감지 > 리렌더링)
useEffect( () => {
console.log(`count is update : ${count}`);
// 조건
if(count > 5){
alert("count가 5를 넘었습니다. 따라서 1로 초기화됩니다.");
setCount(1);
}
}, [count]);
// text insert change > update (변화 감지 > 리렌더링)
useEffect(() => { console.log(`text is update : ${text}`); }, [text]);
return (
<div>
<div>
{count} // 숫자 변화
<button onClick={() => setCount(count + 1)}>count up</button> // 누르면 1씩 증가
</div>
<div>
<input type="text" value={text} onChange={(e) => setText(e.target.value)} /> // 내용 입력
</div>
</div>
);
};
export default LifeCycle;
컴포넌트 탄생(마운트 되는 시점) 제어
src/Lifecycle.js
import React, { useEffect, useState } from "react";
const UnMountTest = () => {
useEffect( () => {
console.log("Mount!");
return () => {
// Unmount 시점에 실행되게 됨
console.log("Unmount!");
};
}, []);
return <div>Unmount Testing Component</div>;
};
const Lifecycle = () => {
// toggle change > update (visible)
const [isVisible, setIsVisible] = useState(false);
const toggle = () => setIsVisible(!isVisible);
// 단락회로평가 (컴포넌트 렌더할지 말지 여부)
return (
<div style={{padding:20}}>
<button onClick={toggle}>ON/OFF</button>
{isVisible && <UnMountTest />}
</div>
);
};
export default LifeCycle;
정리 : 컴포넌트 라이프사이클, useEffect을 활용하면 어떤 특정 값의 변화를 추적하거나 제어가 가능하다