3์ผ์ฐจ๋ ๋๊ฐ์ ๋งด. ์ด๋ ต์ง๋ง ํจ์จ์ ์ด๋ค...
์ค๋์ ๊ฐ๋จํ ์นด์ดํฐ๋ฅผ ๋ง๋ค์์ต๋๋ค!
๋ค๋ง ๋๊ผฌ์ค์ด ํ๋ผ๋ ๋ฐฉ๋ฒ๋๋ก ์์ฑํ๋๋!
import Button from "./Button";
import styles from "./App.module.css";
import { useState } from "react";
function App() {
// ํจ์์ปดํฌ๋ํธ
const [counter, setValue] = useState(0);
const onClick = () => setValue((prev) => prev + 1);
console.log("render");
//์ด๋ ๊ฒ ํ๋ฉด counter์ ์ด๊ธฐ๊ฐ์ 0์ด ๋๊ณ setvalue๋ counter modifyํ๋ ํจ์๊ฐ๋
return (
<div>
<h1 className={styles.title}>{counter}</h1>
<Button text={"continue"} />
<Button text={"hola"} />
<button onClick={onClick}>click me</button>
</div>
);
}
export default App;
์ด๋ ๊ฒ ์์ฑํ๋ ๋ถ๋ถ์์ ๊ณ์ํด์ render๊ฐ ๋๋ฒ ๋ฐ๋ณตํ๋ ํ์์ด ๋ฐ์ํ๋๋ผ๊ณ ์;;
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById("root")
);
์ฐฉ์๋ณด๋ index.js์ React.StrictMode์ ๋ฌธ์ ์์ต๋๋ค!
.
StrictMode๋ create-react-app๋ก ์ค์นํ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ ํ
๊ทธ๋ก,
ํด๋น ํ
๊ทธ๋ก ๊ฐ์ธ์ ธ ์๋ ๊ฒฝ์ฐ ์์๊น์ง ๊ฒ์ฌํ๋คํด์ ๋ ๋ฒ ์คํ๋๋ค๊ณ ํฉ๋๋ค.
React.StrictMode ํ
๊ทธ๋ฅผ ์ง์ฐ์๊ณ ๋ค์ํ๋ฉด ์ ์ฌ์ ์ผ๋ก ํ ๋ฒ๋ง ์ถ๋ ฅ๋ฉ๋๋ค!.
ํด๋น ํ๊ทธ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋ฒ ๋ ๋๋ง ํ๋ค๊ณ ํฉ๋๋ค.(๊ฐ๋ฐ์ฉ์ด ์๋ ํ๋ก๋์
์ฉ)
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ฌธ์ ํด๊ฒฐ!
์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ useEffect๋ผ๋ ํจ์๊ฐ ์์
์ผ๋จ useEffect์ ๊ฒฝ์ฐ ๋ ๊ฐ์ arguments๋ฅผ ๋ฐ์ต๋๋ค!
์ฒซ๋ฒ์งธ argument๋ ๋ฑ ํ๋ฒ ์คํํ๊ณ ์ถ์ ์ฝ๋/๋๋ฒ์งธ๋ ๊ทธ๋ ์ง ์์ ๋ถ๋ถ!
import Button from "./Button";
import styles from "./App.module.css";
import { useState, useEffect } from "react";
function App() {
// ํจ์์ปดํฌ๋ํธ
const [counter, setValue] = useState(0);
const onClick = () => setValue((prev) => prev + 1);
console.log("I run all the time");
const iRunOnlyOnce = () => {
console.log("I Run Only Once");
};
useEffect(() => {
console.log("Call the API");
}, []);
return (
<div>
<h1 className={styles.title}>{counter}</h1>
<Button text={"continue"} />
<Button text={"hola"} />
<button onClick={onClick}>click me</button>
</div>
);
}
export default App;
ํด๋น ์ฝ๋์์๋ ๋ค์ ๋น ๋ฐฐ์ด๊ฐ์ผ๋ก ๋ฐ์์ ๊ธฐ์กด ์ฝ๋์ ์์ฑ๋์ด ์๋ console์ด ์ฌ์ฌ์ฉ ๋์์ต๋๋ค!
์ด๋ฐ์์ผ๋ก ๋ถํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํ์ง ์๋๋ก useEffect๊ฐ ์ฌ์ฉ๋๋๋ฐ ๊ฐ๋ฐ ํ์ ๋ฐ๋ฆฌ ์ฉ๋ฐ๋ฆฌ์ธ ์ ๋ฌธ๋ ๋ฆฌ๋ ๋๋ง์ด ์ ๋์๊ฑธ๊นํ๋ ์๋ฌธ์ด ๋ค์์๋ค.
๋ ๋๋ง์ด ์์ฃผ ๋ฐ์ํ๋ฉด ๋ง์ ๋ฆฌ์์ค๊ฐ ์ฌ์ฉ๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์๋ค,
์ด๋ก ์ธํด์ ์น ์ดํ๋ฆฌ์ผ์ด์
์ด ๋๋ ค์ง๊ฑฐ๋, ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ ์ ์๋ค.
๋ ๋๋ง์ด ์์ฃผ ๋ฐ์ํ๋ค๋ ๊ฑด ์ปดํฌ๋ํธ ์ ์ฒด๋ฅผ ์ฌ์ฑ์ฑํ๊ณ ๋ค์ ๊ณ์ฐํ๋ ์์ ์ ๋ฐ๋ณตํ๊ธฐ๋๋ฌธ์ ์ด๋ ์์ ์ ๋ง์ด ๋ฐ๋ณตํ๊ฒ ๋์ด ๋ถํ์ํ ๊ณ์ฐ์ด ๋ค์ด๊ฐ ์ ์์ผ๋ฉฐ ์์ ๊ฐ์ด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด ์ฑ๋ฅ ์ ํ์ ์ํฅ์ ์ค ์ ์๋ค.
useEffect๋ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ๋์ ๋ฐ์ํ๋ side effects๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฌํ side effects๋ฅผ useEffect ์์ด ๊ตฌํํ๋ฉด ์์ ์ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ด ๋ ์ฌ๋ฌ ๊ฐ์ง ์ ์ฝ ์ฌํญ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋คํธ์ํฌ ์์ฒญ์ ์ํํ๋ ค๋ฉด ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ์ด ํจ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ํ๋ก ์ค์ ํ๋ ๋ฑ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ์์ ์ useEffect ์์ด ์ฒ๋ฆฌํ๋ฉด ๋๋ฒ๊น ์ด ์ด๋ ค์์ง๊ณ ์ฝ๋๋ ๋ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
side effects๊ฐ ๋ญ๊น์?
ํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ ๋ฉ์๋์ ๋์์์ ๋ฐ์ํ๋ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ ์ํฅ์ ์๋ฏธํ๋ต๋๋ค
useEffect๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ์ํ๋, ์ด ๋๋ง๋ค ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ๋ฌดํ ๋ฃจํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
useEffect๋ฅผ ์ฌ์ฉ ์์ผ๋ฉด performance issue์ด ์๊ธธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ง์ ๋ฑ๋กํ์ฌ ์ปดํฌ๋ํธ์ ๋ถ์ฐฉํ๋ ๊ฒฝ์ฐ, ๋ฉ๋ชจ๋ฆฌ ๋์, ๋ ๋๋ง ์๋ ์ ํ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํ์ง๋ง useEffect๋ฅผ ์ด์ฉํ๋ฉด, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ์ side effects๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ฑ๋ฅ ์ด์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ์ฐ๊ณ ์ถ์๋ฐ!
์๊พธ ๋๊ผฌ์ค ๊ฐ์์ useMemo์ useEffect๋ฅผ ๋น๊ตํ๋ ๊ธ๋ค์ด ๋ง๋๋ผ๊ณ ์!
๊ทธ๋์ ์ฐ๊ฒ๋๋ฒ๋ฆฐ!!
ํญ๋ชฉ | useMemo | useEffect |
---|---|---|
๋ชฉ์ | ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ | ์ปดํฌ๋ํธ์ ์ฌ์ด๋ ์ดํํธ ๊ด๋ฆฌ |
์ฌ์ฉ ๋ฐฉ๋ฒ | ์ปดํฌ๋ํธ ๋ ๋๋ง ์ค, ์ฐ์ฐ ๊ฒฐ๊ณผ ๊ฐ์ ์บ์ํ์ฌ ์ฌ์ฌ์ฉ | ์ปดํฌ๋ํธ ๋ ๋๋ง(Rerender) ์ดํ, ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ฐ์ ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ ๋ฐ ํด๋ฆฐ์ |
์ต์ ํ | ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ฅธ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ต์ ํํ๊ณ ๋ถํ์ํ ์ฐ์ฐ์ ํผํจ | ์ปดํฌ๋ํธ ์ฌ์ด๋ ์ดํํธ์ ๊ด๋ จ๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํ |
1.๋ถํ์ํ ์ฐ์ฐ์ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
2.๋์ผํ ์
๋ ฅ ๊ฐ์ ๋ํด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผํ์ฌ ๋ ๋๋ง ๊ณผ์ ์ ์ต์ ํํฉ๋๋ค.
1.๋ฉ๋ชจ์ด์ ์ด์
์ผ๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
2.๋์ผํ ์
๋ ฅ ๊ฐ์ ๋ํด ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋์ด์ผ ํ๋ ์ํฉ์์ ์ฌ์ฉ์ ์ ํ์ด ์์ต๋๋ค.
1.์ปดํฌ๋ํธ์ ์์ฃผ๊ธฐ(Lifecycle)์ ๋ฐ๋ผ ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
2.์ปดํฌ๋ํธ์ ์์ฃผ๊ธฐ(Lifecycle)์ ๋ฐ๋ผ ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
1.componentDidUpdate์ ๊ฐ์ ๋ค์ํ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๋์ฒดํ ์๋ ์์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ์ ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ค๋์ ์ด์์ด์.