
Context API ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ด๋ ํ ์ ๋ณด(๋ฐ์ดํฐ)๋ฅผ ๋ง๋ค๊ณ , ์์ ์ ์์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด props๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ฉฐ ์ฝ๊ฒ ๊ฐ์ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฆฌ์กํธ์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ค์ ๋งํด, React์ context๋ ์ปดํฌ๋ํธ๋ค์ด ๋ฐ์ดํฐ(state)๋ฅผ ๋ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋๋ก ํด์ค๋ค.
โ ๋๋ฌด ๋ง์ prop drilling์ ํ์ง ์๊ธฐ ์ํด!
React ์์์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ -> ์์ ์ปดํฌ๋ํธ์ ๋ฐฉํฅ์ผ๋ก props๋ฅผ ์ด์ฉํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ์ ๋ฌ ํ๋ฆ์ด ์ผ์ด๋๋ค.
์ด๋ state๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ์์์ ๋ชฉํ ์์ ์ด๋ผ๊ณ  ํํํ์ ๋
- ๋ถ๋ชจ โก๏ธ ์์ โก๏ธ ์์ โก๏ธ ์์ โก๏ธ
 ๋ชฉํ ์์- ๋ถ๋ชจ โก๏ธ
 ๋ชฉํ ์์โก๏ธ๋ชฉํ ์์โก๏ธ๋ชฉํ ์์โก๏ธ๋ชฉํ ์์
์ด๋ฌํ ๊ฒฝ์ฐ๋ค์์๋ ๋๋ฌด ๋ง์ prop drilling์ด ๋ฐ์ํ  ์ ์์ผ๋ฏ๋ก context API๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
props๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์์ ์ค๊ฐ ์ปดํฌ๋ํธ๋ ๊ทธ ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์์์๋ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ธฐ ์ํด props๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ณผ์ ์ ๋งํ๋ค.
( prop์ด ๋๋ฆด์ฒ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๋ซ๊ณ ๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๊ณ ํ์ฌ์ prop drilling์ด๋ผ๊ณ ํ๋ค๋ค์! )
์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ๋ฅผ ํ  ๋ ์ปดํฌ๋ํธ๋ค์ ๊ณตํต ์กฐ์์ด ๋๋ฌด ์์ ์๋ ๊ฒฝ์ฐ ๋ถํ์ํ๊ฒ ๋ง์ prop drilling์ ์ผ์ผํฌ ์ ์๋ค.
๐ก ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ(lifting state up)๋?
๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ์ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ฐ์ํด์ผ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น
state๋ฅผ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ(๊ณตํต ์กฐ์)์ ์ ์ํ์ฌ๋๊ณprops๋ฅผ ํตํด ํด๋น state๋ฅผ ๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
์ด๋ ๊ฒ ๋๋ฌด ๋ง์ prop drilling์ ๋ง์์ฃผ๊ธฐ ์ํด React์ Context API๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ํ์์๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ง ์๊ณ  ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ component์ ์ง์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ  ์ ์๊ฒ ๋๋ค.

โ useContext์ ๊ฐ์ฅ ์ค์ํ ์ธ๊ฐ์ง ํค์๋
1. createContext :context ๋ง๋ค๊ธฐ
2. Context.provider : context๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ์์๋คํํ  ๋ฟ๋ ค์ฃผ๊ธฐ
3. useContext : context๊ฐ์ด ํ์ํ ์ปดํฌ๋ํธ์์ context ์ฌ์ฉํ๊ธฐ
๋ง ๊ทธ๋๋ก ์ปดํฌ๋ํธ๋ค์ด provideํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก context ๋ง๋ค๊ธฐ
// someContext.js
import { createContext } from 'react';
const SomeContext = createContext(defaultValue);
export default someContext;
createContext๋ default๊ฐ์ ์ธ์๋ก ๋ฐ๋๋ค. ์ด๋ default๊ฐ์ ์ด๋ ํ์
์ด ๋ค์ด๊ฐ๋ ์๊ด ์๋ค. (๊ฐ์ฒด๋ ๊ฐ๋ฅ,ํจ์๋ ๊ฐ๋ฅ)
default๊ฐ์ context๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ปดํฌ๋ํธ์๊ฒ ๋งค์นญ๋๋ provider๋ฅผ ์ฐพ์ง ๋ชปํ์ ๊ฒฝ์ฐ (ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ provider๊ฐ ์๋ ๊ฒฝ์ฐ)์ context์ ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ค.
default๊ฐ์ ์ค์ ํด๋์ง ์๊ณ  provider๋ก ๊ฐ์ธ์ง ์์ ์ปดํฌ๋ํธ์์ context๊ฐ์ ์ ๊ทผํ๊ฒ ๋๋ค๋ฉด context๋ undefined์ ๊ฐ์ ๋ฐํํ๋ค.
๐ ๊ฐ๋จํ ์ฝ๋ ์์
context.js์์ createContext
(1๋ฒ ๊ฒฝ์ฐ์ 2๋ฒ ๊ฒฝ์ฐ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์๊ฐํด๋ณด์ !)// context.js import { createContext } from 'react'; // 1. default ๊ฐ ์ ์ํด๋์ง ์์ const SomeContext = createContext(); // 2. default ๊ฐ ์ ์ํด๋ const SomeContext = createContext('default value'); export default someContext;
- context๊ฐ์ ์ฌ์ฉํ๋ ค๋
 FirstComponent๋ฅผ provider๋ก ๊ฐ์ธ์ง ์์// App.js import FirstComponent from "./FirstComponent"; export default function App() { return ( // provider๋ก ๊ฐ์ธ์ง ์์ <FirstComponent /> ); }
