일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 안드로이드 앱 아키텍처 가이드라인 설명
- 안드로이드 mvvm예제
- 안드로이드 최적화
- android clean architecture
- Hilt
- 안드로이드 Mockito
- 안드로이드 JUnit
- 안드로이드 리싸이클러뷰
- 안드로이드 앱 아키텍처 가이드라인 예시
- 안드로이드 Espresso
- android memory leak
- sharedFlow
- 안드로이드 mvvm
- 안드로이드 hilt
- 코루틴
- 안드로이드 아키텍처 컴포넌트
- coroutine
- Android App Architecture Guideline
- 리싸이클러뷰 최적화
- Koin
- MVVM
- android DI
- 안드로이드 앱 아키텍처 가이드라인
- RxJava
- Android MVVM
- 안드로이드 앱 아키텍처 가이드라인 사용법
- 안드로이드 클린 아키텍처
- 안드로이드 의존성주입
- 스타트업 코딩테스트
- 안드로이드 테스트코드
- Today
- Total
안드로이드 연구소
[안드로이드 클린 아키텍처] 안드로이드 앱 아키텍처 가이드라인(Data레이어) 본문
Q1. Data 레이어에 대해 설명해줘
https://developer.android.com/topic/architecture/data-layer
Data 레이어에서는 비즈니스 로직이 포함되어 있습니다.
비즈니스 로직은 앱이 데이터를 생성, 저장 및 변경하는 방법을 결정하는 규칙으로 구성됩니다.
비즈니스 로직을 사용한다고 얘기하니 클린 아키텍처에서 Entity에 해당하는 녀석인가봅니다.
데이터 레이어는 비즈니스 로직(애플리케이션의 데이터와 데이터를 다루는 메소드들) 관리하는 역할을 하고 있네요.
Q1-1. Data 레이어는 어떻게 구성이 되어 있어?
Data레이어는 레파지토리와 데이터소스로 구성이 되어 있습니다.
Q1-2. 데이터소스와 레포지토리는 각 각 어떤 역할을 하니?
데이터 소스는 실제 데이터를 검색하거나 저장 및 수정하는 역할을 합니다.
로컬 데이터베이스, 네트워크 API, 파일 시스템에서 데이터를 검색하는 모든 소스가 될 수 있습니다.
- 디바이스에서 로컬 SQLite 데이터베이스를 사용하는 경우 데이터베이스 자체가 데이터 소스로 간주됩니다.
- 웹 API에서 데이터를 가져오는 경우 API 서버가 데이터 소스가 됩니다.
레포지토리는 데이터 소스와 엑세스할 수 있는 API를 제공합니다.
리포지토리는 일반적으로 원격 서버에서 데이터를 가져오거나
로컬 데이터베이스에 캐싱하는 것과 같은 데이터 작업 조정을 담당합니다.
간단히 말하면 데이터 소스는 로컬 데이터베이스나 API서버네요.
그리고 레포지토리는 로컬 데이터베이스나 API서버에 접근할 수 있는 역할을 합니다.
레포지토리와 데이터소스의 역할을 이렇게 분리하는 이유들은 아래와 같이 있습니다.
- 레파지토리 내에서 데이터소스 교체에 용이하다(로컬 데이터베이스에서 원격 API로 변경).
- API서버에서 불러온 데이터를 레파지토리에 저장하여 캐쉬 저장하여 네트워크 호출을 줄일 수 있다.
- 관심사 분리하여 테스트를 용이하게하고 코드를 깔끔하게 관리할 수 있다.
Q1-3. 데이터소스와 레파지토리를 생성 후에 Data레이어에 어떻게 접근을 해야하지?
Data 레이어은 데이터 소스 직접 엑세스 하지 않고 항상 레포지토리 클래스를 통해서 접근해야합니다.
UI state 클래스(UI Layer) 또는 UseCase 클래스(Domain Layer)가 데이터 소스를 직접 종속성으로 가져서는 안 됩니다.
레포지토리 클래스의 Constructure에서 데이터 소스와 Dependency Injection을 사용하는 것이 최고의 방법입니다.)
반드시 데이터 소스는 레파지토리에서만 사용하고 접근하는 것만 주의하면 될 것 같습니다.
레파지토리에서 데이터소스와 수동 의존성 주입하던 DI프레임워크를 사용하는 것을 추천하고 있네요.(사실상 필수)
Q3-4. 그렇다면 데이터소스는 어떻게 서버나 데이터베이스와 접근하고, 레파지토리에서는 어떻게 데이터소스를 접근하니?
데이터소스에서 Retrofit을 통해 서버에서 데이터를 가져올 경우나 Room을 통해 데이터베이스에서 데이터를 가져올 경우
모두 suspend 메서드를 사용하여 메인 쓰레드에서 작업을 해야합니다.
데이터소스에서도 서버나 데이터베이스의 데이터를 가져오는 함수를 생성할 때
메인 쓰레드에서 비동기로 작업을 해야한다는 것을 강조하고 있네요.
(* 메인쓰레드: 네트워크 통신이나 데이터베이스 작업을 할 경우 사용하는 쓰레드)
레파지토리에서 데이터 소스에 접근할 때는 비동기로 접근해야합니다.
단순 CRUD 할 경우는 코틀린 suspend 함수를 사용합니다. (자바-RxJava Single 또는 RxJava Maybe)
또 데이터 소스의 지속적인 변화를 감지할 때는 코틀린 Flow를 사용합니다. (자바-RxJava Observable)
레파지토리에서 비동기로 접근해야하는 것을 강조하고 있네요.
또 Observe해야할 때는 Flow나 RxJava를 사용해야하는 것을 강조해야합니다.
Q3-4. 예제 코드를 보여줘
class NewsRemoteDataSource(
private val newsApi: NewsApi, // (1)
private val ioDispatcher: CoroutineDispatcher // (2)
) {
// (3) suspend 함수로 호출하게 생성
suspend fun fetchLatestNews(): List<ArticleHeadline> =
// (4) 네트워크 통신이나 데이터베이스을 수행할 때 사용하는 쓰레드(Dispatchers.IO)를 호출
withContext(ioDispatcher) {
newsApi.fetchLatestNews() // (5) 네트워크 통신
}
}
class NewsRepository(
private val newsRemoteDataSource: NewsRemoteDataSource // (0) 데이터소스 의존성 주입
) {
// (1) 데이터 호출 메서드 생성시 비동기 suspend 함수로 구현
suspend fun fetchLatestNews(): List<ArticleHeadline> =
newsRemoteDataSource.fetchLatestNews() // (2) 데이터소스와 접근
}
데이터 소스에서 가장 큰 포인트는 레파지토리와 데이터소스의 역할인 것 같습니다.
데이터소스는 서버와 데이터베이스를 불러오게하고
레파지토리는 불러온 데이터를 다른 레이어에서 사용할 수 있게 제공하는 역할을 하는 것이 포인트겠네요!!
그렇다면 다음 포스트에서 이어가보겠습니다!
'안드로이드 연구소 > 클린아키텍처' 카테고리의 다른 글
[안드로이드 클린아키텍처] 안드로이드 아키텍처 가이드라인 만드는 법2 (데이터 레이어/Retrofit연결/Room연결) (0) | 2023.08.16 |
---|---|
[안드로이드 클린아키텍처] 안드로이드 아키텍처 가이드라인 만드는 법1(Hilt Retrofit 연결하는법/Hilt Room 연결하는법) (0) | 2023.08.14 |
[안드로이드 클린 아키텍처] 안드로이드 앱 아키텍처 가이드라인(Domain레이어) (0) | 2023.06.16 |
[안드로이드 클린 아키텍처] 안드로이드 앱 아키텍처 가이드라인(UI레이어) (0) | 2023.06.16 |
[안드로이드 클린 아키텍처] 안드로이드 앱 아키텍처 가이드라인 (0) | 2023.06.16 |