๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋ก ํŠธ์—”๋“œ

์›น ํ”„๋ก ํŠธ์—”๋“œ ํด๋ฆฐ ์•„ํ‚คํ…์ณ(Clean Architecture) ์˜ ์—ญ์‚ฌ

728x90

 

 

์˜ค๋Š˜์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ณ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์“ฐ์ด๋Š” MVC, MVP, MVVM ๋“ฑ์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์–ด๋– ํ•œ ๋ฐฐ๊ฒฝ์—์„œ ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ณ๊ฐ€ ๋‚˜์™”๊ณ  ์–ด๋– ํ•œ ์›๋ฆฌ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊นŠ๊ฒŒ ์ดํ•ดํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค๊ณ  ํ•œ๋‹ค.

 

 

MVC ํŒจํ„ด

๊ฐ€์žฅ ๋จผ์ €, ๋ชจ๋“  ๊ฒƒ์˜ ์›์กฐ๊ฐ€ ๋˜๋Š” MVC ํŒจํ„ด๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. Model-View-Controller์˜ ์•ฝ์ž๋กœ, ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์—ญํ• ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋‹ค.

  • Model(๋ชจ๋ธ) : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹น. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• 
  • View(๋ทฐ) : ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ํ™”๋ฉด(UI)์„ ๋‹ด๋‹น. Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋Š” ์•Š์Œ.
  • Controller(์ปจํŠธ๋กค๋Ÿฌ) : View์™€ Model ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘์žฌ์ž ์—ญํ• . ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ Model์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ View๋ฅผ ๋ณ€๊ฒฝ. 

๋ทฐ์—์„œ ์ƒˆ๋กœ์šด ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด, ์ด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ์•Œ๋ฆฌ๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๋ชจ๋ธ์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์น˜๋ผ๊ณ  ์ง€์‹œํ•œ๋‹ค.

 

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ JS ์ฝ˜์†” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ˆ์‹œ์ด๋‹ค. View ์—์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ธˆ์•ก์„ ์ž…๋ ฅ๋ฐ›๊ณ , 

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ๋ชจ๋ธ์— ์ „ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View ์— ์ „๋‹ฌํ•˜์—ฌ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊น”๋”ํ•˜๊ฒŒ MVC ํŒจํ„ด์ด ์ž˜ ๋ถ„๋ฆฌ๋œ ์‚ฌ๋ก€์ด๋‹ค.

 async handleBuyLottos() {
    const money = await InputView.readMoney();
    this.#customer = new Customer(money);
    this.#customer.buyLottos();
    OutputView.printLottos(this.#customer.getLottos());
  }

์žฅ์ 

 

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

=> ์ฝ”๋“œ์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ, ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ํ˜‘์—…ํ•  ๋•Œ
ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์ง„๋‹ค. ํŠนํžˆ View์™€ Model์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด, ํ•œ์ชฝ์„ ์ˆ˜์ •ํ•ด๋„ ๋‹ค๋ฅธ ์ชฝ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ ์–ด์ง„๋‹ค.

 

๋‹จ์ 

- ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„๋Œ€ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

- ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์žก์„ ๋•Œ ๋งŽ์€ ์„ค๊ณ„ ๊ณ ๋ฏผ ํ•„์š” -> ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜คํžˆ๋ ค ๋ณต์žก๋„๋ฅผ ๋†’์ด๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ๊ตฌํ˜„ ๋น„์šฉ์„ ๋†’์ž„

 

๋ฆฌ์•กํŠธ์—์„œ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆœ ์—†์„๊นŒ?

FE ์—์„œ View ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’, ํ™”๋ฉด์„ ํƒ ๋ฐ ๋ณ€๊ฒฝ, ์Šค์ผ€์ฅด, ์„œ๋ฒ„ํ†ต์‹  ๋“ฑ ์˜จ๊ฐ– ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค. 

๋”ฐ๋ผ์„œ, View ๊ฐ€ ๋ฉ”์ธ์ด์ž ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๋งŒ์•ฝ Vanila JS ๋ฅผ ํ†ตํ•ด MVC ํŒจํ„ด์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด,

 

 

1. View ์˜ ๋ณ€๊ฒฝ์œผ๋กœ Model์„ ๋ฐ”๊พธ์–ด์•ผํ•˜๊ณ  ex) ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’

