Redux: connect ()๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ

์— ๋งŒ๋“  2015๋…„ 08์›” 20์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: reduxjs/redux

๋ฌธ์„œ๋ฅผ ์ฝ์Œ์œผ๋กœ์จ Redux๋ฅผ ์•Œ๊ฒŒ๋˜๊ณ  ์‹ค์ œ ์˜ˆ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” GitHub HTTP API ํ˜ธ์ถœ์„ ์ œ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ณ  Repo ๋ฐ User ๊ฐœ๋…์„ ์ œ ํ™˜๊ฒฝ์—์„œ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋„ˆ๋ฌด ๋‹ค๋ฅด๋ฉด ์•ˆ๋˜์ฃ ?

์—ฌ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด API ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•˜๊ณ  ์‘๋‹ต JSON์ด camelCased ๋ฐ ์ •๊ทœํ™”๋˜๊ณ  _ํ•˜์ง€๋งŒ _ API ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•œ ํ›„ ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. USER_REQUEST ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ "Loading ..."์„ ํ‘œ์‹œํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ ๋œ ์งํ›„ USER_SUCCESS ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ๋‹ค์Œ ์ƒํƒœ์— ์ฑ„์›Œ์ง„ entities ํ‚ค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

pasted_image_8_19_15__3_27_pm

๊ทธ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋ฏธ๋“ค์›จ์–ด์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์˜ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅ์†Œ์— ์ €์žฅํ•ด์•ผํ•˜๋ฉฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•˜๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ?

์‹ค์ œ ์˜ˆ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒ€์ƒ‰๋˜๊ณ  ์ •๊ทœํ™” ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ _ ์‹ค์ œ๋กœ _ ์ €์žฅ์†Œ์— ์ €์žฅ๋˜๋Š” ์œ„์น˜๋Š” ์–ด๋””์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋””์—์„œ ์ •๊ทœํ™”๋˜๊ณ  ์žˆ๋Š”์ง€๋Š” ์•Œ์ง€๋งŒ, ๊ทธ ์ •๊ทœํ™”์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์ ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ์œ„์น˜๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ณ ๋งˆ์›Œ!

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

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

๋”ฐ๋ผ์„œ ๊ฐ์†๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  32 ๋Œ“๊ธ€

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

๋”ฐ๋ผ์„œ ๊ฐ์†๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@ernieturner๋Š” ๋ง ์™ธ์— ์žˆ๋Š”์ง€ ํ™•์ธ mapStateToProps ๋‹น์‹ ์˜ ํ•จ์ˆ˜ connect(mapStateToProps)(YourConnectedComponent) ๊ธฐ๋Šฅ์€ ๊ตญ๊ฐ€ ๊ด€๋ จ ๋งคํ•‘ (์ด ๊ฒฝ์šฐ entities ) ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋“ฃ๊ธฐ๋Š” ๊ทธ๋ž˜์„œ ์ƒํƒœ์˜ ๊ทธ ์กฐ๊ฐ์—.

๋˜ํ•œ connect() ๋Š” ์–•์€ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. https://github.com/rackt/react-redux/blob/d5bf492ee35ad1be8ffd5fa6be689cd74df3b41e/src/components/createConnect.js#L91

์—ฐ๊ฒฐ๋œ ์ƒํƒœ์˜ ๋ชจ์–‘์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„, ์•Œ์•˜์–ด! ๋‚ด mapStateToProps ์—์„œ ์ƒํƒœ์—์„œ ๊ฐœ์ฒด๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ํ‚ค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. entities.users[login] ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋Œ€์‹  entities.users[id] . entities.users ๊ฐœ์ฒด๋Š” login ๋ฌธ์ž์—ด๋กœ ํ‚ค๊ฐ€ ์ง€์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ์ˆซ์ž id ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ์†Œํ’ˆ์ด ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์‹œ๊ฐ„์„๋‚ด์–ด ๋„์™€ ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๋ง๋„ ์•ˆ ๋ผ. connect() ๊ฐ•์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๋” ๊นŠ์€ ์ˆ˜์ค€์˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค

