๐ŸŽฏ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„ ํฌ์ธํŠธ ์ •๋ฆฌํ•˜๊ธฐ - 1. ์ƒํƒœ ๊ด€๋ฆฌ

KINA KIMยท2022๋…„ 8์›” 9์ผ
0
post-thumbnail

React query with CRUD ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ์ดํ•ดํ•œ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜๊ณ , ๊ฐ ํฌ์ธํŠธ๋ณ„๋กœ ๋‚ด๊ฐ€ ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ ์šฉํ–ˆ๋˜ ๊ธฐ์ˆ ๊ณผ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋“ค์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค. ํ•ญ์ƒ ์ˆ˜๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค ๋์— ์–ด์ฐŒ์ €์ฐŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ ์šฉํ•ด ์™”์ง€๋งŒ... ๋‚ด ๊ฒฌํ•ด๋ฅผ ๋งํ•˜๊ณ , ๊ณผ์ œ๋กœ ๋ฐ›์€ TypeScript์™€ NodeJs๋กœ ๊ตฌ์ถ•๋œ ํˆฌ๋‘ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์„ ์„ ์œ„ํ•ด 6๊ฐœ์›” ๊ฐ„ ๋ฐฐ์šฐ๊ณ  ์ตํ˜”๋˜ ์Šคํ‚ฌ๋“ค์„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์™œ ์ผ๊ณ , ์–ด๋–ป๊ฒŒ ์ผ๋Š”์ง€ ๋ณต๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋๋‹ค.

๐ŸŽฏ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„ ํฌ์ธํŠธ


1. ์ƒํƒœ ๊ด€๋ฆฌ

ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

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

ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ ์  ์ปค์งˆ์ˆ˜๋ก ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ฃผ๊ณ ๋ฐ›์•ผ ํ•  ์ •๋ณด๋„ ์ ์  ๋Š˜์–ด๋‚œ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ์— ์‹คํŒจํ•˜๋ฉด ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋กœ ์ธํ•ด ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง€๊ฑฐ๋‚˜ ์ตœ์‹ ํ™” ๋˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋ฟ๋งŒ์ด ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์„ฑ๋Šฅ๊ณผ๋„ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€์ด ์žˆ๋‹ค.

props drilling

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ props๋กœ ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋‚ด๋ ค๋ณด๋‚ธ ์ ์ด ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ์—์ด ๋ญ ์ด์ •๋„์•ผ ํ•˜๋ฉด์„œ ๋‚ด๋ ค๋ณด๋ƒˆ๋Š”๋ฐ ๋ฉ”๋‰ด๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค, ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ด๊ฒŒ ๋งž๋‚˜? ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ตœ์ข… ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— props๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๋•Œ... ์–ด์ฐŒ์ €์ฐŒ ๋„์ฐฉ์€ ํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ์ด ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ญ”์ง€, ๋„๋Œ€์ฒด ์–ด๋””์„œ๋ถ€ํ„ฐ ๋‚ด๋ ค๋ณด๋‚ธ๊ฑด์ง€, ๋˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ์ถ”๋…ธํ•˜๋Š” ๊ณผ์ •์ด ๋”์ฐํ–ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋Œ€์ฒด ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฑด์ง€๋„ ํŒŒ์•…์ด ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋”๋Ÿฌ์›Œ์ง€๋Š” ๊ฑด ๋ฌผ๋ก ์ด์—ˆ๋‹ค.

์ปค๋ฐ‹ ๊ธฐ๋ก์„ ๊ฐ€์ ธ์™”๋‹ค. ์—ฐ์ดˆ์— ์ฒ˜์Œ ํ”„๋ก ํŠธ์—”๋“œ์— ์ž…๋ฌธํ–ˆ์„ ๋•Œ ์งฐ๋˜ ์ฝ”๋“œ๋‹ค. ์ˆ˜๋งŽ์€ ์ƒํƒœ๋“ค๊ณผ ์„œ๋น„์Šค์™€ ์•ก์…˜ ํ•จ์ˆ˜๋“ค... ์ €๊ธฐ๋งŒ ์ €๋žฌ์œผ๋ฉด ์–‘๋ฐ˜์ด๋‹ค. ์ €๋Ÿฐ ํ˜•ํƒœ์˜ props ์ง€์˜ฅ์ด ๋Œ€๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ์—ˆ๋‹ค...๐Ÿคข

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