2. Model ์˜ ๋ณ€๊ฒฝ์œผ๋กœ View๋ฅผ ๋ฐ”๊พธ์–ด์•ผํ•œ๋‹ค. ex) ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ

3. View ๋Š” ์•„์ฃผ ๋งŽ๊ณ , Model ๋„ ๋งŽ์•„์„œ ๋‹ค๋Œ€๋‹ค ๋งŽ์€ ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ์ ๋“ค์ด ์ƒ๊ธฐ๋Š”๋ฐ

 

1. ์˜์กด์„ฑ์ด ๋†’์•„์ง€๊ณ , ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก๋„๋ฅผ ์ƒ๋‹นํžˆ ๋†’์ธ๋‹ค.

2. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ต‰์žฅํžˆ ๋น„๋Œ€ํ•ด์ง„๋‹ค. 

3. View์™€ Controller ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง„๋‹ค.

 

 

๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณต์žกํ•œ ๋ทฐ์™€ ๋ชจ๋ธ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ , 

View๋Š” ์žฆ์€ re-rendering ์œผ๋กœ ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง ํšจ์œจ์„ฑ์„ ์–ป์–ด์•ผํ•œ๋‹ค.

 

 

 

MVP (Model-View-Presenter)  ํŒจํ„ด

MVC ํŒจํ„ด์„ ๋ฐœ์ „์‹œ์ผœ View์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒฐํ•ฉ์„ ๋” ๊ฐ•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ ๊ตฌ์กฐ์ด๋‹ค.

UI ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ˆˆ์— ๋„๋Š” Presenter ๋ฅผ ๋„์ž…ํ•œ๋‹ค.

 

  • Model: ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
  • View: ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ์˜ค์ง Presenter์— ์š”์ฒญ๋งŒ 
  • Presenter: View์™€ Model ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด.
    View์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ View์— ๋„˜๊น€

 

๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ display์šฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ชจ๋ธ๊ณผ ๋ทฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์กฐ์ •ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, Presenter ๊ฐ€ UI ๋™์ž‘์„ ๊ตฌ๋™ํ•˜๋Š” ๋™์•ˆ, View ๋Š” ํ”ฝ์…€์„ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค.

์ฆ‰ UI ๋กœ์ง์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์„œ, View ๊ฐ€ ํ•œ๊ฐ€์ง€ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ณ  ์ด๋Š” ํด๋ฆฐ ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค.

 

MVC ์™€ MVP ์˜ ์ฐจ์ด์ 

 

์–ผํ•๋ณด๋ฉด, Presenter ๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด ๊ธฐ์กด MVC ํŒจํ„ด์—์„œ Controller ๊ฐ€ ํ•˜๋Š” ์—ญํ• ๊ณผ ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์–ด๋ณด์ธ๋‹ค. 

 

