ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 아키텍처 (MVC)
    안드로이드 학습/Android 기술면접 대비 2024. 12. 9. 11:58

    안드로이드 개발자가 자주 보는 앱아키텍처 종류로는 MVC, MVP, MVVM, MVI다.

     

    MVC는 4가지 아키텍처중 가장 오래된 패턴이며, 현재는 안드로이드에서 잘 사용하지는 않는다. 

    실제로 적용하고 많이 사용하는 것은 MVVM일 것이다.

     

    하지만 아키텍처가 어떤 이유로 MVVM에로 넘어갔고 왜 아키텍처 패턴을 사용하는지나 가장 쉬운 구조로 관심사 분리라는 주제를 학습하는 것이 좋다고 생각해서 MVC를 먼저 학습해봤다.

     

    MVC (Model View Controll) :

    MVC는 Model, View, Controller의 약자다. 이것을이 하는 역할을 보자면

    • Model
      • 앱에서 사용하는 데이터, 상태, 비지니스 로직을 포함한다.
      • View 또는 Controller에 묶이지 않아서 재사용이 가능하다.
    • View
      • 사용자에게 제공되는 UI
      • 사용자가 앱과 상호작용할 때 Controller와 통신하는 책임을 맡습니다
    • Controller
      • Controller 는 뷰로부터 사용자에게 입력을 받거나 이벤트가 발생하면 로직에 맞게 모델을 변경하게 됩니다.
      • 모델에서 데이터가 변화되는 것에 따라 컨트롤러는 뷰의 상태를 적절하게 업데이트 시킵니다
      • MVC 디자인 패턴에서는 Activity와 Fragment는 뷰의 역할을 하는 동시에 컨트롤러 역할도 하게 됩니다.

    장점 : 

    • Model과 View가 분리되고, 이것으로 인해 Model의 재사용성 증가
    • 구조가 단순하고 구현하기 제일 쉽다.
    • MVC 디자인 패턴을 학습하지 않았더라도 코드가 이해하기 쉽다

    단점 :

    • Model과 View 사이에 의존성 발생. (View 에서 Model을 참조해서 사용.)
    • Controller와 View가 Activity, Fragment에 있기 때문에 Activity와 Fragment에 코드가 많아질 수도 있다.
    • Controller는 특정 View와 Model에 의존적이며, View도 특정 Model에 의존적이라서 결합도가 높아 유닛테스트가 거의 불가능

    예제:

    다른 아키텍처들과 마찬가지로 MVC 또한 각자의 하는 역할(관심사) 분리가 핵심이다.

     

    View & Controller : 

    class SimpleMvcPatternFragment :  ViewBindingBaseFragment<FragmentSimpleMvcPatternBinding>() {
        override fun getViewBinding(): FragmentSimpleMvcPatternBinding =
            FragmentSimpleMvcPatternBinding.inflate(layoutInflater)
    
        private var model = SimpleMvcModel(0)
    
        override fun initContentInOnViewCreated() {
    
            val tvNumber = binding.tvSimpleMvcNumber
            val btnPlus = binding.btnSimpleMvcPlus
            val btnMinus = binding.btnSimpleMvcMinus
    
            updateView(tvNumber)
    
            // Controller 로직
            btnPlus.setOnClickListener {
                model.plusOne()
                updateView(tvNumber)
            }
    
            btnMinus.setOnClickListener {
                model.minusOne()
                updateView(tvNumber)
            }
        }
    
        private fun updateView(tvNumber: TextView) {
            tvNumber.text = model.number.toString()
        }
    }

     

    View 는 앱에서 사용하는 데이터에 영향을 끼치지 않는다. UI만 처리할 뿐이다.

    데이터는 Model 이 처리하기 때문에 Model을 호출해서 데이터 처리를 해주기 때문이 이 과정에서 의존성이 생긴다. 

    private fun updateView(tvNumber: TextView) {
        tvNumber.text = model.number.toString()
    }

     

     

    Controller 를 사용해서 View와 Model을 중계한다. 그렇기 때문에 Model과 View 양 측에 의존성이 생긴다.

    btnPlus.setOnClickListener {
        model.plusOne()
        updateView(tvNumber)
    }

     

    Model

    data class SimpleMvcModel(var number:Int) {
    
        fun plusOne(){
            number++
        }
    
        fun minusOne(){
            number--
        }
    }

     

    데이터의 관리나 업데이트 비지니스 로직 처리등은 모두 Model에서 해준다. 

    UI 업데이트는 Controller가 데이터를 가져와서 화면에 반영하는 것은 UI에서 해주기 때문에 Model은 UI나 Controller를 직접 접근할 필요성이 없어서 의존성이 없고 이로 인해서 Model부분은 테스트나 재활용에 편하다.

Designed by Tistory.