๐Ÿ‘€ Context API ๋„ˆ ๋ญ๋ƒ?

์„œ์ง„ยท2023๋…„ 11์›” 2์ผ
1

React ์™„๋ฒฝ๊ฐ€์ด๋“œ

๋ชฉ๋ก ๋ณด๊ธฐ
14/15
post-thumbnail

๐Ÿ“ context API๋ž€?

Context API ๋ž€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋– ํ•œ ์ •๋ณด(๋ฐ์ดํ„ฐ)๋ฅผ ๋งŒ๋“ค๊ณ , ์ž์‹ ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ชจ๋‘ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉฐ ์‰ฝ๊ฒŒ ๊ฐ’์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฆฌ์•กํŠธ์— ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ์ด๋‹ค.

๋‹ค์‹œ ๋งํ•ด, React์˜ context๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฐ์ดํ„ฐ(state)๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

๐Ÿค” context๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ?

โœ… ๋„ˆ๋ฌด ๋งŽ์€ prop drilling์„ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด!

React ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ -> ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฉํ–ฅ์œผ๋กœ props๋ฅผ ์ด์šฉํ•œ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํ๋ฆ„์ด ์ผ์–ด๋‚œ๋‹ค.

์ด๋•Œ state๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ž์‹์„ ๋ชฉํ‘œ ์ž์‹ ์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์„ ๋•Œ

  1. ๋ถ€๋ชจ โžก๏ธ ์ž์‹ โžก๏ธ ์ž์‹ โžก๏ธ ์ž์‹ โžก๏ธ ๋ชฉํ‘œ ์ž์‹
  2. ๋ถ€๋ชจ โžก๏ธ ๋ชฉํ‘œ ์ž์‹ โžก๏ธ ๋ชฉํ‘œ ์ž์‹ โžก๏ธ ๋ชฉํ‘œ ์ž์‹ โžก๏ธ ๋ชฉํ‘œ ์ž์‹

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋“ค์—์„œ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ prop drilling์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ context API๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

โ“ prop drilling์ด๋ž€ ?

props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด props๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

( prop์ด ๋“œ๋ฆด์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋šซ๊ณ  ๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ํ•˜์—ฌ์„œ prop drilling์ด๋ผ๊ณ  ํ•œ๋‹ค๋„ค์š”! )

๐Ÿง prop drilling์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ

์ƒํƒœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๋ฅผ ํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ณตํ†ต ์กฐ์ƒ์ด ๋„ˆ๋ฌด ์œ„์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ prop drilling์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์ƒํƒœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ(lifting state up)๋ž€?

๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ˜์˜ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น state๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ(๊ณตํ†ต ์กฐ์ƒ)์— ์ •์˜ํ•˜์—ฌ๋‘๊ณ  props๋ฅผ ํ†ตํ•ด ํ•ด๋‹น state๋ฅผ ๋‘ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด๋ ‡๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ prop drilling์„ ๋ง‰์•„์ฃผ๊ธฐ ์œ„ํ•ด React์˜ Context API๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ํ•„์š”์—†๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” component์— ์ง์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


๐Ÿ“ Context API๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž!

โœ… useContext์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ธ๊ฐ€์ง€ ํ‚ค์›Œ๋“œ

1. createContext :context ๋งŒ๋“ค๊ธฐ

2. Context.provider : context๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์ž์‹๋“คํ•œํ…Œ ๋ฟŒ๋ ค์ฃผ๊ธฐ

3. useContext : context๊ฐ’์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ context ์‚ฌ์šฉํ•˜๊ธฐ

1๏ธโƒฃ createContext

๋ง ๊ทธ๋Œ€๋กœ ์ปดํฌ๋„ŒํŠธ๋“ค์ด provideํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก context ๋งŒ๋“ค๊ธฐ

// someContext.js
import { createContext } from 'react';

const SomeContext = createContext(defaultValue);

export default someContext;

๐Ÿง ์ธ์ž๋กœ ๋ฐ›๋Š” defaultValue๋ž€?