props๋กœ ๋‚ด๋ ค๋ฐ›์€ ์ •๋ณด๋“ค์„ ์ถ”๋…ธํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€์ ์„ ์ถ”๋…ธํ•˜๊ณ  ๊ณ ์น˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋‹ˆ ๋ณธ๋Šฅ์ ์œผ๋กœ ์ด๊ฑด ์•„๋‹ˆ๋‹ค๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•˜๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฆฌ๋•์Šค์™€ ๋ฆฌ์ฝ”์ผ์ด ์žˆ์—ˆ๋Š”๋ฐ ๋‚˜๋Š” ๋ฆฌ๋•์Šค๋ฅผ ์„ ํƒํ–ˆ๋‹ค. ๋ฆฌ๋•์Šค๊ฐ€ ๋‚˜์˜จ์ง€ ์˜ค๋ž˜๋œ ๋งŒํผ ์“ฐ๋Š” ํšŒ์‚ฌ๊ฐ€ ๋งŽ์•˜๊ณ  ๊ด€๋ จ ์ƒํƒœ๊ณ„๊ฐ€ ์ž˜ ๊ตฌ์ถ•๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์ฒซ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋ฌธ์ธ๋งŒํผ ์•ˆ์ •์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Redux์˜ ์ž‘๋™ ๋ฐฉ์‹

๋ฆฌ๋•์Šค๋ฅผ ์“ฐ๋ฉด ์ข‹์€ ๊ฒƒ๋„ ์•Œ๊ฒ ๊ณ , ์“ฐ๋Š” ์‚ฌ๋žŒ๋„ ๋งŽ๊ณ  ์ƒํƒœ๊ณ„๋„ ์ž˜ ๋ฐœ๋‹ฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ์กฐ๊ธˆ๋งŒ ์„œ์นญํ•˜๋ฉด ๊ธˆ๋ฐฉ ์‘์šฉํ•ด์„œ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ๋•์Šค์˜ ๋™์ž‘ ๋ฐฉ๋ฒ•๊ณผ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ์–ด๋”” ๊ฐ€์„œ '๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.' ๋ผ๊ณ  ์ž์‹ ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์—ˆ๋‹ค.

๋ฆฌ๋•์Šค๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด MVC ํŒจํ„ด๊ณผ Flux ํŒจํ„ด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. MVC ํŒจํ„ด์˜ ํ•œ๊ณ„๋กœ ๋‚˜์˜ค๊ฒŒ ๋œ ๊ฒƒ์ด Flux ํŒจํ„ด์ด๊ณ , Redux๊ฐ€ Flux ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

MVC ํŒจํ„ด๊ณผ FLUX ํŒจํ„ด์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๊ธฐ๋ก โœจ
https://velog.io/@kina/FLUX-%ED%8C%A8%ED%84%B4

๊ณต๋ถ€ํ•œ ๊ธฐ๋ก์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด๊ฐ€ ์ข€ ๋” ์ดํ•ดํ•œ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ด์„œ ๋ณต๊ธฐํ•ด๋ณด์ž.

1. MVC ํŒจํ„ด

MVC ํŒจํ„ด์€ ์„œ๋น„์Šค๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๊ตญ๊ฐ€๊ธฐ๊ด€์„ ์ž…๋ฒ•, ์‚ฌ๋ฒ•, ํ–‰์ •์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ฒ˜๋Ÿผ MVC ํŒจํ„ด๋„ Model, View, Controller๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

View๋Š” ๋ˆˆ์— ๋ณด์ด๋Š” ๊ฒƒ, HTML๊ณผ CSS์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด๊ณ  MODEL์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. Controller๋Š” Model๊ณผ View ์‚ฌ์ด์—์„œ ๋‘˜์„ ์กฐ์ ˆํ•˜๋Š” ์—ญํ• ์„ ๋งก๋Š”๋ฐ Model๊ณผ View๋Š” ์„œ๋กœ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— Controller๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์‹œํŒ์„ ํ†ตํ•ด ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ข€ ๋” ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

