MVC Pattern

๐Ÿ’ก ๋””์ž์ธํŒจํ„ด ์ค‘์— ํ•˜๋‚˜์ธ MVC ํŒจํ„ด์— ๋Œ€ํ•˜์—ฌ ํ•™์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค !

 

MVC

  • MVC๋Š” Model, View, Controller์˜ ์•ฝ์ž๋กœ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์„ธ๊ฐ€์ง€ ์—ญํ• ๋กœ ๊ตฌ๋ถ„ํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ controller๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด controller๋Š” model์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ๊ฐ์ ์ธ ํ‘œํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” View๋ฅผ ์ œ์–ดํ•˜ํ˜€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

MVC์˜ ํŠน์ง•

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

Model

  • Data์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ์ •๋ณด๋“ค์˜ ๊ฐ€๊ณต์„ ์ฑ…์ž„์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
// ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ง€๋Š” ํ–‰์œ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” DiceModel์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
class DiceModel {
	// ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
	val color = Color.Red
		
    fun rollDice(): Int { // ๋‚ด๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
        return (1..6).random()
    }
}

๋ชจ๋ธ์˜ ์ œ์•ฝ์‚ฌํ•ญ

  • ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๊ธธ ์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ทฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ์ •๋ณด๋„ ์•Œ์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ •, ์‚ญ์ œ, ์ถ”๊ฐ€ ๋“ฑ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์ด ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

View

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ํ™”๋ฉด, ์ฆ‰ UI๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™”๋ฉด์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.
class DiceView {
	// ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    fun displayResult(result: Int) {
        println("์ฃผ์‚ฌ์œ„ ๊ฒฐ๊ณผ: $result")
    }
	// ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    fun promptRoll() {
        println("์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๋ ค๋ฉด ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.")
    }
}

๋ทฐ์˜ ์ œ์•ฝ์‚ฌํ•ญ

  • ๋ชจ๋ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์ด๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ๋ชฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ UI ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Controller

  • Model๊ณผ View, ๋ฐ์ดํ„ฐ์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋“ค์„ ์ž‡๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€ ์•Œ๋ ค์ฃผ๋ฉฐ, View์— ์š”์ฒญ์ด ์žˆ์œผ๋ฉด Model์„ ํ˜ธ์ถœํ•˜์—ฌ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค์‹œ View์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆญํ•˜๊ณ , ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
// ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Model๊ณผ View๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
class DiceController(
    private val model: DiceModel,
    private val view: DiceView
) {
    fun start() {
        view.promptRoll() // ๋ทฐ ๋กœ์ง ํ˜ธ์ถœ 
        readLine()  // ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋Œ€๊ธฐ 
        val result = model.rollDice()
        // ๋ชจ๋ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ View๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค
        // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ถœ
        view.displayResult(result)
    }
}

์ปจํŠธ๋กค๋Ÿฌ ์ œ์•ฝ์‚ฌํ•ญ

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

์ •๋ฆฌ

  • MVC ํŒจํ„ด์€ ์—ญํ•  ๋ถ„๋‹ด์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ ๊ฒƒ์ธ์ง€ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ๊ฐ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ๋…๋ฆฝ์‹œ์ผœ ํ˜‘์—…์„ ํ•  ๋•Œ ๋งก์€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ํ•˜์ง€๋งŒ Model๊ณผ View ์‚ฌ์ด์—๋Š” Controller๋ฅผ ํ†ตํ•ด ์†Œํ†ต์„ ์ด๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ Massive-View-Controller ํ˜„์ƒ์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ MVP, MVVM ํŒจํ„ด์ด ์ƒ๊ฒจ๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

https://www.sanlab.me/blog/what-is-mvc

https://arc.net/l/quote/rftwmhvq