createContext๋Š” default๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ์ด๋•Œ default๊ฐ’์€ ์–ด๋А ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€๋„ ์ƒ๊ด€ ์—†๋‹ค. (๊ฐ์ฒด๋„ ๊ฐ€๋Šฅ,ํ•จ์ˆ˜๋„ ๊ฐ€๋Šฅ)
default๊ฐ’์€ context๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋งค์นญ๋˜๋Š” provider๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ (ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” provider๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ)์— context์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
default๊ฐ’์„ ์„ค์ •ํ•ด๋‘์ง€ ์•Š๊ณ  provider๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์—์„œ context๊ฐ’์— ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด context๋Š” undefined์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ

  1. 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;
  1. context๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” FirstComponent๋ฅผ provider๋กœ ๊ฐ์‹ธ์ง€ ์•Š์Œ
// App.js
import FirstComponent from "./FirstComponent";

export default function App() {
  return (
    // provider๋กœ ๊ฐ์‹ธ์ง€ ์•Š์Œ
    <FirstComponent />
  );
}
  1. 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์—์„œ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

2๏ธโƒฃ useContext

"์ด ์ปดํฌ๋„ŒํŠธ์—์„œ 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๋ฌธ ๋‚ด๋ถ€๋ผ๋˜๊ฐ€ .. ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์— ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ฐ€์žฅ ์ตœ์ƒ์œ„๋‹จ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!

3๏ธโƒฃ Context.Provider

provider๋Š” 1. ์–ด๋””์—์„œ 2. ์–ด๋–ป๊ฒŒ ์ด context๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€๋ฐ? ๋ฅผ ์ •ํ•ด์„œ ์•Œ๋ ค์ฃผ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

1. ์–ด๋””์—์„œ

๋‚ด๊ฐ€ context๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒ๋‹จ์„ provider๋กœ ๋ฌถ์–ด์ฃผ์–ด์„œ ์•Œ๋ ค์ค€๋‹ค.

1-1. ์ด๋•Œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋งŒ์„ ๋ฌถ์–ด์ค„ ์ˆ˜๋„ ์žˆ๊ณ 
1-2. {children}์„ provider๋กœ ๊ฐ์‹ธ์„œ ํ•˜์œ„์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ context๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์–ด๋–ป๊ฒŒ

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>
  );
}

โ“ ์—ฌ๋Ÿฌ๊ฐœ์˜ provider๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์œผ๋ฉด ์–ด๋А value๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€?

context๋ฅผ ์š”์ฒญํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด provider๋ฅผ ์ฐพ์•„๊ฐ€์„œ ํ•ด๋‹น provider๊ฐ€ ์ œ๊ณตํ•˜๋Š” value๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค!

๐Ÿง provider๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

1๏ธโƒฃ์—์„œ defaultValue๋ฅผ ๋งํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด provider๋กœ ๊ฐ์‹ธ์ง€์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์—์„œ useContext๋ฅผ ํ†ตํ•ด context๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด createContext์—์„œ ์ •์˜ํ•œ defaultValue๋กœ ์ ‘๊ทผ ๋œ๋‹ค. ๋งŒ์•ฝ default๊ฐ’์ด ์—†๋‹ค๋ฉด undefined๋กœ ์ ‘๊ทผ๋œ๋‹ค.

๐Ÿ’ก ์—๋Ÿฌ๋Š” ๋”ฐ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—๋Ÿฌ๋ฅผ ์žก๊ณ ์‹ถ๋‹ค๋ฉด ๋”ฐ๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค ,,

๐Ÿ˜Ž ์ •๋ฆฌ

  1. context ๋งŒ๋“ค๊ธฐ
  2. context๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ provider๋กœ ๊ฐ์‹ธ๊ธฐ, ์‚ฌ์šฉํ•  context๊ฐ’ value ์†์„ฑ ์ด์šฉํ•ด์„œ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ
  3. context ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ useContext๋ฅผ ํ†ตํ•ด context๊ฐ’์— ์ ‘๊ทผ
  4. provider์—์„œ value ์†์„ฑ์„ ํ†ตํ•ด ์—…๋ฐ์ดํŠธํ•œ context๋ฅผ ๋ณด๊ณ  ์‹ค์ œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ Œ๋”๋ง~

๐Ÿ“ context API ํ†บ์•„๋ณด๊ธฐ

๐Ÿค” ๋‹ค์ˆ˜์˜ context๋“ค์€ ๋…๋ฆฝ์ ์ธ๊ฐ€์š”?

YES โญ•๏ธ