์ž‘์—… ์ค‘์ธ ํ”„๋กœ์ ํŠธ์ธ ์š”๊ฐ€๋‚˜๋ผ์˜ ๊ฒŒ์‹œํŒ์ด๋‹ค. ๊ฒŒ์‹œํŒ์—์„œ ์“ฐ์ด๊ณ  ์ฝํžˆ๊ณ  ์ˆ˜์ •๋˜๋Š” ๊ธ€๋“ค์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์ด ๋œ๋‹ค.

์ด ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…๋“ค์ด Model์— ํ•ด๋‹นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” HTML, CSS ์š”์†Œ๊ฐ€ View๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ์ฝ๊ณ  ์“ฐ๊ณ  ์ง€์šฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด Controller์— ํ•ด๋‹นํ•œ๋‹ค.

Contoller๊ฐ€ Model์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , Model์ด Controller์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๋ฉด Controller๊ฐ€ View์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์„œ View๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

๋ฌธ์ œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„œ๋กœ์˜ ์กด์žฌ๋ฅผ ๋ชฐ๋ผ์•ผ ํ•˜๋Š” Model๊ณผ View๊ฐ€ ์„œ๋กœ๋ฅผ ์†Œํ†ตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ณ , ํ•˜๋‚˜์˜ Controller์— ๋‹ค์ˆ˜์˜ Model๊ณผ View๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜๋ฉด์„œ Controller๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทผ๋ฐ... ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค?๐Ÿค”
๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ๊นŒ 1) ์–ด๋–ค ์‚ฌ๋žŒ์€ MVC ํŒจํ„ด์ด Model๊ณผ View๊ฐ€ ์„œ๋กœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค๊ณ  ํ•˜๊ณ , 2) ์–ด๋–ค ์‚ฌ๋žŒ์€ Model๊ณผ View๋Š” ์„œ๋กœ๋ฅผ ๋ชจ๋ฅด๊ณ  Controller๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์†Œํ†ตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

??? View์™€ Model์ด ์„œ๋กœ๋ฅผ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค๋ฉด์„œ์š”... ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๋œ ์ผ์ธ๊ฐ€ ์‹ถ์–ด ์ฐพ์•„๋ดค๋‹ค.


1๋ฒˆ ๊ทธ๋ฆผ


2๋ฒˆ ๊ทธ๋ฆผ

์•Œ๊ณ  ๋ณด๋‹ˆ๊นŒ ์›๋ž˜ MVC ํŒจํ„ด์€ 2๋ฒˆ ํ˜•ํƒœ์ธ๋ฐ, MVC ํŒจํ„ด์ด ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋˜๋ฉด์„œ 1๋ฒˆ๊ณผ ๊ฐ™์€ ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์œผ๋กœ ๋ณ€ํ™”ํ–ˆ๊ณ , ์‹ค์ œ ๊ตฌํ˜„๋  ๋•Œ๋Š” ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์„ ์‚ฌ์šฉํ•œ MVC ํŒจํ„ด์ด ์ ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ดํ›„ ์ž‘์„ฑํ•  facebook์˜ FLUX ํŒจํ„ด๋„ MVC ํŒจํ„ด์˜ ์–‘๋ฐฉํ–ฅ ์†Œํ†ต์˜ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์— ๋“ฑ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ธฐ๋ก์—์„œ ์–ธ๊ธ‰๋˜๋Š” MVC ํŒจํ„ด์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์†Œํ†ตํ•˜๋Š” MVC ํŒจํ„ด์˜ ์˜๋ฏธ๋ฅผ ๋”ฐ๋ฅด๊ฒ ๋‹ค.

2. Flux ํŒจํ„ด

facebook์€ MVC ํŒจํ„ด์ด ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํ™•์žฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๊ณ  FLUX ํŒจํ„ด์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋„ ๊ทธ๋Ÿด ๊ฒƒ์ด MVC ํŒจํ„ด์€ ๋ชจ๋ธ๊ณผ ๋ทฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์„œ๋กœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค.

