๐ง Inertia/React + Context ํ๊ฒฝ์์ ์ค๋ณต fetch
๋ฌธ์ ํด๊ฒฐ๊ธฐ
๐ ๋ฌธ์ ์ ์
์ต๊ทผ Inertia.js + React + Laravel ์กฐํฉ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ์ค, Context ๋ด๋ถ์์ fetch
๊ฐ ๋ ๋ฒ ์ด์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค.
- Context ๋ด๋ถ์์ ์ด๊ธฐ
fetch
์์ฒญ์ ๋ณด๋ด๊ณ ์์๊ณ , ์ด ์์ฒญ์ ํน์ state
์ ์์กดํ๊ณ ์์์ต๋๋ค. - ๊ทธ๋ฐ๋ฐ ํ์ด์ง ์ด๋ ์ Context๊ฐ ์ฌ๋ง์ดํธ๋๋ฉฐ
initialState
๊ฐ ๋ค์ ์ ์ฉ๋์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋กfetch
๊ฐ ๋ ๋ฒ ์ด์ ์คํ๋์์ต๋๋ค. - ์ด๋ก ์ธํด ๋๋ฌผ๊ฒ ์ด๊ธฐ๊ฐ์ด UI์ ๋ฐ์๋๋ ๋ฌธ์ , ํน์ ๊น๋นก์(flickering)์ด ๋ฐ์ํ์ต๋๋ค.
โ๏ธ ๋ฌธ์ ์์ธ ๋ถ์
Inertia ํ๊ฒฝ์์ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ์ด ์์์ต๋๋ค:
- Context Provider๋ฅผ
<App />
์์ ๋ ์ ์๋ ๊ตฌ์กฐ
→ Laravel์์ ๋ ๋๋ง๋๋ Blade ํ์ผ์ด ์๊ณ , ๊ทธ ์์์ React๊ฐ ๋ง์ดํธ๋๊ธฐ ๋๋ฌธ์ Context๋ฅผ ๋ฃจํธ ์ต์๋จ์์ ๊ฐ์ธ๋ ๊ฒ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค. - Inertia ํ์ด์ง ์ด๋ ์ ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ง์ดํธ๋จ
→ ๋ผ์ฐํฐ๋ณด๋ค ํ์์์ Provider๊ฐ ์ ์ธ๋ผ ์์ผ๋ฏ๋ก ํ์ด์ง ์ด๋๋ง๋ค Context๊ฐ ์๋กญ๊ฒ ์ด๊ธฐํ๋จ. useReducer
์initialState
๋ ์ฒซ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ์ ์ฉ๋จ
→ ํ์ง๋ง ํ์ด์ง ์ ํ๋ง๋ค Context ์์ฒด๊ฐ ์ฌ๋ง์ดํธ๋๋ฏ๋ก, ๊ฒฐ๊ณผ์ ์ผ๋กinitialState
๊ฐ ์์ฃผ ์ฌ์ ์ฉ๋๊ณfetch
๊ฐ ๋ฐ๋ณต๋จ.
๐ ๏ธ ํด๊ฒฐ ๊ณผ์
์๋ 1. initialState
์ pageProps
๋ฅผ ํ์ฉ
๋คํํ state
๊ฐ url
์ ์์กดํ๊ณ ์์๊ธฐ ๋๋ฌธ์, ์๋์ฒ๋ผ initialState
๋ฅผ ๋์ ์ผ๋ก ์ค์ ํด ๋ฌธ์ ๋ฅผ ์ฐํํ ์ ์์์ต๋๋ค:
const pageProps = usePage();
const [state, dispatch] = useReducer(
adminReducer,
getInitialAdminState(pageProps), // ์ด๊ธฐ๊ฐ์ props๋ก๋ถํฐ ์ค์
);
ํ์ง๋ง ์ด๋ฐ ๋ฐฉ๋ฒ์ ํ๊ณ๊ฐ ์์ต๋๋ค.
- ์ด๊ธฐํ ๊ธฐ์ค์ด URL์ด๋
props
์ฒ๋ผ ์ธ๋ถ๋ก๋ถํฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ์๋ง ๋์ํฉ๋๋ค. - ์ฌ์ฉ์์ ํด๋ฆญ์ด๋ ์ ๋ ฅ์ฒ๋ผ ๋ด๋ถ ์ํ ๋ณํ์ ์์กดํ๋ ๊ฒฝ์ฐ์ ์ธ ์ ์์ต๋๋ค.
์๋ 2. ์ด๊ธฐ๊ฐ์ null
๋ก ํ๊ณ , useEffect
์์ ์กฐ๊ฑด๋ถ fetch
๋ณด๋ค ๋ฒ์ฉ์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก ์๋ ๋ฐฉ์์ ์ฑํํ์ต๋๋ค:
- ์ํ๋ฅผ ์ต์ํ์ผ๋ก ์ ์ (
targetId: null
) targetId
๊ฐ ์ค์ ๋๋ฉด ๊ทธ๋fetch
๋ฅผ ํธ๋ฆฌ๊ฑฐ- ์ํ๋ ์ปดํฌ๋ํธ์์ ๋ช
์์ ์ผ๋ก
dispatch
๋ฅผ ํตํดtargetId
์ค์
const [state, dispatch] = useReducer(reducer, {
targetId: null,
data: null,
loading: false,
});
useEffect(() => {
if (!state.targetId) return;
dispatch({ type: 'FETCH_START' });
fetchData(state.targetId)
.then((data) => dispatch({ type: 'FETCH_SUCCESS', payload: data }))
.catch(() => dispatch({ type: 'FETCH_FAIL' }));
}, [state.targetId]);
์ปดํฌ๋ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ํธ๋ฆฌ๊ฑฐํฉ๋๋ค:
onClick={() => dispatch({ type: 'SET_ID', payload: 123 })}
โจ ๋ฐฐ์ด ์ & ์ธ์ฌ์ดํธ
- Context๋ ์์น๊ฐ ์ ๋ถ๋ค.
์ต์๋จ์์ ๊ฐ์ธ์ง ๋ชปํ๋ ๊ตฌ์กฐ๋ผ๋ฉด,initialState
์ ์์กด์ฑ๋ง์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๊ธด ์ด๋ ต๋ค. - ์ด๊ธฐ๊ฐ์ ์ต์ํํ๊ณ , side-effect๋ก ๋์์ ๋ถ๋ฆฌํ์.
useEffect
๋ ์์กด์ฑ ๊ธฐ๋ฐ์ผ๋ก fetch ๋์์ ๋ถ๋ฆฌํ ์ ์์ด ํจ์ฌ ์ ์ฐํ๊ณ ์์ ์ ์ด๋ค. - ์ํ ๊ธฐ๋ฐ ์กฐ๊ฑด๋ถ fetch๋ ๊น๋นก์์ ์ค์ด๊ณ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ฌ์ค๋ค.
ํนํ ์ด๊ธฐ๊ฐ์ดnull
์ธ ์ํ์์ fetch๋ฅผ ๋ง๊ณ , ํ์ํ ์์ ์๋ง ๋ช ํํ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ์์ ์ ์ง๋ณด์์ฑ๊ณผ ์์ ์ฑ ์ธก๋ฉด์์ ๋งค์ฐ ๊ฐ๋ ฅํ๋ค. - Context๋ก ๋ชจ๋ ๊ฑธ ํด๊ฒฐํ๋ ค ํ์ง ๋ง์.
ํ ์ํฉ์ ์ ์ญ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์๊ธฐ๋ก ํ์ง๋ง, ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต๋๋ค๋ฉดZustand
,React Query
,Jotai
๊ฐ์ ๊ฒฝ๋ ์ ์ญ ์ํ ๋์ ๋ ๊ณ ๋ฏผํด๋ณผ๋งํ๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250505 TIL] polling ์ ์ฉ๊ธฐ (0) | 2025.05.05 |
---|---|
[250429 TIL] ์ปดํฌ๋ํธ ๋ฆฌ์ ์ key์จ๋จน๊ธฐ (0) | 2025.04.29 |
[250411 til] ๋ฐฉํ๋ฒฝ ์ ์ + VPN์์.. (0) | 2025.04.11 |
[250326 TIL] image-rendering, translateZ(0) (0) | 2025.03.26 |
[250318 TIL] ์ธ์ฑ์์ ํ๊ฒจ๋ฒ๋ฆฌ๊ณ ์ถ์๋ (0) | 2025.03.18 |