createContext()๋กœ ์ง€์ •๋œ ์„œ๋กœ ๋‹ค๋ฅธ context๋“ค์€ ์„œ๋กœ ์ ˆ๋Œ€ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ context๋ฅผ useํ•˜๊ณ  provideํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿšจ ๋ฌธ์ œ์ ! - ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ

๐Ÿค” provider๋กœ ๊ฐ์‹ธ์ง„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง ๋ ๊นŒ?

YES โญ•๏ธ

Context๊ฐ€ ์ „์†กํ•˜๋Š” value ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์—์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ Provider๋กœ ๊ฐ์‹ผ ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ๋‹ค.

Provider๋กœ๋ถ€ํ„ฐ ํ•˜์œ„ consumer๋กœ์˜ ์ „ํŒŒ๋Š” shouldComponentUpdate ๋ฉ”์„œ๋“œ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค!

๐Ÿ’ก shouldComponentUpdate๋ž€

์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด๋กœ ์ด์ „ state, props์™€ ํ˜„์žฌ state,props๋ฅผ ๋น„๊ตํ•ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  1. ์˜ˆ๋ฅผ๋“ค์–ด FirstName ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” NameContext.firstName ๊ฐ’๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  FamilyName ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” NameContext.familyName ๊ฐ’๋งŒ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, FirstName ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ’์„ ์ˆ˜์ •์‹œ FamilyName ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

  2. useContext๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ ๋˜ํ•œ provider๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์œผ๋ฉด provider์— ์˜ํ•ด context๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.
    ์—ฌ๊ธฐ์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ฐธ์กฐ๊ฐ’์ผ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ(์šฐ๋ฆฌ๊ฐ€ ๋ณด๊ธฐ์—) ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜์–ด๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์ธ์ง€ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  3. ์›์‹œ๊ฐ’์ผ ๊ฒฝ์šฐ์—๋„ Provider ํ•˜์œ„์—์„œ context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” Provider์˜ value prop๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ๋‹ค.

๊ฒฐ๊ตญ ์“ธ๋ฐ์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋™์ž‘ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค

๐Ÿค” react context ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€?

1. Context๋ฅผ ์ชผ๊ฐœ์„œ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉ

NameContext.firstName ์™€ NameContext.familyName ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜๋Š” context 2๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ
ํ˜น์€ NameStateContext, NameDispatchContext์™€ ๊ฐ™์ด ์ƒํƒœ๊ฐ’๋งŒ ๊ด€๋ฆฌํ•˜๋Š” context์™€ ์ƒํƒœ ๋ณ€ํ™” ํ•จ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” context๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ

2. ๊ด€๋ จ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ React.memo()๋กœ ๊ฐ์‹ธ์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€

3. Context ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์— useMemo hook์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์„ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
๋ญ๋“  tradeo-ff๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.. ๐Ÿ˜ญ

๐Ÿ‘€ context API๋ฅผ ๋‚จ์šฉํ•˜์ง€ ๋ง์ž!

๋ช‡ ๋‹จ๊ณ„์˜ 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>
// ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ๋„๋ก!

๐Ÿคฏ ๊ทธ๋Ÿผ context๋Š” ์–ธ์ œ ์“ฐ๋Š”๊ฒŒ ์ข‹์€๋ฐ?

1. ์ „์ฒด ๋ ˆ์ด์•„์›ƒ์˜ ํ…Œ๋งˆ ์ ์šฉํ•  ๋•Œ (ex.๋‹คํฌ๋ชจ๋“œ)

app์˜ ๊ฐ€์žฅ ์ƒ๋‹จ์— provider๋ฅผ ๋‘๊ณ , light/dark context๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ํ…Œ๋งˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋กํ•  ๋•Œ

2. ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด

์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜„์žฌ ์œ ์ €๊ฐ€ ๋ˆ„๊ตฐ์ง€์— ๋Œ€ํ•œ ์ •๋ณด ํ•„์š”ํ•  ๋•Œ context๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉ

3. redux๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ์ƒํƒœ๊ด€๋ฆฌ

useReducer์™€ useContext๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ redux๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ!

๋“ฑ๋“ฑ์ด ์žˆ๋‹ค!

๐Ÿ“ useReducer์™€ useContext์˜ ์‹œ๋„ˆ์ง€

