๐ React์์๋ Props Drilling์ผ๋ก ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
Props Drilling์ props๋ฅผ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์ด๋ค.
์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์์ ๋ํ๋ด๊ฒ ๋๋ค.
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ๋ค.
import React from "react";
const ComponentA = () => {
return <ComponentC text="Hello world!" />;
};
const ComponentC = (props) => {
return <ComponentE text={props.text} />;
};
const ComponentE = (props) => {
return <div>{props.text}</div>;
};
export default ComponentA;
๐ Component A์์ Component E๋ก ๋ฐ์ดํฐ ์ ๋ฌ ๊ณผ์
Component A
์์ Component E
๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ์ค๊ฐ์ ์๋ Component C
๋ก props๋ฅผ ์ ๋ฌํ๊ณ ๊ทธ ํ Component C
์์ ๋ฐ์ props๋ฅผ ์ต์ข
Component E
๋ก ์ ๋ฌํ๋ค.
๋ถ๋ชจ โ ์ค๊ฐ โ ... โ ์ตํ์
๐ Props๋ฅผ ์ฌ์ฉํด ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํจ
๐ ๋ณ๋์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ปจํ ์คํธ๋ฅผ ๋์ ํ์ง ์๊ณ ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ๋ฅ
๐ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ ํฅ์
๐ ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ํ์ ์ปดํฌ๋ํธ๋ ๋์ผํ๊ฒ ๋ฐ์ดํฐ ์์ ๋ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
๐ ํธ๋ฆฌ ํํ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ปดํฌ๋ํธ ๊ฐ์ ๊ด๊ณ๊ฐ ๋ช ํํจ
๐ ํ์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๊ฐ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ์ง ์์๋ ๊ฑฐ์ณ๊ฐ์ผ ๋๋ ๋ถํ์ํ ์ ๋ฌ ๋ฌธ์
๐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก props ์ ๋ฌ ๊ณผ์ ์ด ๋ง์์ง๋ ์ถ์ ๋ฐ ์ฑ๋ฅ ์ ํ ๋ฌธ์
๐ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ๋ ์์กด์ฑ ๋ฌธ์
๐ ์ต์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props๋ก ์ ๋ฌํ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ ์ฒด ๊ฑฐ๋ํ ํธ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๋ฌธ์
๐ Props๋ ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก props๋ฅผ ํตํด ์ง์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ถ๊ฐ๋ฅ
๐ ํ์ง๋ง, ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑ(Callback) ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ์๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฆฌ๋ ๋ฐฉ์์ผ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅ
import React, { useState } from "react";
const ParentComponent = () => {
const [data, setData] = useState(0);
const handleDataChanged = (data) => {
setData(data);
};
return (
<div>
<div>count: {data}</div>
<ChildComponent handleDataChanged={handleDataChanged} data={data} />;
</div>
);
};
const ChildComponent = ({ handleDataChanged, data }) => {
const handleButtonClick = () => {
const count = data;
handleDataChanged(count + 1);
};
return <button onClick={handleButtonClick}>์ฆ๊ฐ</button>;
};
export default ParentComponent;
1. ParentComponent
์์ data ์ํ์ handleDataChanged
์ฝ๋ฐฑ ํจ์ ์ ์, ์ด ์ฝ๋ฐฑ ํจ์๋ฅผ ChildComponent
๋ก props๋ก ์ ๋ฌ
2. ChildComponent
์์๋ ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ธ handleButtonClick
ํจ์ ์ ์, ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์ handleDataChanged
ํจ์๋ฅผ ํธ์ถํ์ฌ data ์ํ ์
๋ฐ์ดํธ
3. handleButtonClick
ํจ์ ๋ด์์๋ ํ์ฌ data ๊ฐ์ ๊ฐ์ ธ์์ 1์ ๋ํ ํ ์ด ๊ฐ์ handleDataChanged
ํจ์๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ
Props Drilling์ ํผํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ
๊ทธ ์ค ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ Redux, Recoil, Zustand, Jotai, Mobx ๋ฑ์ด ์๋ค.
์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์๋ค.
๋ํ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ํ์ฅ๋๋๋ผ๋ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.