- FirstComponent์์
 useContext๋ฅผ ํตํด context๊ฐ์ ์ ๊ทผ// FirstComponent.js import { useContext } from "react"; import SomeContext from "./context"; function FirstComponent() { const value = useContext(SomeContext); return <div>First Component says: "{value}"</div>; // 1. First Component says: (๋น ๊ฐ์ผ๋ก ๋์ด) // 2. First Component says: default value }
๐ก ํ์ง๋ง ๊ผญ createContext๋ฅผ ํ  ๋ default๊ฐ์ ์ค์ ํด์ผ ํ๋ ๊ฒ์ ์๋๋ค. default๊ฐ์ ๋น ๊ฐ์ผ๋ก ์ค์ ํ๊ณ  provider์์ ์ง์  ์ค์ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
"์ด ์ปดํฌ๋ํธ์์ createContext๋ก ์ ์๋์ด ์๋ context๋ฅผ ์ฝ๊ณ  ์ฌ์ฉํ๊ณ ์ถ๋ ~ ๋ผ๊ณ  ๋งํด์ฃผ๋ ๊ณผ์ " ์ผ๋ก context๊ฐ์ ์ฌ์ฉํ๋ ค๋ ์ปดํฌ๋ํธ์์ useContext hook์ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ฐ๋ ๊ณผ์ ์ด๋ค. 
useContext๋ createContext์์ ๋ง๋  context๊ฐ์ ์ฝ๊ณ  ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋ฆฌ๋ ๋๋งํ๋ค.
// FirstComponent.js
// 1. useContext importํ๊ธฐ
import { useContext } from "react";
// 2. ๋ง๋ค์ด๋ context importํ๊ธฐ
import SomeContext from "./context";
function FirstComponent() {
  // 3. useContext ์ฌ์ฉํด์ context๊ฐ ์ฝ๊ธฐ, ๋ณํ๊ฐ์ง
  const value = useContext(SomeContext); 
  return <div>First Component says: "{value}"</div>;
}
export default FirstComponent;
๐ ์ด๋ ์ฃผ์ํ ์ ์ useContext๋ hook์ ์ผ์ข ์ด๋ฏ๋ก ๋น์ฐํ! hook์ ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค
๐ซฃ ์ฌ๊ธฐ์ hook์ ๊ท์น ์ ๊น ์ง๊ณ ๋์ด๊ฐ์๋ฉด~
1. ๋ฆฌ์กํธ hook์ ๋ฆฌ์กํธ ํจ์ ๋ด๋ถ์์๋ง ํธ์ถ๋์ด์ผ ํ๋ค.
์ฆ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํจ์ ๋๋ custom Hook์์๋ง ํธ์ถ๋์ด์ผ ํ๋ค.2. ์ต์์ ์์ค์์ ์ฌ์ฉ๋์ด์ผ ํ๋ค.
์ค์ฒฉํจ์์ ๋ด๋ถ๋ผ๋๊ฐ if๋ฌธ ๋ด๋ถ๋ผ๋๊ฐ .. ํจ์์ ๋ด๋ถ์ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ฐ์ฅ ์ต์์๋จ์์ ์ฌ์ฉํด์ผ ํ๋ค!
provider๋ 1. ์ด๋์์ 2. ์ด๋ป๊ฒ ์ด context๊ฐ์ ์ฌ์ฉํ๊ณ  ์ถ์๋ฐ? ๋ฅผ ์ ํด์ ์๋ ค์ฃผ๋ ๊ณผ์ ์ด๋ผ๊ณ  ์๊ฐํ๋ฉด ๋๋ค.
๋ด๊ฐ context๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ค์ ์๋จ์ provider๋ก ๋ฌถ์ด์ฃผ์ด์ ์๋ ค์ค๋ค.
1-1. ์ด๋ ํน์  ์ปดํฌ๋ํธ๋ง์ ๋ฌถ์ด์ค ์๋ ์๊ณ 
1-2. {children}์ provider๋ก ๊ฐ์ธ์ ํ์์ ๋ชจ๋  ์ปดํฌ๋ํธ์์ context๋ฅผ ์ฌ์ฉํ๋๋ก ํ  ์ ์๋ค.
provider์ value๋ฅผ ์
๋ฐ์ดํธ ํด์ context ๊ฐ์ ๋ณ๊ฒฝํด์ค๋ค.
์ฌ๊ธฐ์ value ์์ฑ์ provider์์ ์ ํด์ ธ ์๋ props์ ์ด๋ฆ์ด๋ค.
// 1-1) FirstComponent ๋ด๋ถ์์์ context๊ฐ์ 'seojin'์ผ๋ก ์ค!
// App.js
import FirstComponent from "./firstcomponent";
import SomeContext from "./context";
export default function App() {
  return (
    // context๊ฐ์ 'seojin'์ผ๋ก ์
๋ฐ์ดํธ ํด์ค!
    <SomeContext.Provider value={'seojin'}>
      <FirstComponent />
    </SomeContext.Provider>
  );
}
// 1-2) section ์์ ์๋ ์ด๋ ํ ์ปดํฌ๋ํธ๋  context๋ฅผ ์์ฒญํ๋ฉด, ์ด contextValue๊ฐ์ ์ค !
// section.js
import SomeContext from "./context";
export default function Section({ contextValue, children }) {
  return (
    <section className="section">
      <LevelContext.Provider value={contextValue}>
        {children}
      </LevelContext.Provider>
    </section>
  );
}
context๋ฅผ ์์ฒญํ ์ปดํฌ๋ํธ๋ ์์ ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด provider๋ฅผ ์ฐพ์๊ฐ์ ํด๋น provider๊ฐ ์ ๊ณตํ๋ value๊ฐ์ ์ฌ์ฉํ๋ค!
1๏ธโฃ์์ defaultValue๋ฅผ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ด provider๋ก ๊ฐ์ธ์ง์ง ์์ ์ปดํฌ๋ํธ์์ useContext๋ฅผ ํตํด context๊ฐ์ ์ ๊ทผํ๋ฉด createContext์์ ์ ์ํ defaultValue๋ก ์ ๊ทผ ๋๋ค. ๋ง์ฝ default๊ฐ์ด ์๋ค๋ฉด undefined๋ก ์ ๊ทผ๋๋ค.
๐ก ์๋ฌ๋ ๋ฐ๋ก ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก ์๋ฌ๋ฅผ ์ก๊ณ ์ถ๋ค๋ฉด ๋ฐ๋ก ์๋ฌ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค ,,
๐ ์ ๋ฆฌ
context๋ง๋ค๊ธฐ- context๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ
 provider๋ก ๊ฐ์ธ๊ธฐ, ์ฌ์ฉํcontext๊ฐ value ์์ฑ ์ด์ฉํด์ ์ ๋ฐ์ดํธํ๊ธฐcontext๊ฐ์ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ์์useContext๋ฅผ ํตํด context๊ฐ์ ์ ๊ทผprovider์์ value ์์ฑ์ ํตํด ์ ๋ฐ์ดํธํ context๋ฅผ ๋ณด๊ณ ์ค์  ์ปดํฌ๋ํธ์์ ๋ ๋๋ง~