Controller (MVC)

 

  • View์™€ Controller ์„œ๋กœ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
    • View๊ฐ€ Controller๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๊ณ 
    • Controller๊ฐ€ View๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • Controller๋Š” ์ฃผ๋กœ ์š”์ฒญ์„ ๋ฐ›๊ณ , ํ•„์š”ํ•œ ๋กœ์ง(Model ์กฐ์ž‘ ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•œ ๋’ค, ๊ฒฐ๊ณผ๋ฅผ View์— ์ „๋‹ฌํ•œ๋‹ค.
  • ๊ตฌ์กฐ์ ์œผ๋กœ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์„œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ View์™€ Controller๊ฐ€ ์–ฝํžˆ๊ธฐ ์‰ฝ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํšŒ์›๊ฐ€์ž… ํผ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

  1. ์‚ฌ์šฉ์ž๊ฐ€ "๊ฐ€์ž…" ๋ฒ„ํŠผ ํด๋ฆญ (View)
  2. View๊ฐ€ Controller์˜ handleSignUp() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ( View๊ฐ€ Controller๋ฅผ ์ง์ ‘ ํ˜ธ์ถœ )
  3. Controller๊ฐ€ ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆ ( Controller๊ฐ€ View๋ฅผ ์ง์ ‘ ์กฐ์ž‘ )
  4. ๊ฒ€์ฆ ์‹คํŒจ ์‹œ → Controller๊ฐ€ View๋ฅผ ์กฐ์ž‘ํ•ด์„œ, "์ด๋ฉ”์ผ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ View์— ํ‘œ์‹œ

Presenter (MVP)

 

  • View๋Š” Presenter์—๊ฒŒ ์™„์ „ํžˆ ์˜์กดํ•œ๋‹ค.
  • View๋Š” ์ง์ ‘ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ์„ Presenter์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.
  • Presenter๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ, View์—๊ฒŒ "์ด๋ ‡๊ฒŒ ํ‘œ์‹œํ•ด" ๋ผ๊ณ  ๋ช…๋ น๋งŒ ํ•œ๋‹ค.
  • View๋Š” ๊ทธ ์ง€์‹œ๋ฅผ ๋”ฐ๋ผ ๋‹จ์ˆœํžˆ ํ™”๋ฉด์— ํ‘œ์‹œ๋งŒ ํ•œ๋‹ค.
    (View๋Š” Dumb Component, Passiveํ•œ ์—ญํ• )

 

 

๊ฐ™์€ ํšŒ์›๊ฐ€์ž… ํผ ์ œ์ถœ ์ƒํ™ฉ์„ ๋ณด์ž.

  1. ์‚ฌ์šฉ์ž๊ฐ€ "๊ฐ€์ž…" ๋ฒ„ํŠผ ํด๋ฆญ (View)
  2. View๋Š” ๊ทธ๋ƒฅ Presenter์—๊ฒŒ "๊ฐ€์ž… ์š”์ฒญ" ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๋ƒ„
  3. Presenter๊ฐ€ ๊ฒ€์ฆ ๋กœ์ง ์‹คํ–‰
  4. ๊ฒ€์ฆ ์‹คํŒจ ์‹œ → Presenter๊ฐ€ View์—๊ฒŒ "์—๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•ด๋ผ" ๋ผ๊ณ  ๋ช…๋ น
  5. View๋Š” Presenter์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ๋‹จ์ˆœํžˆ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋งŒ ํ‘œ์‹œ

 

  MVC MVP
View์™€ Controller/Presenter ๊ด€๊ณ„ ์–‘๋ฐฉํ–ฅ View → Presenter ๋‹จ๋ฐฉํ–ฅ
View ์—ญํ•  ์ด๋ฒคํŠธ ๊ฐ์ง€ + ์ง์ ‘ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅ ์ด๋ฒคํŠธ ๊ฐ์ง€๋งŒ ํ•˜๊ณ  ๋กœ์ง์€ ๋ชจ๋‘ Presenter์— ์œ„์ž„
Controller/Presenter ์—ญํ•  ๋กœ์ง ์ฒ˜๋ฆฌ + View ์ง์ ‘ ์กฐ์ž‘ ๋กœ์ง ์ฒ˜๋ฆฌ + View์—๊ฒŒ ๋ช…๋ น๋งŒ (View๋Š” Dumb)

 

 

 

MVC ์—์„œ๋Š” View ์™€ Controller ์˜ ์—ญํ•  ๊ตฌ๋ถ„์ด ๋ชจํ˜ธํ–ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ JS ์ฝ˜์†” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ์—๋„,

์–ด๋””๊นŒ์ง€๋ฅผ View์˜ ์—ญํ• ๋กœ ๋ณด๊ณ , ์–ด๋””๊นŒ์ง€๋ฅผ Controller ์˜ ์—ญํ• ๋กœ ๋ด์•ผํ• ์ง€ ๋ชจํ˜ธํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MVP ๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์—ญํ•  ๊ตฌ๋ถ„์ด ๋œ๋‹ค.

 

MVVM(Model-View-ViewModel) ํŒจํ„ด

UI ์ฝ”๋“œ(View)์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Model)์„ ViewModel์„ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋‹ค.

์ฃผ์š” ๋ชฉ์ ์€ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์™€ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•œ UI์™€ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํšจ์œจํ™”์ด๋‹ค.

 

  • Model: ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
  • View: ์‚ฌ์šฉ์ž UI (HTML, ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ)
  • ViewModel: View๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต, ์ƒํƒœ ๊ด€๋ฆฌ, ์•ก์…˜ ์ฒ˜๋ฆฌ (View์™€ Model์˜ ์ค‘๊ฐ„์ž)

