[Android] MVVM 과 Clean Architecture

kk_jang93·2023년 7월 29일
post-thumbnail

Android


본 페이지는 Android Clen Architecture 정의 설명 및 공통 구조를 모듈화 하기 위하여 작성하였습니다.

🤔 클린 아키텍처

💡 **Clean Architecture 란 ?**

코드를 잘 분리하고 , Testable 한 구조를 가지고 , 변경이 용이한 코드 등의 목적을 만족하기 위해
만들어진 아키텍처들 중 장점들을 모아 정의 한 것 !

추가 정의

  • Clean Architecture 는 프레임 워크에 독립적이다.
    • Clean Architecture 는 일부 기능이 포함된 라이브러리에 의존하지 않는다.
    • 이를통해 시스템의 도구로써 프레임워크를 활용할 수 있게 한다.
  • Clean Architecture 는 테스트를 용이하게 해준다.
    • Entity를 테스트 하는데 외부 요소를 필요로 하지 않는다.
  • Clean Architecture 는 UI에 독립적이다.
    • 다른 시스템 변경 없이 UI를 쉽게 변경할 수 있다.
  • Clean Architecture 는 DB 와 독립적이다.
    • 예를 들면, Oracle에서 SQL Server , Mongo , CouchDB 등등 쉽게 변경 가능하다.

🤨 의존성 규칙 ?

  • 바깥쪽의 원은 메커니즘(Mechanism)이고 안쪽의 원은 정책(Policy)이다.
  • 소스코드 의존성은 외부에서 내부로 향하는 고수준의 정책을 따라야 한다.
  • 원 안쪽으로 갈 수록 의존성이 낮아지게 된다. ( 안쪽의 원은 바깥쪽 원에 대해 전혀 알지 못한다.)

클린아키텍쳐.png

🙏🏻  Clean Architecture 의 기본 구조는 위 이미지 형태로 작성한다

Presentation Layer

  • 사용자가 접근할 수 있는 UI를 비롯하여 , ViewModel과 같은 클래스가 포함된다.
  • UI와의 상호작용이 주요 기능이기 때문에 MVP, MVVM과 같은 디자인 패턴을 사용할 수 있다.
  • Domain Layer의 UseCase를 직접 주입하여 비즈니스 모델을 만든다.> 도메인 계층에 대한 의존성을 가지고 있다는 의미이며, 의존성 주입은 DI 툴인 Hilt Dagger2 를 사용하여 주입하는 형태로 만들어진다.

Data Layer

  • Domain 모듈을 포함한다.> Domain 모듈을 알고 있기 때문에 정의된 Repository를 실제로 구현할 수 있다.
  • Repository에서 사용하는 DTO를 선언하는 곳
  • API 통신 또는 DB와 관련된 DataSource를 다루게 되고 이로인해 안드로이드에 대해 의존성이 생긴다.
  • Mapper를 두어 DB에서의 데이터모델과 UI에 맞는 데이터 모델을 매핑해준다.

Domain Layer

  • 앱에서 일어날 동작인 비지니스 로직을 포함하며, Entity와 UseCase를 포함한다.

  • 순수한 Java or Kotlin 모듈이다.> 🧐 Why? 사용자가 하는 행동들인 유스케이스를 적용하는 것들을 해야하는데 안드로이드에 굳이 의존하지 않고 언어로만 표현이 가능 하기 때문이다. 정보가 담긴 리스트를 호출하는 함수일 경우 리턴 타입을List<> 로만 정의하면 된다!!

  • 어느 계층과도 의존성을 맺지 않는 독립적인 계층

  • 사용자(Use)와 관련된 행동을 정의하는 Repository Interface를 domain Layer에서 만든다.

  • 유스케이스를 정의할 때 데이터베이스와 연관된 고민을 하지않고 Repository를 주입시킨다.

  • Domain Layer 계층

    🤫 Domain Layer 계층에 대한 설명 ! ! !

1. Entities

  • 엔티티는 메서드를 갖는 객체, 데이터 구조, 함수의 집합들을 말한다.가장 일반적이면서 고수준의 비지니스 규칙을 캡슐화하며, 
  • 바깥쪽에서 어떤것이 변경되더라도 여기선 변하지 않는다!
  • 애플리케이션의 동작에 관한 변경이 엔티티 계층에 주어지면 안된다.

2. UseCase

  • 유스케이스는 엔티티로부터의 데이터 흐름을 조합하는 역할을 한다.애플리케이션의 고유 규칙을 캡슐화하며, 엔티티에는 영향을 주지않고 DB, FrameWork 및 UI 에 대한 변경으로 부터 떨어지게 된다.

3. Interface Adapters( Presenters )

  • 호환성 문제를 해결할 수 있도록 도와주는 어댑터들의 집합이다.유스케이스와 엔티티가 사용하기 쉬운 형식으로부터 DB 또는 웹 등 외부의 기능에 사용하기 쉬운 형식으로 변환해주는 역할을 한다.MVC 패턴의 요소들이 모두 인터페이스 어댑터에 속한다.

4. Frameworks & Drivers

  • 가장 바깥쪽에 위치해 있고, 데이터베이스나 웹 프레임워크로 구성되어있다.안쪽의 원과 통신할 연결 코드 이외에는 별다른 코드를 작성하지 않는다.

🧐 Android에 어떻게 적용시키는데?!

  • UI를 독립적이게 만든다.
  • DataBase를 분리시킨다.
  • 외부적인 설정에 독립적인 구조로 프레임워크에 의존적이지 않게 코드를 만든다.
  • Test가 가능한 코드를 만든다.



패키지 구조

패키지 구조는 아래와 같이 크게 3개의 모듈로 나눠집니다.

  1. domain
  2. data
  3. presentation


패키지 의존성

각 레이어 마다 모듈을 분리하면 아래와 같이 각각의 build.gradle 이 생긴다. 여기에 필요한 레이어만
주입하게 되면 Clean Architecture와 한방향으로만 의존성을 가지게 된다.

  • Data Layer 는 Domain Layer 에 대한 의존성만 가진다
  • Domain Layer는 의존성을 가지지 않는다
  • Presentation Layer는 Data Layer와 Domain Layer 두개의 의존성을 가진다.

💭  참고 자료

profile
앱개발을 사랑하는 개발자

2개의 댓글

comment-user-thumbnail
2023년 7월 29일

유익한 글이었습니다.

1개의 답글