개발세리의 성장기🌿

🏛 Architecture - Android MVC 아키텍처 패턴 본문

Android/Jetpack && MVVM

🏛 Architecture - Android MVC 아키텍처 패턴

sery270 2021. 1. 23. 23:00

안녕하세요 :) 오늘은 Android 개발에서 사용되는 MVC 아키텍처 패턴에 대해 알아보겠습니다. Android 개발 경험이 있으시다면, 예제로 준비한 코드를 참고하여 이해를 도우시면 더 좋습니다. 앞으로, MVP, MVVM 아키텍처도 정리해볼 예정이니 기대해주세요. 그럼 오늘도 화이팅 입니다🌿

MVC 아키텍처란?

  • Model은 데이터 로직을 담당, 데이터 처리
  • View는 사용자의 화면을 담당, UI 처리 ( C로부터 알림을 받고, 이 알림을 M과 함께 UI로 구성)
  • Controller는 비즈니스로직을 담당, 사용자의 이벤트 처리

MVC 아키텍처 패턴의 흐름

  1. Control이 사용자 이벤트를 감지한다. 
  2. Control는 사용자 이벤트에 따른 데이터의 업데이트 유무를 확인한다.
  3. 데이터 업데이트 yes) Model이 데이터 갱신 처리를 한다.
  4. Model은 View에게 자신(Model)이 업데이트 되었다는 사실을 알린다. (데이터를 전달하는 단계가 아님에 주의)
  5. View는 Model이 업데이트 되었는지 확인한다.
  6. 모델 업데이트 yes) View는 업데이트된 데이터를 Model로 부터 가져오고, 이를 바탕으로 UI 갱신 처리를 한다.

Android에서 MVC 아키텍처란?

안드로이드에서 사용하는 아키텍처

MVC : Model/ View/ Controller

MVP : Model/ View/ Presenter

MVVM : Model/ View/ ViewModel

안드로이드에서의 MVC 아키텍처 패턴의 흐름

Activity/ Fragment가 View와 Control의 역할을 동시 수행

  1. Activity(Control)가 사용자 이벤트를 감지한다. : Activity의 Onclicklistener에서 이벤트가 발생
  2. Activity(Control)는 사용자 이벤트에 따른 데이터의 업데이트 유무를 확인한다.
  3. 데이터 업데이트 yes) Model이 데이터 갱신 처리를 한다.
  4. Model은 Activity(View)로 자신(Model)이 업데이트 되었다는 사실을 알린다.
  5. Activity(View)는 Model이 업데이트 되었는지 확인한다.
  6. 모델 업데이트 yes) Activity(View)는 업데이트된 데이터를 Model로 부터 가져오고, 이를 바탕으로 UI 갱신 처리를 한다.

MVC 아키텍처 예제

MainActiviy.kt

package com.example.mvc

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {
    lateinit var model: Model
    private lateinit var textView: TextView
    private lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // View
        textView = findViewById<TextView>(R.id.textView)
        button = findViewById<Button>(R.id.button)
        textView.setTextColor(ContextCompat.getColor(this,R.color.black))

        // Controller
        var selected = false
        model = Model()
        textView.text = model.unselectedString
        button.text = model.unselectedString
        button.setOnClickListener {
            selected = !selected
            textView.text = if (selected) model.selectedString else model.unselectedString
            button.text = if (selected) model.selectedString else model.unselectedString

        }


    }
}

 

Model.kt

package com.example.mvc

class Model {
    // Model
    val selectedString = "Selected"
    val unselectedString = "Unselected"
}

xml를 포함한 원본 코드는 아래 제 깃헙에서 확인하실 수 있습니다. 

 

sery270/AndroidMVVMSample

Android의 MVC, MVP, MVVM 을 연습해보기 위한 레포지토리 입니다. . Contribute to sery270/AndroidMVVMSample development by creating an account on GitHub.

github.com

MVC 아키텍처의 장점

  • 생각할 부분이 많지 않아, 개발 기간이 짧을 수 있다
  • 코드 자체를 파악하는 것이 어렵지 않다.

MVC 아키텍처의 단점

  • 스파게티 코드가 될 가능성이 많아진다.
    • Model, View, Controller가 나뉘어져 있지 않다.
    • 복사 붙여넣기가 많아진다.
    • 유지보수가 어려워진다.
  • 테스트 코드 작성이 어렵다.
    • 대부분의 처리가 UI에서 이루어지기 때문에, UI 위주의 테스트 코드를 작성해야한다.
  • Model과 View의 결합도가 높아진다.
  • 코드 양이 증가한다.

 

참고한 자료들

지식덤프

taehwandev/AndroidMVPSample

https://www.youtube.com/watch?v=KCDCElsFZ38

Comments