MVVM์€ View์™€ ViewModel ์‚ฌ์ด์— ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋ฉฐ, View๋Š” ์ˆœ์ˆ˜ UI ์—ญํ• ์— ์ง‘์ค‘ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ViewModel์—์„œ ๋‹ด๋‹นํ•œ๋‹ค. ๋•๋ถ„์— View์™€ ๋กœ์ง์ด ๊น”๋”ํžˆ ๋ถ„๋ฆฌ๋˜๊ณ , ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

 

๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์—ฌ๊ธฐ์„œ View์™€ ViewModel์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ธ๋ฐ

  • ์‚ฌ์šฉ์ž๊ฐ€ View์—์„œ ์ž…๋ ฅํ•˜๋ฉด → ViewModel์— ๋ฐ”๋กœ ๋ฐ˜์˜๋˜๊ณ 
  • ViewModel์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด → View๋„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

 

=> ๋ช…์‹œ์ ์ธ ์—…๋ฐ์ดํŠธ์˜ ํ•„์š”์„ฑ์ด ์ค„์–ด๋“ ๋‹ค. ViewModel ์€ UI ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ

raw ํ•œ Model ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•œ๋‹ค. 

 

 

View ์—์„œ ์ƒˆ๋กœ์šด ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด, View ๋Š” ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ViewModel ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ViewModel ์€ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ Model ์— ์œ ์ง€ํ•œ๋‹ค.

๋ชจ๋“  ๋ชจ๋ธ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋Š” ๋ช…์‹œ์ ์ธ ์ƒˆ๋กœ ๊ณ ์นจ ํ˜ธ์ถœ ์—†์ด๋„ ๋ฐ”์ธ๋”ฉ ๋œ ๋ทฐ ์†์„ฑ์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜์ด ๋œ๋‹ค.

 


๋‹ค์‹œ ํ•œ๋ฒˆ, ํšŒ์›๊ฐ€์ž… ์˜ˆ์ œ๋ฅผ ๋“ค๋ฉด,

 

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ ์ž…๋ ฅ
  2. ViewModel์˜ email ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ
  3. "๊ฐ€์ž…" ๋ฒ„ํŠผ ํด๋ฆญ
  4. ViewModel์ด ์ด๋ฉ”์ผ์„ ๊ฒ€์ฆํ•˜๊ณ  Model์— ์ €์žฅ ์š”์ฒญ
  5. Model์ด ์ €์žฅ ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์คŒ
  6. ViewModel์ด ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ "๊ฐ€์ž… ์„ฑ๊ณต" ๋ฉ”์‹œ์ง€ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ
  7. View๋Š” ์ด ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด ๋ฐ”๋กœ "๊ฐ€์ž… ์„ฑ๊ณต"์„ ํ™”๋ฉด์— ๋ณด์—ฌ์คŒ

 

์žฅ์ 

 

- ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ„์†Œํ™”ํ•œ๋‹ค.

- View๋Š” ์ˆœ์ˆ˜ UI ์—ญํ• ์— ์ง‘์ค‘ -> UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌ

- View์™€ ๋กœ์ง์ด ๊น”๋”ํžˆ ๋ถ„๋ฆฌ๋˜๊ณ , ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

 

๋‹จ์ 

 

- ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์˜ ๋ณต์žก๋„ : ์ž๋™ ๋ฐ”์ธ๋”ฉ์€ ๊ฐ„๋‹จํ•œ UI์—์„œ๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์ƒํƒœ ํ๋ฆ„์—์„œ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋‚˜ ๋””๋ฒ„๊น… ์–ด๋ ค์›€์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ

- ViewModel ์„ค๊ณ„๊ฐ€ ์–ด๋ ค์›€ : View์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ViewModel์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€๋งŒ, UI ์ข…์†์ ์ธ ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๊ฒฝ๊ณ„๊ฐ€ ์• ๋งค

 

๋ฆฌ์•กํŠธ์—์„œ MVVM ์ฒ ํ•™์ด ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜์—ˆ๋Š”๊ฐ€?

๋ฆฌ์•กํŠธ๋Š” MVVM ํŒจํ„ด์˜ ViewModel ์—ญํ•  ์ผ๋ถ€๋ฅผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํก์ˆ˜ํ•œ ํ˜•ํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ๋ฆฌ์•กํŠธ๋Š” MVVM์„ ๋ช…์‹œ์ ์œผ๋กœ ๋”ฐ๋ฅด์ง€๋Š” ์•Š์œผ๋ฉฐ, ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ (unidirectional data flow) ์„ ์ค‘์‹ฌ์œผ๋กœ ์žฌํ•ด์„ํ•œ ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ณด๋Š” ๊ฒŒ ๋” ์ •ํ™•ํ•˜๋‹ค. MVVM์€ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•˜์ง€๋งŒ, React ๋Š” View ๊ฐ€ ๋ณ€ํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

 

