Android, Architecture Pattern
기본적으로, 프로젝트 구조 설계 시에는 어떠한 Architecture Pattern을 적용할 것인지 검토하게 된다.
먼저, Architecture Pattern이란 무엇인지, 그리고 우리가 사용하는 Android의 Architecture Pattern에는 어떠한 것이 있는지, 현재는 무엇을 가장 많이 사용하는지, 그리고 왜 그런지에 대해 간략히 알아보자.
1. Architecture Pattern이란?
- Software의 구조를 구성하기 위한 기본적인 윤곽을 일컫는다.
- 각각의 Sub-System에 역할이 정의되어 있고, 관계 및 규칙 등이 포함된다.
2. Architecture Pattern을 왜 사용해야 하는가
- 개발시에 발생하는 다양한 에러의 원인과 내용들을 쉽게 파악
- 시행착오가 줄어들어 개발시간이 단축
- 공통 Architecture를 사용하여 협업 시 서로의 코드 분석 용이
- Coupling 감소로 유지보수 및 확장성 증대
3. Android Architecture Pattern 흐름
- 굉장히 많은 Architecture Pattern이 존재하지만, Android 개발에 사용되어온 패턴의 흐름만 간략하게 소개하도록 한다.
- 아래 각 패턴에 대하여 설명을 하겠지만, 필자의 주니어 시절부터 지금까지 사용하는 패턴은 다음과 같다
MVC -> MVP -> MVVM
각 패턴은 각 모듈간의 의존성을 감소
시키기 위하여 점차 개선되어 왔다고 볼 수 있다.
이제 위에서 언급된 패턴의 순서를 기억해두고, 각 패턴의 흐름, 장/단점에 대하여 알아보자.
4. Architecture Pattern 종류
1) MVC
1.1) 정의
- Model - View - Controller 구조로 이루어진 Design Pattern
- Model class는 별도로 작성되어지지만, View와 Controller는 Activity 또는 Fragment 등 한개의 class에 모두 작성
1.2) 흐름
- UI코드와 Model 코드를 분리하고 이 둘을 처리하는 Controller 코드를 작성
- Controller(사용자 이벤트 입력) -> Model(데이터 갱신) -> View(UI 업데이트)
1.3) 장점
- 하나의 Activity / Fragment 안에서 모두 작성하여 사용하니 개발이 빠르고, 직관적
- 개발을 직접 하지 않은 사람도 코드만 보면 바로 파악이 가능
1.4) 단점
- 하나의 class에 모든 코드가 들어있다 보니, 코드 라인수가 길어짐
- 개발 시 관심사 분리를 적절히 하지 않으면 유지보수가 어려워짐
- View와 Model의 결합도가 높기 때문에 테스트 코드의 작성이 어려움
2) MVP
2.1) 정의
- MVC에서 발전되어 Model - View - Presenter 구조로 이루어진 Design Pattern
- MVC와 거의 동일하지만 View와 Model의 의존성을 제거하여 단위테스트 작성의 어려움을 해소
2.2) 흐름
- View는 Model을, Model은 View를 서로 참조할 수 없도록 개발하며, 모든 것은 Presenter를 통해서만 주고받을 수 있도록 작성되어 있다.
- View(사용자 이벤트 입력) -> Presenter(Model로 데이터 전달) -> Model(데이터 호출) -> Presenter(Model에서 데이터 수신) -> View(UI갱신)
2.3) 장점
- Model과 View를 분리하여 MVC 대비 코드가 깔끔하며 확장이 용이
- 관심사가 분리되어 유지보수가 용이
2.4) 단점
- 설계에 따라 View와 Presenter의 의존성이 강해지기 때문에 코드 양이 증가함에 따라 분리하기 어려워질 수 있음
3) MVVM
3.1) 정의
- Model - View - ViewModel 구조로 이루어진 Design Pattern
3.2) 흐름
- Model은 아무것도 참조하지 않고 ViewModel은 Model을, View와 ViewModel은 의존관계가 없음
- View(사용자 이벤트 입력) -> ViewModel -> Model -> ViewModel -> (Binding)xml
3.3) 장점
- 기존 MVP에서 View와 Presentor의 의존성이 높아지는 부분을 해소
- View와 Model이 서로 참조하지 않아 독립성을 유지할 수 있으며 테스트에 용이
- Databinding을 이용하여 전체적인 코드의 양 감소
- View를 참조하지 않기 때문에 동일한 ViewModel을 다른 View에서도 사용 가능(View:ViewModel = N:1)
3.4) 단점
- View의 상태 및 부수효과에 신경써서 개발해야 하며, 이를 놓치는 경우에는 버그로 이어질 수 있다.(ex. progress, toast, snackbar 등)
덧) MVI
요즘은 MVI라는 Model - View - Intent 개념이 자주 나오고 있다. 결론적으로, MVI는 Architecture Pattern이라기 보다는 MVVM의 상태 문제와 부수효과를 어떻게 처리하느냐에 대해 다루는 패러다임이라고 볼 수 있을 것 같다.
MVI 란?
덧-1) 정의
- 행위가 단방향으로 이루어지며, 그 방향이 Cycle을 이루고 있는 Cycle.js 프레임워크에서 따왔으며, 기존 Architecture Pattern과는 매우 다르게 작동
- MVVM의 문제라고 일컬어는 상태문제 및 부수효과 처리에 대한 해결책으로 제시
- Model - View - Intent 구조로 이루어진 Design Pattern
덧-2) 흐름
- View에서 Event가 입력되면 Intent로 전달하고 Intent에서는 입력된 Event를 기준으로 Model을 변경하며, Model에서는 데이터 및 View의 상태를 변경한다.
간략히 알아보았지만, 결국 MVI란 기존의 Architecture Pattern에 View의 상태처리와 Side Effect(Toast, Snackbar 등)를 함께 제어하여 문제가 발생하지 않도록 처리하는 패러다임인 것으로 볼 수 있겠다.
5. Finally
Architecture Pattern은 쉽지 않다.
사용하고자 하는 패턴의 구조와 원리 등 여러가지를 확실히 파악 하고 프로젝터 설계 시 어떻게 적용시킬 것인가를 여러모로 고민하여 개발에 임해야 할 것이다.
댓글남기기