React context ์ฝ”๋“œ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ :: ๋ฆฌํŒฉํ† ๋ง

๋ฌธ์ œ ์ƒํ™ฉ

React context ์‚ฌ์šฉ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ ๊ตฌ์„ฑ์ด context ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜๋ก ๋ณต์žกํ•ด์ ธ์„œ ๋ฆฌํŒฉํ† ๋งํ•˜๋ ค ํ•œ๋‹ค.

 

๊ธฐ์กด ๊ตฌํ˜„

// ๊ตฌ์„ฑ
const UserContext = createContext<userType>({});
const SignInContext = createContext<()=>void>(()=>{});
export const UserContextProvider = ({ children }) => {
    const [user, setUser] = useState<userType>();
    const signIn = () => {};

    return (
        <UserContext value={user}>
            <SignInContext value={signIn}>
                {children}
            </SignInContext>
        </UserContext>
    );
}

export function useUserState() {
    const context = useContext(UserContext);
    return context;
}

export function useSignIn() {
    const context = useContext(loginContext);
    return context;
}

// ์‚ฌ์šฉ
const user = useUserState();

๊ธฐ์กด์˜ ์ฝ”๋“œ ๊ตฌ์„ฑ์€ ์œ„์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ํ•˜๋‚˜์˜ Context๋กœ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ value๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š” ํ˜•์‹์ด์—ˆ๊ณ , ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด context๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•œ ์š”์†Œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฐ›๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, signIn์€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์˜ค์ง user์˜ ์ •๋ณด๋งŒ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด signIn์— ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋ฆฌ๋ Œ๋”๋ง๋  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ context๋กœ๋งŒ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์ด ์•„์˜ˆ ๋ถ„๋ฆฌ๋˜์–ด์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. signIn์€ api๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ userContext๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ signIn๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋„ user์™€ ๊ฒฐํ•ฉํ•˜๊ณ  ์žˆ๋‹ค.

์–ด์ฐจํ”ผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์š”์†Œ์— ์˜ํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค๊ณ  ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ฐœ์„  ์ฝ”๋“œ

// ๊ตฌ์„ฑ
export interface UserContextType {
  signIn?: () => void,
  user? : userType | null,
}

const UserContext = createContext<UserContextType>({});

export const UserContextProvider: React.FC = ({ children }) => {
    const [user, setUser] = useState<userType>();
    const signIn = () => {};

  return (
    <UserContext.Provider
      value={{
        signIn,
        user,
      }}
    >
      {children}
    </UserContext.Provider>
  );
};

export const useUserContext = () => {
  const userContext = useContext(UserContext);
  return userContext;
};

// ์‚ฌ์šฉ
const {user, signIn} = useUserState();

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ Context๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ object๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ VSCode์™€ ๊ฐ™์€ ํˆด์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

๊ฒฐ๋ก 

Lighthouse ์ธก์ • ๊ฒฐ๊ณผ context ์ฐจ์ด์— ๋”ฐ๋ฅธ ํฐ ์„ฑ๋Šฅ ๋ณ€ํ™”๋Š” ์—†์—ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด object ํ˜•์‹์œผ๋กœ Context๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๋กœ ํ•˜์ž.

๋ฐ˜์‘ํ˜•