Search
Duplicate

Redux

Redux

β€’
Redux λž€?
β—¦
Reduce
β—¦
Flux
β€’
Redux μ΄ν•΄ν•˜κΈ°
β€’
Redux κΈ°λ³Έ 원리
β€’
Redux ꡬ성 μš”μ†Œ
β—¦
μŠ€ν† μ–΄
β—¦
μ•‘μ…˜
β—¦
λ¦¬λ“€μ„œ
β—¦
λ””μŠ€νŒ¨μΉ˜
β€’
Redux λ™μž‘ κ³Όμ •
β—¦
이벀트 λ°œμƒ
β—¦
μ•‘μ…˜ λ°œμƒ
β—¦
λ””μŠ€νŒ¨μΉ˜
β—¦
λ¦¬λ“€μ„œ μ‹€ν–‰
β—¦
μƒνƒœ μ—…λ°μ΄νŠΈ
β—¦
κ΅¬λ…μž μ•Œλ¦Ό
β€’
Redux κ΄€λ ¨ 라이브러리
β€’
μ˜ˆμ‹œ μ½”λ“œ

Redux λž€?

Reduce + Flux : 단방ν–₯ 데이터 흐름 기반 μƒνƒœ 관리 라이브러리

Reduce

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ reduce ν•¨μˆ˜λŠ” 배열을 μˆœνšŒν•˜λ©΄μ„œ λˆ„μ  값을 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜

Flux

μƒνƒœ 관리λ₯Ό λ‹¨μˆœν™”ν•˜κ³  예츑 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 단방ν–₯ 데이터 흐름 μ•„ν‚€ν…μ²˜ (FaceBook 이 λ§Œλ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ•„ν‚€ν…μ²˜)

Redux μ΄ν•΄ν•˜κΈ°