์ด ๋ถ€๋ถ„์€ ! ์‹ค์Šต์‹œ๊ฐ„์— ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃจ์–ด ๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค ๐Ÿซถ๐Ÿป

๐Ÿค” redux์™€ context API์˜ ์ฐจ์ด์ ์€?

  1. context API๋Š” react์— ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€๋งŒ Redux๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
  2. context API๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ๋ฐ˜๋ฉด Redux๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค!

๐Ÿ’ก ์ž ๊น! ๊ทธ๋ž˜์„œ ์ƒํƒœ ๊ด€๋ฆฌ ์กฐ๊ฑด์ด ๋ญ”๋ฐ?

  1. ์ดˆ๊ธฐ๊ฐ’ ์ €์žฅ ๊ฐ€๋Šฅ
  2. ํ˜„์žฌ ๊ฐ’ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ฐ’ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

๐Ÿคฏ context API์˜ ์ƒํƒœ ๊ด€๋ฆฌ

์ „์—ญ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒํƒœ๊ด€๋ฆฌ ์ž์ฒด๋Š” ์ง์ ‘ ํ•ด์•ผํ•œ๋‹ค. useState์™€ useReducer๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ provider์˜ value์— ์ง์ ‘ state ํ˜น์€ action, dispatch fn ์™€ ๊ด€๋ จ๋œ ๊ฐ’์„ ๋„ฃ์–ด์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค!

๐Ÿคฏ Redux์˜ ์ƒํƒœ ๊ด€๋ฆฌ

  1. ์ดˆ๊ธฐ๊ฐ’ ์ €์žฅ : store์— ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •
  2. ํ˜„์žฌ๊ฐ’ ์ฝ๊ธฐ : useSelector์„ ํ†ตํ•ด์„œ state ์ฝ๊ธฐ ๊ฐ€๋Šฅ
  3. ๊ฐ’ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ : reducer์— action ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ(dispatch)ํ•ด์„œ state ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ

๐Ÿ˜‡ ๊ทธ๋Ÿผ ์–ธ์ œ Redux๋ฅผ ์“ฐ๊ณ  ์–ธ์ œ Context api๋ฅผ ์จ์•ผํ•˜์ง€?

  • ๋‹จ์ˆœ prop-drilling ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด Context ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
  • ์ ๋‹นํžˆ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด Context + useReducer ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
  • ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋งŒ re-render ์‹œํ‚ค๊ฑฐ๋‚˜, ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Redux + React-Redux ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

์ฐธ๊ณ  ) Context API vs Redux ๐Ÿ˜‡

profile
๐Ÿซง โ˜๏ธ ๐ŸŒ™ ๐Ÿ‘ฉ๐Ÿปโ€ข๐Ÿ’ป ๐ŸŒฟ ๐Ÿฑ ๐Ÿ–ฑ ๐ŸŸ ๐Ÿš€ โญ๏ธ ๐Ÿงธ ๐Ÿ€ ๐Ÿ’—

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

comment-user-thumbnail
2023๋…„ 11์›” 3์ผ

์ •๋ฆฌ ์ˆ˜์ค€ ๋ฏธ์ณค๋„ค์š” ์ตœ๊ณ 

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 11์›” 4์ผ

์™„์ „ ์•Œ์ฐฌ ์•„ํ‹ฐํด์ด์—ˆ์–ด์š”!!! ์•„์ง context api๋ž‘ useContext๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ €์—๊ฒŒ ๋ˆˆ๋†’์ด๋˜๋Š”? ์•„ํ‹ฐํด์ด์—ˆ๊ตฌ ์‹ค์Šต ๋„˜ ๊ธฐ๋Œ€๋˜๋Š” ์•„ํ‹ฐํด์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”!!

์‚ฌ์‹ค props drilling๋„ ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”Œ์ ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž˜๊ฒŒ ๋ถ„ํ•ด๋˜์–ด ์žˆ์„ ๋•Œ ์–ด๋””์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! context api๋Š” ์จ์ฃผ์‹  ๊ฒƒ๊ณผ ๊ฐ™์ด ํ…Œ๋งˆ๋‚˜ ์œ ์ €์ •๋ณด (+๊ตญ๊ฐ€๋‚˜ ์–ธ์–ด)์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์€๋ฐ ์—…๋ฐ์ดํŠธ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” context์— ์œ„์น˜ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!! ๋˜ Provider๋Š” ์จ ์ฃผ์‹ ๋Œ€๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ๊ผญ value๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•ด index.js ๋˜๋Š” app.js ์—์„œ Provider๋ฅผ ์ •์˜ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— provider -> ํ•˜์œ„ provider๋ฉด ์šฐ์„ ์ˆœ์œ„๋Š” provider<ํ•˜์œ„ provider์ด๋ผ๊ณ  ํ•˜๋„ค์š”!!

