๐ŸŒ React Context Provider

๋‹จ๋‹จยท2025๋…„ 7์›” 29์ผ

๐Ÿ“Œ ๊ฐœ๋… ์ •๋ฆฌ

โœ… Context๋ž€?

์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ

  • props drilling ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ: ๋กœ๊ทธ์ธ ์ •๋ณด, ํ…Œ๋งˆ ์„ค์ •, ํ•„ํ„ฐ ์กฐ๊ฑด, API ๋ฐ์ดํ„ฐ ๋“ฑ

โœ… ์™œ Provider๋ฅผ ์“ฐ๋Š”๊ฐ€?

๊ธฐ์กด ๋ฐฉ์‹๋ฌธ์ œ์ 
props๋ฅผ ๋ถ€๋ชจ โ†’ ์ž์‹ โ†’ ์†์ž์—๊ฒŒ ๊ณ„์† ์ „๋‹ฌ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ต๊ณ , ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ฑ…์ž„์„ ์ง
useState๋กœ๋งŒ ๊ด€๋ฆฌ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ

โœ” Provider๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „์—ญ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•จ
โ†’ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์‘์ง‘๋„ ๋†’์ด๊ณ , ์ƒํƒœ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌ


โœ… Query๋ž€?

์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ–‰์œ„ (ex. API ํ˜ธ์ถœ)

  • React Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด:
    • useQuery() / useSuspenseQuery() ๋“ฑ์œผ๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ
    • ์บ์‹œ ๊ธฐ๋Šฅ์ด ์žˆ์–ด ๊ฐ™์€ ์ฟผ๋ฆฌ๋Š” ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ
    • ์ƒํƒœ: isLoading, isFetching, error, data ๋“ฑ ์ž๋™ ๊ด€๋ฆฌ

โœ… ์ฟผ๋ฆฌ์™€ Provider์˜ ๊ด€๊ณ„?

์—ญํ• ์„ค๋ช…
์ฟผ๋ฆฌ(Query)์‹ค์ œ API ํ˜ธ์ถœ ๋‹ด๋‹น (GET, POST ๋“ฑ)
Provider์ฟผ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ + ๊ธฐํƒ€ ์ƒํƒœ๋“ค์„ ์ „์—ญ์—์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๊ณต๊ธ‰

โ†’ ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ๊ฑธ Context๋กœ ๊ฐ์‹ธ์„œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ


โœ… ์–ธ์ œ Provider๋ฅผ ์“ฐ๋ฉด ์ข‹์€๊ฐ€?

์ƒํ™ฉ์“ฐ๋ฉด ์ข‹์Œ?
์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ๋งŒ ๊ณต์œ โŒ props๋กœ ์ถฉ๋ถ„
ํŽ˜์ด์ง€ ์ „์ฒด์—์„œ ๊ณต์œ  (ex. ํ•„ํ„ฐ ์กฐ๊ฑด, ๊ฒ€์ƒ‰์–ด, ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋“ฑ)โœ… Context Provider ์ถ”์ฒœ
์ฟผ๋ฆฌ ์‘๋‹ต๊ฐ’ + ํ•„ํ„ฐ ์ƒํƒœ + ํŽ˜์ด์ง• ๊ฐ™์ด ๊ด€๋ฆฌโœ… Provider๋กœ ๋ฌถ์œผ๋ฉด ์ตœ์ ํ™”์™€ ์‘์ง‘๋„ ์ƒ์Šน

โœ๏ธ ์ž‘์„ฑ ๊ทœ์น™ (ITP-CCC)

Context Provider๋ฅผ ์ž‘์„ฑํ•  ๋• ๋‹ค์Œ ๊ทœ์น™์„ ์ง€์ผœ์ฃผ์„ธ์š”:

๐Ÿ“ฆ 1. **I**mport

  • ํ•„์š”ํ•œ ํ›…, ํƒ€์ž…, ์ฟผ๋ฆฌ ๋“ฑ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

โœ๏ธ 2. **T**ype ์ •์˜

  • Context ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฃฐ value ํƒ€์ž… ์ •์˜ (e.g., SomeContextType)

โš™๏ธ 3. **P**rovider ์ƒ์„ฑ

  • createContext๋กœ context ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ + ๊ธฐ๋ณธ๊ฐ’ ์„ธํŒ…

๐Ÿ“ฌ 4. **C**hild Props ์ •์˜

  • children: React.ReactNode๋ฅผ ๋ฐ›๋Š” props ํƒ€์ž…

๐Ÿง  5. **C**omponent ๊ตฌํ˜„

  • ๋‚ด๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ (useState, useQuery, useEffect ๋“ฑ)
  • value={{ ... }}์— ์ •ํ™•ํ•˜๊ฒŒ ํƒ€์ž… ๋งž์ถฐ์„œ ์ „๋‹ฌ

๐Ÿš€ 6. **C**ontext Hook ๋งŒ๋“ค๊ธฐ

  • useXXXProvider() ์ด๋ฆ„์œผ๋กœ context ๋ฆฌํ„ดํ•˜๋Š” ํ›… ์ •์˜

๐Ÿ“ค 7. default export

  • Provider ์ปดํฌ๋„ŒํŠธ๋ฅผ export

๐Ÿง  ์ „์ฒด ๊ธฐ์–ตํ•˜๊ธฐ: ๐Ÿ“ฆ ITP-CCC ๊ตฌ์กฐ

๋‹จ๊ณ„์ด๋ฆ„์„ค๋ช…
1๏ธโƒฃImportํ•„์š”ํ•œ ๋ชจ๋“ˆ/ํƒ€์ž… import
2๏ธโƒฃType ์ •์˜Context์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž… ์ •์˜
3๏ธโƒฃProvider ๊ฐ์ฒด ์ƒ์„ฑcreateContext๋กœ context ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
4๏ธโƒฃChild PropsProvider Props ํƒ€์ž… ์ •์˜
5๏ธโƒฃComponent๋‚ด๋ถ€ ์ƒํƒœ + ์ฟผ๋ฆฌ + value={} ์„ค์ •
6๏ธโƒฃContext HookuseXXXProvider()๋กœ ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ
7๏ธโƒฃExportdefault 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;

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌ ํŒ

  • Context๋Š” ๋„ˆ๋ฌด ๋งŽ์ด ๋‚จ๋ฐœํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํฐ ์ƒํƒœ์—๋งŒ ์ ์šฉ
  • ์ฟผ๋ฆฌ์™€ ๊ฒฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊น”๋”ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์„ค๊ณ„ ๊ฐ€๋Šฅ
  • value={{ ... }}์— ๋“ค์–ด๊ฐ€๋Š” key๋“ค์€ ContextType๊ณผ 100% ์ผ์น˜ํ•˜๋„๋ก ์œ ์ง€ํ•˜์„ธ์š”.

๐Ÿ“Œ ์ด ๊ตฌ์กฐ๋Œ€๋กœ ์ž‘์„ฑํ•˜๋ฉด ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ์œ ์ง€๋ณด์ˆ˜/ํ˜‘์—…์ด ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค!

profile
๋‹จ๋‹จํ•œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€