안드로이드 앱 아키텍처
- 안드로이드 운영체제는 새로운 앱이 실행됐을 때 공간을 확보하기 위해 언제든지 현재 실행중인 앱을 종료시킬 수 있으며 각각의 구성요소들은 개별적으로 실행이 가능하기 때문에 데이터나 상태를 앱 구성요소에 저장해서는 안되며, 앱 구성요소들이 서로 종속되면 안된다.
그렇다면 어떻게 설계를 해야 위와 같은 문제를 해결할 수 있을까?
- 몇 가지 원칙을 적용해 앱 아키텍처를 설계해야 한다. 그 원칙을 하나씩 살펴보자.
1. 관심사를 분리해야 한다.
관심사를 분리한다는 것은 클래스에 대한 의존성을 최소화한다는 것이다.
- 의존성을 최소화하지 않는다면 어떻게 될까?
Activity
와Fragment
에 모든 코드를 작성하는 경우가 있을 수 있는데 이렇게 되면 테스트를 하기 어려운 뿐더러 많은 코드들이Activity
와Fragment
에 의존하기 때문에 코드의 재사용 관점에서도 올바르지 않다.
- 어떻게 분리를 해야하는가?
- 위 경우에서는 UI 기반 클래스는 UI 및 운영체제와 상호작용을 처리하는 코드만 작성해야 한다. 이렇게 클래스를 최대한 가볍게 유지할수록 구성요소의 Lifecycle과 관련된 많은 문제들을 피할 수 있게 됨으로서 테스트도 쉽게 할 수 있다.
2. 데이터 모델에서 UI를 도출해야 한다.
데이터 모델은 일반적으로 앱의 데이터를 나타낸다. 데이터 모델은 UI 및 기타 구성요소와 독립되어 있으므로 UI가 변경되더라도 데이터는 UI에 의존하지 않기 때문에 쉽게 변경이 가능하다.
이러한 데이터 모델은 대부분 데이터베이스와 같은
지속가능한 데이터 모델
을 의미한다.지속가능한 모델
의 장점은 아래와 같다.- 안드로이드 운영체제에서 메모리 확보를 위해 앱을 종료시키더라도 데이터는 남아있다.
- 네트워크에 연결되지 않았거나 속도가 느리더라도 로컬에 남아있는 데이터를 이용해 작동이 가능하다.
아마 Model Driven Development를 의미하는 것 같다.
이 부분은 확인이 필요하다.
그렇다면 어떠한 방식으로 앱 아키텍처를 구현해야 할까?
- 위에서 언급한 일반적인 아키텍처 원칙을 고려하면 각 앱에는 두 개 이상의 레이어가 있어야 한다.
- 화면에 데이터를 표시하는
UI 레이어
- 앱의 비즈니스 로직을 포함하고 데이터를 노출하는
데이터 레이어
UI와 데이터 레이어 간의 상호작용을 최소화하고 재사용하기 위한
도메인 레이어
(옵션)
- 화면에 데이터를 표시하는
3가지의 레이어를 하나씩 살펴보자.
- 각 레이어에 대한 대략적인 내용으로, 자세한 내용은 추후 작성할 예정이다.
1. UI 레이어
프레젠테이션 레이어
라고도 부르며 화면에 데이터를 표시하는 역할을 담당한다.- 사용자와의 상호작용 (버튼 클릭)이나 외부 입력(네트워크)로 인해 데이터가 변할 때마다 변경사항을 반영할 수 있도록 UI가 업데이트 되어야 한다.
이 UI 레이어는 2가지로 구성된다.
- 화면에 데이터를 렌더링하는 UI 요소 (뷰 또는 Jetpack Compose 이용)
데이터를 보유하고 이를 UI에 노출하여 로직을 처리하는 상태 홀더 (ViewModel 클래스)
2. 데이터 레이어
- 데이터 레이어에는
비즈니스 로직
이 포함되어 있다. 비즈니스 로직이란 앱의 데이터를 생성, 저장, 변경하는 로직을 의미한다. - 앱에서 처리하는 다양한 유형의 데이터마다 저장소 클래스를 구현해야 한다.
- 영화 관련 데이터는
MoviesRepository
클래스, 결제는PlaymentsRepository
와 같은 방식으로 데이터마다 저장소 클래스를 구현한다.
- 영화 관련 데이터는
- 이 클래스들은 하나의 데이터 소스만 이용해야 한다.
파일이면 파일, DB면 DB, …
3. 도메인 레이어
- 도메인 레이어는 UI 레이어와 데이터 레이어 사이에 있는 레이어로서 옵션이다.
- 복잡한 비즈니스 로직, 또는 여러 ViewModel에서 재사용되는 간단한 비즈니스 로직의 캡슐화를 담당한다.
따라서 복잡성을 처리하거나 재사용을 해야할 때 사용한다.
이런 구성요소들 간의 종속은 어떻게 처리해야 할까?
- 개발을 하다보면 다른 클래스를 종속할 수 밖에 없는데, 이럴때 사용하거나 구현하기 쉽게 해주는 디자인 패턴이 존재한다.
Dependency Injection(DI)
- DI를 사용하면 클래스가 자신의 종속 객체를 구성할 필요가 없다.
- 런타임 시 다른 클래스가 종속 객체를 제공하는 방식으로 구현된다.
- 생성자 또는 프로퍼티를 이용
Service Locator
- 클래스가 자신의 종속 객체를 구성하는 대신 종속 객체를 가져올 수 있는 레지스트리를 제공한다.
- 하나의 클래스에서 종속 객체들을 선언해준 후 끌어다 쓰는 형식을 의미한다.
- 위 패턴을 적용하면 코드의 중복과 복잡성을 줄일 수 있으며, 종속 객체를 관리하기 편하므로 코드를 확장할 수 있다.
- 안드로이드에서 DI를 적용시켜주는 라이브러리들이 있다.
- Koin, Dagger, Hilt, …
[최종 업데이트]
2022-02-27 17:54:00 +0900
https://developer.android.com/jetpack/guide
Comments powered by Disqus.