[React] React MVVM ๊ตฌ์กฐ MobX / Redux ์—†์ด ๊ตฌํ˜„ํ•˜๊ธฐ (Feat. Context API)

[2021-03-04 ์ตœ์ข… ์ˆ˜์ •]

๋ฐœ๋‹จ

KOS ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘์— ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Mobx)๋ฅผ ์ถ”ํ›„ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜๊ณ , ๋จผ์ € MVVM ํŒจํ„ด๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ ๊ธฐ์กด์— ๋‚˜์™€์žˆ๋Š” ํด๋” ๊ตฌ์กฐ๋“ค์€ ๋ชจ๋‘ react์™€ Redux / Mobx ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๋งŒ๋“ค์–ด๋‚ธ ๊ตฌ์กฐ๋“ค์ด์—ˆ๋‹ค.

๋‹ค์Œ์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  MVVM ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ์‚ฌ์ดํŠธ์ด๋‹ค.

https://github.com/davinci2015/react-mvvm-pokemon ( Class ์ด์šฉ )

https://velog.io/@dlrmsghks7/whatismvvmpattern ( Hook ์ด์šฉ )

 

์œ„์˜ ์‚ฌ์ดํŠธ๋“ค์—์„œ ์ œ์•ˆํ•œ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์ž.

View, View Controller, View Model, Model๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ, View๋กœ ๋“ค์–ด์˜จ ์‚ฌ์šฉ์ž์˜ Action์ด View Controller์— ์žˆ๋Š” ๋กœ์ง ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ View Model์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ Model์˜ state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ๋ฆ„์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” Model์˜ ์†์„ฑ์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ View๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ hi๋ผ๊ณ  ์ €์žฅ๋˜์–ด์žˆ๋Š” state๋ฅผ hello๋ผ๊ณ  ๋ฐ”๊ฟจ๋‹ค๋ฉด Model์—๋Š” hello๊ฐ€ ๋ฐ˜์˜๋˜์–ด์žˆ์ง€๋งŒ, Model์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ View๊ฐ€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ hi๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

์ด ๋ฌธ์ œ๋Š” Controller๊ฐ€ Model์˜ ์†์„ฑ์„ ๊ตฌ๋…ํ•จ์œผ๋กœ์จ(๋ณ€ํ™”๋ฅผ ์ „๋‹ฌ๋ฐ›์Œ์œผ๋กœ์จ) ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์—๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

ํ˜„์žฌ Controller๊ฐ€ Model์˜ ์†์„ฑ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” View Controller์™€ View Model์˜ ๋ ˆ๋ฒจ์ด ๊ฐ™์•„์„œ์ด๋ฏ€๋กœ, Model์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ฌ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ View Controller์™€ View Model์˜ ๋ ˆ๋ฒจ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ Model์ด ๊ฐ€์ง„ State๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

1. Model์„ View Controller์˜ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์ด ๋ฐฉ๋ฒ•์€ React์˜ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ state๋ฅผ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Model์—์„œ์˜ ์†์„ฑ State๊ฐ€ Controller์— Props๋กœ ์ „๋‹ฌ๋˜๋Š” ์›๋ฆฌ๋กœ ์ž๋™ ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

React ์‚ฌ์ดํŠธ์—์„œ๋„ Context API ์ชฝ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ง์ด ๊ธฐ์žฌ๋˜์–ด์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๊ธฐ๋Œ€๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, Model์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์ด๋‹ค.

User์™€ ๋งž๋‹ฟ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ปดํฌ๋„ŒํŠธ๊ฐ€ Model์ด๋ผ๋‹ˆ.. ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Model์˜ State๋ฅผ React์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋…ผ๋ฆฌ์— ์–ด๊ธ‹๋‚œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ๊ตฌ๋… ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด๋ณด๋ คํ•œ๋‹ค.

 

2. Model State์˜ ๊ตฌ๋…ํ•˜๋„๋ก ๊ตฌํ˜„