MVC ํŒจํ„ด์€ MODEL๊ณผ VIEW๊ฐ€ ์„œ๋กœ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ์–‘๋ฐฉํ–ฅ ํ๋ฆ„์ธ ๊ฒƒ์— ๋ฐ˜ํ•ด FLUX ํŒจํ„ด์€ ๋‹จ๋ฐ˜ํ–ฅ ํ๋ฆ„์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์„ค๋ช… ๋ณด๋Ÿฌ๊ฐ€๊ธฐ โœจ
https://velog.io/@kina/FLUX-%ED%8C%A8%ED%84%B4

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด ์ž˜ ์™€๋‹ฟ์ง€๊ฐ€ ์•Š๋Š”๋‹ค. ๊ด€๋ จ ์œ ํŠœ๋ธŒ ์˜์ƒ์„ ๋ณด๋‹ˆ๊นŒ FLUX ํŒจํ„ด์„ ๋ฉ”์„ธ์ง€๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์…จ๋Š”๋ฐ ๋งˆ์นจ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ชฝ์ง€ํ•จ์„ ๊ตฌํ˜„ํ•œ ์ ์ด ์žˆ์–ด ๋ฉ”์„ธ์ง€๋กœ ํ•œ ๋ฒˆ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ดํ›„ ์ฒจ๋ถ€ํ•˜๋Š” ์ฐธ๊ณ  ์‚ฌ์ง„๊ณผ ์ž๋ฃŒ๋“ค์€ ์šฐ์•„ํ•œ ํ…Œํฌํ†ก ์šฐ๋””๋‹˜์˜ Flxu Architecture ์œ ํŠœ๋ธŒ์—์„œ ๋ฐœ์ทŒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
(https://www.youtube.com/watch?v=wQFBgKl1PYw)

์š”๊ฐ€๋‚˜๋ผ์˜ ๋ฉ”์„ธ์ง€ ๋ทฐ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
1) ์ƒˆ๋กœ์šด ๋ฉ”์„ธ์ง€๊ฐ€ ์˜ค๋ฉด ์ขŒ์ธก ์ชฝ์ง€ํ•จ ๋ถ€๋ถ„์˜ ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„ ์˜†์— ์ƒˆ๋กœ์šด ๋ฉ”์„ธ์ง€๊ฐ€ ์™”๋‹ค๋Š” ์•Œ๋ฆผ๊ณผ ๋ฉ”์„ธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋œฌ๋‹ค.
2) ์ƒˆ๋กœ์šด ๋ฉ”์„ธ์ง€๊ฐ€ ์˜ค๋ฉด ์ƒ๋‹จ ๋ƒ…๋ฐ”์˜ ์šฐํŽธ๋ฌผ ์•„์ด์ฝ˜์— ์•ˆ ์ฝ์€ ๋ฉ”์„ธ์ง€ ๊ฐœ์ˆ˜๊ฐ€ ๋œฌ๋‹ค.
3) ๋ฉ”์„ธ์ง€๊ฐ€ ์ฝ์Œ ์ฒ˜๋ฆฌ ๋˜๋ฉด ์ขŒ์ธก ์ชฝ์ง€ํ•จ๊ณผ ์ƒ๋‹จ ๋ƒ…๋ฐ”์˜ ์šฐํŽธ๋ฌผ ์•„์ด์ฝ˜์˜ ๋ฉ”์„ธ์ง€ ๊ฐœ์ˆ˜๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
4) ํ•ด๋‹น ์ฑ„ํŒ…์ด ํ™œ์„ฑํ™” ๋ผ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ์ชฝ์ง€๊ฐ€ ์˜ค๋ฉด ๋ฐ”๋กœ ์ฝ์Œ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

