Entities :
엔티티는 가장 일반적인 비즈니스 규칙을 캡슐화하고 DTO(Data Transfer Object)도 포함하는 전사적 비즈니스 규칙입니다. 외부가 변경되면 이러한 규칙이 변경 될 가능성이 가장 적습니다.
Use cases :
유스케이스는 Intereactor라고도 하며 소프트웨어의 애플리케이션 별 비즈니스 규칙을 나타냅니다.이 계층은 데이터베이스, 공통 프레임 워크 및 UI에 대한 변경으로부터 격리됩니다.
Interface Adapters (Presenters) :
인터페이스 어댑터는 데이터를 Entity 및 UseCase의 편리한 형식(Format) 에서 데이터베이스 및 웹에 적용 할 수있는 형식으로 변환합니다. 이 계층에는 MVP의 Presenter, MVVM의 ViewModel 및 게이트웨이 (= Repositories)가 포함됩니다. 즉 순수한 비즈니스 로직만을 담당하는 역할을 하게 됩니다.
Frameworks & Drivers (Web, DB) :
프레임워크와 드라이버는 웹 프레임 워크, 데이터베이스, UI, HTTP 클라이언트 등으로 구성된 가장 바깥 쪽 계층입니다.
View | ViewModel | Model(Repository) |
---|---|---|
1. 사용자의 이벤트를 받아, ViewModel에 데이터를 요청 | ||
2. 해당 데이터를 불러오는 Model(Repository)의 메소드를 호출 | ||
3. ViewModel에서 요청하는 값을 반환 | ||
4. Model(Repository)로부터 받은 값을 LiveData에 저장 | ||
5. LiveData의 값을 Observing하여, 값이 바뀌면, View를 갱신 |
Clean Architecture와 MVVM Pattern을 연결하여 사용하면 유지보수성이 높은 안드로이드 앱을 개발할 수 있음.
MVC → View와 Controller가 모두 Activity와 Fragment와 같은 UI에서 처리되어야하기 때문에, 관심사의 분리가 비교적 원할하지 않다.
MVP → Presenter가 View와 1대1로 동작하기 때문에, View와 Presenter의 의존성이 강해지는 문제가 발생, Presenter의 로직이 비대해진다.
MVVM → View와 Model 사이에 ViewModel 을 두어 충분히 관심사를 분리할 수 있고, 화면회전 등의 동작으로 View가 다시 그려지더라도 ViewModel 을 통해 데이터를 유지할 수 있는 MVVM 방식을 채택하기로 결정.
일반적으로 Presentation, Data, Domain 총 3개의 Layer로 나눠지게 된다.
사용자 인터페이스를 관리, 사용자의 입력에 대한 반응으로 적절한 작업을 수행
View → Activity, Fragment
ViewModel
클라이언트에서 요청하는 해당 데이터를 불러오는 메소드를 호출.
어떠한 비즈니스 로직이 포함되어서는 안됨.
인터페이스의 메서드를 호출하기만 한다.
메서드의 구현체는 Data Layer에 있음.
Data Layer는 Data Source와 애플리케이션의 Use case와 Boundary 레이어 사이에서 데이터를 변환(ViewModel에서 필요로 하는 데이터로 변환)하고 반환하는 역할을 합니다.
Data Layer는 외부 Data Source와의 통신을 담당하며, Repository 인터페이스를 구현하여 Use case나 Boundary 레이어에서 데이터를 요청하면 해당 데이터를 반환합니다.
Repository
Impl (구현체)
Data Source
Impl (구현체)
Server API Interface
비즈니스 로직을 담당
Repository Interface
Data Source Interface
의존성 방향은 다음과 같다.
Presentation
→ Data
Presentation
→ Domain
Data
→ Domain
Module을 생성하여 Presentation, Data, Domain Layer로 구분
[Android Studio]에서 [File > New > New Project]를 통해 생성 시 app 은 application 모듈을 의미한다.
[File > New > New Module] 을 통해 생성할 수 있다.
소스 파일 및 빌드 설정으로 구성된 모음, 프로젝트를 별개의 기능 단위로 분할할 수 있음.
프로젝트에는 하나 이상의 모듈이 있으며, 모듈은 다른 모듈을 종속 항목으로 사용할 수 있다.