ํ•ฉ๋ฆฌ์ ์ธ ํฌ๊ธฐ์˜ ์•ฑ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋งŽ์€ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์ƒํƒœ๊ฐ€ ์ „ํ˜€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์•ฑ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ react-redux์˜ ์ฃผ์š” ์ตœ์ ํ™” ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ๋… ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์ƒํƒœ ์ฟผ๋ฆฌ๋ฅผ ํ‰๊ฐ€ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ reselect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„๋ฅผ ๋†’์ด์‹ญ์‹œ์˜ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

๊นŠ์€ ๋น„๊ต ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ์˜ ๋‚ฎ์€ ์œ„์น˜์—์„œ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ช…ํ™•ํžˆํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ํŠธ๋ฆฌ์˜ ๋‚ฎ์€ ์œ„์น˜์— ์—ฐ๊ฒฐํ•˜๋ฉด ์‹ค์ œ๋กœ _performance_์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ฌ์ธต ๋น„๊ต ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊นŠ์€ ๋น„๊ต ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋ฆฌ๋“€์„œ๊ฐ€ ์ƒํƒœ๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์–•์€ ๋น„๊ต๋Š” ๋” ๊นŠ์€ ์ƒํƒœ๊ฐ€ ์–ธ์ œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•Œ๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋ฆฌ๋“€์„œ๊ฐ€ ๊ธฐ์กด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•œ, ์ตœ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฐ ์ค‘์ฒฉ ์ƒํƒœ ๋ถ€๋ถ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ _ ์–•์€ ๋น„๊ต์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@naw ๊ทธ ํŒ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ• ์œผ๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ์— ์ƒˆ๋กœ์šด ๊ฐ์†๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

const reducers = combineReducers({
    //...bunch of reducers which always return objects of 3 or 4 properties that change sometimes but
    // the shape stays the same
    dataVersion: (state = Symbol(), action = {}) => {
        switch (action.type) {
            case SAME_ACTION_AS_THE_ONE_THAT_UPDATES_A_COMPLEX_PROPERTY:
            case ANOTHER_ACTION_THAT_ALSO_UPDATES_A_COMPLEX_PROPERTY:
                return Symbol():
            default:
                return state;
        }
    }
})

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ :

    switch (action.type) {
       case UPDATE_THIS:
           return {a: action.a, b: action.b, c: action.c};
       default:
           return state;
     }

์ด์ „ ์ƒํƒœ์™€ ๋™์ผํ•œ ๋ชจ์–‘ ์ธ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ previousState !== newState ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค๋ฉด ์ •์ฒด์„ฑ๋ณด๋‹ค๋Š” ๋ชจ์–‘์„ ์–•๊ฒŒ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น„ํšจ์œจ์  ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์ด Redux๊ฐ€ ์‹ค์ œ๋กœํ•˜๋Š” ์ผ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๊ทธ๊ฒƒ์€ ๋‚ด Symbol ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ธํ•ด ๊ทธ๊ฒƒ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.)

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋” ๋งŽ์€ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šฌํ”„๊ฒŒ๋„ ์„ค๋ช…์„ ์œ„ํ•ด ์ „์ฒด github ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ๊ณ ์žˆ๋Š” ํšŒ์‚ฌ์˜ ๋น„๊ณต๊ฐœ ์†Œ์Šค ํ•ญ๋ชฉ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@Zacqary ํ˜„์žฌ ์ƒํƒœ์™€ ์ด์ „ ์ƒํƒœ์˜ ๋น„๊ต๋Š” ์™„์ „ ๋™์ผ (===)์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. stateProps (mapStateToProps์˜ ๊ฒฐ๊ณผ) ๋น„๊ต๋Š” ์–•์€ ๋™๋“ฑ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ซ‘๋ผ๋ฆฌ

mapStateToProps ๋Š” ์ƒ์ ์— ๋„๋‹ฌํ•˜์—ฌ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ "์กฐ๋ฆฝ"ํ•ฉ๋‹ˆ๋‹ค.

