์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ญ์ผ๋ก ๊ณต์ ํ ์ ์๋ ๋ฆฌ์กํธ ๊ธฐ๋ฅ
| ๊ธฐ์กด ๋ฐฉ์ | ๋ฌธ์ ์ |
|---|---|
| props๋ฅผ ๋ถ๋ชจ โ ์์ โ ์์์๊ฒ ๊ณ์ ์ ๋ฌ | ์ ์ง๋ณด์ ์ด๋ ต๊ณ , ์ค๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ ์ฑ ์์ ์ง |
| useState๋ก๋ง ๊ด๋ฆฌ | ์ฌ๋ฌ ํ์ผ์์ ์ค๋ณต๋๊ฑฐ๋ ๋นํจ์จ์ ์ผ ์ ์์ |
โ Provider๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ฅผ ํ๋์ ์์ ์ปดํฌ๋ํธ์์ ์ ์ญ ๊ด๋ฆฌ ๊ฐ๋ฅํจ
โ ์ปดํฌ๋ํธ ๊ฐ ์์ง๋ ๋์ด๊ณ , ์ํ ํ๋ฆ์ ๋ช
ํํ๊ฒ ๊ด๋ฆฌ
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํ์ (ex. API ํธ์ถ)
useQuery() / useSuspenseQuery() ๋ฑ์ผ๋ก ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ฒญisLoading, isFetching, error, data ๋ฑ ์๋ ๊ด๋ฆฌ| ์ญํ | ์ค๋ช |
|---|---|
| ์ฟผ๋ฆฌ(Query) | ์ค์ API ํธ์ถ ๋ด๋น (GET, POST ๋ฑ) |
| Provider | ์ฟผ๋ฆฌ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ + ๊ธฐํ ์ํ๋ค์ ์ ์ญ์์ ์ธ ์ ์๊ฒ ๊ณต๊ธ |
โ ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ๊ฑธ Context๋ก ๊ฐ์ธ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ฆ
| ์ํฉ | ์ฐ๋ฉด ์ข์? |
|---|---|
| ์์ ์ปดํฌ๋ํธ๋ผ๋ฆฌ๋ง ๊ณต์ | โ props๋ก ์ถฉ๋ถ |
| ํ์ด์ง ์ ์ฒด์์ ๊ณต์ (ex. ํํฐ ์กฐ๊ฑด, ๊ฒ์์ด, ๋ฆฌ์คํธ ๋ฐ์ดํฐ ๋ฑ) | โ Context Provider ์ถ์ฒ |
| ์ฟผ๋ฆฌ ์๋ต๊ฐ + ํํฐ ์ํ + ํ์ด์ง ๊ฐ์ด ๊ด๋ฆฌ | โ Provider๋ก ๋ฌถ์ผ๋ฉด ์ต์ ํ์ ์์ง๋ ์์น |
Context Provider๋ฅผ ์์ฑํ ๋ ๋ค์ ๊ท์น์ ์ง์ผ์ฃผ์ธ์:
**I**mport**T**ype ์ ์SomeContextType)**P**rovider ์์ฑcreateContext๋ก context ๊ฐ์ฒด ๋ง๋ค๊ธฐ + ๊ธฐ๋ณธ๊ฐ ์ธํ
**C**hild Props ์ ์children: React.ReactNode๋ฅผ ๋ฐ๋ props ํ์
**C**omponent ๊ตฌํuseState, useQuery, useEffect ๋ฑ)value={{ ... }}์ ์ ํํ๊ฒ ํ์
๋ง์ถฐ์ ์ ๋ฌ**C**ontext Hook ๋ง๋ค๊ธฐuseXXXProvider() ์ด๋ฆ์ผ๋ก context ๋ฆฌํดํ๋ ํ
์ ์default export๐ฆ ITP-CCC ๊ตฌ์กฐ| ๋จ๊ณ | ์ด๋ฆ | ์ค๋ช |
|---|---|---|
| 1๏ธโฃ | Import | ํ์ํ ๋ชจ๋/ํ์ import |
| 2๏ธโฃ | Type ์ ์ | Context์์ ์ฌ์ฉํ ํ์ ์ ์ |
| 3๏ธโฃ | Provider ๊ฐ์ฒด ์์ฑ | createContext๋ก context ๊ฐ์ฒด ๋ง๋ค๊ธฐ |
| 4๏ธโฃ | Child Props | Provider Props ํ์ ์ ์ |
| 5๏ธโฃ | Component | ๋ด๋ถ ์ํ + ์ฟผ๋ฆฌ + value={} ์ค์ |
| 6๏ธโฃ | Context Hook | useXXXProvider()๋ก ์ ๊ทผ์ฑ ํฅ์ |
| 7๏ธโฃ | Export | default export ๊ผญ ์ถ๊ฐ |
import { createContext, useContext, useState, Dispatch, SetStateAction } from 'react';
import useXYZ from '@/hooks/useXYZ';
import { Item } from '@/types/model/item';
type XYZContextType = {
itemList: Item[];
count: number;
setCount: Dispatch<SetStateAction<number>>;
};
const XYZContext = createContext<XYZContextType>({
itemList: [],
count: 0,
setCount: () => {},
});
type XYZProviderProps = {
children: React.ReactNode;
};
const XYZProvider = ({ children }: XYZProviderProps) => {
const [count, setCount] = useState(0);
const { data: itemList = [] } = useXYZ();
return (
<XYZContext.Provider value={{ itemList, count, setCount }}>
{children}
</XYZContext.Provider>
);
};
export const useXYZProvider = () => useContext(XYZContext);
export default XYZProvider;
value={{ ... }}์ ๋ค์ด๊ฐ๋ key๋ค์ ContextType๊ณผ 100% ์ผ์นํ๋๋ก ์ ์งํ์ธ์.๐ ์ด ๊ตฌ์กฐ๋๋ก ์์ฑํ๋ฉด ๊ท๋ชจ๊ฐ ์ปค์ ธ๋ ์ ์ง๋ณด์/ํ์ ์ด ํธ๋ฆฌํด์ง๋๋ค!