๋ฆฌ์กํธ์ ํจ์ ์ปดํฌ๋ํธ์์๋ side effect๋ฅผ ๋ฐ์์ํค๊ณ ์ ํ์ ๋
์๋ ์ฝ๋์ฒ๋ผ ํจ์๋ฅผ return๋ฌธ ์์ ๋ง๋ค์ด ํธ์ถํ๋ฉด ์ด๋จ๊น?
๋ ๋๋ง ์์๋ sideEffect๊ฐ ํจ์๊ฐ ์คํ๋๊ณ ๋ฆฌํดํ ๊ฐ์ด ๋์จ๋ค.
const Component = () => {
const sideEffect = () => {
์ฌ์ด๋๋ฆฌํฉํธ ์คํ ๋ด์ฉ;
};
sideEffect();
return (
๋ฆฌํดํ ๊ฐ
);
}
์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๊ธด๋ค.
1.side effect ๊ฐ ๋ ๋๋ง์ Blocking ํ๋ค.
์ฝ๋๋ ์์์ ์๋๋ฐฉํฅ์ผ๋ก ์คํ๋๋ค.
sideEffect๋ผ๋ ํจ์๊ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ํจ์๋ผ๋ฉด
side effect๊ฐ ๋๋๊ธฐ ์ ๊น์ง ๋ธ๋ผ์ฐ์ ์์์๋ UI๊ฐ ๋ ๋๋ง ๋์ง ๋ชปํ๊ณ ๋ฉ์ถ๊ฒ ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ์๊ฐ ํ๋ฉด์ UI๊ฐ ์
๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณด๊ธฐ๊น์ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ค ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ ์ ์๋ค.
2.๋งค ๋ ๋๋ง๋ง๋ค Side Effect๊ฐ ์ํ๋๋ค.
๋ฆฌ์กํธ์์ ํจ์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ํจ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์คํ๋๋ค.
ํน์ ์ํฉ์์๋ง ํ์ํ side effect๊ฐ ๋งค ๋ ๋๋ง๋ง๋ค ๊ณ์ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด Side Effect ๊ฐ ์ฌ๋ฐ๋ฅธ ์์ ์์ ๋์ํ๋ค๋ ๊ฑด?
1. ๋ ๋๋ง์ด ๋ชจ๋ ์๋ฃ๋๊ณ ๋ ํ side effect ๊ฐ ์คํ๋๋ค.
side effect ๊ฐ ๋ง์ง๋ง์ผ๋ก ์คํ๋๋ค๋ฉด ํ๋ฉด UI๊ฐ ๋ ๋๋ง ๋๋ ์๊ฐ์ด ๋๋ ค์ง์ง ์์ ๊ฒ์ด๋ค.
2. side effect๋ฅผ ์ํ ๋๋ง ์กฐ๊ฑด์ ๊ฑธ์ด ์คํํ ์ ์์ด์ผ ํ๋ค.
๋งค๋ฒ ๋ ๋๋ง๋ ๋๋ง๋ค side effect๊ฐ ์ํ์ง ์์ ์ํฉ์์ ๊ฐ์ด ์คํ๋๋ ๊ฒ์ ๋ง์ ๋ ํจ์จ์ ์ผ ๊ฒ์ด๋ค.
โ ์ด๋ฌํ ์กฐ๊ฑด๋ค์ ์ถฉ์กฑ ์ํค๋ ๊ฒ useEffect๋ผ๋ hook ์ด๋ค.
useEffect(() => {์ฝ๋ฐฑํจ์}, [์์กด์ฑ๋ฐฐ์ด])
useEffect ๋ฅผ ์ธ ๋๋ ์ฝ๋ฐฑํจ์์, ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ์จ์ค๋ค.
์ฝ๋ฐฑํจ์๋ ์ด๋ค ๋์์ ํ๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ฐ, ์ฌ์ด๋ ์ดํฉํธ๊ฐ ๋ฐ์ํ ๋ ์ด๋ค ๊ฑธ ์คํ์ํฌ์ง ๋ด๋๋ค.
์ฝ๋ฐฑํจ์์ ์ญํ ์ ๋ค๋ฅธ UI๋ค์ด ๋จผ์ ๋ ๋๋ง๋๊ณ useEffect ํจ์๋ฅผ ๋งจ ๋์ค์ ์คํํ๋ค.
์ฝ๋ฐฑํจ์๋ฅผ ์จ์ค ๋ ํ๋ฉด blocking ์ ๋ง์ ์ ์์ง๋ง,
ํ์ํ์ง ์์ ๋์๋ ๋ณํ๋ ๊ฐ์ด ์์ ๋๋ง๋ค ๊ฐ์ด ์คํ๋๋ค๋ ๋ฌธ์ ์ ์ด ๋จ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ด ์จ์ฃผ๋ ๊ฒ์ด ์์กด์ฑ ๋ฐฐ์ด์ด๋ค.
์์กด์ฑ ๋ฐฐ์ด์ ๋ค์ด๊ฐ๋ ๊ฐ์ '์ด์ ๋ ๋๋ง๊ณผ ๋น๊ตํ์ ๋ ๋์ผํ๊ฐ?' ๋ฅผ ๊ฒ์ฌํ๋ค.
์ฒซ ๋ฒ์งธ ๋ ๋๋ง์์๋ ๋ฌด์กฐ๊ฑด ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ์ง๋ง
๋ ๋ฒ์งธ ๋ ๋๋ง๋ถํฐ๋ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณํ์ผ๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๊ณ ๋ณํ์ง ์์ผ๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ์ง ์๋๋ค.
((((๋ง์ฝ ๋น ๋ฐฐ์ด [ ] ์ ์จ์ค๋ค๋ฉด ๋งจ ์ฒ์ ํ ๋ฒ๋ง ์คํ๋๊ณ ๊ทธ ์ดํ๋ก ์คํ๋์ง ์๋๋ค.))))
๐ ์ฝ๋๋ก useEffect( ) ๋ ๋๋ง ์ฌ์ดํด ์์๋ณด๊ธฐ
์๋ ์ฐ์ต์ ํตํด ์์๋ณด๋ ค๊ณ ํ๋ค.
import React, { useEffect, useState } from "react";
function App() {
const [count, setCount] = useState(0);
const [text, setText] = useState("");
useEffect(() => {
console.log("1");
}, [count, text]);
//count์ text๊ฐ ๋ณํ ๋ ์ด ์ฝ๋ฐฑํจ์ ํธ์ถ
useEffect(() => {console.log("2");
}[]);
//๋น ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ฉด ๋ณํ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๊ณ ๋ ๋๋ง ๋์ง ์์ ๊ฒ
console.log("3");
return (
<div>
<div className="wrapper">
<h1>Count: {count}</h1>
<button onClick={() => setCount(count + 1)}>Up</button>
</div>
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
);
}
export default App;
์ฌ๊ธฐ์ ๋ฌธ์ !
Q. ๋จผ์ App์ด๋ผ๋ ์ปดํฌ๋ํธ์ ํด๋นํ๋ UI ๊ฐ ๋ ๋๋ง๋ ๋ ์ด๋ค ์์๋ก ๋ ๋๋ง์ด ๋ ๊น?
1๋ฒ
useEffect(() => {
console.log("2");
}, [count, text]);
2๋ฒ
useEffect(() => {console.log("3");
}[]);
3๋ฒ
console.log("1");
Answer
์ฒ์์ ํ๋ฉด ์ง์ ์
๋ชจ๋ UI๊ฐ ๋ค ๋ ๋๋ง๋์ง๋ง useEffect๊ฐ ์ฐ์ธ ํจ์๋ ๋ง์ง๋ง์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์
3 -> 1 -> 2 ์์๋ก ์ฐํ๋ค.
๋ฒํผ ํด๋ฆญ ์ ๋๋ Input ์ ํ ์คํธ ์ ๋ ฅ ์
๋น ๋ฐฐ์ด์ ์์กด์ฑ ๋ฐฐ์ด๋ก ๋ฃ์ด์ค 2๋ฒ์ ํด๋นํ์ง ์๊ณ ,
3๋ฒ๊ณผ ํด๋ฆญ์ด๋ input ๋ณํ๋ฅผ ๊ฐ์งํ๋ 1๋ฒ์ ํ๋ฉด์ ์คํ ๋๋ค.
3 -> 1
useEffect ์ผ์ ๋ Rendering Cycle
1๏ธโฃ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋๋ค. mount
2๏ธโฃ useEffect์์ ์ฝ๋ฐฑํจ์ ํธ์ถํ๋ค. side effect
3๏ธโฃ ์ปดํฌ๋ํธ์ state/ props ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง๋๋ค. update
4๏ธโฃ useEffect์์ ์์กด์ฑ ๋ฐฐ์ด ํ์ธํด์ ๋ง์ฝ ์ด์ ๋ ๋๋ง๊ณผ ๋น๊ตํ์ ๋ ๋ณํ๋ ๊ฐ์ด ์์ผ๋ฉด ์ฝ๋ฐฑํจ์ ํธ์ถ side effect
5๏ธโฃ state/ propd ๊ฐ ๋ณ๊ฒฝ๋๋ฉด 3๋ฒ๊ณผ 4๋ฒ๊ณผ์ ๋ฐ๋ณตํ๋ค.
6๏ธโฃ ์ปดํฌ๋ํธ๊ฐ ๋ ์ด์ ํ์ ์์ด์ง๋ฉด ํ๋ฉด์์ ์ฌ๋ผ์ง๋ค.unmount
์ง๊ธ๊น์ง useEffect๋ฅผ ์์๋ณด์๋ค.
๋ด ์์
๋ฌผ์๋ useEffect ๊ฐ ์ ์ฉ๋ ์ง ๊ถ๊ธํ๊ธฐ๋ ํ๊ณ ์์ง๊น์ง ๋๋ ต๊ธฐ๋ ํ๋ค.
๋นจ๋ฆฌ ์ต์ํด์ก์ผ๋ฉดใ
ใ
'๐Code > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React | REST API๋ฅผ ์ด์ฉํ Kakao ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ (1) | 2023.05.14 |
---|---|
React | UseEffect() ๋ฅผ ์ฐ๋ ์ด์ (0) | 2023.03.28 |
React | ๋๊ธ ์จ๊ธฐ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ (0) | 2023.03.26 |
React | React์ JSX (0) | 2023.03.26 |
React | React ์ฌ์ฉํ๊ธฐ (0) | 2023.03.26 |