mapStateToProps ๋Š” ์ƒ์ ์—์„œ ๋‹ค์–‘ํ•œ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์™€ ์ƒˆ๋กœ์šด stateProps ๊ฐœ์ฒด์˜ ํ‚ค์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ stateProps ๊ฐ์ฒด๋Š” ๋งค๋ฒˆ ์ƒˆ ๊ฒƒ์ด๋ฏ€๋กœ (์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋จ) stateProps ๊ฐ์ฒด ์ž์ฒด์˜ ๊ฐ์ฒด ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .--- ์šฐ๋ฆฌ๋Š” ์•„๋ž˜๋กœ ๋‚ด๋ ค ๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ์„ ํ™•์ธํ•˜๊ณ  @jimbolla๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ shallowEqual ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฐ ๊ฐ’์˜ ๊ฐœ์ฒด ID๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ ์กฐ๊ฐ์˜ ๊ฐ์ฒด ID๊ฐ€ _ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  _ ์ผ๋ถ€ ์ค‘์ฒฉ ๋œ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ๋“€์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด react-redux ์€ (๋Š”) ์‹ค์ œ๋กœ ๋ฌด์–ธ๊ฐ€๊ฐ€ _did_ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์ƒํƒœ์™€ ๋™์ผํ•œ ๋ชจ์–‘ ์ธ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ previousState! == newState๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ƒํƒœ ์กฐ๊ฐ์— ๋Œ€ํ•ด ์ƒˆ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  mapStateToProps ํ•ด๋‹น ์ƒํƒœ ์กฐ๊ฐ์„ ํ‚ค ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด react-redux ์—์„œ ๊ฐœ์ฒด ID๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„๋ณด๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํŠน์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? Symbol ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹จ์ˆœํžˆ connected() ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋™ํ•˜์—ฌ ์†Œํ’ˆ์„ ์ƒ์†ํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. connect() ๋‘ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹œ๋„ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@ernieturner ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ž˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์„น์…˜ ๋งํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ

๋‚˜๋Š”์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ •ํ™•ํžˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํƒœ์— ์†์„ฑ์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  constructor(props){
    this.state = {
      text: props.text
    }
  }

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์†Œํ’ˆ์—์„œ ์ง์ ‘ ๊ฐ’์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

{this.props.text}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :)

@AlexanderKozhevin ๋‚ด๊ฐ€ ์ฐฉ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ƒ์„ฑ์ž์— super(props) .
์ผ๋ฐ˜์ ์œผ๋กœ super(props) ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์—๋Š” this ์„ (๋ฅผ) ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ cdubois-mh ๋งž์•„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋งž์ถคํ˜• ์•ฑ ๋ฃจํŠธ ๊ฐ์†๊ธฐ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ๊ทธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ „์ฒด ์ƒํƒœ์˜ ๋ณต์‚ฌ๋ณธ ๋ฐ˜ํ™˜
{...state}
๋ฃจํŠธ ๊ฐ์†๊ธฐ๊ฐ€ ๋๋‚  ๋•Œ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@daedalius ๊ทธ๊ฒƒ์ด ๊ฐ์†๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ž‘์—…์ด ๊ด€๋ จ์ด์—†๋Š” ๊ฒฝ์šฐ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ƒ ์ˆ˜์ • ๋œ ๊ฐ’์ด์žˆ๋Š” ์ƒํƒœ ๋ณต์‚ฌ๋ณธ ์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด react๊ฐ€ ํ•ญ์ƒ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๊ฐ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
(์˜ˆ : ์ค‘์ฒฉ ๋œ ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ)

์ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

{
    "clients": [
        { "name": "John", "cid": 4578 },
        { "name": "Alex", "cid": 5492 },
        { "name": "Bob",  "cid": 254 }
    ]
}

ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋ฆ„์„ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์ƒํƒœ์˜ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์˜ ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ • ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ์ด์ „๊ณผ ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ react๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋†“์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ƒํƒœ ์ž์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ์ด์ œ ๋‹ฌ๋ผ์ง€๊ณ  (์ƒˆ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—) ๋ฐ˜์‘์ด ์ „์ฒด ๋‹ค์‹œ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ €๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ์†๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ @daedalius๋Š” _ ํ•ญ์ƒ _ state ์˜ ์–•์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ๊ทธ๋ ‡๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ•์ œ ์—…๋ฐ์ดํŠธ

<AfterConnect
    _forceUpdate={Symbol()}
/>

