프론트엔드/React

[React] useEffect에 대해서 알아보자

병걸 2024. 1. 19. 17:34

 

useEffect 함수란?

 

React component가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 React Hook입니다.

import {useState, useEffect} from 'react';

function Detail(){

  useEffect(()=>{
    //여기적은 코드는 컴포넌트 로드 & 업데이트 마다 실행됨
    console.log('안녕')
  });

  let [count, setCount] = useState(0)
  
  return (
    <button onClick={()=>{ setCount(count+1) }}>버튼</button>
  )
}

 

위 소스 처럼 콜백함수 내에 소스를 적으면 컴포넌트가 mount & update 시 실행이 됩니다.

즉, 버튼을 클릭할때마다 '안녕' 이 콘솔창에 나타나게 됩니다.

 

하지만, 

import {useState, useEffect} from 'react';

function Detail(){

  useEffect(()=>{
    //여기적은 코드는 컴포넌트 로드 & 업데이트 마다 실행됨
  });
  console.log('안녕')
  
  let [count, setCount] = useState(0)
  
  return (
    <button onClick={()=>{ setCount(count+1) }}>버튼</button>
  )
}

 

위 소스처럼 콜백함수 내에 적지 않아도 '안녕'이 두번 나타나게 됩니다.

그 이유는 useEffect 바깥에 적어도 똑같이 컴포넌트 mount & update시 실행됩니다.

컴포넌트가 mount & update시 function 안에 있는 코드도 다시 읽고 지나가서 그렇습니다.

 

그럼 왜 useEffect를 만들어 놓은것일까요?

 

차이점은 useEffect 안에 적은 코드는 html 렌더링 이후에 동작합니다.

 

예를 들어 아래 굉장히 시간이 오래 걸리는 소스가 있습니다.

function Detail(){
  (반복문 10억번 돌리는 코드)
  return (생략)
}

 

▲ 여기에 대충 적으면 반복문 돌리고 나서 하단의 html 보여줌

 

function Detail(){
  useEffect(()=>{
    (반복문 10억번 돌리는 코드)
  });
  return (생략)
}

 

▲ useEffect 안에 적으면 html 보여주고 나서 반복문 돌림 

 

이런 식으로 코드의 실행 시점을 조절할 수 있기 때문에 조금이라도 html 렌더링이 빠른 사이트를 원하면 시간이 오래 걸리는 것들은 useEffect 안에 넣어서 작업하는게 좋습니다.

 

오래걸리는 반복연산, 서버에서 데이터가져오는 작업, 타이머 등 useEffect 안에 많이 적어 html 렌더링이 빠르게 하는게 좋습니다.

 

 

useEffect 는 다양한 사용법이 있습니다.

useEffect (() => { }) // 1. 재렌더링마다 코드 실행할 때

useEffect (() => { ], []) // 2. mount시 1회 코드실행할 때

useEffect (() => {
	return () => { 코드 
    }
}, []) // 3. unmount 시 1회 코드 실행하고 싶을 때
// 4. useEffect 실행 전에 뭔가 실행하려면 언제나 return () => {}

uesEffect (() => { }, [변수명]) // 5. 특정 state 변경시에만 실행할 때