-
[Android] 안드로이드 MVVM 패턴, 아키텍처안드로이드 2024. 3. 26. 20:31
📝 공부한 내용 정리
MVVM 패턴
1. MVVM (Model - View - ViewModel) 패턴
안드로이드 앱 개발에서 사용되는 아키텍처 패턴 중 하나이다. 이 패턴은 코드를 더욱 구조화하고 유지보수하기 쉽게 만들며, 특히 대규모 앱의 개발에서 유용하다.
1.1) MVVM 패턴의 세 가지 구성 요소
- 모델(Model)
모델은 데이터와 비즈니스 로직을 나타낸다. 이는 일반적으로 데이터베이스, 네트워크 요청, 파일 시스템 등과 같은 데이터 소스와 관련된 작업을 처리하는 클래스이다. 모델은 일반적으로 뷰나 뷰모델과 직접적인 의존성을 갖지 않는다.
- 뷰(View)
뷰는 사용자에게 데이터를 표시하고 사용자 입력을 받는 인터페이스 요소이다. XML 레이아웃 파일을 통해 뷰를 정의하고, 액티비티나 프래그먼트 클래스에서 해당 XML 파일을 로드하여 화면을 그린다.
- 뷰모델(ViewModel)
뷰모델은 뷰와 모델 간의 중개자 역할이다. 뷰모델은 뷰에 표시할 데이터를 제공하고, 뷰가 필요로 하는 데이터 변환을 처리한다. 뷰모델은 일반적으로 뷰의 생명주기를 인식하고, 데이터를 적절하게 유지하고 관리하기 위해 라이프사이클을 활용한다. ViewModel은 View의 라이프사이클이 종료(destory)될때 사라짐(cleared)진다. 안드로이드에서는 주로 AAC(Android Architecture Components) 라이브러리의 ViewModel 클래스를 사용하여 뷰모델을 구현한다.
2. 앱 아키텍처 (App Architecture)
앱 아키텍처는 안드로이드 앱 또는 모바일 앱 전반의 디자인과 구조를 정의하는 방법이나 체계이다. 이는 앱이 어떻게 구성되고 동작하는지에 대한 전체적인 프레임워크 또는 체계를 의미한다. 좋은 앱 아키텍처는 개발자에게 코드를 조직화하고 유지보수하며 확장하기 쉽게 만들어준다.
2.1) 앱 아키텍처 주요 기본 원칙
- 관심사 분리(Separation of Concerns):
Activity나 Fragment에 너무 모든 코드를 작성하는 것은 좋지 않다. 의존성을 최소화해야한다. UI 기반의 클래스는 UI와 OS 상호작용을 담당하는 로직만 포함해야한다. 이는 클래스를 가볍게 유지하고, 수명 주기 관련 문제를 피하고, 테스트 가능성을 향상시킨다.
- 데이터 모델에서 UI 도출하기(Drive UI from data models):
데이터 모델은 앱의 데이터를 나타내며, UI나 다른 구성 요소와는 독립적이다. 즉, 이들은 UI 및 앱 구성요소 수명 주기와는 관련이 없다. 데이터 모델 클래스를 기반으로 앱 아키텍처를 구축하면 앱의 테스트 가능성과 견고성이 더 높아진다.- 단일 소스 저장소(Single Source of Truth):
앱에서 새로운 데이터 유형을 정의할 때는 데이터 유형에 단일 소스 저장소(SSOT)를 할당해야한다. SSOT는 데이터의 소유자이며, SSOT만 데이터를 수정하거나 변경할 수 있다. SSOT는 이를 위해 불변 유형을 사용하여 데이터를 노출하며, 다른 유형이 호출할 수 있는 이벤트를 수신하거나 함수를 노출하여 데이터를 수정한다.
- 단방향 데이터 흐름(Unidirectional Data Flow):
UDF에서 state는 한 방향으로만 흐른다. 데이터를 수정하는 이벤트는 반대 방향으로 흐른다. 애플리케이션 데이터는 보통 데이터 소스에서 UI로 흐른다. 버튼 누르기와 같은 사용자 이벤트는 UI에서 SSOT로 흐르며, SSOT에서는 애플리케이션 데이터가 불변 유형으로 수정 및 노출된다. 이 패턴은 데이터 일관성을 강화하고, 오류가 발생할 확률을 줄여 주며, 디버그하기 쉽고, SSOT 패턴의 모든 이점을 제공한다.
2.2) UI 레이어(UI Layer)
UI의 역할은 화면에 애플리케이션 데이터를 표시하고 사용자와 상호작용(버튼 클릭, 네트워크 처리, 데이터의 변경 등)하는 것이다. UI는 Data Layer에서 가져온 애플리케이션 State를 시각적으로 나타낸다.
UI Layer는 사용자와의 상호작용을 담당하며, 앱의 사용자 인터페이스를 구성한다. 사용자에게 정보를 표시하고 입력을 받아들이는 부분으로, 주로 화면을 그리고 이벤트를 처리한다.
- UI 레이어의 주요 구성 요소
- 뷰(View): 사용자에게 정보를 표시하고 사용자 Action(텍스트 입력, 버튼 터치 등)을 받는 부분이다. 보통 Activity, Fragment가 View 역할을 담당한다. XML 레이아웃 파일을 사용하여 뷰를 정의하고, Activity, Fragment에서 해당 XML 파일을 로드하여 화면을 표시한다. Action에 따른 데이터 변화를 통해, 혹은 ViewModel의 데이터를 관찰해(Observe) UI를 갱신한다.
- 뷰모델(ViewModel): 앱의 비즈니스 로직을 캡슐화하고 데이터를 뷰에 제공한다. 사용자 입력을 받아 처리하고, 데이터를 Model(Data Layer)로부터 가져오거나 View에 표시할 데이터를 가공하여 View에 전달한다. UI에 사용될 State를 처리하고 UI Layer에 이벤트를 알리거나 State를 업데이트한다. UI Layer는 ViewModel에 이벤트를 전송한다. 안드로이드에서는 주로 AAC(Android Architecture Components)의 ViewModel 클래스를 사용하여 이 역할을 수행한다.
- UI 의 주요 구성 요소
- UI State(사용자 인터페이스 상태): 사용자가 앱에서 볼 수 있는 부분의 현재 상태를 나타낸다. 이는 UI 요소의 상태와 사용자 인터랙션에 따라 변할 수 있다. LiveData, StateFlow, SharedFlow로 UI State를 관리한다. 화면에 표시되는 텍스트, 버튼의 활성화 상태, 체크박스의 선택 여부 등이 UI State의 일부이다.
- UI Elements(요소): 사용자 인터페이스를 구성하는 개별적인 부분들을 말한다. 안드로이드 앱에서는 이러한 요소들이 XML 레이아웃 파일에서 정의된다. 앱의 레이아웃을 형성하며, 사용자와의 상호작용을 담당한다. UI State와 함께 사용되어 UI를 동적으로 업데이트하거나 사용자 인터랙션을 처리하는 데 사용된다. 일반적으로 텍스트 뷰, 이미지 뷰, 버튼, 체크박스, 레이아웃 등이 요소에 해당한다.
2.3) Data 레이어(Data Layer)
Data Layer는 앱의 데이터를 관리하고 처리하는 부분이다. 다양한 데이터 소스와 상호작용하여 데이터를 가져오고 저장한다. 주로 데이터베이스, 네트워크 요청, 파일 시스템 등과 같은 외부 데이터 소스와 통신한다.
- 데이터 레이어의 주요 구성 요소
- 모델(Model): Data Layer에서 사용되는 데이터 구조와 비즈니스 로직(사용자 인증, 결제 처리, 데이터 유효성 검사 등)을 처리한다. ViewModel에서 요청한 데이터를 처리, 반환한다. 데이터베이스와의 상호작용, 외부 API 호출, 파일 시스템 접근 등의 작업을 수행할 수 있다.
- 데이터 접근 계층(Data Access Layer): 데이터를 실제로 가져오고 저장하는 역할을 담당한다. 데이터베이스 접근 객체(ORM, Object-Relational Mapping), Local DB(SQLite, Room), 네트워크 통신(Retrofit), 파일 시스템 접근 객체 등이 포함된다.
공식 문서
'안드로이드' 카테고리의 다른 글
[Android] 회원가입시 LiveData 사용한 비밀번호 유효성 검사 (ViewModel/ Pattern, Matcher 정규식) (0) 2024.03.29 [Android] ViewModel의 생성과 Lifecycle 생명주기 (0) 2024.03.29 [Android] 타이틀바 제거하기 (0) 2024.03.22 [Android] Selector 사용해서 Button 상태에 따라 버튼 디자인 변경하기 (state_pressed) (0) 2024.03.22 [Android] Button에 background drawable 적용 안 되는 문제 해결 (0) 2024.03.22