YES โญ๏ธ
createContext()๋ก ์ง์ ๋ ์๋ก ๋ค๋ฅธ context๋ค์ ์๋ก ์ ๋ ์ํฅ์ ๋ผ์น์ง ์๋๋ค. ๋๋ฌธ์ ํ๋์ ์ปดํฌ๋ํธ์์ ์ฌ๋ฌ ๊ฐ์ ์๋ก ๋ค๋ฅธ context๋ฅผ useํ๊ณ  provideํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
YES โญ๏ธ
Context๊ฐ ์ ์กํ๋ value ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ํํ์ด๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด์์ ํ๋์ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝ๋์ด๋ Provider๋ก ๊ฐ์ผ ๋ชจ๋  ์์ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
Provider๋ก๋ถํฐ ํ์ consumer๋ก์ ์ ํ๋ shouldComponentUpdate ๋ฉ์๋๊ฐ ์ ์ฉ๋์ง ์๋๋ค!
๐ก shouldComponentUpdate๋
์ต์ ํ๋ฅผ ์ํ ๋ผ์ดํ ์ฌ์ดํด๋ก ์ด์  state, props์ ํ์ฌ state,props๋ฅผ ๋น๊ตํด ๋ฌ๋ผ์ง์ง ์์๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ ํ์ง ์๊ฒ ํ๋ ์ต์ ํ ๊ธฐ๋ฒ
์๋ฅผ๋ค์ด  FirstName ์ปดํฌ๋ํธ์์๋ NameContext.firstName ๊ฐ๋ง์ ์ฌ์ฉํ๊ณ  FamilyName ์ปดํฌ๋ํธ์์๋ NameContext.familyName ๊ฐ๋ง์ ์ฌ์ฉํ์ง๋ง, FirstName ์ปดํฌ๋ํธ์์ ๊ฐ์ ์์ ์ FamilyName ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
useContext๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ ๋ํ provider๋ก ๊ฐ์ธ์ ธ ์์ผ๋ฉด provider์ ์ํด context๊ฐ์ด ๋ณ๊ฒฝ๋  ๊ฒฝ์ฐ ๋ชจ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค.
์ฌ๊ธฐ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ์ฐธ์กฐ๊ฐ์ผ ๊ฒฝ์ฐ ์ค์ ๋ก(์ฐ๋ฆฌ๊ฐ ๋ณด๊ธฐ์) ๊ฐ์ด ๋ณํ์ง ์์์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๊ณ์ ์๋ก์ด ๊ฐ์ผ๋ก ์ธ์งํ์ฌ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์์๊ฐ์ผ ๊ฒฝ์ฐ์๋ Provider ํ์์์ context๋ฅผ ๊ตฌ๋
ํ๋ ๋ชจ๋  ์ปดํฌ๋ํธ๋ Provider์ value prop๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ค์ ๋ ๋๋ง ๋๋ค. 
๊ฒฐ๊ตญ ์ธ๋ฐ์๋ ๋ฆฌ๋ ๋๋ง์ด ๋์ํ๊ฒ ๋ ์ ์๋ค
NameContext.firstName ์ NameContext.familyName ๋ฅผ ๋ฐ๋ก ์ ์ํ๋ context 2๊ฐ๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ๊ธฐ
ํน์ NameStateContext, NameDispatchContext์ ๊ฐ์ด ์ํ๊ฐ๋ง ๊ด๋ฆฌํ๋ context์ ์ํ ๋ณํ ํจ์๋ฅผ ๊ด๋ฆฌํ๋ context๋ก ๋ถ๋ฆฌํ๊ธฐ
React.memo()๋ก ๊ฐ์ธ์ ์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์งuseMemo hook์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ์บ์ฑ์ ํตํ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์งํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ  ์ ์ง๋ณด์๊ฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์๋ค.
๋ญ๋  tradeo-ff๊ฐ ๋ฐ์ํ๋ค.. ๐ญ
๋ช ๋จ๊ณ์ props ์ ๋ฌ์ ๊ฑฐ์ณ์ผ ํ๋ค๊ณ  ํด์ ๋ฌด์กฐ๊ฑด context ์จ์ผ์ง~ ๋ ์ข์ง ์์ ์๊ฐ์ด๋ค.
context API๋ฅผ ๋จ์ฉํ  ๊ฒฝ์ฐ ์์ ๊ฐ์ ๋ฆฌ๋ ๋๋ง์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๊ณ , ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์์ง๋ค๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค.
๋๋ฌธ์ context API๋ฅผ ์ฐ๊ธฐ ์ ์ ๊ณ ๋ คํ ๋จ๊ณ๋ก๋
1. ์ผ๋จ props ์ ๋ฌ๋ก ์์ํ๊ธฐ
props๊ฐ ๊ฐ์ฅ ๊ธฐ๋ณธ์ธ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ์ฅ ์ง๊ด์ ์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ ๋ฌํ๋์ง ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ props๋ก ์ ๊ทผํ์!
2. component composition ํ์ฉํ๊ธฐ!
์ค์ฒฉ๋ layer๋ฅผ ์ค์ด๋ ค๋ ๋ ธ๋ ฅ์ผ๋ก
{children}์ ์ ๊ทน ์ฌ์ฉํด๋ณด์!
๋ง ๊ทธ๋๋กprops๋ฅผ ์ฌ์ฉํ์ง๋ ์๊ณ ์ ๋ฌ๋ง ํ๋ ์ฉ๋์ ์ปดํฌ๋ํธ(prop drilling)๊ฐ ๋ฐ์ํ๋ค๋ฉด Component ์์ฒด๋ฅผ props์ฒ๋ผ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ๋งํ๋ค.<Layout posts={posts} /> //๋์ ์ <Layout>{children}</Layout> // ๋ก ํด์ ์ค์  ๋ ๋๋ง ๋ ๋๋ <Layout><Posts posts={posts} /></Layout> // ์ด๋ ๊ฒ ๋ ์ ์๋๋ก!
1. ์ ์ฒด ๋ ์ด์์์ ํ ๋ง ์ ์ฉํ ๋ (ex.๋คํฌ๋ชจ๋)
app์ ๊ฐ์ฅ ์๋จ์ provider๋ฅผ ๋๊ณ , light/dark context๋ฅผ ์ง์  ์ง์ ํ์ฌ ํ ๋ง ๋ณ๊ฒฝํ ์ ์๋๋กํ ๋
2. ํ์ฌ ๋ก๊ทธ์ธํ ์ ์  ์ ๋ณด
์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ํ์ฌ ์ ์ ๊ฐ ๋๊ตฐ์ง์ ๋ํ ์ ๋ณด ํ์ํ ๋ context๋ก ์ ์ํด์ ์ฌ์ฉ
3. redux๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ์ํ๊ด๋ฆฌ
useReducer์ useContext๋ฅผ ๊ฐ์ด ์ฌ์ฉํ์ฌ redux๋ฅผ ๋์ฒดํ๋ ๊ฒฝ์ฐ!
๋ฑ๋ฑ์ด ์๋ค!
์ด ๋ถ๋ถ์ ! ์ค์ต์๊ฐ์ ์ฝ๋๋ฅผ ํตํด ๋ค๋ฃจ์ด ๋ณผ ์์ ์ ๋๋ค ๐ซถ๐ป
๐ก ์ ๊น! ๊ทธ๋์ ์ํ ๊ด๋ฆฌ ์กฐ๊ฑด์ด ๋ญ๋ฐ?
- ์ด๊ธฐ๊ฐ ์ ์ฅ ๊ฐ๋ฅ
 - ํ์ฌ ๊ฐ ์ฝ์ ์ ์๋ค.
 - ๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๋ค
 