@BrookShuihuaLee ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ? ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๋‚˜ ์„ค๋ช…์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@CedSharp _forceUpdate = {Symbol ()}์„ ์„ค์ •ํ•˜๋ฉด shallowEqual ํ•จ์ˆ˜๋Š” false๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

@BrookShuihuaLee ์ฒซ ๋ฒˆ์งธ ๋‹ต๋ณ€์— ์ด์™€ ๊ฐ™์€ ์„ค๋ช…์„ ํฌํ•จํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ^^

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

@BrookShuihuaLee : ๋‚˜์œ ์ƒ๊ฐ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

@BrookShuihuaLee, ๋‚˜๋Š” @markerikson์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ํด๋ก ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์œ ํšจํ•œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด Redux๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋‘˜๋Ÿฌ ๋ณด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๋ฟก ๋นต๋€จ
AfterConnect ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์„ค๊ณ„ ์ƒ ์ž์ฃผ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๋•Œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด๋„๋ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  AfterConnect์— ๋Œ€ํ•œ ์ˆ˜๋งŽ์€ ์†Œํ’ˆ์„ ์„ค์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@BrookShuihuaLee , ์ฃ„์†ก ํ•ฉ๋‹ˆ๋‹ค๋งŒ ๊ท€ํ•˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€
๋‚ด๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ž์‹ ์˜ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ForceUpdate๋Š” React ์„ธ๊ณ„์—์„œ ๋งค์šฐ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์†”๋ฃจ์…˜์œผ๋กœ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฐพ๋Š” ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด mobx์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
(https://github.com/mobxjs/mobx)

๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€, ์™œ์ด ์ƒํ™ฉ์— ์ ์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

@CedSharp ๋ชจ๋“  ์‚ฌ๋žŒ์ด forceUpdate๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ฒœ์€ ํ•˜๋‚˜์ด๊ณ  ์„ ํƒ์€ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. React๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด ReactComponent.prototype.forceUpdate๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๋‹ค๋ฅธ ์„ ํƒ์„ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ตœ์„ ์˜ ์„ ํƒ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ ์€ ์•„๋‹ˆ์ง€๋งŒ ์•ฑ ์ƒํƒœ๋ฅผ ์ž˜๋ชป ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ ์ƒํƒœ์˜ ์Šฌ๋ผ์ด์Šค์—์„œ ์–•์€ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์–•์€ ๋น„๊ต ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

case SOME_ACTION:
      return {
        ...state,
        ts: (new Date).getTime(),
      };

IMO๋Š” ์ข‹์€ ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ํ˜„์žฌ ๋ฐ”์ธ๋”ฉ ์ƒํƒœ์—์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ (์ฆ‰, ํ•˜๋ฃจ๊ฐ€ ๋๋‚  ๋•Œ ๋ฆด๋ฆฌ์Šคํ•ด์•ผ ํ•จ) ๋น ๋ฅธ ์ˆ˜์ •์ด๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ Œ๋”๋ง์„ ๊ฐ•์ œ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊นŠ๊ฒŒ ์ค‘์ฒฉ ๋œ ์ƒํƒœ์—์„œ๋„ ์–•์€ ๋น„๊ต๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ์—์„œ ์ƒํƒœ๋ฅผ ์ž์„ธํžˆ ๋ณต์‚ฌํ•˜๋ฉด ์—ฐ๊ฒฐ์—์„œ ์–•์€ ๋น„๊ต๊ฐ€ ์ถฉ๋ถ„ํ•˜๊ณ  ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” ๊ทธ ์•ˆ์— ๋ฐฐ์—ด์ด์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–•์€ ๋น„๊ต ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ๋ฐฐ์—ด ๋‚ด์˜ ๊ฐœ์ฒด์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. mapStateToProps ๐Ÿ‘๐Ÿผ์—์„œ lists:state.obj ๋Œ€์‹  list:state.obj.list ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๋‹ต๋ณ€์„ ์ฝ์€ ํ›„ ๊ฐ์†๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ์˜คํƒ€๊ฐ€ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์†์„ฑ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  INITIAL_STATE๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์ง€๋งŒ์ด ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ์ž‘์—…์œผ๋กœ ์—…๋ฐ์ดํŠธ์ค‘์ธ ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์†๊ธฐ์—์„œ ์˜คํƒ€๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค! :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