Skip to content

๐Ÿป Context API์™€ Provider ์ง€์˜ฅ๊ณผ ๊ท€์—ฌ์šด ๊ณฐ๋Œ์ด ๐Ÿป

Song_Minhyung edited this page Dec 14, 2023 · 2 revisions

Zustand๋ฅผ ๋„์ž…ํ•œ ์ด์œ 

img_042 WebRTC ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ด€๋ฆฌํ•  ์ƒํƒœ๊ฐ€ ๋งŽ์•„์กŒ๋‹ค. ๋งค์šฐ ๋งŽ์ด!!
๊ทธ๋ž˜์„œ Props Drilling ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์ „์—ญ์ƒํƒœ์˜ ๋„์ž…์ด ํ•„์š”ํ–ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” Context API๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด๋ ค ์‹œ๋„ํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋„์ค‘์— ์‚ฌ์šฉ์„ฑ์ด ์ข‹์ง€ ๋ชปํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ณ , Zustand๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

WebRTC ๊ด€๋ จ ์ƒํƒœ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์กŒ๋‹ค

img_043 ์ฒ˜์Œ์—๋Š” UI์— ๊ด€๋ จ๋œ ์ƒํƒœ๋งŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์ƒ๊ฐ์„ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ WebRTC ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•˜๋‹ค๋ณด๋‹ˆ ์ฒ˜์Œ์— ์˜ˆ์ƒํ–ˆ๋˜๊ฒƒ๋ณด๋‹ค ๊ด€๋ฆฌํ•  ์ƒํƒœ๊ฐ€ ๋งŽ์•„์กŒ๋‹ค...๐Ÿ˜จ

๊ทธ๋ž˜์„œ ์ผ๋‹จ WebRTC ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” useWebRTC ํ›…์— ์ด ์ƒํƒœ๋ฅผ ์ „๋ถ€ ๋„ฃ์–ด์คฌ๋‹ค.
์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๊ฑด ๋งค์šฐ ํฌ๋‚˜ํฐ ์‹ค์ˆ˜์˜€๋‹ค... ์•„๋งˆ ๊ฑฐ๊ธฐ๋ถ€ํ„ฐ ๋ชจ๋“ ๊ฒŒ ์ž˜๋ชป๋๋˜๊ฒƒ ๊ฐ™๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋งŒ ๋ด๋„ ๋ฒŒ์จ ์ƒํƒœ๊ฐ€ ๋งŽ์€๋ฐ ์•ž์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ๋Š˜์–ด๋‚  ์˜ˆ์ •์ด๋‹ค.

Context API ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ

img_044 ํ”ํžˆ Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜๊ณ  ์ด๋ฅผ ์ตœ์ ํ™” ํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทผ๋ฐ ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‚˜๋Š” ๋‚ด์šฉ์„ ํ•™์Šตํ•˜๊ณ  ์ •๋ฆฌํ•˜๊ธฐ ์ „๊นŒ์ง€๋„ ์ •ํ™•ํžˆ ์ด์œ ๋ฅผ ๋ชฐ๋ž๋‹ค!!!
๊ทธ๋ž˜์„œ ์ด๊ฑธ ์ตœ์ ํ™” ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์ฝ”๋“œ ์ค‘๋ณต์ด ๋งŽ์•„์กŒ๊ธฐ์— ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ์ด์œ 

img_045 NameAgeProvider ์•„๋ž˜์— <Name/> ๊ณผ <Age/> ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์„ ํ•œ๋ฒˆ ๊ฐ€์ •ํ•ด๋ณธ๋‹ค.
๋งŒ์•ฝ <Name/> ์—์„œ ์ƒํƒœ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ค๋ฉด <Name/>์€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š”๊ฒŒ ๋จธ๋ฆฌ์— ๊ทธ๋ ค์ง„๋‹ค.
๊ทผ๋ฐ <Age/> ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” Provider ์•ˆ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ useContext๋กœ
๊ทธ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ์‹œ์ผœ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ Provider๋ฅผ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ์ชผ๊ฐœ์•ผํ•œ๋‹ค.

Provider ๋ถ„๋ฆฌ

img_046 ์œ„ ์‚ฌ์ง„์€ ๊ธฐ์กด NameAgeProvder๋ฅผ NameProvider์™€ AgeProvider๋กœ ๋ถ„๋ฆฌ์‹œํ‚จ ๋ชจ์Šต์ด๋‹ค.
๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‘๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ Context๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

Provider ์ง€์˜ฅ

img_047 ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ Provider๋ฅผ ์ž‘๊ฐœ ์ชผ๊ฐœ๋ฉด Provider ์ง€์˜ฅ์ด ํŽผ์ณ์ง„๋‹ค.
์ฒ˜์Œ์—๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒ ์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ๋Š˜์ˆ˜๋ก ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์–ด๋ ค์›Œ์งˆ๊ฒƒ์ด๋‹ค.

Context API๋ฅผ ํฌ๊ธฐํ•œ ์ฒซ๋ฒˆ์งธ ์ด์œ ๋‹ค.

SetStateAction ํ•จ์ˆ˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ›…