1.
기상청 & μ‹œμ²­μžκ°€ λ°©μ†‘κ΅­μœΌλ‘œ ν˜„μž₯의 기상 상황을 μ œλ³΄ν•©λ‹ˆλ‹€.
2.
방솑ꡭ μŠ€νŠœλ””μ˜€μ—μ„œλŠ” λ°•λŒ€κΈ° 기자λ₯Ό ν˜„μž₯으둜 νŒŒκ²¬ν•©λ‹ˆλ‹€.
3.
λ°•λŒ€κΈ° κΈ°μžλŠ” ν˜„μž₯μ—μ„œ λŒ€κΈ°ν•˜λ©° ν˜„μž¬ 날씨와 날씨 변화와 강도λ₯Ό μ·¨μž¬ν•˜κ³ , ν˜„μž₯의 컨트둀 νƒ€μ›ŒμΈ PDλŠ” μƒˆλ‘œμš΄ 날씨 상황을 라이브둜 λ°©μ†‘ν•©λ‹ˆλ‹€.
4.
이 ν˜„μž₯ 기상 상황 λ‰΄μŠ€λ₯Ό μ‹œμ²­μžλ“€μ΄ μ‹œμ²­ν•©λ‹ˆλ‹€.
μ‹œμ²­μžκ°€ 제보λ₯Ό ν•˜λŠ” λͺ¨μŠ΅μ€ 마치, Redux λ™μž‘ κ³Όμ •μ˜ 이벀트 λ°œμƒκ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€. 이 제보λ₯Ό 받은 방솑ꡭ μŠ€νŠœλ””μ˜€λŠ” ν˜„μž₯에 κ°€μ„œ μ–΄λ–€ μ•‘μ…˜μ„ μ·¨ν•΄μ•Όν• μ§€ μ •ν•˜κ³  λ°•λŒ€κΈ° 기자λ₯Ό νŒŒκ²¬ν•˜λŠ”λ°, λ°•λŒ€κΈ° 기자λ₯Ό νŒŒκ²¬ν•˜λŠ” 과정은 Redux λ™μž‘ κ³Όμ •μ˜ Dispatch 와 μœ μ‚¬ν•©λ‹ˆλ‹€.
μ•‘μ…˜μ„ κ°€μ§€κ³  파견된 λ°•λŒ€κΈ° κΈ°μžμ™€ ν˜„μž₯에 μžˆλŠ” PDλŠ” ν˜„μž¬ 상황과 μ•‘μ…˜μ„ νŒŒμ•…ν•˜κ³ , μƒˆλ‘œμš΄ 날씨 상황을 μ·¨μž¬ν•˜μ—¬ λ°©μ†‘ν•©λ‹ˆλ‹€. 이 과정은 마치 State 와 Action 을 전달 λ°›μ•„ μƒˆλ‘œμš΄ State λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¦¬λ“€μ„œμ˜ λ™μž‘ κ³Όμ •κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
μ΄μ–΄μ„œ 이 방솑 λ‰΄μŠ€λ₯Ό 톡해 μƒˆλ‘œμš΄ 날씨 상황이 μ‹œμ²­μžλ“€μ—κ²Œ μ „λ‹¬λ˜κ³  날씨에 영ν–₯을 λ°›λŠ” 지역에 μ „λ‹¬λ˜λŠ” 과정은 Redux λ™μž‘ κ³Όμ •μ—μ„œ Store λ₯Ό κ΅¬λ…ν•œ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μƒνƒœ λ³€ν™”λ₯Ό 전달 λ°›λŠ” κ³Όμ •κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
1.
ν™”μž¬ ν˜„μž₯μ—μ„œ 119 에 μ „ν™”ν•˜μ—¬ μ œλ³΄ν•©λ‹ˆλ‹€.
2.
119 μƒν™©μ‹€μ—μ„œ μ†Œλ°© 당ꡭ에 ν™”μž¬ ν˜„μž₯ μ œλ³΄μ— λŒ€ν•˜μ—¬ λ³΄κ³ ν•©λ‹ˆλ‹€.
3.
μ†Œλ°© 당ꡭ은 119 μƒν™©μ‹€λ‘œ 전달 받은, μ±…μž„μžμ˜ ν˜„μž¬ 단계와 λŒ€μ‘ λ°©ν–₯을 전달 λ°›μ•„ μƒˆλ‘œμš΄ λŒ€μ‘ 단계λ₯Ό λ°œν‘œν•©λ‹ˆλ‹€.
4.
이에 따라, λŒ€μ‘ 단계에 λ§žλŠ” ν™”μž¬ ν˜„μž₯에 λŒ€μ‘μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
μ΄λ ‡κ²Œ ν™”μž¬ ν˜„μž₯의 μ œλ³΄κ°€ 119 상황싀에 μ „λ‹¬λ˜κ³ , 이에 λŒ€ν•œ μ†Œλ°© 비상 λŒ€μ‘ 단계λ₯Ό μ†Œλ°© λ‹Ήκ΅­ 컨트둀 νƒ€μ›Œμ—μ„œ μ²˜λ¦¬ν•˜μ—¬ μƒˆλ‘œμš΄ λŒ€μ‘ 단계λ₯Ό λ°œν‘œν•˜κ³  ν™”μž¬ ν˜„μž₯에 λŒ€μ‘ν•˜λŠ” 과정은 마치 Redux 의 λ™μž‘ κ³Όμ •κ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
λ¦¬λ•μŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μƒνƒœ 관리가 μ΄λ£¨μ–΄μ§€λŠ” 과정을 λ‹¨κ³„λ³„λ‘œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ¨Όμ €, μ•‘μ…˜ λ°œμƒ λ‹¨κ³„μ—μ„œλŠ” μ‚¬μš©μžκ°€ UI와 μƒν˜Έμž‘μš©ν•˜κ±°λ‚˜ λ‹€λ₯Έ μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ μ•‘μ…˜μ΄ μƒμ„±λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μ•‘μ…˜μ΄ λ°œμƒν•©λ‹ˆλ‹€. 이 μ•‘μ…˜μ€ μƒνƒœ 변경을 μ§€μ‹œν•˜λŠ” 정보λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒμœΌλ‘œ, λ””μŠ€νŒ¨μΉ˜ 단계가 μžˆμŠ΅λ‹ˆλ‹€. μƒμ„±λœ μ•‘μ…˜μ€ dispatch λ©”μ„œλ“œλ₯Ό 톡해 μŠ€ν† μ–΄μ— μ „λ‹¬λ©λ‹ˆλ‹€. 이 과정은 μ•‘μ…˜μ„ μŠ€ν† μ–΄μ— λ³΄λ‚΄λŠ” 역할을 ν•˜λ©°, 이λ₯Ό 톡해 μƒνƒœ 변경을 μš”μ²­ν•©λ‹ˆλ‹€.
이후 λ¦¬λ“€μ„œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ μŠ€ν† μ–΄λŠ” ν•΄λ‹Ή μ•‘μ…˜μ„ λ¦¬λ“€μ„œλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. λ¦¬λ“€μ„œλŠ” ν˜„μž¬ μƒνƒœμ™€ μ „λ‹¬λœ μ•‘μ…˜μ„ 기반으둜 μƒˆλ‘œμš΄ μƒνƒœλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€. λ¦¬λ“€μ„œλŠ” 순수 ν•¨μˆ˜λ‘œ, μ£Όμ–΄μ§„ μž…λ ₯(ν˜„μž¬ μƒνƒœμ™€ μ•‘μ…˜)에 따라 λ™μΌν•œ 좜λ ₯(μƒˆλ‘œμš΄ μƒνƒœ)을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
μƒνƒœ μ—…λ°μ΄νŠΈ λ‹¨κ³„μ—μ„œλŠ” λ¦¬λ“€μ„œκ°€ λ°˜ν™˜ν•œ μƒˆλ‘œμš΄ μƒνƒœκ°€ μŠ€ν† μ–΄μ— μ €μž₯λ©λ‹ˆλ‹€. μŠ€ν† μ–΄λŠ” 항상 ν˜„μž¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό λ³΄μœ ν•˜κ³  있으며, λ¦¬λ“€μ„œλ₯Ό 톡해 κ³„μ‚°λœ μƒνƒœλ₯Ό μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•©λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ, κ΅¬λ…μž μ•Œλ¦Ό 단계가 μ§„ν–‰λ©λ‹ˆλ‹€. μŠ€ν† μ–΄λŠ” μƒνƒœκ°€ 변경될 λ•Œλ§ˆλ‹€ κ΅¬λ…λœ λͺ¨λ“  λ¦¬μŠ€λ„ˆμ—κ²Œ μƒνƒœ λ³€ν™” 사싀을 ν†΅μ§€ν•©λ‹ˆλ‹€. λ¦¬μŠ€λ„ˆλŠ” 일반적으둜 λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈλ‘œ, μƒνƒœ λ³€ν™”κ°€ λ°œμƒν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈλŠ” μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜μ˜ν•˜μ—¬ μžλ™μœΌλ‘œ λ¦¬λ Œλ”λ§λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ UIλŠ” 항상 μ΅œμ‹  μƒνƒœλ₯Ό λ°˜μ˜ν•˜κ²Œ λ©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 단계듀이 λͺ¨μ—¬ λ¦¬λ•μŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœ 관리 흐름을 κ΅¬μ„±ν•©λ‹ˆλ‹€. 이 과정은 μƒνƒœ 변경을 예츑 κ°€λŠ₯ν•˜κ³  일관성 있게 μœ μ§€ν•˜λ„λ‘ λ•μŠ΅λ‹ˆλ‹€.

