이번엔 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라는 함수와 함께 백엔드 통신할때 사용된다고 하니 개념을 잘 익혀뒀다가 써먹어야 겠다...!!!