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이 업데이트되었음을 보장한다.