๊ตฌ๋… ๊ธฐ์ˆ  ์ •๋ฆฌ

๊ฐ’์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์€ ์–ด๋–ค๊ฒŒ ์žˆ์„๊นŒ?

https://www.educative.io/blog/react-design-patterns-best-practices ์ฐธ๊ณ 

 

์œ„์˜ ์‚ฌ์ดํŠธ๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๊ตฌ๋…์„ ํ™œ์šฉํ•œ ๊ธฐ์ˆ ๋“ค์ด ์™œ ๋‚˜์˜ค๊ฒŒ ๋์œผ๋ฉฐ ๋ฐœ์ „ํ•˜๋ฉด์„œ ์–ด๋–ค ๊ธฐ์ˆ ๋“ค์ด ์ฐจ๋ก€๋กœ ๋‚˜์™”๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. MVC ๊ตฌ์กฐ

์ฒ˜์Œ์—๋Š” MVC ๊ตฌ์กฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.

img

MVC ๊ตฌ์กฐ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Action์„ ๊ฐ€ํ•˜๋ฉด Controller๊ฐ€ Model์˜ State๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , State์˜ ๋ณ€๊ฒฝ์ด View์— ์ ์šฉ๋œ๋‹ค. ๋ฌธ์ œ๋Š” ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์ด ์•„๋‹ˆ๋ผ View๋„ ์ง์ ‘์ ์œผ๋กœ Model์˜ State๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ํ๋ฆ„์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์—์„œ๋Š” View๊ฐ€ ๊ฐ Model์˜ State๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” Model์˜ state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•œ๋ฒˆ์˜ Action์ด ์—ฐ์‡„์ ์ธ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ผ์œผ์ผœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

 

  1. Flux ํŒจํ„ด

MVC ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์Šค๋ถ์—์„œ Flux ํŒจํ„ด์„ ๋งŒ๋“ค์—ˆ๋‹ค.

Flux ํŒจํ„ด์ด๋ž€ Action => Dispatcher => Model(Store) => View => Action๋กœ ํ•œ action์œผ๋กœ๋ถ€ํ„ฐ์˜ ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์ด ์ด์–ด์ ธ view๊นŒ์ง€ ์ ์šฉ๋˜๋Š” ํŒจํ„ด์„ ์˜๋ฏธํ•œ๋‹ค.

MVC์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Model์€ Dispatcher๋กœ๋งŒ ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ์—ˆ๊ณ , View๋Š” Model์˜ State๋ฅผ ๊ตฌ๋…ํ•œ๋‹ค.

 

  1. Redux

์ด๋Ÿฌํ•œ Flux ํŒจํ„ด์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒํ•˜๋Š” ๊ณ ๋ฏผ ๋์— ๋‚˜์˜จ ๊ฒƒ์ด Redux์™€ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

Redux๋Š” ํ•˜๋‚˜์˜ Model(Store)๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ ์ „์ฒด State๊ฐ€ ์ด๋Ÿฌํ•œ Store(์ง„๋ฆฌ์˜ ์›์ฒœ)์— ์ง‘ํ•ฉํ•ด์žˆ๋‹ค. ๋™์‹œ์— ์ด๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” Dispatcher๋กœ Reducer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Reducer๋Š” state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์ด๋ฉฐ, delay๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, api ํ†ต์‹  ๋“ฑ์„ Reducer์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

 

๊ตฌํ˜„

๊ฐœ๋…

Model์—์„œ Context๋ฅผ ๋งŒ๋“ค๊ณ , Context๋ฅผ Provider๋ฅผ ํ†ตํ•ด์„œ View Model์— ์ „๋‹ฌํ•œ๋‹ค.

