Nuke Olaf - Log Store

[MVP] 안드로이드에 mvp 패턴 적용하기(1) - mvp 패턴이란? 본문

ComputerScience/[디자인 패턴]

[MVP] 안드로이드에 mvp 패턴 적용하기(1) - mvp 패턴이란?

NukeOlaf 2020. 3. 10. 04:11
<안드로이드에 mvp 패턴 적용하기 시리즈>
안드로이드에 mvp 패턴 적용하기(1) mvp 패턴이란?
안드로이드에 mvp 패턴 적용하기(2) Contract 작성
안드로이드에 mvp 패턴 적용하기(3) Model 정의
안드로이드에 mvp 패턴 적용하기(4) Presenter 만들기
안드로이드에 mvp 패턴 적용하기(5) Activity 에 View 구현

요즘 안드로이드 개발자 채용 공고를 보면 mvp, mvvm 이라는 말을 심심치 않게 볼 수 있다.

우리는 현재 진행하고 있는 Metaler 프로젝트의 Android 앱에 mvp 패턴을 적용하려고 한다.

그런데, mvp 패턴이란 무엇일까? mvp 패턴이란 이름의 뜻은 무엇이고, 왜 사용하는 것일까?

프로젝트에 mvp 패턴을 적용하기 전에 mvp 가 무엇인지 알아보려 한다.

 

1. 디자인패턴과 mvc 패턴

mvp 패턴에 대해 이해하기 위해서는 "디자인 패턴" 과 "mvc 패턴" 이 무엇인지 알아야 한다.

mvp 패턴은 mvc 패턴에서 파생된 패턴이며, mvc 패턴은 디자인 패턴의 종류 중 하나이기 때문이다.

MVC 패턴은 다양한 디자인 패턴의 종류 중 하나이며, MVP 패턴은 MVC 패턴으로부터 파생된 또다른 디자인 패턴이다.

 

1.1 디자인패턴이란?

디자인 패턴에 대한 나의 정의는 "코드를 효율적으로 작성하기 위한 방법론"이다.

디자인 패턴 (Design Pattern) 은 합성어이다.
"Design" 은 계획하다, 설계하다라는 의미를 갖고 있다.
"Pattern" 은 어떤 반복적인 양상을 띄는 것을 이르는 말이다.

두 단어를 합쳐보면, "무언가를 계획하는 데 쓰이는 양상" 이라는 의미로 해석해볼 수 있겠다.

그럼 개발업계에서 말하는 디자인패턴의 정의는 무엇일까?

소프트웨어 공학에서 말하는 디자인 패턴의 뜻을 찾아보면,
"설계 문제에 대한 해결책의 재사용 가능한 형태" 라고 나온다.
코드를 작성하면서 생길 수 있는 문제들을 해결할 수 있는 방법을 만들었는데, 이 해결 방법이 다른 프로젝트의 설계 문제를 해결하기 위해서 또 쓰일 수 있다는 뜻이다.

코드를 작성하면서 생길 수 있는 문제라는게 구체적으로 무엇일까?

다양한 문제들이 있을 수 있겠지만, 우리 프로젝트와 관련된 안드로이드 개발을 예로 들어 설명해 보겠다.

안드로이드 개발을 어느정도 경험해본 사람이라면 느껴본 적이 있을 것이다. 앱의 규모가 작을때는 상관이 없었지만, 앱의 규모가 점차 커지면 코드는 굉장히 복잡해진다. 코드가 거대하고 복잡해지면, 코드의 가독성이 떨어진다. 그러면 코드에 뭔가 추가하거나 수정하거나 삭제하는 과정이 번거롭고 어려워지는 것이다.

이러한 문제는 과거의 개발자들에게도 똑같이 존재했다. 그 당시 개발자들은 코드를 어떻게하면 효율적으로 작성할 수 있을지 고민했다. 그러다가 생각해낸 방법이 "기능에 따라 코드를 구분하자" 였다. 사용자에게 보여지는 UI 부분의 코드(View)와, UI에 담길 데이터를 처리하는 코드(Model)를 분리하고, 사용자의 입력에 따라 이 둘을 처리하는 코드(Controller)를 작성하자고 생각한 것이다. 이런 식의 문제 해결 방식을 MVC 디자인 패턴이라고 한다.

