👩💻 오늘의 할 일
클린 아키텍처에서의 의존성 방향은 바깥에서 안쪽으로 흐릅니다. 그리고 동심원의 가장 안쪽, Entitiy는 외부와의 의존성이 없어야 하기 때문에 경계를 횡단하기 위해선 반드시 의존성 역전 원칙을 적용해야 합니다. 모바일 클린 아키텍처에선 Data Layer에서 Domain Layer로의 의존성을 제거하기 위해서 의존성 역전 원칙을 사용합니다. 오늘은 봐도 봐도 어려운 의존성 역전 원칙이 클린 아키텍처에서 어떻게 의존 관계를 역전시키는지 알아보겠습니다.
🤔의문점
이전에 제가 공부했던 Repository Pattern에선 하나의 데이터에 대해서 하나의 DataSource 인터페이스와 Remote DataBase 와 Local DataBase, 두 개의 구현체로 나누고 Repository 또한 인터페이스와 구현체로 구현했습니다.
그런데 클린 아키텍처로 구현된 프로젝트들을 보면 Repository만 인터페이스와 구현체로 나눠져 있습니다. 이에 대해 고민해 본 결과 도메인에 있는 유즈 케이스에서 Repository를 직접 주입하면 Domain ----> Data 의존성이 생기기 때문에 같은 도메인에 있는 인터페이스를 주입해서 의존성 역전원칙으로 경계를 횡단하기 위한게 아닐까란 생각을 하게 되었습니다.
그림을 그려보자
기본적인 클린 아키텍처의 의존 관계는 Presentation과 Data 모두 Domain을 의존하며 Domain은 두 Layer중 어느 곳에도 의존성을 가지지 않습니다. 그렇다면 Repository Interface가 없다면 어떤 일이 일어날까요? 🤔
만약 Repository Interface가 없다면 UseCase에 Repository를 주입할 수 있는 방법은 직접 Data Layer에 있는 Repository 구현체를 주입하는 방법밖에 없습니다. 하지만 이렇게 될 경우, Domain에서 Data Layer로의 의존성이 생겨 클린 아키텍처를 위반하게 됩니다.
이를 해결하기 위해 Data Layer에 존재하는 Repository는 Domain Layer의 Repository Interface를 구현하고, UseCase에선 이 Repository 인터페이스를 주입하면 위 그림처럼 Domain에서 Data로 향하는 의존성을 인터페이스를 통해 역전 시킬 수 있습니다. 이런 원리로 Clean Architecture에서 의존성 역전 원칙을 활용할 수 있습니다.
그래서 DataSoure는 왜 혼자?
Clean Architecture와 Repository Pattern 차이는 DataSource Interface 존재 유무에서 찾을 수 있습니다. Repository Pattern에선 DataSource가 Interface와 구현체로 분리되어 있습니다. Repository Pattern의 핵심 기능은 두 가지입니다.
- 인터페이스를 통한 추상화로 데이터 소스 캡슐화해 데이터를 가져오는 소스를 Repository가 알지 못하게 감춥니다.
- 이를 활용해 데이터베이스 트랜잭션, Api 요청 같은 DataSource 로직과 ViewModel이나 UseCase가 해야하는 비즈니스 로직을 분리합니다.
아키텍처 관점에서 인터페이스를 나누는 이유는 의존성 역전 원칙을 활용해서 숨은 의존성을 끊어주기 위함입니다. 모바일 클린 아키텍처에서는 일반적으로 Repository는 Data Layer의 가장 바깥쪽에 위치해 Data Layer의 인터페이스 역할을 하고 있습니다.
위에서 알아본 것 처럼 Repository는 Domain Layer에서 Data Layer로의 의존성을 역전시키기 위해 반드시 인터페이스가 필요했습니다. 즉, Repository 만큼은 필수로 인터페이스가 필요하다고 볼 수 있습니다. 하지만 DataSource는 이미 Data Layer안에 존재하기 때문에, Presentation - Domain - Data 를 나누기 위한 관점에서 Repository처럼 인터페이스를 사용할 필요가 없습니다. 물론, 아키텍처란 정답이 없는 문제기 때문에 본인의 취향에 따라 추상화 레벨을 더 높이기 위해 사용할 수 도 있습니다.
'Android Architecture' 카테고리의 다른 글
MVVM에서 MVI로 (5) | 2024.11.07 |
---|---|
Android MVI를 알아보자 (1) | 2024.10.12 |
클린아키텍처를 지향하는 아키텍처 (0) | 2024.05.15 |
객체지향의 꽃 다형성과 의존성 주입 (0) | 2024.05.06 |
FireBase 의존성 주입 생각해보기 (0) | 2024.05.01 |