Search

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
๋ณต์‚ฌ