๐ŸณReact | ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ Context API, Redux, Recoil

์›์˜ยท2023๋…„ 7์›” 10์ผ
1

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

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

๐Ÿง์ƒํ™ฉ

React ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์ „์—ญ์œผ๋กœ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค๐Ÿ”ฅ
์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ Recoil์„ ์„ ํƒํ•œ ์ด์œ ์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•ด๋ด„โœ๐Ÿป


๐Ÿ”ŽProps Drilling ๊ณผ ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ

๐Ÿ’กProps Drilling

  • React์—์„œ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ ์–ธํ•œ ์ƒํƒœ๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๊ณ , ๊ทธ ์ƒํƒœ์™€ ๊ด€๋ จ์—†๋Š” ์•Š์€ ์ค‘์ฒฉ๋œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด์„œ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ–ˆ์Œ
  • ์ด ์ƒํ™ฉ์„ Props Drilling์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ

๐Ÿ’ก์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ

  • Props Drilling์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ๋ฅผ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌ

  • ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ ์ €์žฅ์†Œ์—์„œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ์‰ฝ๊ณ  ํšจ์œจ์ ์ด๊ฒŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•จ ๊ทธ๋ฆผ์ถœ์ฒ˜ : ๋‚˜

  • ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Context API, Redux, Recoil์ด ์žˆ์Œ


๐Ÿ”ŽContext API

  • React๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ ๊ธฐ๋Šฅ (๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ํ•  ํ•„์š” X)
  • props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ์ž์œ ๋กญ๊ฒŒ ๊ฐ’ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ๊ณต์œ ํ•˜๋ ค๋Š” state๊ฐ€ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ Provider๋กœ ๊ฐ์‹ธ์ฃผ๊ณ , ๊ณต์œ ํ•˜๋ ค๋Š” state๋ฅผ value์— ๋„ฃ์–ด ๊ณต์œ 

๐Ÿ’ก์‚ฌ์šฉ ์˜ˆ์‹œ

import { createContext, useState } from 'react';

// Context ๋งŒ๋“ค ๋•Œ๋Š” ํ•ญ์ƒ Provider ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ค˜์•ผํ•จ

// Context : data ๋‹ด๋Š” ๊ณณ
export const DarkModeContext = createContext();

// Provider : data ๊ฐ์‹ธ์ฃผ๋Š” ์šฐ์‚ฐ
// ๋ฐ‘์˜ ํ•˜์œ„ ์š”์†Œ๋“ค ๊ฐ์‹ธ์ฃผ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ
// UI์ ์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์€ ์—†์ง€๋งŒ, children์„ ๊ฐ์‹ธ๋Š” ์šฐ์‚ฐ ์—ญํ• 
export function DarkModeProvider({ children }) {
  // ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” data, ๊ทธ data ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค ์—ฌ๊ธฐ ์•ˆ์—์„œ ๋งŒ๋“ค๋ฉด ๋จ
  const [darkMode, setDarkMode] = useState(false);
  const toggleDarkMode = () => setDarkMode((mode) => !mode);

  return (
    // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ๊ฐ’๋“ค value๋กœ ์ง€์ •
    // ์•„๋ž˜ ๊ฒฝ์šฐ ํ‚ค์™€ ๋ฐธ๋ฅ˜๊ฐ’(๋ณ€์ˆ˜๋ช…) ๊ฐ™์•„์„œ ์ถ•์•ฝ
    <DarkModeProvider.Provider value={{ darkMode, toggleDarkMode }}>
      {children}
    </DarkModeProvider.Provider>
  );
}

๐Ÿ’ก๋‹จ์ 

  • Provider์— ์—ฐ๊ฒฐ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊นŠ์–ด์ง€๋ฉด ๊ฒฐ๊ตญ ๊ณต์œ ํ•˜๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•˜์œ„์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žฌ๋ Œ๋”๋ง๋จ
  • ์ƒˆ๋กœ์šด Provider๋ฅผ ํ•˜์œ„์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, Provider๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•˜์œ„์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋‹ค์‹œ ๋งˆ์šดํŠธ๋จ
    * ๋งˆ์šดํŠธ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ
  • ๊ฒฐ๋ก ์ ์œผ๋กœ, tree ๊ตฌ์กฐ์˜ ๋‹จ์ ์ธ Props Drilling ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ƒ์œ„์— Provider๊ฐ€ ์ถ”๊ฐ€๋œ tree ๊ตฌ์กฐ๊ฐ€ ๋จ

๐Ÿ”ŽRedux

  • ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ž„
  • store : ์ƒํƒœ๋ฅผ ์ €์žฅ
    action : ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด
    dispatch : action์„ store์— ์ „๋‹ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    reducer : action์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜
  • ์ƒํƒœ๊ฐ€ ๋ณ€ํ• ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋„๋ก ์ตœ์ ํ™”

๐Ÿ’ก๋‹จ์ 

  • ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋–„๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์žฅํ™ฉํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ Redux๋ฅผ ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”ŽRecoil

  • facebook์—์„œ ๊ฐœ๋ฐœํ•œ ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • React ๋ฌธ๋ฒ• ์นœํ™”์ 
    ์ „์—ญ์ƒํƒœ ๊ฐ’์„ state์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ get/set ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€
  • ๊ฐ’๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์™€ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํ”„๋กœ์ ํŠธ์—์„œ Recoil์„ ์„ ํƒํ•œ ์ด์œ 

  • ์ตœ์‹ ๋ฒ„์ „์˜ ์ƒํƒœ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๊ณ , React์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋น„์Šทํ•ด React๋ฅผ ๋ฐฐ์šด ๊ธฐ๊ฐ„์ด ์ ์€ ํŒ€์›๋ผ๋ฆฌ ํ˜‘์—…ํ•˜๊ธฐ์— ์ข‹์Œ
  • Redux๋Š” ๋งŽ์€ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ์™€ ์„ค์ •์ด ํ•„์š”ํ•˜๊ณ , ์†Œ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
    ์ด์— ๋น„ํ•ด Recoil์€ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณต
  • Context API ํ™œ์šฉํ•ด์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
    ํ›„์— ์ค‘๊ฐ„ ๊ทœ๋ชจ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๋ณต์žก์„ฑ์„ ๊ณ ๋ คํ•ด์„œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณผ ํ•„์š”์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— recoil์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •
profile
ํ™”์ดํŒ…~~^ใ…^/

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

๊ทธ๋ฆผ์ถœ์ฒ˜: ๋‚˜ ๋„ˆ๋ฌด ๊ท€์—ฌ์šฐ์‹œ๋„ค์š”

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