Redux κΈ°λ³Έ 원칙

β€’
단일 μ§„μ‹€μ˜ 근원: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨λ“  μƒνƒœλŠ” ν•˜λ‚˜μ˜ μŠ€ν† μ–΄(store)에 μ €μž₯λ©λ‹ˆλ‹€. μ΄λŠ” μƒνƒœλ₯Ό μ‰½κ²Œ μΆ”μ ν•˜κ³  λ””λ²„κΉ…ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
β€’
μƒνƒœλŠ” 읽기 μ „μš©: μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³ , μ•‘μ…˜(action)을 ν†΅ν•΄μ„œλ§Œ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
변경은 순수 ν•¨μˆ˜(reducer)둜: μƒνƒœμ™€ μ•‘μ…˜μ„ μž…λ ₯λ°›μ•„ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜μΈ λ¦¬λ“€μ„œ(reducer)λ₯Ό 톡해 μƒνƒœκ°€ λ³€κ²½λ©λ‹ˆλ‹€.

Redux ꡬ성 μš”μ†Œ

β€’
μ•‘μ…˜
β€’
λ””μŠ€νŒ¨μΉ˜
β€’
μŠ€ν† μ–΄
β€’
λ¦¬λ“€μ„œ

μ•‘μ…˜ (Action)

type + payload : μ–΄λ–€ μ΄λ²€νŠΈκ°€ μΌμ–΄λ‚˜μ„œ μ–΄λ–€ μƒνƒœκ°€ λ³€κ²½λ˜μ•Όν•˜λŠ”μ§€ λ‚˜νƒ€λ‚΄λŠ” 객체
β€’
type : μ•‘μ…˜μ˜ μ’…λ₯˜
β€’
payload : 데이터

