๐ก
useEffect๋? ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ์ดํ๋ง๋ค ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ํ ์ ์๋ Hook ์ด๋ค.
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ์ดํ ์คํ๋๋ค. ์ด๊ฒ ๋ฐ๋ก useEffect ํต์ฌ ๊ธฐ๋ฅ.
์ด๋ค ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ณด์ฌ์ก์ ๋ ๋ด๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด?
๋๋ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ก์ ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด?
๐ข useEffect๋ฅผ ์ฌ์ฉ
useState์ ๋ง์ฐฌ๊ฐ์ง๋ก React์์ ์ ๊ณตํ๋ ํ (๊ธฐ๋ฅ) ์ด๋ฏ๋ก import ํด์ ์ฌ์ฉ
import React, { useEffect } from "react";
๋ธ๋ผ์ฐ์ ์์ ์ฐ๋ฆฌ๊ฐ App ์ปดํฌ๋ํธ๋ฅผ ๋์ผ๋ก ๋ณด๋ ์๊ฐ, ์ฆ App ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ ๋๋ง ๋ ์ดํ useEffect ์์ ์๋ console.log๊ฐ ์คํ๋๋ค.
// src/App.js
import React, { useEffect } from "react";
const App = () => {
useEffect(() => {
// ์ด ๋ถ๋ถ์ด ์คํ๋๋ค.
console.log("hello useEffect");
});
return <div>Home</div>;
}
export default App;
useEffect๊ฐ ์ํ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋๋๋ง ๋ ์ดํ ์คํ๋๋ ํน์ง ๋๋ฌธ์ ์๋์น์์ ๋์์ ๊ฒฝํํ ์ ์๋ค.
import React, { useEffect, useState } from "react";
const App = () => {
const [value, setValue] = useState("");
useEffect(() => {
console.log("HELLLO");
});
return (
<div>
<input
type="text"
value={value}
onChange={(event) => {
setValue(event.target.value);
console.log("value => ", value);
}}
/>
</div>
);
}
export default App;

input์ ๊ฐ์ ์ ๋ ฅํ ๋ ๋ง๋ค ์ฝ์์ฐฝ์ ํ ์คํธ๊ฐ ๊ณ์ ์์ฑ๋๋ค.
๐ข ๋ฐ๋์ ์์์ผ ํ๋ useEffect hook์ ๋์ trigger, ์์กด์ฑ ๋ฐฐ์ด
?? : โ์ด ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๊ทธ ๊ฐ์ด ๋ฐ๋ ๋๋ง
useEffect๋ฅผ ์คํํ ๊ฒโ
// useEffect์ ๋๋ฒ์งธ ์ธ์๊ฐ ์์กด์ฑ ๋ฐฐ์ด์ด ๋ค์ด๊ฐ๋ ๊ณณ ์
๋๋ค.
useEffect(()=>{
// ์คํํ๊ณ ์ถ์ ํจ์
}, [์์กด์ฑ๋ฐฐ์ด])
useEffect๋ ์ต์ด ๋ ๋๋ง ์ดํ ๋ฑ ํ๋ฒ๋ง ์คํ๋๊ณ ๊ทธ ์ดํ๋ก ์คํ๋์ง ์๋๋ค!
๋น์ฐํจ. ๋ฐฐ์ด ์ ๊ฐ์ด ๋ฐ๋์ด์ผ useEffect๋ฅผ ์คํํ๋ค๊ณ ํ๋๋ฐ ๋น๊ฐ์ด๋ผ ๋ฐ๋์ผ์ด ์์.
useEffect๋ ๊ณ์ ์คํ์ด ๋๊ฒ ์ฃ
๋ฐฐ์ด์ value๋ฅผ ๋ฃ์ด๋ณด๊ฒ ์ผ
// src/App.js
import React, { useEffect, useState } from "react";
const App = () => {
const [value, setValue] = useState("");
useEffect(() => {
console.log("HELLLO");
}, [value]); // value๋ฅผ ๋ฃ์
return (
<div>
<input
type="text"
value={value}
onChange={(event) => {
setValue(event.target.value);
}}
/>
</div>
);
}
export default App;
์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ก์ ๋
(unmount)๋ฌด์ธ๊ฐ๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง =>ํด๋ฆฐ ์ (clean up)
useEffect์ ๋ฐ๋๋๋ ๊ฐ๋ ?! ๐
useEffect ์์์ return์ ์ฃผ๊ณ ์ฌ๊ธฐ์ ์คํ ํจ์๋ฅผ ๋ฃ์
// src/App.js
import React, { useEffect } from "react";
const App = () => {
useEffect(()=>{
// ํ๋ฉด์ ์ปดํฌ๋ํธ๊ฐ ๋ํ๋ฌ์(mount) ๋ ์คํํ๊ณ ์ ํ๋ ํจ์๋ฅผ ๋ฃ์ด์ฃผ์ธ์.
return ()=>{
// ํ๋ฉด์์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ก์(unmount) ๋ ์คํํ๊ณ ์ ํ๋ ํจ์๋ฅผ ๋ฃ์ด์ฃผ์ธ์.
}
}, [])
return <div>hello react!</div>
};
export default App;
์์ธ๋ฅผ ๋ฒ์ด๋๋ ๋ฒํผ ์ ๋ง๋ค์๊ณ ๋ฒํผ์ ๋๋ฅด๋ฉด useNavigate์ ์ํด์ /todos๋ก ์ด๋ํ๋ฉด์ ์์ธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด์ ํ๋ฉด์์ ์์ธ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ด๊ณ , useEffect์ return ๋ถ๋ถ์ด ์คํ๋ ๊ฒ.
// src/SokSae.js
import React, { useEffect } from "react";
import { useNavigate } from "react-router-dom";
const ์์ธ = () => {
const nav = useNavigate();
useEffect(() => {
/// ํด๋ฆฐ์
ํจ์!
return () => {
console.log(
"์๋
ํ ๊ณ์ธ์ ์ฌ๋ฌ๋ถ! ์ ์ด ์ธ์์ ๋ชจ๋ ๊ตด๋ ์ ์๋ฐ์ ๋ฒ์ด ๋์ง๊ณ ์ ํ๋ณต์ ์ฐพ์ ๋ ๋ฉ๋๋ค! ์ฌ๋ฌ๋ถ๋ ํ๋ณตํ์ธ์~~!"
);
};
}, []);
return (
<button
onClick={() => {
nav("/todos");
}}
>
์์ธ๋ฅผ ๋ฒ์ด๋๋ ๋ฒํผ
</button>
);
};
export default ์์ธ;
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ํ์ด๋๊ณ , ์ด์๊ฐ๊ณ , ์ฃฝ๋ ์์ ์ฃผ๊ธฐ๊ฐ ์กด์ฌํ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์ ์ด์ ๋ฒ์ ์์๋ ์ด ์์ ์ฃผ๊ธฐ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง๋ง,
ํ์ฌ์ฒ๋ผ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋๋ useEffect๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์ฌ ํธ๋ค๋งํ๋ค.

์ถ์ฒ : Dev Community