Sam Story

안드로이드 MVP 패턴 본문

Android

안드로이드 MVP 패턴

Sam H 2024. 4. 29. 18:09

오늘은 지난번 포스팅에 이어 안드로이드 디자인 패턴중에 하나인

MVP 패턴에 대해 포스팅 해보려 한다.

 

그 전에 포스팅한 MVC 패턴에 대해 궁금하다면 글 최하단의 포스팅을 참고하도록 하자.

 

 

1. MVP 디자인 패턴이란?

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

 

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

 

 

1. Model

 

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

 

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

 

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

 

 

2. View

 

- View , Layout 등 화면을 처리하는 곳
(안드로이드의 경우 Activity , Fragment 에 해당)

 

- 사용자 입력을 받고 Presenter에게 알린다.

 

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

 

 

3. Presenter

 

- View와 Model 사이에서 데이터를 전달하는 역할을 한다.

 

 

간단하게 위 요소들이 어떤 흐름으로 동작하는지 그림을 통해 알아보자.

MVP 패턴의 흐름

 

위그림의 흐름처럼 작동하는걸 한눈에 볼 수 있다.

 

 

 

2. MVP 패턴의 특징

- Presenter와 View는 1:1 관계다.

 

● Presenter와 View는 각각의 다른 형태로 존재하기 때문에

 

- View와 Model은 서로의 존재를 알 필요가 전혀 없다.

 

● View는 Presenter를 통해 응답을 받기 때문에 Model의 존재를 알 필요가 없다.

 

 

 

3. 예제

오늘 준비한 예제는 지난번 MVC 패턴에서 사용한 예제와 같은 예제 이지만

MVP 패턴으로 코드를 작성했다.

 

 

Model

package com.example.designpattern_mvp_example

import kotlin.random.Random

class Model {

    var name = ""

    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

    }

}

 

Model 클래스의 경우 지난번 MVC 패턴과 동일한걸 알 수 있다.

 

 

Presenter

package com.example.designpattern_mvp_example

class Presenter {

    // model 객체를 초기화
    private val model = Model()

    fun result(): String {

        // result 메서드를 통해 model.randomName()의 반환값을 반환 해준다.
        return model.randomName()

    }

}

 

Presenter 클래스에서 model을 초기화 해주고 model의 메서드를 호출해서 받은 반환값을 다시 반환해준다.

 

 

메인 액티비티

package com.example.designpattern_mvp_example

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

class MainActivity : AppCompatActivity() {

    lateinit var presenter: Presenter

    lateinit var textView: TextView
    lateinit var button: Button

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

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

        // 프레젠터 객체 초기화
        presenter = Presenter()

        button.setOnClickListener {
         
            // presenter의 result 메서드 호출 후 반환값을 textView의 text로 초기화 해준다.
            textView.text = presenter.result()

        }

    }

}

 

메인 액티비티 에서는 presenter만 초기화 하고 presenter의 메서드를 호출한다.

 

 

 

실행 결과

좌 - 버튼 누르기 전  우 - 버튼 누른 후

 

위와 같은 실행결과를 볼 수 있다.

 

 

4. MVP 패턴의 장점과 단점

 

장점

 

- View와 Model의 의존성이 없다. ( Presentor가 중개자 역할 )

 

- 따라서 MVC의 일부 단점 해결

 

 

단점

 

- 프로젝트 규모가 커질수록 Presenter가 무거워진다.

 

- View와 Presenter의 1:1 관계로 인해 의존성 증가

 

 

 

 

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

 

MVC 패턴의 문제인 Model과 Controller,View 의 의존성을 없애고

 

Presenter가 중개자 역할을 함으로써 MVC 패턴의 단점을 보완한 디자인 패턴이

 

MVP 패턴이라고 생각한다.

 

MVC 패턴이 익숙해졌다면 간단한 프로젝트는 MVP 패턴으로 구성해보는것도 좋다고 생각한다.

 

 

 

MVC 패턴 포스팅

 

안드로이드 MVC 패턴

오늘은 안드로이드 디자인 패턴중에 하나인 MVC 패턴에 대해 포스팅 해보려 한다.  디자인 패턴에 관한 내용은 하단 링크에 정리해놓은 포스팅이 있으니기본적인 내용은 생략하도록 하겠다 디

samtistory.tistory.com

 

 

 

오늘 예제 깃허브 주소

 

GitHub - nam-su/MVPPatternExample

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

github.com

 

'Android' 카테고리의 다른 글

핸들러 (Handler)  (0) 2024.05.13
안드로이드 MVVM 패턴  (0) 2024.04.30
안드로이드 MVC 패턴  (0) 2024.04.27
안드로이드 ConstraintLayout  (2) 2024.04.25
제트팩 컴포즈 (Jetpack Compose)  (1) 2024.04.21