์›๋ž˜๋ผ๋ฉด ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ด๋‹นํ•ด์„œ ๋ทฐ์—๊ฒŒ ๋ช…๋ นํ•œ๋‹ค. ๋ฉ”์„ธ์ง€ ์™”์œผ๋‹ˆ๊นŒ ์ฑ—ํƒญ์ด๋ž‘ ๋ฉ”์ธ ๋ฉ”์‹œ์ง€ ๋ทฐ๋Š” ๋ฉ”์„ธ์ง€ ์ถ”๊ฐ€ํ•ด. ์ฝ์—ˆ๋‹ˆ? ์ฝ์—ˆ์œผ๋ฉด ์ฝ์Œ ์ฒ˜๋ฆฌํ•ด. ์ฝ์Œ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฉด ์ฝ์ง€ ์•Š์Œ ์นด์šดํ„ฐ ๊ฐ์†Œ์‹œ์ผœ.

๋งŒ์•ฝ์— ๋ฉ”์„ธ์ง€์™€ ๊ด€๋ จ๋œ ๋ทฐ๊ฐ€ ์ ์  ์ฆ๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ธฐ๋Šฅ์ด ์ ์  ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ํ•ด์•ผ ๋  ์ผ์ด ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•„์ฃผ ๋ฐ”๋น  ์ •์‹ ์ด ์—†์„ ๊ฒƒ์ด๊ณ  ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ทฐ๋ผ๋ฆฌ๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์‹œ์Šคํ…œ์˜ ํ™•์žฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค.

๊ทธ๋ž˜์„œ Flux ํŒจํ„ด์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•œ ๋ทฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ด€๋ จ๋œ ์ „์—ญ ์ €์žฅ์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์ „์—ญ ์ €์žฅ์†Œ๋Š” ์ž์‹ ๊ณผ ๊ด€๋ จ๋œ ์ƒํƒœ๋งŒ์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ€์ง„๋‹ค.

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

์ฑ—ํƒญ๊ณผ ๋ฉ”์ธ ๋ฉ”์„ธ์ง€ ๋ทฐ๋Š” '์ฝ์Œ์œผ๋กœ ํ‘œ์‹œ' ์•ก์…˜์„ '์ฝ์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ๋“ค' ์ €์žฅ์†Œ๋กœ ๋ณด๋‚ด๊ณ , ์ €์žฅ์†Œ๋Š” ์ง์ ‘ ์ฝ์€ ๋ฉ”์„ธ์ง€๋งŒํผ์„ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ฝ์ง€ ์•Š์Œ ์นด์šดํ„ฐ๋Š” ์ˆซ์ž๋ฅผ ์„ธ์„œ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๋ชจํ˜•์ด๋‹ค. ์ค‘๊ฐ„์˜ Dispatcher๋Š” ์•ก์…˜์„ ์ €์žฅ์†Œ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋งจ ์ฒ˜์Œ์˜ ์•ก์…˜์€ '์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€ ๋„์ฐฉ'์— ํ•ด๋‹นํ•˜๋Š”๋ฐ, ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€์˜ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด(ajax๋‚˜ ๋ทฐ์—์„œ ๋ฐœ์ƒํ•œ ์ƒํƒœ ๋ณ€ํ™˜ ์•ก์…˜)์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๊ธฐ ์Šค์Šค๋กœ ์ €์žฅ์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ €์žฅ์†Œ๋กœ ์ด๋™์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋Š” Dispatcher๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

3. Redux

๋ฆฌ๋•์Šค๋Š” Flux ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์ง€๋งŒ Flux ํŒจํ„ด์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜์ง€๋Š” ์•Š์•˜๋‹ค. ๋ฆฌ๋•์Šค์—๋Š” Dispatcher ๊ฐœ๋…์ด ์—†๋‹ค. ๋ฆฌ๋“€์„œ๊ฐ€ ๋””์ŠคํŒจ์ฒ˜์™€ ์Šคํ† ์–ด์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค.