이 MVC 디자인 패턴은 원래 웹 개발 분야에서 사용하기 위해 만들어진 것이지만, 꼭 웹이 아니더라도 다양한 플랫폼의 프로젝트에서 사용될 수 있다. 웹 개발이던, 안드로이드 개발이던, ios 개발이던 간에 말이다. 'MVC 패턴'이라는 해결방법을 적용하기 위해 작성한 코드 내용은 프로젝트마다 다르겠지만, 그 코드들을 관통하는 해결방법의 핵심내용은 같기 때문이다. 그 핵심내용이란 바로 코드를 Model-View-Controller 기능으로 구분하여 설계하는 것. 이러한 특징 때문에 디자인 패턴을 "재사용 가능한 해결책"이라고 부르는 것이다.

MVC 디자인 패턴 이외에도, 코드를 효율적으로 설계하는 여러 디자인 패턴들(예를 들면 싱글톤, 어댑터와 같은)이 존재한다. 그 디자인 패턴들 또한, 코드를 비효율적으로 작성해서 생기는 문제점을 해결할 수 있는 코드 설계 방법론같은 것들이다. 디자인 패턴을 알고 적재적소에 활용할 수 있다면, 프로그램을 설계하는 과정에서 생길 수 있는 많은 문제들을 사전에 차단할 수 있을 것이다. 그러나, 디자인패턴은 코드를 효율적으로 작성하기 위한 방법론일 뿐이다. 디자인패턴을 위한 디자인패턴을 억지로 적용하느라 코드가 비효율적으로 작성되는 일이 없도록 주의해야 한다.

 

1.2 디자인 패턴을 왜 사용할까?

위에서 디자인 패턴은 코드를 효율적으로 설계/작성하기 위해 사용한다고 했다.

그런데, 이 효율적으로 설계한다는 것의 의미를 제대로 생각해 볼 필요가 있다.

디자인 패턴은 누군가가 "코드는 이렇게 작성하는 게 효율적이야!" 라고 처음부터 정해놓은 규칙은 아니다.디자인 패턴은 과거의 실수에 기반하여 만들어진 해결책과 같은 것이다.

과거 우리 이전의 수많은 개발자들이

"코드를 이렇게 짜면 비효율적이고 나중에는 코드가 개판이 돼서 이런 문제가 생기는구나!"
"그런데 이거랑 비슷한 패턴의 문제가 빈번하게 생겨!"

하고 발견한 수많은 문제점들이 있었을 것이다.

그 문제점들은 현재를 살아가는 우리들에게도 똑같이 빈번하게 생길 수 있는 것들이다. 그런데 이미 수많은 개발자들이 똑같은 문제를 직면하고 그 문제를 해결하는 방법을 마련해놓았다. 우리가 직면한 문제점들은 대부분의 경우 전혀 새로운 것이 아니며, 그걸 해결할 수 있는 검증된 방법이 마련되어 있는데 굳이 우리가 해결책을 또 강구해야할 필요는 없지 않은가?

"Do not reinvent the wheel!", 바퀴를 다시 발명하지 마라! 이미 잘 마련되어 있는 해결책들을 사용하여 위에서 말한 코드를 작성하면서 자주 발생하는 문제점들을 사전에 피할 수 있다. 그것이 바로 디자인 패턴을 사용하는 주된 이유이다.

또한, 디자인 패턴은 개발자와 의사소통의 수단으로서 사용될 수 있다. 위에서 간단히 예시를 들었던 MVC 패턴을 예로 들어보자. MVC 패턴이라고 정의된 이름이 없다면, 다른 개발자에게 우리 MVC 패턴으로 프로젝트를 설계하자는 말을 이렇게 어렵게 해야한다.

" 우리 이 프로젝트 코드를 짤 때, UI 부분의 코드(View)와, UI에 담길 데이터를 처리하는 코드(Model)를 분리하고, 사용자의 입력에 따라 이 둘을 처리하는 코드(Controller)를 작성하자"

위와 같이 말한다고 해도, 내가 생각하고 있는 개념을 제대로 전달했는지, 상대 개발자가 내 말을 제대로 이해했는지 확인하기가 어렵다. 그런데, MVC 패턴이라는 단어를 사용하면, 위의 긴 문장을 한 문장으로 함축하여 말할 수 있다.

" 우리 이 프로젝트 MVC 패턴으로 설계하자! "

이렇게, 디자인 패턴은 문제 해결방법을 단어 하나로 정의하므로서, 개발자들 사이의 의사소통을 원활하게 해준다.

 

1.3 MVC 패턴이란?

MVC 패턴이란, 애플리케이션의 시각적 요소와 그 뒤에서 돌아가는 비즈니스 로직(프로그램의 논리 구조)을 서로 영향없이 쉽게 고칠 수 있는 애플리케이션을 만드는 방식이다.

MVC 패턴의 MVC 는 "Model-View-Controller"의 축약어이다.