Model ์ƒํƒœ(State), API ์‘๋‹ต, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ
ViewModel ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋กœ์ง (hooks ํฌํ•จ: useState, useEffect, custom hooks ๋“ฑ)
View JSX๋กœ ํ‘œํ˜„๋œ UI

 

๐Ÿ”„ ๋ฐ”์ธ๋”ฉ ๊ด€์ ์—์„œ์˜ ์ฐจ์ด

 

  • MVVM์€ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ์ง€์› (ex. Angular, Vue)
    • View๊ฐ€ ๋ณ€ํ•˜๋ฉด ViewModel์— ์ž๋™ ๋ฐ˜์˜
    • ViewModel์ด ๋ณ€ํ•˜๋ฉด View์— ์ž๋™ ๋ฐ˜์˜
  • React๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ (one-way binding)
    • ์ƒ์œ„ → ํ•˜์œ„๋กœ props ์ „๋‹ฌ
    • View๊ฐ€ ๋ณ€ํ•˜๋ฉด setState๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ

 

 

๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๊นŒ?


๋ฆฌ์•กํŠธ๋Š” ์ „ํ†ต์ ์ธ MVC, MVVM ๊ฐ™์€ ๊ณ ์ „ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ์—„๊ฒฉํžˆ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ์ž์ฒด์ ์œผ๋กœ “์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜”์™€ “๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Unidirectional Data Flow)” ์— ๊ธฐ๋ฐ˜ํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

Component-Based Architecture (์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜)

 

  • UI๋ฅผ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์ฒด ์ƒํƒœ(state)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  • ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• (Function Component) ๋˜๋Š” ํด๋ž˜์Šคํ˜• (Class Component) ์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ

Container-Presenter ํŒจํ„ด

  • UI ๊ตฌ์„ฑ๊ณผ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด
  • React ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ํ™œ์šฉ๋˜๋ฉฐ, ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ, ๊ฐ€๋…์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
// ๐Ÿ“ UserContainer.jsx
import { useEffect, useState } from 'react';
import UserPresenter from './UserPresenter';

export default function UserContainer() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch('/api/user')
      .then(res => res.json())
      .then(data => setUser(data));
  }, []);

  return <UserPresenter user={user} />;
}

 

// ๐Ÿ“ UserPresenter.jsx
export default function UserPresenter({ user }) {
  if (!user) return <p>Loading...</p>;

  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
}

 

๐Ÿ‘ ์žฅ์ 

  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ (Separation of Concerns)
    → UI ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋‚˜๋ˆ ์„œ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ™•๋ณด
  • ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์€ Presenter ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฌ์›€ (Presenter๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• UI)

โ— ๋‹จ์  / ๋ณด์™„์ 

 

  • ๋„ˆ๋ฌด ๋ถ„๋ฆฌํ•˜๋ฉด ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์•„์ ธ ๋ณต์žก๋„ ์ฆ๊ฐ€
  • Hooks์™€ custom hooks์˜ ๋ฐœ๋‹ฌ๋กœ ์ตœ๊ทผ์—๋Š” ์ผ๋ถ€ ๋กœ์ง๋งŒ hook์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ๋„ ์žˆ์Œ (→ Smart-Dumb ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด์œผ๋กœ ์œ ์‚ฌํ•˜๊ฒŒ ๋ฐœ์ „)

 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Unidirectional Data Flow)

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋จ
  • ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ œํ•œ๋˜๋ฏ€๋กœ ์ƒํƒœ ์ถ”์ ๊ณผ ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•จ

 FLUX ํŒจํ„ด 

๋ฆฌ์•กํŠธ์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Unidirectional Data Flow) ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Facebook์ด ์ œ์•ˆํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋‹ค.

๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

 

 

๋ฆฌ์•กํŠธ ์ž์ฒด๋Š” ์ƒํƒœ๋ฅผ useState์™€ props ์ „๋‹ฌ๋กœ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์•ฑ์—์„œ๋Š” ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ฒฐํ•ฉ๋œ๋‹ค.