img_048 ์ถ”๊ฐ€์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋“ค๋„ ๊ด€๋ฆฌ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
์ด๋Š” ๊ณง ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๋œป๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ ๊ธธ์ง€๋Š” ์•Š์ง€๋งŒ ๋งจ ์œ—๋ถ€๋ถ„์— Provider ์•ˆ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•  ๊ฒƒ์ด๊ณ 
Provider ๊ฐœ์ˆ˜๋งŒํผ ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ํ›…์˜ ๊ฐœ์ˆ˜๋„ ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค.

Context API๋ฅผ ํฌ๊ธฐํ•œ ๋‘๋ฒˆ์งธ ์ด์œ ๋‹ค.

์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›„๋ณด

img_049 Redux, Recoil, Zustand ์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€ ์ •๋„๋ฅผ ๊ณ ๋ฏผํ–ˆ๋‹ค.
Redux๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ˆ ๋งํ•  ํ•„์š”๋„ ์—†๊ณ  Recoil์€ ํŽธ๋ฆฌ์„ฑ์ด ๋†’๊ธฐ์— ๊ฐ™์ด ๊ณ ๋ฏผํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Zustand๋Š” Recoil๊ณผ ๋‹ค๋ฅด๊ฒŒ ์•ˆ์ •์ ์ธ ๋ฒ„์ „์ด ์กด์žฌํ•˜๊ณ  Recoil๋งŒํผ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋‹ค๊ธฐ์— ๊ณ ๋ฏผํ–ˆ๋‹ค.

์Šน์ž๋Š”!!

img_051 ์„ธ๊ฐ€์ง€ ํ›„๋ณด์ค‘ ์Šน์ž๋Š” Zustand๋‹ค.
์šฐ์„  ์ด์œ ๋Š” ๊ณฐ๋Œ์ด๊ฐ€ ๊ท€์—ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ท€์—ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ง„์งœ์ด์œ 

img_050 ์ œ์ผ ์ปธ๋˜ ์ด์œ ๋Š” ๊ณฐ๋Œ์ด๊ฐ€ ๊ท€์—ฌ์› ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์›๋ž˜ Recoil์„ ๋„์ž…ํ•˜๋ ค ํ–ˆ๋Š”๋ฐ ๊ณฐ๋Œ์ด๋ฅผ ๋ณด๊ณ  ๋งˆ์Œ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค.

๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๋‹ค.

๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋งค์šฐ ๋‚ฎ์•˜๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ณต์‹๋ฌธ์„œ์˜ ์ฝ”๋“œ์ธ๋ฐ ์ •๋ง ์งง๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
๋น ๋ฅธ ๋„์ž…์ด ํ•„์š”ํ–ˆ๊ธฐ์— ๋‚ฎ์€ ๋Ÿฌ๋‹์ปค๋ธŒ๋Š” ์ •๋ง ์ค‘์š”ํ–ˆ๋‹ค.
์ด์ •๋„๋ฉด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชจ๋ฅด๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ด๋„ ์‰ฌ์šธ๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

import { create } from 'zustand'

const useStore = create((set) => ({
  count: 1,
  inc: () => set((state) => ({ count: state.count + 1 })),
}))

function Counter() {
  const { count, inc } = useStore()
  return (
    <div>
      <span>{count}</span>
      <button onClick={inc}>one up</button>
    </div>
  )
}

์•ก์…˜ํ•จ์ˆ˜๋„ ํ•จ๊ป˜ ๊ด€๋ฆฌ.

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด inc ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ create ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.
Redux๋„ ์œ„์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ , recoil์€ ์ „ํ˜€ ๊ทธ๋Ÿฌ์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋ฆฌ๊ณ  Context API๋„ ๋”ฐ๋กœ ํ›…์œผ๋กœ ๊ด€๋ฆฌ ํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.

ํ‚ค ๊ด€๋ฆฌ ์—ฌ๋ถ€

Recoil์˜ ๊ฒฝ์šฐ key๋กœ atom์„ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ key๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ์•ˆ๋˜๊ณ  ๊ด€๋ฆฌ๋ฅผ ํ•ด ์ค˜์•ผํ•œ๋‹ค.
๊ทผ๋ฐ Zustand๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ถ„๋„ ์—†๋‹ค.

๋‚ฎ์€ ์šฉ๋Ÿ‰

์ง์ ‘ ๋น„๊ต ํ•ด๋ด๋„ 1.1kB๋กœ ์ œ์ผ ๋‚ฎ์€๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ฆ ์šฐ๋‹นํƒ•ํƒ• ์ด์Šˆ ํ•ด๊ฒฐ๊ธฐ

BE

FE

FE/BE

๐Ÿง‘โ€๐Ÿซ ๋ฉ˜ํ† ๋ง ์ผ์ง€

๐Ÿ“ข ํšŒ์˜๋ก

๐Ÿ’ฌ ์Šคํฌ๋Ÿผ

๐Ÿ’ญ ํŒ€ ํšŒ๊ณ 

๐Ÿ’ญ ๊ฐœ์ธ ํšŒ๊ณ 

๐Ÿƒ Ongoing Project

Clone this wiki locally