MVC 아키텍처는 소프트웨어 디자인 패턴 중 하나인데, 소프트웨어를 세 가지 주요 구성 요소로 분리하는 방법론을 말한다.
Model, View , Controller
애플리케이션의 비즈니스 로직과 데이터를 처리하는 class 이다. 모델은 주로 데이터를 관리하고 조작하고, 주로 데이터베이스와 상호작용하거나 비즈니스 규칙을 적용한다.
Controller 에게 받은 데이터를 조작하는 역할을 수행한다고 볼 수 있다. 즉, 데이터와 관련된 부분을 담당하며 값과 기능을 가지는 객체라고 보면 된다.
모델은 다음과 같은 규칙을 가지고 있다.
사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 합니다.
뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 합니다.
변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야만 합니다.
package com.example.tutorial
class MVC_Model {
var password : MutableList<Int> = mutableListOf()
fun inputPassword(i : Int){
if (password.size < 4){
password.add(i)
}
}
fun checkPassword() : Boolean {
var trueCount = 0
var savePassword = mutableListOf(1,2,3,4)
for (i in 0 until savePassword.size){
if (savePassword.get(i) == password.get(i)){
trueCount ++
}
}
return trueCount == 4
}
}
View는 입력값이나 체크박스 등과 같은 사용자 인터페이스 요소를 말한다. 이는 Controller에게 받은 Model의 데이터를 사용자에게 시각적으로 보여주기 위한 역할을 수행한다.
View 는 다음과 같은 규칙을 가지고 있다.
모델이 가지고 있는 정보를 따로 저장해서는 안됩니다.
모델이나 컨트롤러와 같이 다른 구성 요소들을 몰라야 됩니다.
변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 합니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="MVC_Activity"
type="com.example.tutorial.MVC_Activity" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MVC_Activity">
<!-- 버튼 그리드 -->
<GridLayout
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnCount="3"
android:rowCount="3">
<!-- 숫자 버튼 -->
<androidx.appcompat.widget.AppCompatButton
android:layout_width="100dp"
android:layout_height="100dp"
android:onClick="@{() -> MVC_Activity.clickNumber(1)}"
android:text="1" />
<!-- 나머지 버튼들 생략 -->
</GridLayout>
<!-- 비밀번호 해제 성공 메시지 -->
<TextView
android:id="@+id/pass_wordTxt"
android:visibility="invisible"
android:layout_margin="10dp"
android:text="비밀번호 해제 성공 !"
android:textSize="15sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
데이터 바인딩을 통해서 MVC_Activity 와 데이터 바인딩하여 컨트롤러와 뷰를 연결한다.
MVC_Acitivty에 clickNumber 메서드 파라미터에 각각의 번호를 전송한다.
Controller는 Model과 View 사이에서 데이터 흐름을 제어한다. 사용자가 접근한 URL에 따라 요청을 파악하고 URL에 적절한 메서드를 호출하여 Service에서 비즈니스 로직을 처리한다 (clickNumber 메서드 호출)
Controller는 Model과 View의 역할을 분리하는 요소라고 할 수 있다.
컨트롤러는 다음과 같은 규칙을 가지고 있다.
모델이나 뷰에 대해서 알고 있어야 합니다.
모델이나 뷰의 변경을 모니터링 해야 합니다.
package com.example.tutorial
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import com.example.tutorial.databinding.ActivityMvcBinding
class MVC_Activity : AppCompatActivity() {
private lateinit var binding: ActivityMvcBinding
var model = MVC_Model()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_mvc)
binding.mvcActivity = this
}
fun clickNumber(i: Int) {
Toast.makeText(this, "$i 번을 클릭했습니다", Toast.LENGTH_SHORT).show()
model.inputPassword(i)
//View의 입력을 받아서 View를 업데이트함 , 동시에 inputPassword(Model) 메서드에 i 값을 전달하여 Model은 받은 데이터를 처리함.
if (model.password.size == 4 && model.checkPassword()) {
// 4자리 이상 비밀번호가 1234인 경우
binding.passWordTxt.visibility = View.VISIBLE
}
}
}
복잡도 증가
이때, Model은 Controller 를 통해서 View와 연결되는데 이 말은 Controller에 의해 하나의 View에 연결되는 Model도 여러개가 될 수 있는 것이다.
즉, 복잡한 구조의 애플리케이션일수록 하나의 Controller에 다수의 View와 Model이 복잡하게 연결되어 서로간의 의존성이 커지는 상황이 발생할 수 있다.
Massive-View-Controller

Massive-View-Controller 현상은 MVC 패턴에서 Controller 역할을 담당하는 클래스가 너무 많은 책임을 갖고 코드가 복잡하게 비대해지는 현상을 말한다.
MVC 패턴에서는 컨트롤러가 모델과 뷰의 인스턴스를 직접 참조하고 있기 때문에 의존성이 높아지기 마련이다. 이로 인해 Controller가 너무 많은 객체에 의존하게 되고 코드가 복잡해지며 유지보수의 어려움이 발생하는 현상이다.
MVC 패턴은 Model-View-Controller의 약자로 소프트웨어 디자인 패턴 중 하나를 말한다.
Model은 앱의 비즈니스 로직과 데이터를 처리하는 객체를 말하며 컨트롤러에서 사용자의 요청을 받은 데이터를 조작하고 업데이트하는 역할을 수행한다
View는 사용자 인터페이스를 담당하고 사용자의 입력을 받아 Controller에 전달한다
Controller는 Model과 View 사이의 데이터 흐름을 제어한다. 사용자의 요청을 받아 해당 요청을 처리하고 모델을 업데이트 하거나 뷰를 업데이트 한다, 모델과 뷰의 역할을 분리하는 요소로써 중개자 역할을 한다.