Sam Story

안드로이드 MVC 패턴 본문

Android

안드로이드 MVC 패턴

Sam H 2024. 4. 27. 16:42

 

오늘은 안드로이드 디자인 패턴중에 하나인 MVC 패턴에 대해 포스팅 해보려 한다.

 

 

디자인 패턴에 관한 내용은 하단 링크에 정리해놓은 포스팅이 있으니

기본적인 내용은 생략하도록 하겠다

 

디자인 패턴 (Design Pattern)

디자인 패턴이란 무엇인가 ? 쉽게 말하면 소프트웨어의 개발 방식을 문서로 공식화 한 것. 개발 중 자주 나타나는 문제들을 해결하기 위한 방법 중 하나로 개발 과정에서의 불편한 점을 보완하

samtistory.tistory.com

 

1. MVC 디자인 패턴이란?

MVC 패턴은  Model + View + Controller 세가지 구성요소의 앞글자를 따온 패턴이다.

 

이 세가지 구성요소에 대해서 간단하게 설명해보자면

 

 

1. Model

 

- 데이터 , 비즈니스 로직을 주로 관리한다.

 

- Controller 에게 명령을 전달 받고 데이터의 상태를 변경시킨다.

 

- 데이터의 상태가 변경되면 뷰에게 알린다.

 

 

2. View

 

- View , Layout 등 화면을 처리하는 곳

 

- 업데이트 될 데이터를 Model로부터 전달 받는다.

 

 

3. Controller

 

- 사용자에게 입력을 받고 명령을 전달하는 곳

 

- 일반적으로 입력을 받으며 Model에게 데이터 업데이트 명령을 전달

 

- 상황에 따라 모델을 거치지 않고 곧바로 View에게 전달하기도 한다.

 

 

 

간단하게 위 요소들이 어떤흐름으로 동작하는지 그림으로 보자면

MVC 패턴의 흐름

 

위 그림과 같은 흐름으로 동작하는데 안드로이드의 경우

View 와 Controller가 Activity , Fragment 에 합쳐져 있다.

 

 

이걸 그림으로 다시 나타내보면

안드로이드에서 MVC 패턴의 흐름

 

위 그림의 흐름처럼 작동하는걸 알 수 있다.

 

 

2. MVC 패턴의 특징

- Controller는 여러개의 View를 선택할 수 있는 1:n 구조다.

 

●Controller 와 View가 Activity , Fragment 형태로 합쳐져있기 때문에

 

- Controller는 Model에 직접적인 영향을 끼칠 수 있다.

 

● 데이터를 요청하고 직접 참조하고 있기때문에 영향을 끼친다.

 

 

 

3. 예제

오늘 준비한 예제는 버튼을 누르면 텍스트뷰에 값을 띄워주는 간단한 예제다.

 

 

Model

package com.example.designpattern_mvc_example

import kotlin.random.Random

class Model {

    var name = ""

    // 0 ~ 5 까지의 랜덤한 숫자에 지정된 이름을 뽑는 로직
    fun randomName(): String {

        when(Random.nextInt(6)){

            0 -> name = "Human"
            1 -> name = "Harry"
            2 -> name = "Stella"
            3 -> name = "Hyun"
            4 -> name = "Lion"
            5 -> name = "Jin"

        }

        return name

    }

}

 

모델에서는 간단한 메서드와 그 메서드로 반환해주는 값이 있다.

 

 

 

메인 액티비티

package com.example.designpattern_mvc_example

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    lateinit var textView: TextView
    lateinit var button: Button
    lateinit var model: Model

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

        // 모델 객체 초기화
        model = Model()

        textView = findViewById(R.id.textView)
        button = findViewById(R.id.button)

        // 버튼 입력을 받았을 때
        button.setOnClickListener {

            // 텍스트 뷰에 model의 randomName() 메서드값을 할당해준다.
            textView.text = model.randomName()

        }

    }

}

 

메인 액티비티는 Controller 와 View 두가지 역할을 한다.

 

 

 

메인 액티비티 레이아웃

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:gravity="center"
        android:textSize="30sp"
        android:textColor="@color/black"
        android:textStyle="bold"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="오늘의 당첨자는?" />

    <Button
        android:id="@+id/button"
        android:layout_margin="40dp"
        android:textSize="20sp"
        android:text="추첨"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

간단하게 텍스트뷰와 버튼이 있는 레이아웃이다.

 

 

 

실행 결과

실행 결과

 

버튼을 눌렀을 때

버튼 눌렀을 때

 

버튼을 눌렀을 때 Model 의 비즈니스 로직이 정상작동 하여 TextView에 데이터가 들어오는걸 볼 수있다.

 

 

4. MVC 패턴의 장점과 단점

 

장점

 

- 코드를 이해하기 쉽다.

 

- 구조가 단순하기 때문에 빠르게 짧은 개발기간 안에 완성 가능하다.

 

 

단점

 

- 프로젝트 규모가 커질수록 코드가 복잡해 진다.

 

- 모든 컴포넌트들 간의 의존성이 강하다.

 

- 다른 패턴들에 비해 Controller에 많은 코드가 모여 Activity가 무거워진다.

 

 

 

 

이렇게 오늘은 MVC 패턴에 대해 알아보았다.

 

보통 프로그래밍을 시작한지 얼마 안되었을때 무의식중에

 

MVC 패턴을 사용한 사람들도 많았을 것이다.

 

그만큼 구조도 단순하고 쉽기때문에 디자인 패턴에 대한 이해도가 낮은사람이

 

처음 디자인 패턴을 사용할때 쉽게 사용할 수 있고 접근하기도 쉽다고 생각한다.

 

하지만 항상 디자인 패턴을 사용할 때에는

 

프로젝트 규모나 상황에 맞게 적절하게 사용하는게 좋다고 생각한다.

 

 

 

 

오늘 예제 깃허브 주소

 

GitHub - nam-su/MVCPatternExample

Contribute to nam-su/MVCPatternExample development by creating an account on GitHub.

github.com

 

'Android' 카테고리의 다른 글

안드로이드 MVVM 패턴  (0) 2024.04.30
안드로이드 MVP 패턴  (0) 2024.04.29
안드로이드 ConstraintLayout  (2) 2024.04.25
제트팩 컴포즈 (Jetpack Compose)  (1) 2024.04.21
룸 (Room)  (0) 2024.04.16