λ””μŠ€νŒ¨μΉ˜ (Dispatch)

μ•‘μ…˜μ„ μŠ€ν† μ–΄μ— λ³΄λ‚΄λŠ” ν•¨μˆ˜

μŠ€ν† μ–΄ (Store)

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœ μ €μž₯μ†Œ

λ¦¬λ“€μ„œ (Reducer)

ν˜„μž¬ μƒνƒœμ™€ μ•‘μ…˜μ„ λ°›μ•„μ„œ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

Redux λ™μž‘ κ³Όμ •

1.
μ•‘μ…˜ λ°œμƒ : UIλ‚˜ λ‹€λ₯Έ μ΄λ²€νŠΈμ— μ˜ν•΄ μ•‘μ…˜μ΄ λ°œμƒν•©λ‹ˆλ‹€.
2.
λ””μŠ€νŒ¨μΉ˜ : μ•‘μ…˜μ„ μŠ€ν† μ–΄μ— λ””μŠ€νŒ¨μΉ˜ν•©λ‹ˆλ‹€.
3.
λ¦¬λ“€μ„œ μ‹€ν–‰ : μŠ€ν† μ–΄λŠ” λ¦¬λ“€μ„œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
4.
μƒνƒœ μ—…λ°μ΄νŠΈ : μƒˆλ‘œμš΄ μƒνƒœκ°€ μŠ€ν† μ–΄μ— μ €μž₯λ©λ‹ˆλ‹€.
5.
κ΅¬λ…μž μ•Œλ¦Ό : μŠ€ν† μ–΄μ— κ΅¬λ…λœ λͺ¨λ“  λ¦¬μŠ€λ„ˆ(μ»΄ν¬λ„ŒνŠΈ λ“±)μ—κ²Œ μƒνƒœ λ³€ν™”κ°€ ν†΅μ§€λ©λ‹ˆλ‹€.

Redux κ΄€λ ¨ 라이브러리

β€’
redux
β€’
react-redux
β€’
redux-devtools-extension
β€’
redux-actions

Redux 라이브러리 μ„€μΉ˜

npm install redux react-redux redux-devtools-extension redux-actions
Bash
볡사
npm install redux npm install react-redux npm install redux-devtools-extension npm install redux-actions
Bash
볡사

redux

ReduxλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ μƒνƒœ 관리 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό 예츑 κ°€λŠ₯ν•œ λ°©μ‹μœΌλ‘œ 관리할 수 있게 ν•΄μ£Όλ©°, 주둜 React와 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€. ReduxλŠ” 단일 μŠ€ν† μ–΄, μ•‘μ…˜, λ¦¬λ“€μ„œ, 미듀웨어 등을 톡해 μƒνƒœλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
npm install redux
Bash
볡사

react-redux

React-ReduxλŠ” Redux와 Reactλ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” 곡식 바인딩 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. React μ»΄ν¬λ„ŒνŠΈκ°€ Redux μŠ€ν† μ–΄μ™€ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. Provider μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ Redux μŠ€ν† μ–΄λ₯Ό React μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬μ— μ£Όμž…ν•˜κ³ , connect ν•¨μˆ˜λ‚˜ useSelector 및 useDispatch 훅을 μ‚¬μš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈκ°€ μƒνƒœλ₯Ό 읽고 μ•‘μ…˜μ„ λ””μŠ€νŒ¨μΉ˜ν•  수 있게 ν•©λ‹ˆλ‹€.
npm install react-redux
Bash
볡사

redux-devtools-extension