코드를 Model View Controller 세 가지 기능으로 나누어 작성하는 방법을 말한다.

  • Model : 애플리케이션이 포함해야할 데이터가 무엇인지 정의한다
  • View : 데이터가 어떻게 표시될지 정의하며, 모델로부터 데이터를 받아온다.
  • Controller : 사용자 입력에 따른 응답으로 모델이나 뷰를 업데이트하는 로직을 포함한다.

MVC 패턴은 정보가 사용자에게 보여지는 부분과, 정보가 내부적으로 표현되는 부분, 그리고 그 둘을 제어하는 컨트롤 부분을 분리하기 위해 사용한다. 이렇게 세 기능으로 분리하여 코드를 작성하면, 코드의 확장성과 유연성이 증가하고 코드를 유지보수하기가 용이해진다. 각 코드가 각각의 정해진 역할만 담당하기 때문이다.

 

2. 안드로이드에서 MVC 패턴과 MVP 패턴

2.1 안드로이드의 MVC 패턴

아래는 안드로이드에서 MVC 패턴을 사용하는 방법을 도식화한 그림이다.

그림을 보면, 안드로이드의 Activity/Fragment 에 View 와 Controller 기능이 혼재되어있음을 알 수 있다.

xml 레이아웃이 View 역할을 하고, Activity 에 작성된 함수가 Controller 을 역할을 하도록 분리했지만, 결국 xml 의 view 를 보여주는 방식은 Activity 에서 정의해야하기 때문이다.

이 내용을 코드로 작성하면 아래와 같다. Android 에서 MVC 는 class 하나로 모든 처리가 가능한 구조가 만들어진다. 

class MainActivity : AppCompactActivity() {

  @Override
  override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    // Control 역할을 하는 setOnClickLitener가 View 에서 발생하고 처리된다
    button.setOnClickListener {
    	// 데이터 갱신 요청
        // Model에 접근해서 최신 데이터를 요청
        // ex) ArrayList<String>을 반환하는 getItems() 함수 호출,
        // getItems() 로 전달받은 ArrayList로 View를 갱신
    }
  }
}

위와 같은 방법으로 코드를 작성하면, 코드가 짧을 때는 한 눈에 코드 파악이 가능할 수 있다. 그러나 코드 분리를 제대로 하지 않으면 스파게티코드가 되기 쉽고, 기능이 조금만 추가되어도 클래스 하나에 코드가 수백 수천줄이 될 수 있다. 그렇게 해서 코드의 복잡도가 증가하면 유지보수가 어려워진다는 단점이 있다.

또한, MVC 는 View 와 Model 의 결합도가 높다는 단점이 있다. 대부분의 코드가 View 에서 Model 을 직접 호출하여 사용하게 되기 때문이다. 그래서 테스트 코드를 작성하는 경우 UI 위주의 테스트코드를 작성해야 하는데, UI 는 개발중 변화가 자주 있는 곳이기 때문에 일이 매우 복잡해진다.

 

2.2 안드로이드의 MVP 패턴

View 와 Model 의 결합도가 높다는 MVC 패턴의 문제점을 보완하기 위해 만들어진 것이 바로 MVP 패턴이다.

MVP 패턴은 View 와 Model 이 Presenter 를 통해서만 동작할 수 있도록 하여, View 와 Model 의 의존성을 제거한 디자인 패턴이다. 그 이외에는 MVC 패턴과 동일하다.

아래의 그림과 같이 MVP 패턴의 View 는 데이터, 즉 "Model" 을 직접 호출할 수 없고, Model 은 View 에게 바로 데이터를 전달해 줄 수 없다. View 와 Model 은 Presenter 를 통해서만 데이터를 주고받을 수 있다는 것이 MVP 패턴의 가장 큰 특징이라고 볼 수 있다.

Model, View, Presenter 의 정의는 MVC 패턴과 크게 다르지는 않다.

  • Model : 애플리케이션 데이터와 상태에 대한 비즈니스 로직을 수행한다
  • View : 실제 View 에 대한 직접적인 접근을 담당한다
  • Presenter : 뷰와 모델 사이에서 데이터를 전달하는 역할을 한다

 

 

이렇게 지금까지 디자인패턴이란 무엇인지, mvc 패턴으로부터 파생된 mvp 패턴이란 무엇인지 간략하게 알아보았다.

다음 포스팅부터는 실제 안드로이드 화면을 구현할때 MVP 패턴을 적용하는 법에 대해 알아볼 것이다.

 

참고 사이트 >>>

https://thdev.tech/androiddev/2016/10/23/Android-MVC-Architecture/

Comments