์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ณต์ ํด์ฃผ๋ ๊ธฐ๋ฅ๋ง์ ์ํํ๊ณ  ์ํ๊ด๋ฆฌ ์์ฒด๋ ์ง์  ํด์ผํ๋ค. useState์ useReducer๋ฅผ ๊ฐ์ด ์ฌ์ฉํ์ฌ provider์ value์ ์ง์  state ํน์ action, dispatch fn ์ ๊ด๋ จ๋ ๊ฐ์ ๋ฃ์ด์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํํ๊ฒ ๋๋ค!
- ๋จ์ prop-drilling ์ ํผํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด
 Context๋ฅผ ์ฌ์ฉํ๊ธฐ- ์ ๋นํ ๋ณต์กํ ์ปดํฌ๋ํธ๊ฐ ์๊ฑฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด
 Context + useReducer๋ฅผ ์ฌ์ฉํ๊ธฐ- ํน์  ๊ตฌ์ฑ ์์๋ง re-render ์ํค๊ฑฐ๋, ์ฌ์ด๋์ดํํธ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ํ์ํ๋ค๋ฉด
 Redux + React-Redux๋ฅผ ์ฌ์ฉํ๊ธฐ
์์  ์์ฐฌ ์ํฐํด์ด์์ด์!!! ์์ง context api๋ useContext๊ฐ ์ต์ํ์ง ์์ ์ ์๊ฒ ๋๋์ด๋๋? ์ํฐํด์ด์๊ตฌ ์ค์ต ๋ ๊ธฐ๋๋๋ ์ํฐํด์ด์๋ ๊ฒ ๊ฐ์์!!
์ฌ์ค props drilling๋ ์ฅ์ ์ด ์๋ค๊ณ  ํฉ๋๋ค. ์ฌ์ค ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ  ์ฝ๊ฒ ์ ๋ฌํ  ์ ์๊ณ , ์์ ๊ท๋ชจ์ ํ์ ์์๋ ์ปดํฌ๋ํธ๊ฐ ์๊ฒ ๋ถํด๋์ด ์์ ๋ ์ด๋์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋๋์ง ์ฝ๊ฒ ํ์
ํ  ์ ์๋ค๊ณ  ํฉ๋๋ค! context api๋ ์จ์ฃผ์  ๊ฒ๊ณผ ๊ฐ์ด ํ
๋ง๋ ์ ์ ์ ๋ณด (+๊ตญ๊ฐ๋ ์ธ์ด)์ ์ฌ์ฉํ๋ ๊ฒ ์ข์๋ฐ ์
๋ฐ์ดํธ ํ  ํ์๊ฐ ์๋ context์ ์์นํ๋ค๊ณ  ๋ณผ ์ ์๊ฒ ๋ค์!! ๋ Provider๋ ์จ ์ฃผ์ ๋๋ก ์ ๋ฌํ๋ ๋ณ์๋ ๊ผญ value๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ๋ชจ๋  ์ปดํฌ๋ํธ์ ์ ๊ทผํ๋ ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฃจํธ ์ปดํฌ๋ํธ๊ฐ ํ์ํด index.js ๋๋ app.js ์์ Provider๋ฅผ ์ ์ํ๋ค๊ณ  ํฉ๋๋ค. ๋ง์ฝ์ provider -> ํ์ provider๋ฉด ์ฐ์ ์์๋ provider<ํ์ provider์ด๋ผ๊ณ  ํ๋ค์!! 
์์ง ์ด ๋ถ๋ถ์ ๋ง์ด ์ต์์น ์์๋ฐ useReducer๋ ํจ๊ป ์ค์ต์ด๋ผ๋,,, ๊ทธ๋ฅ ๊ทธ์  ๋น์ด๋ผ๋,,,
context์ ๋ํด ๊น์ด์๊ฒ ๋ค๋ค์ฃผ์  ์ํฐํด ์ ์ฝ์์ต๋๋ค!
context๋ ์ ๋๋ก ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์์ด์ ๊ทธ๋์ ๊ผญ ํ ๋ฒ ์ฌ์ฉํด๋ณด๊ณ  ์ถ์๋๋ฐ, ์ด๋ฒ ์ค์ต์ ํตํด ์ด ๋ถ๋ถ์ ๋ค๋ฃฐ ์ ์๋ค๋ ๊ธฐ๋๊ฐ ๋ฉ๋๋ค..!!
๊ฐ์ธ์ ์ผ๋ก๋ react context ์ต์ ํ ๋ฐฉ๋ฒ๊ณผ context๋ฅผ ์ธ์  ์ฌ์ฉํ๋ฉด ์ข์์ง์ ๋ํด ์ ๋ฆฌํด์ฃผ์  ๋ถ๋ถ์ด ๊ฐ์ฅ ์ธ์๊น์๋๋ฐ์, props๊ฐ ๋ช ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ ๋ฌ๋๋ค๊ณ  ํด์ ๋ฐ๋ก โcontext๋ฅผ ์ฌ์ฉํด์ผ๊ฒ ๋ค!โ๋ ์๊ฐ์ ๊ฐ๋๋ค๋ฉด ๋ฆฌ๋ ๋๋ก ์ธํ ์ฑ๋ฅ ์ ํ์ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ด ์ด๋ ค์์ง ์์์ผ๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๋ถ๋ถ ์ญ์ ์ง๊ณ  ๋์ด๊ฐ ์ ์์ด ์ข์์ต๋๋ค!
context๋ฅผ ์ฌ์ฉํด์ผ๊ฒ ๋ค๊ณ  ์ฒ์๋ถํฐ ๋ค์งํ๊ณ  ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์๋, props์ {children}์ผ๋ก ์ต๋ํ ๊ตฌํํ ๋ค ์ต์ ํ๋ฅผ ํ๋ฏ์ด context๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ๋ง์ํด์ฃผ์  ๊ฒ์ฒ๋ผ ์ด๋ค ๊ธฐ์ ์ด๋  ํญ์ trade-off๊ฐ ์กด์ฌํ๋ ๊ฒ ๊ฐ๋ค์. ์ญ์ ์ ๋์ ์ผ๋ก ์ข๊ณ  ๋์ ๊ธฐ์ ์ ์๋ ๋ฏ ํฉ๋๋ค ..!
์ด์ธ์๋ redux์ context API์ ์ฐจ์ด์ ๊น์ง ์ผ๋ฌด์ง๊ฒ ์ ๋ฆฌํด์ฃผ์ ์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์์ด ! context์ ๋ํด ์ ์์๊ฐ ์ ์์์ต๋๋ค! ์ข์ ์ํฐํด ๊ฐ์ฌํด์ฉ ์๊ณ ํ์ จ์ต๋๋ค:-)
โuseContext๋ฅผ ์๋ฏธ์์ด ์ฌ์ฉํ์ง ๋ง์์ผํ๋ค.โ โํน๋ณํ ๊ทผ๊ฑฐ๋ฅผ ๊ฐ์ง์ฑ๋ก ์ฌ์ฉํด์ผํ๋คโ ๋ผ๊ณ ๋ง์ํ์๋ ๋ถ๋ถ์ด ๊ต์ฅํ ์ธ์๊น์์ด์!
๋ redux์ ๋น๊ตํด์ฃผ์ ๋๋ถ์ ์คํ์ ์ ํ ๋์ ๊ณ ๋ฏผ์ ์ง์ ์ด ๊ธ์ ๋ณด๋ฉฐ ๋ง์ด ๋ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ component composition ์๋ํด ์์๋ณด์๋๋ฐ์ ์ปดํฌ๋ํธ ์ปดํฌ์ง์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ์ฌย ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ํจ๊ป ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ย ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋จ์ํ๋ฉด์ ๋๋ผ์ธ ์ ๋๋ก ๊ฐ๋ ฅํ ํจํด์ผ๋ก React์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ ๋์ฌ์ค๋ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ํนํ props drilling ๊ฐ์ ์ ๋์์ ์ฃผ๋๋ฐ ์ปดํฌ๋ํธ์ ๋ ์ด์ด๋ฅผ ์ค์ด๋ค๊ฒ ํ์ฌ drilling์ ์ค์ด๊ฑฐ๋ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ ์ด๋ props๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด ์๋ children ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ๋๋ง ํ์๋ฅผ ์ค์ด๋ ๋ฐ์๋ ๊ธฐ์ฌํ๋ค๊ณ ํฉ๋๋ค.
ํ context api๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์ ๊ต์ฅํ ์ฌ์ด ๋ง๋ก ์ ๋ฆฌํด์ฃผ์
์ ์ดํด๊ฐ ์์ ๋์ต๋๋ค..!
๊ทผ๋ ๋ค์ด ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ context api๋ฅผ ์ด๋ค๋ ๋ง์ ์ ๋ง ๋ง์ด ๋ค์์ด์. ์ง๋ ์ฑ์ผ ๋ฐ๋ชจ๋ฐ์ด ๋ ์นด์นด์ค ๊ฐ๋ฐ์ ๋ถ๊ป์ ์ค์
์ ํ๋ณ๋ก ํผ๋๋ฐฑ์ ํด์ฃผ์
จ๋๋ฐ, ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ค ๊ฑธ ์ฐ๋๊ณ  ์ฌ์ญค๋ณด๋ ๋ค๋ฅธ ๊ฒ์ด ์๋ context api๋ฅผ ์ด๋ค๊ณ  ํ์๋๋ผ๊ตฌ์. ๊ทธ๋ฆฌ๊ณ  ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์์  ์ฌ๊ณ ๋ฐฉ์์ ๋ฐ๊ฟ์ผํ๋๊ฒ, ์ด๋ฐ์ ๋ง์ํด์ฃผ์  ๊ฒ์ฒ๋ผ ์ ์ญ์ํ๊ด๋ฆฌ๋ผ๋ ๊ฐ๋
 ์์ฒด๊ฐ props drilling์ ๊ฐํธํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ props drilling์ด ์ผ์ด๋์ง ์๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋๋ํ๊ฒ ์ค๊ณํ๋๊ฒ ๋ฌด์๋ณด๋ค๋ ์ค์ํ ๊ฒ์ด๋๋ผ๊ตฌ์.
