useEffect hook은 함수 컴포넌트에서 side effect를 수행할 수 있게 만드는 리액트 컴포넌트가 렌더링되거나 상태가 업데이트될 때, 특정 작업을 실행할 수 있도록 하는 hook이다.
useEffect는 component가 mount 됐을 때, component가 unmount 됐을 때, component가 update 됐을 때, 특정 작업을 처리한다.
클래스형 컴포넌트에서 사용할 수 있었던 생명주기 메소드를 함수형 컴포넌트에서도 사용할 수 있게 해주는 함수이다.
기본 형태: useEffect(function, deps)
import React, {useEffect, useState} from 'react';
function TestComponent() {
const [test, setTest] = useState();
useEffect(() => {
console.log("이건 컴포넌트가 마운트 될 때 한번만 실행된다.");
return () => {
// clean-up
console.log("이건 컴포넌트가 언마운트 될 때 한번만 실행된다.");
}
},[])
useEffect(() => {
console.log("이건 test가 변경되어 상태가 업데이트 될 때마다 실행된다.")
return () => {
console.log("이건 test가 변경되어 상태가 업데이트 되기 전에 실행된다.")
}
},[test])
return (
<>테스트 컴포넌트</>
)
}
React는 useEffect Hook을 통해 작업(함수)를 넘겨 받아서 함수를 기억했다가 DOM 업데이트를 수행한 이후에 불러낸다. 이런 방식으로 side effect를 수행한다.
useEffect를 컴포넌트 내부에 둠으로써 effect를 통해 state 변수(또는 그 어떤 prop에도)에 접근할 수 있게 있다. 함수 범위 안에 존재하기 때문에 특별한 API 없이도 값을 얻을 수 있어서 편리하게 사용할 수 있다. Hook은 자바스크립트의 클로저를 이용하여 React에 한정된 API를 고안하는 것보다 자바스크립트가 이미 가지고 있는 방법을 이용하여 문제를 해결합니다.
useEffect는 렌더링 이후에 매번 수행되는가?기본적으로 첫번째 렌더링과 이후의 모든 업데이트에서 수행된다. 마운팅과 업데이트라는 방식으로 생각하는 대신 effect를 렌더링 이후에 발생하는 것으로 생각하는 것이 더 쉽다. React는 effect가 수행되는 시점에 이미 DOM이 업데이트되었음을 보장한다.