Clean Architecture는 계층을 크게 나눠서 관심사를 분리하고 각 분리된 클래스가 한 가지 역할만 할 수 있도록 구현하는 방식입니다.
또한, 계층 구조에서 외부에서 내부로 의존성을 가지고 있기 때문에 내부로 갈수록 의존성은 낮아지게 됩니다.(의존성 규칙) 즉, 어떤 동작을 할 때 자기보다 내부에 있는 계층이 변화하면 동작을 행하는 계층에도 영향이 있을 수 있지만(의존성이 있음), 자신의 외부에 있는 계층이 변화하는 것 때문에 동작을 행하는 계층에 영향이 있어서는 안 됩니다.(의존성이 없음)
그렇기 때문에 계층 내부로 들어갈수록 의존하는 성격이 낮아지게 됩니다.
예를들어, 위 이미지에서 가장 바깥의 DB와 가장 내부의 Entitiy를 봅시다. DB기준으로 Entity가 변화하게 되면 DB 자체에서 저장할 데이터 타입이 변경될 가능성이 있는 등 내부의 변화로 인해 동작을 하는 계층에 영향이 갈 수 있습니다. 하지만, Entity는 실제 사용할 데이터 클래스이므로 DB가 변경되더라도 Entity에는 아무런 영향이 없어야 합니다.
반대로, Entity는 가장 내부에 있으므로 다른 어떤 계층의 변화에도 영향을 받지 않으며, 오로지 자신의 변화만이 다른 계층에 영향을 끼칠 수 있습니다. 이것이 DB(바깥)가 의존성이 높고, Entity(내부)가 의존성이 낮다는 의미입니다.
이렇게 계층을 분리하고, 의존성을 내부로 향하게 하는 식으로 구현을 해서 다양한 이점을 갖도록 설계를 하는 것이 '클린 아키텍처' 입니다.
클린 아키텍쳐 창시자인 Robert C. Martin가 운영하는 The Clean Code Blog에 의하면, 클린 아키텍쳐가 시스템에 주는 이점은 아래와 같습니다.
안드로이드 클린 아키텍쳐에서 사용되는 3가지 계층은 Presentation, Domain, Data 계층입니다. 아래 그림은 위의 그림을 90도 회전한 모습입니다.
위 그림의 Presenter는 Presenter뿐 아니라 ViewModel도 포함하므로 Controllers로 칭하겠습니다.
Presentation Layer ---> Domain Layer
Domain 층에 의존성을 가지고 있으며 Data들을 control(CRUD)하는 계층입니다.
dataSource와 dataSourceImpl
Data Layer의 Data Source도, 위에서 봤던 의존성 역전 법칙의 적용으로, 추상화되어 interface와 Implementation으로 구성됩니다.
즉, Repository-->Data Source의 의존에 대한 회피입니다.
Android Architecture Components(이하 AAC)는 'Google I/O 2017'에서 처음 발표된 라이브러리 모음입니다.
구글에서 AAC를 제공한 이유는 Android를 구성하는 Component(Activity, Service, BroadcastReceiver, ContentProvider)가 서로 다른 생명주기(LifeCycle)을 가지고 있으며 이들의 생명주기를 잘 연결할 뿐만 아니라 컴포넌트들을 서로 잘 연결해서 더욱 손쉽게 앱을 개발해나가도록 가이드하기 위함입니다.
당시는 라이브러리 묶음으로 AAC를 칭했지만, Android Jetpack이 2018년 나오면서 AAC가 jetpack의 구성요소로 변경됐습니다.
공식문서에 AAC로 정의된 라이브러리들을 확인해보면 다음과 같습니다.
DataStore: SharedPreferences 대신 사용할 key-value 저장소
ViewBinding: XML 레이아웃 뷰결합 클래스
DataBinding: 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합
Lifecycles: 수명주기 인식 구성요소를 빌드할 수 있는 클래스, 인터페이스
Room: SQLite 개체 매칭 라이브러리. Room을 사용해 SQLite 테이블 데이터를 자바 객체로 쉽게 변환할 수 있음
LiveData: 수명주기를 인식하는 관찰가능한 데이터 홀더 클래스
Paging3: 데이터 페이지를 로드하고 표시
ViewModel: 수명주기를 고려한 UI 관련 데이터를 저장하고 관리하는 클래스
Navigation: 사용자가 앱 내의 여러 콘텐츠를 탐색하고 들어갔다 나올 수 있게 하는 상호작용을 의미
WorkManager: 백그라운드 작업을 할 수 있게 해주는 라이브러리
[참고]
https://undeadkwandoll.tistory.com/84?category=923703
https://velog.io/@bk87/AOSAndroid-App-Architecture