본문 바로가기

Android/Architecture

[Android] Clean Architecture 실전 압축 정리 - Data Flow

728x90

필자가 클린 아키텍처에 대한 개념을 공부하고, 예제를 만들면서 가장 헷갈렸던 부분이 데이터의 흐름이 어떻게 되는지에 대해서 이다.

 

다중 모듈(3개 밖에 되지 않지만) 구조를 처음 만들어 보았기 때문일 수도 있겠지만,

어디에서는 인터페이스, 어디에서는 구현부, 어디에서는 실 사용 하는지 명확하게 이해하지 못했기 때문이다.

 

그에 따라서, 해당 내용을 복기 할 겸 정리해보고자 한다.


클린 아키텍처에서 데이터의 흐름이라고 하면 Data 모듈에서 Local 혹은 Remote 에서 구해 온 데이터를 어디로 전달하여 어떻게 실제로 사용하는지 에 대한것이 메인이 아닐까 생각한다.

 

그렇다면, 모듈로 보았을 때 데이터의 흐름은 어떻게 되는 것인가?

필자는 이런식으로 생각하고 이해하였다.

 

간단하게 생각해 보았을 때,

사용자가 원하는 서비스 이용을 위하여 어떠한 입력을 하게 되면 그것에 따른 데이터를 가져오게 된다.

사용자가 입력을 하는 부분은 UI. 즉, Presentation 이 되는 것이고

데이터를 가져오는 것은 Data 가 된다.

 

그러면, 여기서 Domain 은 어디에 사용되는가 생각해보자.

Domain 계층에는 Entity, Repository, UseCase 가 들어가는데, 여기서 UseCase 가 무엇인가?

 

사용자에게 제공하고자 하는 서비스 를 의미한다.

즉, 사용자가 원하는 서비스 이용을 위하여 수행하는 어떠한 입력 이 Domain 에 속하게 된다.

사용자가 화면에서 어떠한 입력을 하게 되는데 (UI : Presentation)
다양한 서비스 중에서 사용자가 원하는 서비스에 따라서 (UseCase : Domain)
내부에서 데이터를 검색 (Local,Remote : Data)

 

하여 가져온다.

 

즉, Presentation > Domain > Data 순서로 Data 의 요청이 들어오게 되고, 그 반대의 순서로 Data 가 전달되게 된다.

 

Data Request : Presentation Module > Domain Module > Data Module
Data Flow : Data Module > Domain Module > Presentation Module

위에 설명한 내용을 토대로 예제를 확인해 보자.

전체 예제 코드는 gitHub에 올려두었다.

https://github.com/HeeGyeong/CleanArchitectureSample

 

GitHub - HeeGyeong/CleanArchitectureSample

Contribute to HeeGyeong/CleanArchitectureSample development by creating an account on GitHub.

github.com

 

본 예제에서 사용자는

영화 이름을 검색하여 그 결과를 가져오는

서비스를 제공한다.

 

 

이처럼 EditText 에서 검색어를 입력 받고 검색 버튼을 통해 RequestMovie 라는 함수를 호출한다.

여기서 호출된 함수 소스코드 상단에 데이터 바인딩 부분을 확인해보면 ViewModel 인 것을 알 수 있다.

즉, Data 요청은 처음 UI 에서 VM 으로 넘어오게 된다.

 

 

호출한 함수 부분이다.

해당 코드를 보면 getMovieUseCase 에 입력된 값을 넣어서 호출하고, 그 결과 값인 movie 를 통해 값을 저장하고 있음을 볼 수 있다.

즉, VM 에서 UseCase (Domain) 으로 데이터의 요청이 넘어가게 되는 것이다.

 

 

UseCase 에서는 repository 를 사용하여 원하는 데이터를 요청하게 되는데, 해당 Repo 는 Domain 모듈에 선언되어 있지만 실제 구현 부분은 Data 모듈의 Impl 클래스에 되어있다.

즉, Usecase 에서 repository interface 를 통하여 Data 모듈의 Interface 구현부 (Data) 로 넘어가게 된다.

 

 

RepositoryImpl 클래스에서 override 된 함수를 확인해 보자.

값을 return 하기는 하는데, DataSourece 에서 데이터를 가져오는 것을 확인 할 수 있다.

물론, 그 결과 값에 따라 또 별도의 처리하는 로직이 들어가 있지만 최초의 Data Flow 에 집중하도록 하자.

 

DataSoure 는 interface 이기 때문에 interface 를 통하여 구현부인 DataSourceImpl 로 이동된다.

여기서는 간단하게 Dao 를 통해 DB 에서 원하는 값을 가져오게 되는데, Local 이 아닌 Remote 였다면 API 를 통해 원하는 값을 가져오게 되는 것 이다.

 

원하는 데이터를 가져왔으면, 이곳까지 왔던 방향의 역순으로 데이터를 전달하여 사용자에게 서비스를 제공하게 되는 것이다.


순서대로 정리해 보자.

1. 사용자가 서비스를 위해 입력 (UI, Presentation)
2. 입력에 따라 필요한 서비스를 VM 에서 호출 (VM, Presentation > Domain)
3. 필요한 서비스를 가지고있는 UseCase 에서 필요한 데이터 호출 (UseCase, Domain)
4. 필요한 데이터를 가져오기 위해 interface 에서 구현부를 호출 (Repository, Domain > Data)
5. 구현부에서 필요한 데이터에따라 적당한 DataSource 를 호출 (Repo Impl, Data)
6. DataSource Interface 를 통해 구현부를 호출 (DataSource, Data)
7. 구현부에서 원하는 데이터를 찾아서 가져옴 (DataSource Impl, Data)
8. API 혹은 Local DB 에서 데이터를 던진다.

이처럼 Data Request 가 1 ~ 7 번 순서로 요청되고, 8번에서 획득한 데이터를 가지고 이의 역순으로 Data 가 전달되게 된다는 것이다.

728x90