์˜ˆ์‹œ๋กœ ๋ฆฌ์•กํŠธ์˜ ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์„ ๊ตฌ์กฐํ™”ํ•œ ๊ฒƒ์ด Flux ์•„ํ‚คํ…์ฒ˜์ด๋ฉฐ, ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Redux ์ด๋‹ค.

 

  • Action : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ, ์„œ๋ฒ„ ์‘๋‹ต ๋“ฑ ‘๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€’๋ฅผ ๋‹ด์€ ๊ฐ์ฒด (type๊ณผ payload๋ฅผ ํฌํ•จ)
  • Dispatcher : ๋ชจ๋“  Action์„ ๋ฐ›์•„์„œ ๋“ฑ๋ก๋œ Store์— ์ „๋‹ฌํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ (Flux์˜ ํ•ต์‹ฌ ์ฐจ๋ณ„์ )
  • Store : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ(State) ์™€ ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์„ ๋ณด๊ด€
  • View : React ์ปดํฌ๋„ŒํŠธ๋กœ, Store๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง

๋ฆฌ์•กํŠธ ํŒจํ„ด์˜ ์ง„ํ™” (์—ญ์‚ฌ ํ๋ฆ„ ์ •๋ฆฌ)

1. MVC, MVVM (2010๋…„ ์ด์ „ ~ React ๋“ฑ์žฅ ์ „)

  • ์›น ๊ฐœ๋ฐœ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ ํŒจํ„ด๋“ค.
  • MVC๋Š” Model-View-Controller ๊ตฌ์กฐ๋กœ, ๋ฐ์ดํ„ฐ-UI-๋กœ์ง์„ ๋ถ„๋ฆฌํ•จ.
  • MVVM์€ ViewModel์„ ๋‘์–ด View ↔ Model ๊ฐ„ ๋ฐ”์ธ๋”ฉ ์ž๋™ํ™”๋ฅผ ๊ฐ•์กฐ.
  • ํ•˜์ง€๋งŒ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ธํ•ด ๋ณต์žก๋„ ์ƒ์Šน, ๋””๋ฒ„๊น… ์–ด๋ ค์›€.

2. React์˜ ๋“ฑ์žฅ: Component ๊ธฐ๋ฐ˜ UI (2013~)

  • React๋Š” View๋งŒ ๋‹ด๋‹นํ•˜๋ฉฐ, UI๋ฅผ Component ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ.
  • ์„ ์–ธํ˜• UI, ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„, ๊ฐ€์ƒ DOM์ด๋ผ๋Š” ํ˜์‹ ์  ๊ฐœ๋… ๋„์ž….

3. Container-Presenter ํŒจํ„ด (2014~2015)

  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋„์ž….
    • Container: ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ๋กœ์ง ๋‹ด๋‹น
    • Presenter: UI ํ‘œํ˜„๋งŒ ๋‹ด๋‹น (props๋งŒ ๋ฐ›์Œ)
  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ–ฅ์ƒ์„ ๋ชฉํ‘œ

4. Flux (2014)

  • ํŽ˜์ด์Šค๋ถ์ด ์ œ์•ˆํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜.
  • Action → Dispatcher → Store → View ํ๋ฆ„์˜ ๋‹จ๋ฐฉํ–ฅ ๊ตฌ์กฐ.
  • ๊ตฌ์กฐ๋Š” ๋ช…ํ™•ํ•˜์ง€๋งŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ๊ณ  Dispatcher๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›€.

5. Redux (2015)

  • Flux์˜ ๋ณต์žกํ•จ์„ ์ค„์ธ ๊ฐœ์„  ๋ฒ„์ „.
  • ํ•ต์‹ฌ ๊ฐœ๋…: ๋‹จ์ผ Store + ์ˆœ์ˆ˜ Reducer ํ•จ์ˆ˜ + Action
  • Time-travel debugging ๊ฐ€๋Šฅ, ๋ฏธ๋“ค์›จ์–ด ๋„์ž… ๊ฐ€๋Šฅ.
  • ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฆฌ ์ฑ„ํƒ๋จ.

 

'ํ”„๋ก ํŠธ์—”๋“œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

building a File Tree UI given a list of File objects  (0) 2025.04.24