๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฃจ๊ฒ ๋๋ค.
์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ๊ฐ์ง ์ํฉ์ ๋ฐ๋ผ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์๋๋ฐ ์ด๋ ๊ฐ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ์ธ์ ์ธ๊ฐ?
๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ํฌ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
1. props๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
2. state๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
3. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ์ props๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๊ณ
state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๊ณ
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์์ ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ์ฌํญ์ด ์๋ํ๋๋ผ๋ ์์์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง๋๋ค.
์ปดํฌ๋ํธ ์์ ์ props์ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง๋๋ ํ์ํ ๋ถ๋ถ์ด์ง๋ง ๋ถ๋ชจ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋คํด์ ๋ณ๊ฒฝ์ด ์๋ ์์์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋๋ ๊ฒ์ ์น ์ฑ๋ฅ์ ๋๋ฆฌ๊ฒ ํ ์ ์๋ค.
๋ค์ ์์๋ฅผ ๋ณด์.
Parent.js
import React, { useState } from "react";
import Child from "./Child";
const Parent = () => {
const [number, setNumber] = useState(0);
console.log("Parent render");
return (
<div>
<h1>Parent</h1>
<h2>Parent Number : {number}</h2>
<button
onClick={() => {
setNumber(number + 1);
}}
>
Increase
</button>
<Child />
<Child />
<Child />
</div>
);
};
export default Parent;
Child.js
import React from "react";
const Child = ({ number }) => {
console.log("Child render");
return (
<div>
<h2>Child</h2>
</div>
);
};
export default Child;
App.js
import React from "react";
import Parent from "./Parent";
const App = () => {
return (
<div>
<Parent />
</div>
);
};
export default App;
Parent์ปดํฌ๋ํธ์์๋ 3๊ฐ์ Child์ปดํฌ๋ํธ๊ฐ ์๋ค.
์ด ๋ ๋ฒํผ์ ๋๋ฆ์ผ๋ก์จ number๋ผ๋ state๊ฐ์ ๋ณ๊ฒฝํ ๋ parent์ state๊ฐ์ด ๋ฐ๋๋ฉด Parent ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง๋๋ค.
ํ์ง๋ง ์ค์ํ ๊ฒ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ Child๋ ๋ฆฌ๋ ๋๋ง๋๊ณ ์๋ค๋์ ์ด๋ค.
์ด๋ฐ์์ผ๋ก ๋ถ๋ชจ์ปดํฌ๋ํธ์ state๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์์์ปดํฌ๋ํธ๋ก ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ ์๋ค.
์ง๊ธ ์์์ปดํฌ๋ํธ๊ฐ 3๊ฐ์ฌ์ ๋ณ๊ฒ์ด ์๋์ง๋ง ์ค์ ํ๋ก์ ํธ์์๋ ๋ณต์กํ ์ปดํฌ๋ํธ ๊ณ์ธต์ ์ด๋ฃจ๊ณ ์๋ค.
์ด ๋ ๋ถ๋ชจ์ปดํฌ๋ํธ์์ ์์์ปดํฌ๋ํธ์ ์๊ด์๋ ์์ ๋ถ๋ถ์ด ๋ฐ๋๋ค๊ณ ํ์ ๋ ๊ทธ๊ฒ๋๋ฌธ์ ์์์ปดํฌ๋ํธ๊ฐ ์ ๋ถ ๋ฆฌ๋ ๋๋ง์ด ๋๋คํ๋ ๊ฒ์ ์์ฒญ๋ ๋ญ๋น์ด๋ค.
๋๋ฌธ์ ์ด๋ฌํ ๊ณผ๋ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ํจ์ํ ์ปดํฌ๋ํธ์์๋ React.memo๋ผ๋ ๊ณ ์ฐจ์ปดํฌ๋ํธ(Higher-Order Component)๋ฅผ ์ ์ํ๊ณ ์๋ค.
React.memo
React.memo๋ ๊ณ ์ฐจ์ปดํฌ๋ํธ(Higher-Order Component)๋ก์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํด๋ธ๋ค๋ฉด React.memo๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์งํ๋๋ก ๋ํํ์ฌ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์ฑ๋ฅ ํฅ์์ ์ํฌ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ React.memo๋ก ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
์์ ์์๋ฅผ React.memo๋ก ๊ฐ์ธ์ฃผ์.
Child.js
import React from "react";
const Child = ({ number }) => {
console.log("Child render");
return (
<div>
<h2>Child</h2>
<h3>Child Number : {number}</h3>
</div>
);
};
export default React.memo(Child);
๋ค์๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ React.memo๋ก ๊ฐ์ธ์ฃผ๋ฉด Parent ์ปดํฌ๋ํธ์ state๊ฐ ๋ณ๊ฒฝ๋์ด๋ Child ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค.
Parent์ state๊ฐ ๋ฐ๋์ด๋ Parent ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ถ๋ชจ์ปดํฌ๋ํธ์ ๋ณํ์ ๋ฐ๋ผ ๋ณํ๊ฐ ์๋ ์์์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก React.memo๋ผ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋ค.
ํ์ง๋ง ์ปดํฌ๋ํธ์ ์ค์ฒฉ์ด ๋ง์ง ์๋ค๋ฉด ๊ตณ์ด ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์จ์ฃผ์ง ์์๋ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ์ง๋ง ๋๋ถ๋ถ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ์์ฒญ๋ ์ปดํฌ๋ํธ์ ์ค์ฒฉ์ ํ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅํฅ์์ ์ํด์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ผญ ์์๋์ผํ๋ค.
์ฐธ์กฐ : ๋ฆฌ์กํธ ๊ณต์๋ฌธ์