Redux DevTools Extension은 Redux μƒνƒœμ™€ μ•‘μ…˜μ„ λ””λ²„κ·Έν•˜λŠ” 데 도움을 μ£ΌλŠ” λΈŒλΌμš°μ € ν™•μž₯ ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€. 이 ν™•μž₯을 μ‚¬μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœ λ³€ν™”λ₯Ό μ‹œκ°μ μœΌλ‘œ μΆ”μ ν•˜κ³ , νƒ€μž„ νŠΈλž˜λΈ” 디버깅을 톡해 μƒνƒœλ₯Ό 이전 λ‹¨κ³„λ‘œ 되돌릴 수 μžˆμŠ΅λ‹ˆλ‹€.
npm install redux-devtools-extension
Bash
볡사

redux-actions

Redux-ActionsλŠ” Reduxμ—μ„œ μ•‘μ…˜ μƒμ„±μžμ™€ λ¦¬λ“€μ„œλ₯Ό κ°„κ²°ν•˜κ²Œ μ •μ˜ν•  수 있게 ν•΄μ£ΌλŠ” μœ ν‹Έλ¦¬ν‹° λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. createActionκ³Ό handleActions 같은 ν•¨μˆ˜λ“€μ„ μ œκ³΅ν•˜μ—¬ μ•‘μ…˜ 생성과 λ¦¬λ“€μ„œ μ •μ˜λ₯Ό λ‹¨μˆœν™”ν•©λ‹ˆλ‹€.
npm install redux-actions
Bash
볡사

μ˜ˆμ‹œμ½”λ“œ

β€’
μΉ΄μš΄ν„° μ•± ν”„λ‘œμ νŠΈ
β€’
ν”„λ‘œμ νŠΈ 생성
β€’
라이브러리 μ„€μΉ˜
β€’
μ½”λ“œ μž‘μ—…
β—¦
μ•‘μ…˜ νƒ€μž… μ„ μ–Έ
β—¦
μ•‘μ…˜ 생성 ν•¨μˆ˜ μ •μ˜
β—¦
λ¦¬λ“€μ„œ ν•¨μˆ˜ μ •μ˜
β—¦
μŠ€ν† μ–΄ μ •μ˜
β—¦
UI ν™”λ©΄
β—¦
Store Provider

μΉ΄μš΄ν„° μ•± ν”„λ‘œμ νŠΈ

ν”„λ‘œμ νŠΈ 생성

npx create-react-app redux-app
Bash
볡사

라이브러리 μ„€μΉ˜

β€’
Redux
npm install redux @reduxjs/toolkit react-redux redux-actions
Bash
볡사
β€’
bootstrap
npm install bootstrap
Bash
볡사
β€’
sweetalert2
npm install sweetalert2 sweetalert2-react-content
Bash
볡사

μ½”λ“œ μž‘μ—…

β€’
μ•‘μ…˜ νƒ€μž… μ„ μ–Έ
β€’
μ•‘μ…˜ 생성 ν•¨μˆ˜ μ •μ˜
β€’
λ¦¬λ“€μ„œ ν•¨μˆ˜ μ •μ˜
β€’
μŠ€ν† μ–΄ μ •μ˜
β€’
UI ν™”λ©΄

μ•‘μ…˜ νƒ€μž… μ„ μ–Έ

β€’
actionTypes.js
// μ•‘μ…˜ νƒ€μž… μ •μ˜ export const INCREMENT = 'INCREMENT' export const DECREMENT = 'DECREMENT'
JavaScript
볡사
Reduxμ—μ„œ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λ™μž‘(μ•‘μ…˜)을 λ¬Έμžμ—΄ μƒμˆ˜λ‘œ μ„ μ–Έν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.
κ·Έ λ•Œ κ·Έ λ•Œ ν•„μš”ν•œ κ³³μ—μ„œ λ¬Έμžμ—΄λ‘œ μ•‘μ…˜μ„ λ‚˜νƒ€λ‚΄λ„ λ˜μ§€λ§Œ, λ¬Έμžμ—΄ μƒμˆ˜λ‘œ μ„ μ–Έν•˜λ©΄ μ˜€νƒ€λ‘œ μΈν•œ 버그λ₯Ό λ°©μ§€ν•  수 μžˆλŠ” 이점이 μžˆμŠ΅λ‹ˆλ‹€.

μ•‘μ…˜ 생성 ν•¨μˆ˜ μ •μ˜

