side effect는 직역하면 부작용이다. 보통 우리는 부작용에 대해서 안좋은 이미지를 가지고 있다. 당장 백신패스 도입에 따른 국민들의 반응만 보더라도 백신의 부작용을 두려워서 백신패스를 반대하는 사람들이 많다.
하지만 이 React를 비롯한 프로그래밍 측면에서는 side effect는 단순 부작용을 뜻하지 않는다.
React에서 side effect는 main effect를 제외한 모든 효과를 일컫는다.
무엇을 React의 main effect라 칭할 수 있을까?
React의 함수 컴포넌트에서 main effect는 state,props를 통한 UI를 그려내는 행위를 react의 main effect라 칭할 수 있다.
함수 컴포넌트에 있는 모든 로직들이 UI를 그려주지는 않기 때문에 함수 컴포넌트의 side effect는 렌더링이 아닌 외부세계에 영향을 주는 어떤 행위
라 말할 수 있다.
대표적으로 Data fetching, DOM에 직접 접근(ex. Event Listener 등록), 구독(ex.setInterval)과 같은 것들이 side effect라 할 수 있다.
side effect가 꼭 나쁜 효과는 아니지만 이러한 effect들을 그대로 방치할수는 없다.
이러한 side effect는 state의 변화가 있을 때 마다 페이지가 re-rendering되므로 body의 모든 logic이 실행된다.
이러한 rendering과 무관한 로직은 렌더링 자체에 악영향을 끼칠 수 있다.
따라서 우리는 useEffect Hook을 통해 side effect의 실행타이밍을 따로 관리해주어야햔다.
import { useEffect } from "react"
// 사용법
useEffect( 실행시킬 동작, [ 타이밍 ] )
document.addEventListener("타이밍", 실행시킬 동작) // 추상화 한 예시
// 매 렌더링마다 Side Effect가 실행되어야 하는 경우
useEffect(() => {
// Side Effect
})
// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 특정 값의 업데이트를 감지했을 때마다 실행되어야 하는 경우
useEffect(() => {
// Side Effect
}, [value])
// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 어떤 값의 업데이트도 감지하지 않도록 해야 하는 경우
useEffect(() => {
// Side Effect
}, [])
useEffect의 타이밍을 조절하는 방법은 크게 3가지이다.
useEffect는 첫번째 인자로 callback 함수를 받고 두번째 인자로 의존성배열
을 받는다.
이 의존성배열에 따라서 useEffect가 실행되는 방법이 달라진다.
관심사의 구분을 위해서 여러개의 useEffect를 사용할 수도 있다!