MVC 패턴

곽지욱·2024년 4월 6일

Andorid

목록 보기
5/5
post-thumbnail
  • MVC 아키텍처는 소프트웨어 디자인 패턴 중 하나인데, 소프트웨어를 세 가지 주요 구성 요소로 분리하는 방법론을 말한다.

  • Model, View , Controller

모델 (Model)

  • 애플리케이션의 비즈니스 로직과 데이터를 처리하는 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)

  • 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 (컨트롤러)

  • 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
            
            
        }
    }
}
  • 사용자가 숫자 버튼을 클릭할 때 마다 clickNumber 메서드가 호출되며 모델에 입력된 숫자를 전달하여 비밀번호를 입력하고 확인한다.

MVC 의 장점

  1. 컴포넌트의 명확한 역할 분리로 인해 서로간의 결합도를 낮출 수 있다.
  • MVC 패턴으로 구현된 소프트웨어나 애플리케이션은 Model,View,Controller 3가지 컴포넌트로 명확하게 구분되기 때문에 Model은 데이터 및 비즈니스 로직을 담당하고, View 는 사용자 인터페이스를 표현하며, Controller는 사용자 요청을 처리하기 위해 Model과 View의 흐름을 제어한다.
  1. 코드의 재사용성 및 확장성을 높일 수 있다
  • 개발한 Model과 Controller는 여러 View에서 재사용할 수 있고, View의 경우도 다른 Model과 함께 재사용할수 있으므로 시간을 단축하고 중복 코드를 줄일 수 있음.
  1. 서비스를 유지보수하고 테스트하는데 용이해진다.
  • 변경이 필요한 부분을 보다 쉽게 파악할 수 있고, 수정이나 확장할 경우 해당 부분에만 집중하여 개발할 수 있어서 다른 부분에는 영향을 덜 주게 된다.

MVC 패턴의 한계점

복잡도 증가

  • 일반적으로 View는 Controller와 연결되어 화면을 구성하게 된다. 그렇기에 자연스럽게 Controller는 여러 개의 View를 가질 수 있게 된다.

이때, 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 사이의 데이터 흐름을 제어한다. 사용자의 요청을 받아 해당 요청을 처리하고 모델을 업데이트 하거나 뷰를 업데이트 한다, 모델과 뷰의 역할을 분리하는 요소로써 중개자 역할을 한다.

0개의 댓글