๐ ๋ถํ์ํ prop drilling ์ ๊ฑฐํ๊ธฐ
React์์ ํ์ด์ง ๋ด๋ถ์ 2~3๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ props๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ฒ ๊ธ์ ํ ํ์ด์ง ๋ด์ ์ปดํฌ๋ํธ 3๊ฐ(A -> B -> C)๋ฅผ ์ ์ธํ์ฌ ๋จ์ํ props๋ก ์ ๋ฌ๋งํ๋ B์ปดํฌ๋ํธ์ prop drilling์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์๋ณด์.
์ฐ์ , React๋ฅผ ๋ค๋ค ๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด prop drilling์ ๋ํด ํ ๋ฒ์ฏค์ ๋ค์ด๋ดค์ ๊ฒ์ด๋ค. prop drilling์ด๋, props๋ฅผ ์ด์ฉํด ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ค ๋ ๋ชจ๋ ๋ ๋ฒจ์์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ์ํฉ์ ๋งํ๋ค.

๊ท๋ชจ๊ฐ ์์ ๋ prop drilling์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ณ , ๊ตฌํ ๋ฐฉ๋ฒ์ด ์ฝ๊ณ , props๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ์ ์ํ ๋ณ๊ฒฝ ์ ์๋ก์ด ๋ณ๊ฒฝ์ฌํญ์ ์ฝ๊ฒ ์
๋ฐ์ดํธ ํ ์ ์๋ ์ฅ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ฃผ๋ ์ญํ ๋ก๋ง ์ฌ์ฉ๋๊ณ ๊ทธ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ถํ์ํ๊ฒ ๊ธธ์ด์ง๋ฉฐ ํ์ํ์ง ์์ ๋ฐ์ดํฐ๊น์ง ์ ๋ฌํด์ค ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ถ์ฅํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ด ๊ฒฝ์ฐ contextAPI ํน์ ์ ์ญ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ ๋ฐ์ ์ ์์ง๋ง, ์ด๋ฒ์ ๊ทธ๋ค์ ๋์์ ๋ฐ์ง ์๊ณ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ค์๋์ง๋ฅผ ์์๋ฅผ ๋ค์ด ์ดํด๋ณด์.
์ฐ์ , API๋ฅผ ์ด์ฉํด User๊ฐ ๊ฐ์
ํ ๊ณ์ ์ ์ฐพ๋ Accounts ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํ์๋ ์ฒ์ AccountsFound๋ ์ปดํฌ๋ํธ์์ User์ Accounts๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๋ฐ์ดํฐ์ Accounts๊ฐ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ฅผ Accounts๋ ์ปดํฌ๋ํธ๋ก ๋๊ธฐ๊ณ ์ด๋ค์ ํ๋์ฉ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด mapํจ์๋ฅผ ์ฌ์ฉํด Account๋ผ๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํด์ฃผ์๋ค. ์๋ ์ฝ๋๋ธ๋ก์ ๋ณด์.
// before
interface AccountType {
name: string
email: string
createdAt: Date
}
function AccountsFound({ accounts }: { accounts: AccountType[] }) {
return <Accounts accounts={accounts} />
}
function Accounts({ accounts }: { accounts: AccountType[] }) {
return (
<>
<div>๊ณ ๊ฐ๋์ ๊ณ์ ์ ๋ณด์
๋๋ค.</div>
{accounts.map((item, idx) => (
<Account key={idx} info={item} />
))}
</>
)
}
function Account({ account }: { account: AccountType }) {
const { name, email, createdAt } = extractAccountData(account)
return (
<>
<div>{name}</div>
<div>{email}</div>
<div>{createdAt}</div>
</>
)
}
์ด ํ์ด์ง์์ ์์ฑ๋ ์ฝ๋ ์ค ๋นํจ์จ์ ์ผ๋ก ์์ฑ๋ ๋ถ๋ถ์ ์ฐพ์ ์ ์๊ฒ ๋๊ฐ?
- 15๋ผ์ธ์
<div>๋map์ ํตํดaccounts์ ๊ฐ์๋งํผ ์๋กญ๊ฒ ๋ ๋๋ง ๋๋ค. ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถํ์ํ๊ฒ ๋งค๋ฒ ์๋กญ๊ฒ ๋ ๋๋ง ๋๋ค. - ๋ถ๋ชจ(
<Accounts />) ์ปดํฌ๋ํธ๋ ์์(<Account />) ์ปดํฌ๋ํธ์๊ฒ ๋จ์ํ ๋ฐ์ดํฐ๋ง ์ ๋ฌํด์ฃผ๋ ์ญํ ๋ง ํ๊ณ ์๋ค. (์ด ๋ถ๋ถ์ดpropDrilling) ๋ฐ๋ผ์,<Accounts />์ปดํฌ๋ํธ๋ฅผ ์์ค๋ค. ์ฆ, ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์์๋ฅผAccountsFound -> Accounts -> Account์์AccountsFound -> Account๋ก ์ค์ฌ์ค๋ค.
// after
interface AccountType {
name: string
email: string
createdAt: Date
}
function AccountsFound({ accounts }: { accounts: AccountType[] }) {
return (
<>
<div>๊ณ ๊ฐ๋์ ๊ณ์ ์ ๋ณด์
๋๋ค.</div>
{accounts.map((account, idx) => (
<Account key={idx} account={account} />
))}
</>
)
}
function Account({ account }: { account: AccountType }) {
const { name, email, createdAt } = extractAccountData(account)
return (
<>
<div>{name}</div>
<div>{email}</div>
<div>{createdAt}</div>
</>
)
}
์ด๋ ๊ฒ ํด์ prop drilling์ ์ ์ญ์ํ๊ด๋ฆฌ๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ์๋๋ผ ๋ถํ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ฑฐํ๋ฉด์ ์ฝ๋๋ฅผ ๊ฐ๋จํ ์ค์ด๋ ์์๋ฅผ ์ดํด๋ดค๋ค. ๋จ์ํ ๋ฐ์ดํฐ๋ง ์ ๋ฌํด์ฃผ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์์ก๋ค๊ณ ์๊ฐํ๋ฉด prop drilling์ ํ๋ ๊ฒ์ ์๋์ง ํ ๋ฒ์ฏค ์์ ์ ๋๋์๋ณผ ์ ์๋ ์๊ฐ์ ์ ๊น์ด๋๋ง ๊ฐ์ง๋ฉฐ ์ด ๊ธ์ ๋ง์น๋ค.
Reference
๋๊ธ