๐ ๋ถํ์ํ 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
๋๊ธ