๐ 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 ์์ฑ
import React, { createContext } from 'react';
export const MyContext = createContext();
โก 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>
);
};
โฃ 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;
๊ณผ๋ํ ์ฌ์ฉ ์์
Provider ์ค์ฒฉ
์ต์ ํ