ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Clean Architecture 기반의 Multi Module 도입하기
    AOS 2023. 11. 15. 11:43
    반응형

    네이버 부스트 캠프에서 안드로이드 프로젝트 설계를 하면서 Clean Architecture 기반의 Multi Module 도입하기 로 결정했다. 이전에도 관련 글을 작성한적이 있는데 미흡한 것 같아서 다시 작성해보려고 한다.

    이 전에 프로젝트를 할 때, Domain layer 가 없는 안드로이드 앱 아키텍처 가이드를 기반으로 개발하였다. 거의 모든 비즈니스 로직이 서버에 있었고, 빠른 속도로 개발하고 출시해야했기 때문에 domain layer를 포함하지 않았다.

    간단한 기능들만 있을 때는 위의 구조로도 커버가 가능했다.

    하지만 점점 서비스가 커지고 비즈니스 로직이 늘어날 수록 view model이 복잡해지고 코드를 파악하기 어려워졌고, 반복되는 비즈니스 로직들도 생겨났다. Domain layer 를 도입하여 관심사 분리가 필요했다.

    계층 분리에 대하여 학습 하던 중에 클린 아키텍처를 알게 되었고, 여러 장점들이 많아서 채택하기로 하였다. 장점들은 아래에 정리해 놓았다.

    🧹 클린 아키텍처

    🕵🏻‍♀️ 왜 클린아키텍처가 필요한가?

    Android 서비스만 필요한 경우는 드물다.

    • 아이폰이나 웹 전용 으로도 만들어야 하는데 이때 내부 동작이 거의 동일하다. 순수 kotlin 으로 공통 로직을 모듈로 분리해서 설계해두면 여러 플랫폼에서 활용할 수 있다.
    • 비즈니스 로직을 아이폰, 웹 개발자들이 각자 구현하더라도, 다른 플랫폼 개발자가 domain 모듈만 보고 이 서비스의 비즈니스 로직을 전부 빠르게 파악하여 개발할 수 있다.

     

    변경 범위를 최소화

    • 새로운 기능이나 기존 기능을 변경할 때 변경 범위를 최소화 시킬 수 있다.
    • 비즈니스 로직이 변경되더라도 다른 레이어에 영향을 끼치지 않아서 변경에 유연하다.

     

    계층 분리

    • 책임과 구조가 명확히 나눠져서 협업할 때 편리하다.
    • 테스트에 용이해진다.

    🧐 어떻게 클린아키텍처를 적용할까?

    클린아키텍처에서 중요한 것은 “관심사 분리” 이다.

    모바일 앱에서는 크게 3가지 계층을 나눠 적용한다.

    • Presentation Layer
    • Domian Layer
    • Data Layer

    catchy-tape 전체 구조

    위 사진은 우리 프로젝트의 계층 구조이다.

    각 계층에 대하여 자세히 알아보자.

     

    Presentation Layer

    • View : 데이터를 화면에 표시한다. 유저와 상호작용하는 곳이다.
    • Viewmodel : UI 관련 데이터를 저장하고, Domain Layer와 상호작용한다.

     

    Domain Layer: 앱의 비즈니스 로직으로 독립적인 레이어이고, 순수 java/kotlin 으로 구성되어 있다.

    • Usecase : 앱의 비즈니스 로직 포함한다.
    우리 프로젝트에서 usecase 를 나누는 기준을 이와 같이 정했다.

    - viewmode에 복잡한 로직이 필요할 때

    - 여러 viewmodel 에서 중복되는 로직이 있을 때

    • Domain Model : Domain Layer 에서 사용되는 데이터 구조, 객체이다.

     

    Data Layer: 데이터를 검색, 저장, 매핑하는 데이터 관련 레이어이다.

    • Repository Implementation : Repository Interface를 구현한다.
    • Mapper : Data Layer의 Model을 Domain Layer의 Model로 변환한다.
    • Data Model (dto) : Data Layer에서 사용되는 데이터 구조, 객체 이다.

     

    📦 모듈화

    🕵🏻‍♀️ 왜 모듈을 나눌까??

    1. 여러 모듈들을 조립하여 다른 앱 개발에 활용할 수 있어서 확장성 UP
    2. 수정된 모듈만 빌드 되기 때문에 빌드시간이 줄어들고 개발 생산성 UP
    3. 모듈화를 통해 클린아키텍쳐의 계층을 분리하고, 모듈들 간에 알아야 하는 대상과 몰라야 하는 대상의 제약을 둘 수 있다.

    🧐 어떻게 모듈을 나눌까?

    catchy-tape 모듈

    app 모듈

    app 의 진입점이다.

     

    feature 모듈 ( = presentation layer)

    독립적인 기능을 분리하였다. (home, playlist, search, my, player 등등)

     

    core 모듈

    다른 모듈에서 자주 사용 하는 공통 모듈이다.

    • ui ( = presentation layer) : 다양한 기능에서 공통적으로 사용하는 UI를 포함하여 UI의 일관성을 유지하는데 도움을 준다.
    • domain ( = domain layer) : 앱의 비즈니스 로직을 캡슐화 한다. domain 모듈은 안드로이드의 의존성이 없는 순수 Java/Kotlin 코드로만 구성한다.
    • data ( = data layer) : data를 CRUD 한다.

     

     

     

    현재는 이렇게 설계했지만,

    추후에 개발하면서 계속 아키텍처가 수정될 것 같다.

    그 때, 또 블로그를 수정하러 와야겠다.

    저희 프로젝트 링크입니다 😉

    https://github.com/boostcampwm2023/and04-catchy-tape

     

    GitHub - boostcampwm2023/and04-catchy-tape: 너의 목소리가 들려 ~ 📼

    너의 목소리가 들려 ~ 📼. Contribute to boostcampwm2023/and04-catchy-tape development by creating an account on GitHub.

    github.com

     

    반응형
Designed by Tistory.