[React] 15์žฅ. Context API

๊ฒจ๋ ˆยท2024๋…„ 12์›” 5์ผ

[React] ๋ฆฌ์•กํŠธ ์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
81/95

๐Ÿ“ React Context API
React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ

๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ Props Drilling(๋ถ€๋ชจ์—์„œ ์ž์‹, ์†์ž ๋“ฑ์œผ๋กœ props๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ)์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ React Context API ์ฃผ์š” ๊ฐœ๋…

  • Context ์ƒ์„ฑ
    • React.createContext()๋ฅผ ์‚ฌ์šฉํ•ด Context๋ฅผ ์ƒ์„ฑํ•จ.
    • ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.

  • Provider
    • Context ๊ฐ’์„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ
    • ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹ธ๋Š” ์—ญํ• 

  • Consumer
    • Context์—์„œ ์ œ๊ณต๋œ ๊ฐ’์„ ์ฝ๋Š” ์—ญํ• 
    • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useContext ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 

โ“๐Ÿค” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํ™˜๊ฒฝ ์„ค์ •, ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ฐ™์€ ์ „์—ญ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ props๋กœ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ์ฃผ๋กœ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ App์˜ state์— ๋„ฃ์–ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ๊ฐ€์ •
    G ์ปดํฌ๋„ŒํŠธ๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ์‹œํ‚ค๊ณ , F์™€ J ์ปดํฌ๋„ŒํŠธ๋Š” ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด App ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํƒœ์™€ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

    const [value, setValue] = useState('hello');
    const onSetValue = useCallback(value => setValue(value), []);

    ๊ทธ๋ฆฌ๊ณ  App์ด ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” value ๊ฐ’์„ F ์ปดํฌ๋„ŒํŠธ์™€ J ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. F์˜ ๊ฒฝ์šฐ App โ†’ A โ†’ B โ†’ F์˜ ํ๋ฆ„์ด๊ณ , J์˜ ๊ฒฝ์šฐ App โ†’ H โ†’ J์˜ ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์ถ”๊ฐ€๋กœ G ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋„ App โ†’ A โ†’ B โ†’ E โ†’ G์™€ ๊ฐ™์ด ๋ณต์žกํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑฐ์ณ์„œ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.


์‹ค์ œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•  ๋•Œ๋„ ์žˆ๊ณ  ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ›จ์”ฌ ๋งŽ์•„์งˆ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ๋‚ฎ์•„์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋•์Šค๋‚˜ MobX ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ์ž‘์—…์„ ๋” ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋ฆฌ์•กํŠธ v16.3 ์—…๋ฐ์ดํŠธ ์ดํ›„ Context API๊ฐ€ ๋งŽ์ด ๊ฐœ์„ ๋˜๋ฉด์„œ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ „์—ญ ์ƒํƒœ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆผ 15-3๊ณผ ๊ฐ™์ด ๊ธฐ์กด์—๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ props๋กœ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ–ˆ์ง€๋งŒ, Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Context๋ฅผ ๋งŒ๋“ค์–ด ๋‹จ ํ•œ ๋ฒˆ์— ์›ํ•˜๋Š” ๊ฐ’์„ ๋ฐ›์•„ ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ Context API ์‚ฌ์šฉ๋ฒ•

  • โ‘  Context ์ƒ์„ฑ

    import React, { createContext } from 'react';
    export const MyContext = createContext();
    • Context๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” createContext ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ํ•ด๋‹น Context์˜ ๊ธฐ๋ณธ ์ƒํƒœ๋ฅผ ์ง€์ •

  • โ‘ก Provider๋กœ ๋ฐ์ดํ„ฐ ์ œ๊ณต

    • ์ƒ์„ฑํ•œ context๋ฅผ ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Provider๋กœ ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ผ๋‹ค.

  • โ‘ข Provider๋กœ ๋ฐ์ดํ„ฐ ์ œ๊ณต

    // ์˜ˆ์‹œ
    import React, { createContext, useState } from 'react';
    
    export const MyContext = createContext();
    
    export const MyProvider = ({ children }) => {
     const [value, setValue] = useState("Hello, Context!");
    
      return (
       <MyContext.Provider value={{ value, setValue }}>
         {children}
       </MyContext.Provider>
     );
    };
    
    • Provider์˜ ํ”„๋กœํผํ‹ฐ์ธ value์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š”๋‹ค.
      • ์—ฌ๊ธฐ์„œ MyProvider๋Š” ์ƒํƒœ(value์™€ setValue)๋ฅผ Context๋กœ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
      • value โ‡’ Context์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ
        setValue โ‡’ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜

    • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” MyProvider๋กœ ๊ฐ์‹ธ์•ผ๋งŒ Context ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • โ‘ฃ Context ์‚ฌ์šฉ(Consumer ๋˜๋Š” useContext)
    Provider์˜ value์— ๋‹ด์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ๋Š”, 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    Consumer ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” useContext๋ผ๋Š” ํ›…(Hook)์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

    โœ… ๋‹จ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!!!

    • โœ” useContext ํ›… ์‚ฌ์šฉํ•˜๊ธฐ
      useContext๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ Context๋ฅผ ๋” ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ!

      import React, { useContext } from 'react';
      import { MyContext } from './MyProvider';
      
      const MyComponent = () => {
      const { value, setValue } = useContext(MyContext);
      
      return (
        <div>
          <p>{value}</p>
          <button onClick={() => setValue("New Context Value")}>Update Value</button>
        </div>
      );
      };
      
      export default MyComponent;
      

    • โœ” Consumer ์‚ฌ์šฉํ•˜๊ธฐ
      Consumer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ํ˜•์ด๋‚˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘์—์„œ Context๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!

      import React from 'react';
      import { MyContext } from './MyProvider';
      
      const MyComponent = () => {
      return (
       <MyContext.Consumer>
         {({ value, setValue }) => (
           <div>
             <p>{value}</p>
             <button onClick={() => setValue("New Context Value")}>Update Value</button>
           </div>
         )}
       </MyContext.Consumer>
      );
      };
      
      export default MyComponent;

๐Ÿ“ Context API ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 

  • ๊ณผ๋„ํ•œ ์‚ฌ์šฉ ์ž์ œ

    • Context๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ Redux, Zustand ๊ฐ™์€ ์ „์šฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.
  • Provider ์ค‘์ฒฉ

    • ์—ฌ๋Ÿฌ Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Provider ์ค‘์ฒฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด Context ๊ตฌ์กฐ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
  • ์ตœ์ ํ™”

    • ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ฒŒ React.memo ๋˜๋Š” useMemo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
profile
ํ˜ธ๋–ก ์‹ ๋ฌธ์ง€์—์„œ ๊ฐœ๋ฐœ์ž๋กœ ํ™˜์ƒ

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