// μ•‘μ…˜ 생성 ν•¨μˆ˜ μ •μ˜ import { createAction } from 'redux-actions'; import { DECREMENT, INCREMENT } from './actionTypes'; export const increment = createAction(INCREMENT) export const decrement = createAction(DECREMENT)
JavaScript
볡사
Redux μ•‘μ…˜ 생성 ν•¨μˆ˜λ₯Ό μ •μ˜ν•œ μ½”λ“œμž…λ‹ˆλ‹€.

createAction ν•¨μˆ˜

μ•‘μ…˜ νƒ€μž…μ„ 인자둜 μ§€μ •ν•˜μ—¬, ν•΄λ‹Ή νƒ€μž…μ„ κ°€μ§„ μ•‘μ…˜ 생성 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
createAction ν•¨μˆ˜λ‘œ μ•‘μ…˜μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“­λ‹ˆλ‹€. μœ„μ˜ μ½”λ“œμ—μ„œλŠ” 카운트λ₯Ό μ¦κ°€μ‹œν‚€λŠ” 의미의 β€˜INCREMENT’ μ•‘μ…˜ νƒ€μž…κ³Ό 카운트λ₯Ό κ°μ†Œμ‹œν‚€λŠ” 의미둜 β€˜DECREMENT’ μ•‘μ…˜ νƒ€μž…μ„ κ°€μ§„ increment(), decrement() μ•‘μ…˜ μƒμ„±ν•¨μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ μ•‘μ…˜ 생성 ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, 이벀트 ν•Έλ“€λŸ¬μ—μ„œ dispatch() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ ν•΄λ‹Ή μ΄λ²€νŠΈμ— 연결될 μ•‘μ…˜ 생성 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜λ©΄ μŠ€ν† μ–΄μ— 미리 μ •μ˜λœ μ•‘μ…˜μ„ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ¦¬λ“€μ„œ ν•¨μˆ˜ μ •μ˜

// λ¦¬λ“€μ„œ μ •μ˜ import { handleActions } from 'redux-actions'; import { DECREMENT, INCREMENT } from './actionTypes'; // μƒνƒœ μ΄ˆκΈ°ν™” const initialState = { count : 0 } // λ¦¬λ“€μ„œ const counterReducer = handleActions( { [INCREMENT] : (state) => ( {count: state.count + 1} ), [DECREMENT] : (state) => ( {count: state.count - 1} ), }, initialState ) export default counterReducer;
JavaScript
볡사
redux-actions 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¦¬λ“€μ„œλ₯Ό μ •μ˜ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

μŠ€ν† μ–΄ μ •μ˜

// μŠ€ν† μ–΄ μ •μ˜ import { configureStore } from '@reduxjs/toolkit' import rootReducer from './reducers'; const store = configureStore({ reducer: rootReducer }); export default store;
JavaScript
볡사

UI ν™”λ©΄

β€’
App.js
import { useDispatch, useSelector } from 'react-redux'; import './App.css'; import 'bootstrap/dist/css/bootstrap.min.css' import { decrement, increment } from './redux/actions'; function App() { // μŠ€ν† μ–΄μ˜ μƒνƒœ 선택 : count const count = useSelector( (state) => state.count ) // λ””μŠ€νŒ¨μΉ˜ const dispatch = useDispatch() return ( <div className="container d-flex flex-column justify-content-center align-items-center" style={{ minHeight: '100vh' }}> <div className="card text-center p-4 shadow"> <h1 className="card-title">Counter</h1> <h3>{count}</h3> <div className="card-body"> <button className='btn btn-primary me-2' onClick={() => dispatch(increment())} >+</button> <button className='btn btn-danger' onClick={() => dispatch(decrement())} >-</button> </div> </div> </div> ); } export default App;
JavaScript
볡사

Store Provider

β€’
index.js
import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import { Provider } from 'react-redux'; import store from './redux/store'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <React.StrictMode> {/* ⭐ Providerλ₯Ό μ‚¬μš©ν•˜μ—¬ Redux μŠ€ν† μ–΄λ₯Ό React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 제곡 */} <Provider store={ store }> <App /> {/* ⭐ App 및 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ Redux μŠ€ν† μ–΄μ— μ ‘κ·Ό κ°€λŠ₯ */} </Provider> </React.StrictMode> ); reportWebVitals();
JavaScript
볡사