Programming/Language Tip

안드로이드 - MVC 패턴 개념, 안드로이드에서 MVC 패턴의 미묘함

awesometic 2017. 3. 11. 17:16
반응형

 PHP CodeIgniter를 공부하면서.. MVC 패턴이란 걸 알게 됐습니다.

 원래 기존에도 프로그램을 만들 때 모듈화에 대한 고민을 했긴 했었는데, 예를 들어 DB에 접근하는 프로그램을 개발할 땐 DB 접근 부분을 완전히 독립시키려 노력한다던가.. 물론 완전히 모듈화시키진 못하고 코드가 중구난방이었습니다.

 그러다보니 최근에 MVC 패턴이 있다는 걸 알고 아 역시 이런 디자인 패턴도 있었군! 하면서 한창 공부 중입니다.

 안드로이드 개발에선 MVC의 파생격인 MVP 패턴을 이용한다는데, 그 개념을 간단하게 정리하고자 포스팅합니다.




 [MVC 패턴]

 MVC 패턴은 Model-View-Controller 패턴을 가리킵니다. 

 사용자 인터페이스 영역과 비즈니스 로직 영역을 서로 영향 없이 쉽게 고칠 수 있도록, 아주 독립적으로 만들기 위해 사용하는 소프트웨어 디자인 패턴이라네요.

 그러니까, 프론트 엔드와 백 엔드를 서로 다른 사람이 독립적으로 개발할 수 있게끔 하는 디자인 패턴입니다. 


 PHP CodeIgniter의 경우, 

 로 표현될 수 있는데요.

 엄청나 보이지만, 간단히 다음과 같은 순서를 따릅니다.

 1. 사용자가 Browser를 통해 특정 페이지 request
 2. 서버 내 Controller가 해당 페이지에 대해 Model과 View에서 필요한 정보를 로드
 3. 적절한 처리 후 해당 페이지를 생성, 사용자에게 response

 

 여기서 Model, View, Controller란,

 Model : 데이터 구조에 관한 영역. DB 등 데이터 저장소에 접근해 데이터를 검색, 삽입, 삭제, 수정하기 위한 코드 등 포함
 View : 사용자에게 보여질 화면에 관한 영역. 페이지 레이아웃, 프래그먼트 등 포함
 Controller : Model과 View 사이에 위치한 영역. 각 영역에서 데이터를 받은 후 처리하고, 사용자에게 제공

 로 볼 수 있습니다. 다시 저 그림을 보시면 감회가 새로우실 거라 믿어요

 따라서 MVC 패턴은 프론트 엔드(View)와 백 엔드(Model, Controller)를 독립시켜 각각의 전문 프로그래머들이 자기 영역에서만 작업해도 되도록 하는 디자인 패턴입니다. 

 또한 각 기능이 굉장히 독립적이니 코드의 일관성 유지와 유지보수에도 좋습니다.

 이렇듯 협업 능률 향상에 아주 좋으니 여러 기업에서 많이들 사용하는 것 같아요.


 [MVP 패턴 프롤로그(?)

 안드로이드에선 MVC 패턴이 미묘합니다.

 안드로이드의 화면은 액티비티와 프래그먼트로 표현될 수 있어요. 액티비티(프래그먼트)는 표현할 화면에 대한 레이아웃을 받아오고(Controller), 화면을 그리기 위한 데이터 처리(View, Controller)도 합니다. 벌써 액티비티 자체가 화면을 그리는 시점에서 MVC의 View와 Controller 역할을 해버립니다. 

 게다가 보통 버튼 클릭 이벤트를 처리할 때, 해당 이벤트에 대한 핸들러도 다 넣어버리고, 데이터도 해당 핸들러 안에서 가져와버리곤 하니 Model까지 포함해 사실상 모든 게 액티비티 안에서 이뤄질 수 있습니다. 데이터도 접근하고, 화면도 갱신하고.. 점점 굉장해져서 한 액티비티 클래스의 코드가 1000줄이 넘어가기 쉽상입니다. 그러면 당연히 유지보수 할 엄두도 안 나는 코드가 돼버립니다.

 그래서 액티비티가 Controller의 역할만을 수행하기 위해 MVVM(Model-View-ViewModel) 디자인 패턴을 도입합니다.

 액티비티가 ViewModel에 접근해 "ViewModel아, View와 Model에 접근해 내가 표현할 화면을 그려주고, 데이터도 받아와줘!" 라는 Controller의 역할만을 수행하기 위해 도입한 패턴이었지만, 정작 액티비티가 자신의 역할을 ViewModel에 전부 넘겨버리니 Controller로써도 하는 게 없어지게 됩니다. ViewModel에 넘길 매개변수도 자기 자신(Activity)일 정도로..

 결국 MVP 패턴을 도입하게 됐습니다.


 참고
 1. https://www.tutorialspoint.com/codeigniter/codeigniter_mvc_framework.htm
 2. http://tosslab.github.io/android/2015/03/01/01.Android-mvc-mvvm-mvp.html

반응형