YAPP동아리 내의 스터디에서 클린 아키텍처 라는 주제에 대해 개인적으로 공부하는 시간을 가졌다.
나는 클린 아키텍처에 대해 따로 공부해본 적도 없었고, 책도 가지고 있는게 아니여서 구글에 있는 다양한 기술 블로그에 적힌 글들을 읽고 개념을 정리해 보았다.(스터디를 진행한 후 내용을 추가로 업데이트할 예정!)
💡 코드를 잘 분리하고, Testable한 구조를가지고 , 변경이 용이한 코드 등의 목적을 만족하기 위해 만들어진 아키텍처들 중 장점들을 모아 정의 한 것
클린 아키텍처와 관련된 그림들 중 가장 유명하다. Uncle Bob님이 2012년에 만들었다고 한다.
이 그림을 보면 클린 아키텍처의 목적에 대해 알 수 있다. 바로 의존성 규칙을 통한 계층을 분리하는 것!
바깥쪽의 원은 메커니즘(Mechanism)이고 안쪽의 원은 정책(Policy)이다.
소스코드 의존성은 외부에서 내부로 향하는 고수준의 정책을 따라야 한다.
원 안쪽으로 갈 수록 의존성이 낮아지게 된다. ( 안쪽의 원은 바깥쪽 원에 대해 전혀 알지 못한다.)
1. Entities
엔티티는 메서드를 갖는 객체, 데이터 구조, 함수의 집합
들을 말한다.
가장 일반적이면서 고수준의 비지니스 규칙을 캡슐화하며, 바깥쪽에서 어떤것이 변경되더라도 여기선 변하지 않는다!
애플리케이션의 동작에 관한 변경이 엔티티 계층에 주어지면 안된다.
2. UseCase
유스케이스는 엔티티로부터의 데이터 흐름을 조합하는 역할
을 한다.
애플리케이션의 고유 규칙을 캡슐화하며, 엔티티에는 영향을 주지않고 DB, FrameWork 및 UI 에 대한 변경으로 부터 떨어지게 된다.
3. Interface Adapters( Presenters )
호환성 문제를 해결할 수 있도록 도와주는 어댑터들의 집합
이다.
유스케이스와 엔티티가 사용하기 쉬운 형식으로부터 DB 또는 웹 등 외부의 기능에 사용하기 쉬운 형식으로 변환해주는 역할을 한다.
MVC 패턴의 요소들이 모두 인터페이스 어댑터에 속한다.
4. Frameworks & Drivers
가장 바깥쪽에 위치해 있고, 데이터베이스나 웹 프레임워크
로 구성되어있다.
안쪽의 원과 통신할 연결 코드 이외에는 별다른 코드를 작성하지 않는다.
이론적인 개념으로 살펴보았을 때
클린 아키텍처는 변화가 일어났을 때 유연하게 잘 대응하기 위해 계층 간 의존성을 낮춘다! 라는 이야기를 강조&반복하고 있다.
이렇게 의존성을 낮추어 처음에 언급했던 TestTable
하다라는 특징도 가지게 된다.
클린 아키텍처의 이론적인 개념을 Android에 적용시킨다면!
위의 특징들을 모아 Android의 의존성을 고려했을 때 총 3가지의 계층이 나온다.
앱에서 일어날 동작인 비지니스 로직을 포함하며, Entity와 UseCase
를 포함한다.
순수한 Java or Kotlin 모듈이다.
-> 🧐 Why? 사용자가 하는 행동들인 유스케이스를 적용하는 것들을 해야하는데 안드로이드에 굳이 의존하지 않고 언어로만 표현이 가능 하기 때문이다. 정보가 담긴 리스트를 호출하는 함수일 경우 리턴 타입을List<>
로만 정의하면 된다!!
어느 계층과도 의존성을 맺지 않는 독립적인 계층
사용자(Use)와 관련된 행동을 정의하는 Repository Interface
를 domain Layer에서 만든다.
유스케이스를 정의할 때 데이터베이스와 연관된 고민을 하지않고 Repository
를 주입시킨다.
Domain 모듈을 포함한다.
-> Domain 모듈을 알고 있기 때문에 정의된 Repository
를 실제로 구현할 수 있다.
Repository에서 사용하는 DTO를 선언하는 곳
API 통신 또는 DB와 관련된 DataSource
를 다루게 되고 이로인해 안드로이드에 대해 의존성이 생긴다.
Mapper
를 두어 DB에서의 데이터모델과 UI에 맞는 데이터 모델을 매핑해준다.
사용자가 접근할 수 있는 UI를 비롯하여 , ViewModel과 같은 클래스가 포함된다.
UI와의 상호작용이 주요 기능이기 때문에 MVP, MVVM과 같은 디자인 패턴을 사용할 수 있다.
Domain Layer
의 UseCase
를 직접 주입하여 비즈니스 모델을 만든다.
-> 도메인 계층에 대한 의존성을 가지고 있다는 의미이며, 의존성 주입은 DI 툴인 Hilt
Dagger2
를 사용하여 주입하는 형태로 만들어진다.
클린 아키텍처의 원형만 살펴보았을 때보다 안드로이드에서의 클린 아키텍처에 대해 공부하니 이해가 조금 더 잘됐던 것 같다. 프로젝트를 진행했었을 때, 패키지를 어떻게 나누어야 하는지에 대해 고민을 많이 했었다. MVVM 아키텍처를 적용시키자 했었는데 다음 프로젝트에서는 클린 아키텍처를 적용시켜보는 것도 좋을 것같다.
코드와 함께 클린 아키텍처를 보면 더 확실하게 이해할 수 있을 거 같다!!!!!!!