๊ธฐ์กด๊ณผ ๋น„๊ตํ•ด๋ณด๋ฉด View Controller์˜ ์—ญํ• ์„ View Model์ด ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, View Model๊ณผ Model์˜ ๋ ˆ๋ฒจ์ด ๊ฐ™์Œ์—๋„ ๊ตฌ๋…๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ Model์˜ State๋ฅผ View์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์‚ฌ์šฉ์ž์˜ action์— ๋”ฐ๋ฅธ ํ๋ฆ„์„ ์‚ดํŽด๋ณด์ž.

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

 

์ธํ„ฐ๋„ท์— MVVM ๊ตฌ์กฐ๋ฅผ ์น˜๋ฉด ๋‚˜์˜ค๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๋ชจ๋ธ ๋ทฐ-ViewModel ํŒจํ„ด - Xamarin | Microsoft Docs๊ทธ๋ƒฅ ๊ทธ๋Ÿฐ ๋ธ”๋กœ๊ทธ :: MVVM ํŒจํ„ด ๊ตฌํ˜„ํ•˜๊ธฐ

https://t1.daumcdn.net/cfile/tistory/261A2545541843742C

 

์ฝ”๋“œ

  • Model
import { useState, createContext, useContext } from 'react';

// create context to use open
export const OpenStateContext = createContext();
export const OpenDispatchContext = createContext();

// Model์€ Context ์ €์žฅ ๋ฐ ์ œ๊ณต
export const OpenContextProvider = ({ children }) => {
    const [open, setOpen] = useState(true);

    return (
        <OpenStateContext.Provider value = {open}>
            <OpenDispatchContext.Provider value = {setOpen}>
                {children}
            </OpenDispatchContext.Provider>
        </OpenStateContext.Provider>
    );
};

export function useOpenState() {
    const context = useContext(OpenStateContext);
    return context;
}

export function useOpenDispatch() {
    const context = useContext(OpenDispatchContext);
    return context;
}

Model์—์„œ๋Š” ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ์ •์˜ํ•˜๊ณ , Context๋กœ ๋“ฑ๋กํ•œ๋‹ค.

Context๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด๋ณด๋‚ธ๋‹ค(export).

  • Provider
import React from 'react';
import ViewModel from './ViewModel';
import { OpenContextProvider } from './Model/SideBarModel';

// Model๊ณผ View Model์„ ์ด์–ด์ฃผ๋Š” ์—ญํ• 
function Provider() {
    return (
        <OpenContextProvider>
            <ViewModel/>
        </OpenContextProvider>
    );
}

export default Provider;

Provider๋Š” Model์ด ๋‚ด๋ณด๋‚ธ Provider๋ฅผ ๋ฐ›์•„ ViewModel์„ ๊ฐ์‹ธ์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ViewModel์ด Model์˜ Context๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • View Model
import React from 'react';
import { useOpenState, useOpenDispatch } from './Model/SideBarModel';
import SideBarView from './View/SideBarView';
import PageView from './View/PageView';

// View Model์€ Model์˜ Context๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , ๊ฐฑ์‹ ํ•˜๋Š” ์—ญํ• 
function ViewModel() {
    const open = useOpenState();
    const setOpen = useOpenDispatch();

    const handleSideBarOpen = () => {
        setOpen(true);
    };

    const handleSideBarClose = () => {
        setOpen(false);
    };

    return (
        <React.Fragment>
            {open ?
                <SideBarView
                    handleSideBarClose = { handleSideBarClose }
                    open = { open }
                /> : undefined
            }
            <PageView
                handleSideBarOpen = { handleSideBarOpen }
                open = { open }
            />
        </React.Fragment>
    );
}

export default ViewModel;

View Model์€ Model์˜ Context๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, Model์˜ State๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ตฌ๋…ํ•œ๋‹ค.

View Model์—์„œ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” State๋ฅผ View์—๋Š” props๋กœ ๋‚ด๋ ค๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.

  • View
import React from 'react';
import Grid from '@material-ui/core/Grid';
import Tooltip from '@material-ui/core/Tooltip';
import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';

