본문 바로가기
안드로이드/디자인 패턴

안드로이드 디자인 패턴: MVC 패턴 완벽 정리

by 시작이반의반 2024. 5. 24.

안드로이드 MVC 패턴
디자인 패턴 MVC

안녕하세요!

이번 글에서는 안드로이드 개발에서 많이 사용되는 디자인 패턴 중 하나로

MVC(Model-View-Controller) 패턴에 대해 알아보려고 합니다.

MVC 패턴의 개념과 이해, 장단점, MVC를 사용할 때 주의해야 하는 내용까지 정리하려고 합니다.

MVC 패턴을 잘 이해하고 활용한다면 코드의 가독성과 유지보수성을 크게 향상할 수 있습니다.

 

 

 

 

 

MVC 패턴이란?

MVC 패턴은 Model-View-Controller의 약자로 애플리케이션을 세 가지 주요 구성 요소로 분리하는 디자인 패턴입니다.

각 구성 요소는 특정한 역할을 담당하고 서로 독립적으로 동작할 수 있도록 설계되어 있습니다.

MVC 패턴 구성 요소
MVC 패턴 구성요소

1. 뷰 : View

사용자 인터페이스를 담당합니다.

데이터를 사용자에게 보여주는 역할을 하며 사용자가 이벤트를 발생시킬 수 있습니다.

 

2. 모델 : Model

데이터를 관리하고 관련 비즈니스 로직을 처리합니다.

 

3. 컨트롤러 : Controller

뷰와 모델을 연결하는 중간 관리자 역할을 합니다.

사용자의 이벤트를 받아서 처리하고, 그 결과를 모델에 반영해 줍니다.

 

 

 

 

 

MVC 패턴 이해 (+예제)

 

간단한 예제를 통해 MVC 코드를 살펴보면 조금 더 이해에 도움이 됩니다.

activity_main.xml, User, MainActivity 각자의 역할과 어떻게 상호작용을 하고 있는지 살펴보도록 하겠습니다.

MVC 예제
MVC 예제

1. 뷰 : activity_main.xml

메인화면으로 activity_main.xml에 버튼, 텍스트 등 여러 UI를 구성해서 사용자에게 보여주는 사용자 인터페이스입니다.

xml 내용에서 중요한 부분은 없으니 xml 코드는 생략하겠습니다!

 

2. 모델 : User

data class로 작성된 User(Model)는 데이터를 관리하고 관련 비즈니스 로직을 처리합니다.

data class User(val name: String, var level: Int) {
    // 데이터 관리 : User(name, level)
    // 데이터 관련 비즈니스 로직 처리 : levelUp, resetLevel
    fun levelUp() {
        level += 1
    }

    fun resetLevel() {
        level = 0
    }
}

 

3. 컨트롤러 : MainActivity

User(모델)를 설정해 주기도 하고 UI(뷰) 업데이트도 해주면서 모델과 뷰의 중간 관리자 역할을 합니다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val user = User("joo", 0)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        // User Event
        binding.btnLevelUp.setOnClickListener {
            user.levelUp() // 모델 설정
            updateLevel(user) // 뷰 업데이트
        }

        // User Event
        binding.btnReset.setOnClickListener {
            user.resetLevel() // 모델 설정
            updateLevel(user) // 뷰 업데이트
        }
    }

    private fun updateLevel(user: User) {
        binding.tvLevel.text = "${user.level}"
    }
}

 

 

 

 

 

MVC 패턴 장단점

 

MVC 패턴 장점

  • 각각 독립적으로 역할을 담당하여 코드의 분리가 명확하다.
  • 처리방식이 직관적이다.
  • 데이터 모델에 대한 재사용이 가능하다.

 

MVC 패턴 단점

  • 뷰와 모델 간의 강한 결합으로 의존성이 높다.
  • 화면 요소, UI 업데이트가 많을수록 유지보수가 힘들어질 수 있다.
  • Activity 또는 Fragment가 많을수록 데이터 관리가 힘들어질 수 있다.

 

 

