useEffect Hook

임채현·2022년 1월 18일
0

Side Effect

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라 할 수 있다.

Effect Hook

useEffect

side effect가 꼭 나쁜 효과는 아니지만 이러한 effect들을 그대로 방치할수는 없다.
이러한 side effect는 state의 변화가 있을 때 마다 페이지가 re-rendering되므로 body의 모든 logic이 실행된다.
이러한 rendering과 무관한 로직은 렌더링 자체에 악영향을 끼칠 수 있다.

따라서 우리는 useEffect Hook을 통해 side effect의 실행타이밍을 따로 관리해주어야햔다.

rendering cycle with useEffect

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는 모든 state나 props가 바뀔때마다(새로운 렌더링이 실행될때마다) 실행된다.
  • 의존성배열을 빈배열로 넣으면 첫 번째 렌더링(mount) 이후 한번 실행되고 그 이후에는 state나 props가 바뀌어도 실행되지 않는다.
  • 의존성배열에 특정 값(state)을 넣으면 그 값의 업데이트(re-rendering)에 따라 useEffect가 실행된다.
    • 배열이라 여러 값에 대해 useEffect를 실행할 수 있다. (참고로 or이다 and가 아니라! 즉 배열의 어느 하나 값이라도 업데이트되면 실행된다는 것)

관심사의 구분을 위해서 여러개의 useEffect를 사용할 수도 있다!

profile
열심히 살고 싶은 임채현입니다.

0개의 댓글

관련 채용 정보