// View๋Š” Controller์˜ data ๋ฐ function์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ
function SideBarView(props) {
    const {
        handleSideBarClose,
        open
    } = props;

    return (
        <Grid className="sidebar">
            <header className="sidebar-header">
                <Grid className="sidebar-header-title">
                    <img src="/logo192.png"/>
                    <h1>KOS</h1>
                </Grid>
                <Grid className="sidebar-btn">
                    <Tooltip title="Close Sidebar" aria-label="close sidebar">
                        <ArrowBackIosIcon onClick={handleSideBarClose}/>
                    </Tooltip>
                </Grid>
            </header>
        </Grid>
    );
}

export default SideBarView;

View๋Š” props๋กœ ๋ฐ›์€ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•œ๋‹ค.

 

์‹ค์ œ ๊ตฌํ˜„

์•„๋ž˜์˜ ๊ตฌ์กฐ๊ฐ€ ์‹ค์ œ๋กœ ๊ตฌํ˜„๋œ ๊ตฌ์กฐ์ด๋‹ค.

์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋‹ˆ, Model์˜ State๋Š” View์—์„œ ์ง์ ‘ ๋ฐ›์•„์„œ ์“ฐ๊ณ  ์ฒ˜๋ฆฌ ๋กœ์ง์€ View Model์„ ๊ฑฐ์น˜๋Š” ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ์งœ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋œ ์ด์œ ๋Š” React์™€ Context API์˜ ํŠน์„ฑ๊ณผ ์—ฐ๊ด€์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

Context API ํŠน์„ฑ ์ƒ State๋Š” ์ง์ ‘ ๊ตฌ๋…์„ ํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ฆ‰, Model์˜ State๊ฐ€ ๋ฐ”๋€ ๊ฒƒ์„ ViewModel์˜ State๋Š” ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, props๋กœ ์ „๋‹ฌ๋œ View๋Š” ViewModel์˜ State๊ฐ€ ๋ฐ”๋€ ๊ฒƒ๋งŒ์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

Model์˜ State ๋ณ€๊ฒฝ => View Model์˜ State ๋ณ€๊ฒฝ => View์˜ State ๋ณ€๊ฒฝ์ด ์—ฐ์‡„์ ์œผ๋กœ ์ผ์–ด๋‚˜์ง€ ์•Š์„๊นŒ ์‹ถ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. React์˜ ํŠน์„ฑ ์ƒ ๋ณตํ•ฉํƒ€์ž…์ธ Array๋‚˜ Object๋Š” ๊ฒ‰๋ชจ์Šต์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์œผ๋ฉด ์žฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ View Model์˜ State๋Š” ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ, View๋กœ ๋‚ด๋ ค์ค€ props๋Š” ๊ฒ‰๋ชจ์Šต์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด Model์˜ State ์ค‘ [1,2,3,4]์ด๋ผ๊ณ  ๋˜์–ด์žˆ๋Š” ์ƒํƒœ๋ฅผ [1,2,3,3]์ด๋ผ๊ณ  ๋ฐ”๊พธ๋ฉด, ๊ฐ’์„ ๋ฐ”๋กœ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” View Model์—์„œ๋Š” [1,2,3,3]์œผ๋กœ State๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€๋งŒ props๋กœ ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” View์—์„œ๋Š” ๊ฐฑ์‹ ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด forceUpdate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•์ œ ์žฌ๋ Œ๋”๋งํ•˜๋Š” ๋“ฑ์˜ ์ž„์‹œ ๋ฐฉํŽธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

ViewModel์—์„œ props๋กœ state๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋Œ€์‹  View์—์„œ ๊ฐ๊ฐ Model์˜ State๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

์ค‘๊ฐ„์— ๋ณด์•˜๋˜ ๊ฒƒ๋“ค

๋ฐ˜์‘ํ˜•