[React] ์ปจํ…์ŠคํŠธ API (Context API)

๐Ÿ“„ ์ปจํ…์ŠคํŠธ API

์ปจํ…์ŠคํŠธ API๋Š” ์ž์‹ ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ฐ‘์œผ๋กœ ๋‚ด๋ ค์ค˜์•ผํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ํ˜น์€ ๋‹ค๋ฅธ ๋ฉ€๋ฆฌ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๋กœ ์ผ์ผ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์ง€ ์•Š์•„๋„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ createContextํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

// ์ปจํ…์ŠคํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ
const UserContext = createContext("unknown");

// ์ปจํ…์ŠคํŠธ ํ•จ์ˆ˜ ์‚ฌ์šฉ
const ContextExample = useContext(UserContext);

createContext๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ• ๋•Œ ํ•ด๋‹น ๊ฐ’์ด ์—†์œผ๋ฉด ์ดˆ๊ธฐ๊ฐ’์ด ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“„ ์ฃผ์˜ํ•  ์ 

context๋Š” ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

  1. Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  2. Prop drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๋ฉด Component Composition (์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ)์„ ๋จผ์ € ๊ณ ๋ คํ•˜์ž.

๐Ÿ“„ ์˜ˆ์ œ

import React, { createContext, useContext, useState } from "react";

const MyContext = createContext("defalutValue");

function Child() {
  const text = useContext(MyContext);
  return <div>์•ˆ๋…•ํ•˜์„ธ์š”? {text} </div>;
}

function Parent() {
  // ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ์ธ Parent์— ์•„๋ฌด๋Ÿฐ props๋„ ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜๋‹ค.
  return <Child />;
}

function GrandParent() {
  return <Parent />;
}

function ContextSample() {
  const [value, setValue] = useState(true);
  return (
    <MyContext.Provider value={value ? "Good" : "Bad"}>
      <GrandParent />
      <button onClick={() => setValue(!value)}>CLICK ME</button>
    </MyContext.Provider>
  );
}

export default ContextSample;
  • MyContext์— createContext๋กœ ๊ธฐ๋ณธ๊ฐ’์ด defalutValue์ธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
  • Child ์ปดํฌ๋„ŒํŠธ์˜ text์— MyContext๋ฅผ ์ ์šฉํ–ˆ๋‹ค.
  • ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ์ธ ContextSample์—์„œ text๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ธ GrandParent์ปดํฌ๋„ŒํŠธ๋ฅผ MyContextํƒœ๊ทธ๋กœ ๊ฐ์‹ธ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด Provider ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด value์˜ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

๊ฐ์ฒด ์•ˆ์—๋Š” Provider ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

Provider์—์„œ value์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด Context๊ฐ€ ์ ์šฉ๋œ ๊ฐ’์ด ๋ฐ”๋€๋‹ˆ๋‹ค.

Provider์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•˜์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์‹œ ๋žœ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์•„๋„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜

Leave a comment