์•„์ง ์ด ๋ถ€๋ถ„์— ๋งŽ์ด ์ต์ˆ™์น˜ ์•Š์€๋ฐ useReducer๋ž‘ ํ•จ๊ป˜ ์‹ค์Šต์ด๋ผ๋‹ˆ,,, ๊ทธ๋ƒฅ ๊ทธ์ € ๋น›์ด๋ผ๋Š”,,,

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 11์›” 5์ผ

context์— ๋Œ€ํ•ด ๊นŠ์ด์žˆ๊ฒŒ ๋‹ค๋ค„์ฃผ์‹  ์•„ํ‹ฐํด ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค!
context๋Š” ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์—†์–ด์„œ ๊ทธ๋™์•ˆ ๊ผญ ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ์‹ค์Šต์„ ํ†ตํ•ด ์ด ๋ถ€๋ถ„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋‹ˆ ๊ธฐ๋Œ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค..!!

๊ฐœ์ธ์ ์œผ๋กœ๋Š” react context ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๊ณผ context๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด์ฃผ์‹  ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์ธ์ƒ๊นŠ์—ˆ๋Š”๋ฐ์š”, props๊ฐ€ ๋ช‡ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ โ€˜context๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค!โ€™๋Š” ์ƒ๊ฐ์„ ๊ฐ–๋Š”๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋ถ„ ์—ญ์‹œ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค!
context๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์งํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, props์™€ {children}์œผ๋กœ ์ตœ๋Œ€ํ•œ ๊ตฌํ˜„ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ํ•˜๋“ฏ์ด context๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์–ด๋–ค ๊ธฐ์ˆ ์ด๋“  ํ•ญ์ƒ trade-off๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ์—ญ์‹œ ์ ˆ๋Œ€์ ์œผ๋กœ ์ข‹๊ณ  ๋‚˜์œ ๊ธฐ์ˆ ์€ ์—†๋Š” ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค ..!

์ด์™ธ์—๋„ redux์™€ context API์˜ ์ฐจ์ด์ ๊นŒ์ง€ ์•ผ๋ฌด์ง€๊ฒŒ ์ •๋ฆฌํ•ด์ฃผ์…”์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์—†์ด ! context์— ๋Œ€ํ•ด ์ž˜ ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! ์ข‹์€ ์•„ํ‹ฐํด ๊ฐ์‚ฌํ•ด์šฉ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค:-)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 11์›” 5์ผ

โ€œuseContext๋ฅผ ์˜๋ฏธ์—†์ด ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค.โ€ โ€œํŠน๋ณ„ํ•œ ๊ทผ๊ฑฐ๋ฅผ ๊ฐ€์ง„์ฑ„๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹คโ€ ๋ผ๊ณ  ๋ง์”€ํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด ๊ต‰์žฅํžˆ ์ธ์ƒ๊นŠ์—ˆ์–ด์š”!

๋˜ redux์™€ ๋น„๊ตํ•ด์ฃผ์‹  ๋•๋ถ„์— ์Šคํƒ์„ ์ •ํ•  ๋•Œ์˜ ๊ณ ๋ฏผ์˜ ์ง์„ ์ด ๊ธ€์„ ๋ณด๋ฉฐ ๋งŽ์ด ๋œ ์ˆ˜ ์žˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €๋Š” component composition ์—๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š” ์ปดํฌ๋„ŒํŠธ ์ปดํฌ์ง€์…˜์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜์—ฌย ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”ย ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•˜๋ฉด์„œ ๋†€๋ผ์šธ ์ •๋„๋กœ ๊ฐ•๋ ฅํ•œ ํŒจํ„ด์œผ๋กœ React์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ ๋†’์—ฌ์ค€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ props drilling ๊ฐœ์„ ์— ๋„์›€์„ ์ฃผ๋Š”๋ฐ ์ปดํฌ๋„ŒํŠธ์˜ ๋ ˆ์ด์–ด๋ฅผ ์ค„์–ด๋“ค๊ฒŒ ํ•˜์—ฌ drilling์„ ์ค„์ด๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ์ด๋Š” props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ children ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ์—๋„ ๊ธฐ์—ฌํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 11์›” 5์ผ