๊ทธ๋์ ์ฌ์ค ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๊ตํ  ๋ ์์ฃผ๋์ค๋, ์ด๋ค ์ํฉ์์  redux๊ฐ ์ข๋ค, ์ด๋ค ์ํฉ์์  context api๊ฐ ์ข๋ค, ์ด๋ฐ ๋ง๋ ์ด๋ป๊ฒ ๋ฐ์๋ค์ฌ์ผ ํ ์ง ์ข ๊ณ ๋ฏผ์ด ๋๋ ๊ฒ ๊ฐ์์ ใ
 ใ
  ์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ณต์ ํด์ฃผ๋ ๊ธฐ๋ฅ๋ง์ ์ํํ๊ณ  ์ํ๊ด๋ฆฌ ์์ฒด๋ ์ง์  ํด์ผํ๋ค๋ผ๊ณ  ๋ง์ํด ์ฃผ์
จ๋ฏ, context api๋ ์ ์ญ์ํ๊ด๋ฆฌ๋ผ๋ ๋ถ๋ฆฌ๋๋ ์์ญ์ด๋ค๋ณด๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋น๊ต๋ ์๋ฏธ๊ฐ ์๋ ๊ฒ ๊ฐ๊ตฌ์. ์ค๋ ์ค์ต์ ํตํด์ ์ํ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ด ๊ทธ๋์ ๋ง์ด ์ผ๋ recoil๊ณผ๋ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์๊ฐํ๋ฉด์ ๋ฐ๋ผ๊ฐ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
์์ฐ ๋๋ฌด๋๋ ๊น๋ํ๊ฒ ์ ๋ฆฌ๋ฅผ ์ ํด์ฃผ์ ์ ์ดํดํ๊ธฐ ์์ํ์ต๋๋ค! ์์ ์ ๊ฐ์ด ์ค๋ช ์ ํด์ฃผ์ ์ ์ง์  ์์ฑํด๋ณด์ง ์์๋ ์ด๋ป๊ฒ ์ฌ์ฉ์ ํ๋์ง ์ดํดํ ์ ์์์ต๋๋ค :)
๊ทธ๋ฅ props drilling์ด ๊น์ด์ง๋ฉด ๋น์ฐํ useContext๋ฅผ ์ฌ์ฉํด์ผ ํ์๋๋ฐ, context๋ฅผ ๋ง์ด ์ด์ฉํ๋ ๊ฒ์ด ์คํ๋ ค ์ ์ข์ ์๋ ์์๊ตฐ์! ์ญ์ ๋ชจ๋ ๊ฑด ์ฅ๋จ์ ์ด ์๋ ๊ฑฐ ๊ฐ์ต๋๋ค
SCU๋ ๊ฐ๋
๋ ์ด๋ฒ ์ํฐํด์ ํตํด ์ฒ์ ์ ํ๊ฒ ๋์๋๋ฐ์ ์ด์ ๋ํด ์กฐ๊ธ ๋ ์กฐ์ฌ๋ฅผ ํด๋ดค์ต๋๋ค
์ํฐํด์์ ์ค๋ช
์ ์์ธํ๊ฒ ์ ํด์ฃผ์
์ ๋๋ถ๋ถ ๋น์ทํ ๋ด์ฉ์ด์ด์ ๊ตฌ๊ธ๋ง์ ํ๋ฉด์๋ ์ด๋ ค์ด ์ ์ด ์์์ต๋๋ค!
์์๋ฅผ ํ๋ ๊ฐ์ ธ์ ๋ณด์๋ฉด
import React, { Component } from "react";
class App extends Component {
  constructor() {
    super();
    this.state = {
      counter: this.state.counter + 1,
    };
  }
  handleClick = () => {
    this.setState({
      counter: this.state.counter + 1,
    });
  };
  render() {
    console.log("๋ ๋ํ
์คํธ", this.state);
    return (
      <div>
        <button onClick={this.handleClick}>ํด๋ฆญ</button>
      </div>
    );
  }
}
export default App;
์ด์ ๊ฐ์ ์ฝ๋๊ฐ ์์ ๋,
handleClick = () => {
    this.setState({
      // counter: this.state.counter + 1,
    });
  };
handleClick ๋ถ๋ถ์ ์ฃผ์์ฒ๋ฆฌ ํ๋ค ํ๋๋ผ๋, setState ํจ์๊ฐ ์คํ์ด ๋์ด render ๊ฐ ์ผ์ด๋๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก console.log๊ฐ ์ถ๋ ฅ์ด ๋๋ค๊ณ ํฉ๋๋ค
์ด๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด SCU๋ ๊ฐ๋ ์ ๋์ ํ๋ ๊ฒ์ด๊ณ ,
  shouldComponentUpdate(newxProps, nextState, nextContext) {
    if (this.state.counter !== nextState.counter) {
      console.log("SCU๋ true์");
      return true;
    }
    console.log("SCU๋ false์");
    return false;
  }
์ด๋ฐ ์์ผ๋ก ํจ์ ์์์ re-rendering์ด ๋ฐ์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ์ ๋ํด์๋ง return ๊ฐ์ผ๋ก true๋ฅผ ์ฃผ๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ false๋ฅผ ์ฃผ์ด ๊ฐ์ด ๋ณ๊ฒฝ ๋์์ ๋๋ง ๋ ๋๋ง์ด ์ผ์ด๋ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ ๋๋ค
์ํฐํด ์ค๋นํ์๋๋ผ ๊ณ ์ ๋ง์ผ์ จ์ต๋๋ค!
์ ๋ฆฌ ์์ค ๋ฏธ์ณค๋ค์ ์ต๊ณ