기능 개발을 우선으로 생각하고 개발한 결과, 가장 어려웠던 부분은 기능의 확장과 유지보수였다.
최근에는 이를 고려하여 MVVM 아키텍쳐를 적용하여 개발하기 위해 노력하고 있다.
MVVM 이란?
Model-View-ViewModel의 약자로 UI와 로직을 분리하여 프로그래밍하는 기법이다.
MVVM을 사용하는 이유
- 각 영역마다 관심사를 분리하여 설계함으로써 코드의 복잡성이 감소하고, 유지보수성과 확장성이 증가한다.
- View는 단순히 UI만 구성하는 코드를 작성할 수 있게되어 UI 변경 시 ViewModel에 영향이 가지 않는다. 이처럼 View와 ViewModel이 분리되기 때문에 ViewModel의 테스트가 용이해진다.
View
- 사용자에게 보여지는 UI 부분, 사용자의 동작이나 각종 처리를 ViewModel에 의뢰한다.
- Flutter는 선언형 UI로 View의 구성요소들은 Widget이 된다. Flutter의 대표적인 Widget으로는 StatelessWidget, StatefulWidget이 있는데, StatefulWidget의 경우에는 자체적으로 상태를 관리하기 때문에 ViewModel을 통해 상태관리를 하는 경우에는 StatelessWidget을 사용하는게 좋다.
ViewModel
- View로부터 의뢰받은 처리를 Model에 의뢰한다.
- Model로부터의 처리 결과를 View로 전달한다.
-> View의 상태를 유지/관리하는 부분으로 Provider와 같은 상태관리 패키지를 통해 구현이 가능하다.
View와 ViewModel을 합쳐서 Presentation Layer라고 한다.
Model
- ViewModel로부터 의뢰받은 로직을 처리한다.
- DB, File, Web 등으로부터 데이터를 가져오거나 전송한다.
- Domain Layer와 Data Layer로 나뉨
Domain Layer
- Use Case: Repository를 통한 비즈니스 로직을 담당하는 부분, ViewModel이 복잡해지는 것을 방지한다.
- Repository: ViewModel의 의뢰를 추상화해놓은 부분, Repository와 ViewModel 간의 의존성을 분리하여 유지보수성과 테스트 용이성을 높인다.
- Entity: 실질적인 Data Model class
Data Layer
- Data Source: DB나 File 등에 접근하여 데이터를 가져오거나 전송하는 부분
- Repository(Implements): Data Source를 통해 Domain Layer의 Repository 추상 클래스를 구현하는 부분
각 레이어 별로 역할을 확실한 관심사의 분리로 데이터의 흐름을 일관되게 하면 확장성과 유지보수성이 높고 Testable한 앱을 개발할 수 있다.
'Flutter' 카테고리의 다른 글
get_it, injectable 패키지를 이용한 의존성의 주입 (1) | 2024.01.15 |
---|---|
flutter_gen 패키지를 이용하여 asset 사용하기 (0) | 2023.11.27 |
Flutter Mockito를 이용한 API 통신 Unit Test (0) | 2023.04.19 |
Flutter InheritedWidget (0) | 2023.04.18 |
뒤늦게 정리하는 Flutter riverpod 개념 (0) | 2023.04.06 |