강한 결합이 뭔가요?

 

아래와 같이 뷰와 모델이 서로 직접적으로 상호 작용을 하는 경우를 말합니다.

private fun updateLevel(user: User) {
    // 뷰와 모델이 서로 직접적으로 상호 작용 : 뷰와 모델 간의 강한 결합에 대한 근거
    binding.tvLevel.text = "${user.level}"
}

 

뷰와 모델 간에 강한 결합으로 의존성이 높아 어느 한쪽이 바뀌면 같이 바꿔줘야 합니다. (동기화)

이렇게 강한 결합으로 의존성이 높기 때문에 동기화하는 작업에 유의해야 합니다.

앞서 제시했던 예시에도 이러한 경우를 확인할 수 있습니다.

binding.btnLevelUp.setOnClickListener {
    // 동기화
    user.levelUp() // Model Set
    updateLevel(user) // View Update
}

 

MVC 패턴을 사용하면 가독성 및 유지 보수성이 좋다고 했는데..
갑자기 왜 유지보수가 힘들어질 수 있는 건가요?

 

MVC 패턴은 역할에 맞게 분리하기 때문에 가독성 및 유지보수성이 좋은 건 맞습니다.

그런데 MVC 패턴에서 컨트롤러가 이벤트 처리, 상호작용을 모두 관리하고 있습니다.

화면 요소(버튼, 텍스트 등등), 화면 업데이트가 많아질수록 컨트롤러 코드가 비대해질 것입니다.

Model-View-Controller를 분리했지만 프로젝트가 커지면 커질수록 컨트롤러 한쪽만 비대해지는 경향이 있기 때문에 유지보수가 힘들어질 수 있습니다.

 

 

데이터 관리가 힘들어지는 이유가 뭔가요?

 

두 개의 Activity, Fragment를 MVC 패턴으로 작성했다고 가정해 봅시다.

Activity와 Fragment는 밀접한 관련이 있어 서로 데이터도 주고받고 데이터를 바꿀 수도 있습니다.

여기까지는 좋습니다.

 

다음으로 여러 개의 Activity 또는 Fragment를 MVC 패턴으로 작성했다고 가정해 봅시다.

서로 관계가 밀접하면 밀접할수록 데이터 공유는 많아지고 데이터 관리는 복잡해질 것입니다.

MVC 복잡성
MVC 복잡성

 

 

 

 

 

결론

 

이번 글에서는 안드로이드 개발에서 많이 사용되는 MVC 패턴에 대해 알아보았습니다. MVC 패턴은 코드의 가독성과 유지보수성을 높이는 데 도움을 주지만, 프로젝트가 커질수록 Controller의 비대화, 강한 결합, 데이터 관리의 어려움과 같은 단점도 존재합니다. MVC 패턴을 효과적으로 활용하려면 프로젝트의 규모와 복잡성을 고려하는 것이 중요합니다.

주로 단점에 대한 내용을 많이 다뤘지만 MVC 패턴의 처리방식은 직관적이기 때문에 오래된 방법이지만 여전히 사용되는 디자인 패턴 중에 하나입니다. MVC 패턴을 잘 이해하고 단점을 최소화한다면 유용한 방법이 될 수 있습니다.

 

관련 글

안드로이드 디자인 패턴: MVP 완벽 정리

 

안드로이드 디자인 패턴 : MVP 완벽 정리

안녕하세요!이번 글에서는 MVP(Model-View-Presenter) 패턴에 대해 자세히 알아보겠습니다.MVC 패턴과 마찬가지로 MVP 패턴도 애플리케이션의 구조를 명확히 하고, 유지 보수성을 높이기 위해 사용됩니

joo-selfdev.tistory.com

 

참고자료

Architecture Patterns in Android App Development : MVC, MVP, MVVM

 

Architecture Patterns in Android App Development: MVC, MVP, MVVM

Navigate the world of Android app development with our in-depth guide on architecture patterns – MVC, MVP, MVVM and make informed choices for your projects.

magicminds.io

댓글