๋ฆฌ๋•์Šค์—์„œ๋Š” Dispatcher๊ฐ€ ์—†๋Š” ๋Œ€์‹  ๋ฆฌ๋“€์„œ๊ฐ€ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ฆฌ๋“€์„œ๋Š” ์ „์ฒด ๋ฆฌ๋“€์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฃจํŠธ ๋ฆฌ๋“€์„œ์™€ ๊ทธ ํ•˜์œ„์— ์žˆ๋Š” ์„œ๋ธŒ ๋ฆฌ๋“€์„œ๋กœ ๋‚˜๋‰œ๋‹ค. ์„œ๋ธŒ ๋ฆฌ๋“€์„œ ์•ˆ์—๋Š” ์ƒํƒœ์™€ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”ํ•˜๋Š” ๋กœ์ง์ด ๋‹ด๊ฒจ ์žˆ๋Š” ์Šคํ† ์–ด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

๋ฆฌ๋•์Šค ์ ์šฉ๊ธฐ โœจ
https://velog.io/@kina/%EB%8B%A4%EB%8F%85%EB%8B%A4%EB%8F%85-Redux-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0

4. ๋•์Šค ํŒจํ„ด(Ducks pattern)

Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋•์Šค ํŒจํ„ด์„ ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜์ž. (์œ„ ๋งํฌ๋ฅผ ์ž‘์„ฑํ•  ๋‹น์‹œ์—๋Š” ๋•์Šค ํŒจํ„ด์„ ๋ชฐ๋ž๋˜ ๋•Œ๋ผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์ •๐Ÿ‘Š)

Redux์—๋Š” ์•ก์…˜ ํƒ€์ž…(Actions), ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜(Action Creators), ๋ฆฌ๋“€์„œ(Reducer)๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๊ฐ๊ฐ์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ํŒŒ์ผ์„ ์ด๋ฆฌ์ €๋ฆฌ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋Š๋ผ ์ •์‹ ๋„ ์—†๊ณ  ํŒŒ์•…ํ•˜๊ธฐ๋„ ์–ด๋ ค์šด๋ฐ๋‹ค ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ด€๋ จํ•œ ํŒŒ์ผ์„ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

๋•์Šค ํŒจํ„ด์€ ์•ก์…˜ ํƒ€์ž…, ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜, ๋ฆฌ๋“€์„œ๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์•ˆ์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™” ํ•œ๋‹ค.

๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ ๋ฐฉ์‹๋•์Šค ํŒจํ„ด ์ ์šฉ
Action๊ณผ Reducer ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค. ํ•œ ํŒŒ์ผ ์•ˆ์— ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค.

๋•์Šค ํŒจํ„ด์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.
1. reducer๋Š” export default๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.
2. action ํ•จ์ˆ˜๋Š” export๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.
3. ์•ก์…˜ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ reducer/ACTION_TYPEํ˜•ํƒœ๋กœ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ์ด์œ ๋Š” ์„œ๋กœ๋‹ค๋ฅธ ๋ฆฌ๋“€์„œ์—์„œ ์•ก์…˜์ด๋ฆ„์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
https://velog.io/@dolarge/React-Redux-Ducks-%ED%8C%A8%ED%84%B4

๋•์Šค ํŒจํ„ด ์ž‘์„ฑ ๋ฐฉ์‹
/* ------------ ์•ก์…˜ ํƒ€์ž… ---------------*/
const CREATE = 'posts/CREATE'
const READ = 'posts/READ'
const UPDATE = 'posts/UPDATE'
const DELETE = 'posts/DELETE'


/* ------------ ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜ ---------------*/
export const createPost = (post) => {
  return {type: CREATE, post}
}
export const readPost = () => {
  return {type: READ}
}
export const updatePost = (post) => {
  return {type: UPDATE, post}
}
export const DeletePost = (post) => {
  return {type: DELETE, post}
}

/* ------------ ์ดˆ๊ธฐ ์ƒํƒœ ---------------*/
const initState = {
    posts : [],
}

/* ------------ ๋ฆฌ๋“€์„œ ---------------*/
export const postsReducer = (state=initState, action) => {

    switch(action.type){
        //case action...
        default: return state
    }
}

์ฐธ๊ณ  ์ž๋ฃŒ

https://www.youtube.com/watch?v=wQFBgKl1PYw
https://velog.io/@dolarge/React-Redux-Ducks-%ED%8C%A8%ED%84%B4

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