[React] ๋ฆฌ๋•์Šค.. ์™œ ์“ฐ์ฃ ? ํ•„์š”์„ฑ๊ณผ ๊ทธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด
728x90

๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋Š ์ˆœ๊ฐ„ ๋ฆฌ๋•์Šค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•„์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๊ฐ€ ์˜จ๋‹ค.

๋‚˜์—๊ฒŒ๋„ ๋“œ๋””์–ด ๊ทธ ์‹œ๊ธฐ๊ฐ€ ์™”๋‹ค!... ๐Ÿง

๋ฆฌ๋•์Šค์— ๋Œ€ํ•ด ๊นŠ๊ณ  ์ข‹์€ ๊ธ€๋“ค์€ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋งŽ์œผ๋‹ˆ... ์•„์ง์€ ์ดˆ์‹ฌ์ž์ธ ๋‚˜์˜ ๊ด€์ ์—์„œ ๊ฐœ๋…์„ ๊ฐ€๋ณ๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ๋กœ~

(๊ณ ๋กœ ์ด ๊ธ€์€ ์ดˆ์‹ฌ์ž๋“ค์—๊ฒŒ ์ ํ•ฉ)

 

 

Redux and Context API

๋ฆฌ๋•์Šค๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

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

์•„๋งˆ ๋ฆฌ๋•์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด ์ง€๊ธˆ๊นŒ์ง€ Context API๋ฅผ ์จ์™”์„ ๊ฒƒ์ด๋‹ค. (๋‚˜ ๋˜ํ•œ...)

React.createContext ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณต๋˜๋Š” Provider๋ฅผ ํ†ตํ•ด์„œ ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ง์ด๋‹ค.

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

 

 

 

Context API์˜ ๋ฌธ์ œ

๊ทธ๋Ÿผ Context API๋ฅผ ๊ณ„์† ์จ๋„ ๋˜์ง€ ์•Š๋‚˜?... ๐Ÿค” ์‹ถ์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ํ•˜๋Š” ํ† ์ด ํ”„๋กœ์ ํŠธ๋‚˜, ์ž‘์€ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ž˜ ์“ฐ์ด์ง€๋งŒ-

๋ฐ˜๋Œ€๋กœ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ์ผ ๊ฒฝ์šฐ, Context API๊ฐ€ ์ด๋ ‡๊ฒŒ ์™•์ฐฝ ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

(์ฝœ๋ฐฑ์ง€์˜ฅ์ด ์ƒ๊ฐ๋‚˜๋„ค?..)

์ด๋ ‡๊ฒŒ ์ค‘์ฒฉ๋˜๋Š” ๊ฒƒ์€ ๋ฌผ๋ก ์ด๊ณ , Context API๋Š” ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์— ํšจ๊ณผ์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ถ€ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ด์œ ๋กœ ๋ฆฌ๋•์Šค๊ฐ€ ๋” ํšจ์œจ์ ์œผ๋กœ ์ƒํƒœ๊ด€๋ฆฌ์— ์‚ฌ์šฉ๋˜๊ธฐ ์‹œ์ž‘!

 

 

 

Redux

๊ตฌ์กฐ ํ›‘์–ด๋ณด๊ธฐ

https://redux.js.org/tutorials/fundamentals/part-2-concepts-data-flow

๋ฆฌ๋•์Šค ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๊ฐ€์ ธ์™”๋‹ค.

 

์œ„ gif์˜ ๊ณผ์ •์„ ์ด๋ ‡๊ฒŒ ๋ถ„ํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 

1. UI ์ปดํฌ๋„ŒํŠธ์—์„œ Deposit $10 ๋ฒ„ํŠผ์„ ํด๋ฆญ

2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ Dispatch ํ•จ์ˆ˜์—์„œ Action ๊ฐ์ฒด๋ฅผ store๋กœ ์ „๋‹ฌ

3. Store ๋‚ด๋ถ€์˜ Reducer์—์„œ Action ๊ฐ์ง€, Action์˜ type์— ๋”ฐ๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰ ํ›„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์—…๋ฐ์ดํŠธ

4. UI ์ปดํฌ๋„ŒํŠธ์—์„œ Store์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์—…๋ฐ์ดํŠธ

 

 

๋จผ์ € store๊ฐ€ ์žˆ๋‹ค. store๋Š” ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ์ €์žฅ์†Œ์ด๋ฉฐ JSON ๊ฒฐ์ •์ฒด ๊ฐ™์€ ๋…€์„์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๋Š” store๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ํ˜•ํƒœ๋‹ค.

๊ตฌ๋…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ญ˜๊นŒ ์‹ถ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ง ๊ทธ๋Œ€๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ๋ฅผ store๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์™€์„œ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•  ๋ฟ,

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์ปจํŠธ๋กคํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ทธ๋Ÿผ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ์–ด๋–ป๊ฒŒ?? ๐Ÿคท‍โ™€๏ธ

์‹ค์งˆ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—ญํ• - ์ฆ‰ ์ด์ „ state์—์„œ ์ƒˆ๋กœ์šด state๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋…€์„์€ Reducer๋‹ค.

์œ„ ๊ตฌ์กฐ์—์„œ ๋ณด๋ฉด, Dispatch๋ฅผ ํ†ตํ•ด ๋ฐœํ–‰ํ•œ 'Action'์ด Reducer๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์ด์ „ ์ƒํƒœ์˜€๋˜ 0์ด ์ƒˆ๋กœ์šด ์ƒํƒœ์ธ 10์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ข€ ๋” ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด์ž.

 

 

 

Store

store๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด์ ์ธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค.
๋ฆฌ๋•์Šค์—์„œ store๋Š” ํ•œ ๊ฐœ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.

store์— ์ €์žฅ๋œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด dispatch ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด action์„ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฐ–์— ์—†๋‹ค.

import { createStore } from 'redux'
const store = createStore(todos, ['Use Redux']) // store๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

function addTodo(text) {
  return {
    type: 'ADD_TODO',
    text
  }
}

store.dispatch(addTodo('Read the docs'))
store.dispatch(addTodo('Read about the middleware'))

๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” store์˜ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

 

 

 

Action

Action์€ ๊ธฐ๋ณธ์ ์œผ๋กœ- ๋ฆฌ๋“€์„œ๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ธ, ์ด๋Ÿฐ ํฌ๋งท์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋‹ค.

 {
     type: 'Action์˜ ์ข…๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋‚˜ ์‹ฌ๋ณผ',
    payload: 'Action ์‹คํ–‰์— ํ•„์š”ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ',
 }

์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” dispatch๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด action์„ ๋ฆฌ๋“€์„œ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ๋‚ด๋ถ€์˜ dispatch ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ, ํด๋ฆญ ๊ฐ™์€ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

Reducer

๋ฆฌ๋“€์„œ๋Š” ํ˜„์žฌ์˜ ์ƒํƒœ(current state)์™€ action์„ ์ธ์ž๋กœ ๊ฐ–๋Š” ํ•จ์ˆ˜์ด๊ณ , ์ƒˆ๋กœ์šด ์ƒํƒœ(new state)๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

if๋ฌธ์€ type์— ๋”ฐ๋ฅธ switch๋ฌธ์œผ๋กœ๋„ ๋Œ€์ฒด ๊ฐ€๋Šฅ

 

๋ฆฌ๋“€์„œ๋Š” ํ•ญ์ƒ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ํŠน๋ณ„ํ•œ ๊ทœ์น™์ด ์žˆ๋‹ค!

์—ฌ๊ธฐ์„œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์€, ๋™์ผํ•œ ์ธ์ž๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ๋ฆฌ๋“€์„œ๋Š”

  • ๊ธฐ์กด์˜ ์ƒํƒœ์™€ action ์ธ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ƒํƒœ๋งŒ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฆฌ๋•์Šค์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆ๋ณ€์„ฑ ์žˆ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ ๋‹ค. (๋ฎ์–ด ์”Œ์šฐ๋Š” ๋Š๋‚Œ)
  • ๋‹ค๋ฅธ side effects ๋‚˜ ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์„  ์•ˆ๋œ๋‹ค.
    • side effects๋Š” ํ•จ์ˆ˜ ๋ฐ”๊นฅ์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋“ค์ธ๋ฐ, ํ•จ์ˆ˜์— ์ž…๋ ฅ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ•จ์ˆ˜ ๋ฐ”๊นฅ์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”ํ•˜๊ฑฐ๋‚˜ ๋“ฑ๋“ฑ.. ์˜ ์ž‘์—…๋“ค.

 

 

combineReducers ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ๋“€์„œ๋ฅผ ํ•˜๋‚˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

import { combineReducers } from 'redux'

import todosReducer from './features/todos/todosSlice'
import filtersReducer from './features/filters/filtersSlice'

const rootReducer = combineReducers({
  // Define a top-level state field named `todos`, handled by `todosReducer`
  todos: todosReducer,
  filters: filtersReducer
})

export default rootReducer

 

 

 

์ด๋ ‡๊ฒŒ ๋ฆฌ๋•์Šค์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์Šฌ์ฉ ์ •๋ฆฌํ•ด๋ดค๋Š”๋ฐ,

๋ฆฌ๋•์Šค ๊ณต์‹ ํŽ˜์ด์ง€์—๋„ ์ƒ์„ธํ•œ ์„ค๋ช…์ด ์žˆ์–ด์„œ ์ฐจ์ฐจ ์ฝ์–ด๋ด์•ผ์ง€ ์‹ถ๋‹ค.

๋ฆฌ๋•์Šค ํˆดํ‚ท์„ ์ด์šฉํ•˜๋ฉด ์ด๋ณด๋‹ค๋„ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค!..

 

์–ธ์  ๊ฐ€ ์ด ๊ธ€์ด ์ถ”๊ฐ€ ์ˆ˜์ •์ด ๋˜๊ธธ ๋ฐ”๋ผ๋ฉฐ.. ๐Ÿ˜‡

 

 

 

์ฐธ๊ณ 

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

 

Redux Fundamentals, Part 2: Concepts and Data Flow | Redux

The official Redux Fundamentals tutorial: learn key Redux terms and how data flows in a Redux app

redux.js.org

 

์•„๋งˆ ์ด๊ฒŒ ์ œ์ผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ๊ฑธ์š”? React + Redux ํ”Œ๋กœ์šฐ์˜ ์ดํ•ด

https://qiita.com/mpyw/items/a816c6380219b1d5a3bf?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items ๋ฅผ ๋ฒˆ์—ญํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

medium.com

 

 


๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ

๋ฐฉ๋ฌธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™Œ

ํฌ์ŠคํŒ…๋“ค์€ ๊ณต๋ถ€ ์ค‘์ธ ๋‚ด์šฉ์„ ๊ธ€๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋ผ ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 

๋ถ€์กฑํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ฝ”๋ฉ˜ํŠธ๋Š” ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค.

์ข‹์€ ํ•˜๋ฃจ ๋ณด๋‚ด์„ธ์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™‚

728x90