이번엔 useEffect에 대해서 알아보쟈
useEffect
는 리액트 hook중 하나로 변화된 상태 값을 랜던링 후 실행되는 함수라고 할 수 있다. useEffect가 정확히 무엇이고 언제 어떻게 쓰이는지에 대해서 알아보려면 먼저 sideEffect
라는 개념에 대한 이해가 필요하다!
sideEffect
는 부작용 즉, 부수효과라는 뜻으로 주요한 효과에 따라서 발생하는 부수적인 효과라는 의미이다. 예를 들어 감기약을 먹으면 감기에 낫을 수 있지만 졸음이 오는 효과가 발생한다. 이처럼 어떠한 효과에 따라서 오는 부수적인 효과를 부수효과라고 칭하는 것이다.
💡코드에서의 부수효과란?
- 코드가 의도한 주된 효과 외에 추가적으로 발생하는 효과이다.
- 주로 함수에서 사용되는 용어이다.
- 함수의 주된 효과는 input을 받아서 output을 산출하는 것이다.
- 따라서, 함수의 sideEffect는 input을 받아서 output을 산출하는 것 이외의 모든 행위를 뜻한다.
// 순수 함수
const sum = (x) => {
return x + 1;
};
위와 같이 input을 받아서 output을 내는 행위 외의 다른 행위를 하지 않는 함수가 sideEffect가 없는 함수 이며, 이를 순수 함수 라고 칭한다.
// 1.외부의 상태를 읽어오기
const num = 1;
const sum = (x) => {
return x + num;
};
// 2.외부의 상태를 변경시키기
let num;
const sum = (x) => {
num = x + 1;
};
// 3.DOM에 접근하여 상태 변경시키기
const printNum = (x) => {
console.log(x);
};
const changeTitle = (newTitle) => {
const title = document.getElementById('title');
title.innerText = newTitle;
};
위와 같은 경우 함수에서 함수 외부의 값을 읽어오거나 외부의 값을 변경하는 행위를 할 경우는 모두 프로그래밍에서 sideEffect
가 발생했다고 할 수 있다.
💡console.log만 출력하는 함수의 경우도
sideEffect
인가?
- 콘솔 패널에 문자를 출력하는 행위 또한 함수 외부에 존재하는 DOM의 상태를 변경시키는 것임으로
sideEffect
가 있는 함수라고 할 수 있다.
💡 그렇다면,
sideEffect
를 기피해야하는 걸까?
- 함수의 동작 결과를 예측하기 쉽지 않기 때문에 기피해야하지만, 프로그램이 어떤 값도 외부로 출력하지 않는다면 그 프로그램은 의미가 없다.
- 또한, 데이터를 저장하고 값을 읽어오는 행위는 프로그래밍에서 필수 불가결한 요소이다.
- 따라서, 개발자들은
sideEffect
를 최소화 하면서 프로그램을 설계하되 필요한 상황에서 통제 가능하게 만들어 유지보수에 악영향을 주지 않도록 해야한다.
리액트의 함수 컴포넌트의 본질은 state
와 props
를 통해 JSX
를 만들어 내는 것이라고 할 수 있다. 따라서 리액트에서의 sideEffect
란 state
와 porps
를 통해서 JSX
를 만들어 내는 외의 모든 행위를 뜻하며, 종류는 다음과 같다.
setTimeout
setInterval
리액트에서의 sideEffect의 올바른 발생 시점은
하지만 이때 문제점이 발생하게 되는데
따라서, 이러한 문제점을 해결하기 위해 등장한 것이 useEffect hook인 것이다.
import { useEffect } from "react";
useEffet( 함수 )
useEffect( 함수, [값] )
[]
빈배열 입력시, 랜더링 직후 한번만 실행한다는 의미이다.// 예시1
import { useEffect, useState } from "react";
const Count = () => {
const [count, setCount ] = useState(0);
function clickAction(){
setCount(count + 1);
}
useEffect(() => {
console.log('count change!');
})
return(
<button onClick = {clickAction}>{count}</button>
)
}
export default Count
count change!
가 찍히게 된다.// 예시2
import { useEffect, useState } from "react";
const Count = () => {
const [count, setCount ] = useState(0);
const [day, setDay] = useState([]);
function clickAction(){
setCount(count + 1);
}
function addAction(){
setDay([
...day,
{
id: Math.random(),
day: 'DAY'
}
])
}
useEffect(() => {
console.log('count change!');
}, [count])
return(
<button onClick = {clickAction}>{count}</button>
<button onClick = {addAction}>ADD DAY</button>
)
}
export default Count
[count]
를 지정해줬기 때문에 count
가 변경되는 함수 clickAction
실행될 때에만 useEffect함수가 실행된다.마무리✨
아직 잘 sideEffect라는 개념이 잘 와닿지는 않지만 나중에 fetch라는 함수와 함께 백엔드 통신할때 사용된다고 하니 개념을 잘 익혀뒀다가 써먹어야 겠다...!!!