ํ—‰ context api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ต‰์žฅํžˆ ์‰ฌ์šด ๋ง๋กœ ์ •๋ฆฌํ•ด์ฃผ์…”์„œ ์ดํ•ด๊ฐ€ ์™์™ ๋์Šต๋‹ˆ๋‹ค..!
๊ทผ๋ž˜ ๋“ค์–ด ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ context api๋ฅผ ์“ด๋‹ค๋Š” ๋ง์„ ์ •๋ง ๋งŽ์ด ๋“ค์—ˆ์–ด์š”. ์ง€๋‚œ ์•ฑ์žผ ๋ฐ๋ชจ๋ฐ์ด ๋•Œ ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ๋ถ„๊ป˜์„œ ์˜ค์…”์„œ ํŒ€๋ณ„๋กœ ํ”ผ๋“œ๋ฐฑ์„ ํ•ด์ฃผ์…จ๋Š”๋ฐ, ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ค ๊ฑธ ์“ฐ๋ƒ๊ณ  ์—ฌ์ญค๋ณด๋‹ˆ ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹Œ context api๋ฅผ ์“ด๋‹ค๊ณ  ํ•˜์‹œ๋”๋ผ๊ตฌ์š”. ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์™„์ „ ์‚ฌ๊ณ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ”์•ผํ•˜๋Š”๊ฒŒ, ์ดˆ๋ฐ˜์— ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๋ผ๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ props drilling์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์€ props drilling์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š”๊ฒŒ ๋ฌด์—‡๋ณด๋‹ค๋„ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋”๋ผ๊ตฌ์š”.
๊ทธ๋ž˜์„œ ์‚ฌ์‹ค ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๊ตํ•  ๋•Œ ์ž์ฃผ๋‚˜์˜ค๋Š”, ์–ด๋–ค ์ƒํ™ฉ์—์„  redux๊ฐ€ ์ข‹๋‹ค, ์–ด๋–ค ์ƒํ™ฉ์—์„  context api๊ฐ€ ์ข‹๋‹ค, ์ด๋Ÿฐ ๋ง๋„ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ• ์ง€ ์ข€ ๊ณ ๋ฏผ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š” ใ… ใ…  ์ „์—ญ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒํƒœ๊ด€๋ฆฌ ์ž์ฒด๋Š” ์ง์ ‘ ํ•ด์•ผํ•œ๋‹ค๋ผ๊ณ  ๋ง์”€ํ•ด ์ฃผ์…จ๋“ฏ, context api๋Š” ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๋ผ๋Š” ๋ถ„๋ฆฌ๋˜๋Š” ์˜์—ญ์ด๋‹ค๋ณด๋‹ˆ ํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๋น„๊ต๋„ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™๊ตฌ์š”. ์˜ค๋Š˜ ์‹ค์Šต์„ ํ†ตํ•ด์„œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ด ๊ทธ๋™์•ˆ ๋งŽ์ด ์ผ๋˜ recoil๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ƒ๊ฐํ•˜๋ฉด์„œ ๋”ฐ๋ผ๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2023๋…„ 11์›” 21์ผ

์™€์šฐ ๋„ˆ๋ฌด๋‚˜๋„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋ฅผ ์ž˜ ํ•ด์ฃผ์…”์„œ ์ดํ•ดํ•˜๊ธฐ ์ˆ˜์›”ํ–ˆ์Šต๋‹ˆ๋‹ค! ์˜ˆ์ œ์™€ ๊ฐ™์ด ์„ค๋ช…์„ ํ•ด์ฃผ์…”์„œ ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด์ง€ ์•Š์•„๋„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค :)

๊ทธ๋ƒฅ 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๋ฅผ ์ฃผ์–ด ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

์•„ํ‹ฐํด ์ค€๋น„ํ•˜์‹œ๋А๋ผ ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