Home 안드로이드 앱 아키텍처
Post
Cancel

안드로이드 앱 아키텍처

안드로이드 앱 아키텍처

  • 안드로이드 운영체제는 새로운 앱이 실행됐을 때 공간을 확보하기 위해 언제든지 현재 실행중인 앱을 종료시킬 수 있으며 각각의 구성요소들은 개별적으로 실행이 가능하기 때문에 데이터나 상태를 앱 구성요소에 저장해서는 안되며, 앱 구성요소들이 서로 종속되면 안된다.

그렇다면 어떻게 설계를 해야 위와 같은 문제를 해결할 수 있을까?

  • 몇 가지 원칙을 적용해 앱 아키텍처를 설계해야 한다. 그 원칙을 하나씩 살펴보자.

1. 관심사를 분리해야 한다.

  • 관심사를 분리한다는 것은 클래스에 대한 의존성을 최소화한다는 것이다.

  • 의존성을 최소화하지 않는다면 어떻게 될까?
    • ActivityFragment에 모든 코드를 작성하는 경우가 있을 수 있는데 이렇게 되면 테스트를 하기 어려운 뿐더러 많은 코드들이 ActivityFragment에 의존하기 때문에 코드의 재사용 관점에서도 올바르지 않다.
  • 어떻게 분리를 해야하는가?
    • 위 경우에서는 UI 기반 클래스는 UI 및 운영체제와 상호작용을 처리하는 코드만 작성해야 한다. 이렇게 클래스를 최대한 가볍게 유지할수록 구성요소의 Lifecycle과 관련된 많은 문제들을 피할 수 있게 됨으로서 테스트도 쉽게 할 수 있다.

2. 데이터 모델에서 UI를 도출해야 한다.

  • 데이터 모델은 일반적으로 앱의 데이터를 나타낸다. 데이터 모델은 UI 및 기타 구성요소와 독립되어 있으므로 UI가 변경되더라도 데이터는 UI에 의존하지 않기 때문에 쉽게 변경이 가능하다.

  • 이러한 데이터 모델은 대부분 데이터베이스와 같은 지속가능한 데이터 모델을 의미한다.

  • 지속가능한 모델의 장점은 아래와 같다.

    • 안드로이드 운영체제에서 메모리 확보를 위해 앱을 종료시키더라도 데이터는 남아있다.
    • 네트워크에 연결되지 않았거나 속도가 느리더라도 로컬에 남아있는 데이터를 이용해 작동이 가능하다.

    아마 Model Driven Development를 의미하는 것 같다.
    이 부분은 확인이 필요하다.


그렇다면 어떠한 방식으로 앱 아키텍처를 구현해야 할까?

  • 위에서 언급한 일반적인 아키텍처 원칙을 고려하면 각 앱에는 두 개 이상의 레이어가 있어야 한다.
    • 화면에 데이터를 표시하는 UI 레이어
    • 앱의 비즈니스 로직을 포함하고 데이터를 노출하는 데이터 레이어
    • UI와 데이터 레이어 간의 상호작용을 최소화하고 재사용하기 위한 도메인 레이어 (옵션)

      일반적인 앱 아키텍처 다이어그램

3가지의 레이어를 하나씩 살펴보자.

  • 각 레이어에 대한 대략적인 내용으로, 자세한 내용은 추후 작성할 예정이다.

1. UI 레이어

  • 프레젠테이션 레이어라고도 부르며 화면에 데이터를 표시하는 역할을 담당한다.
  • 사용자와의 상호작용 (버튼 클릭)이나 외부 입력(네트워크)로 인해 데이터가 변할 때마다 변경사항을 반영할 수 있도록 UI가 업데이트 되어야 한다.
  • 이 UI 레이어는 2가지로 구성된다.

    1. 화면에 데이터를 렌더링하는 UI 요소 (뷰 또는 Jetpack Compose 이용)
    2. 데이터를 보유하고 이를 UI에 노출하여 로직을 처리하는 상태 홀더 (ViewModel 클래스)

      UI 레이어

2. 데이터 레이어

  • 데이터 레이어에는 비즈니스 로직이 포함되어 있다. 비즈니스 로직이란 앱의 데이터를 생성, 저장, 변경하는 로직을 의미한다.
  • 앱에서 처리하는 다양한 유형의 데이터마다 저장소 클래스를 구현해야 한다.
    • 영화 관련 데이터는 MoviesRepository클래스, 결제는 PlaymentsRepository와 같은 방식으로 데이터마다 저장소 클래스를 구현한다.
  • 이 클래스들은 하나의 데이터 소스만 이용해야 한다.
    • 파일이면 파일, DB면 DB, …

      mad-arch-overview-data

3. 도메인 레이어

  • 도메인 레이어는 UI 레이어와 데이터 레이어 사이에 있는 레이어로서 옵션이다.
  • 복잡한 비즈니스 로직, 또는 여러 ViewModel에서 재사용되는 간단한 비즈니스 로직의 캡슐화를 담당한다.
  • 따라서 복잡성을 처리하거나 재사용을 해야할 때 사용한다.

    mad-arch-overview-domain


이런 구성요소들 간의 종속은 어떻게 처리해야 할까?

  • 개발을 하다보면 다른 클래스를 종속할 수 밖에 없는데, 이럴때 사용하거나 구현하기 쉽게 해주는 디자인 패턴이 존재한다.
    1. Dependency Injection(DI)
      • DI를 사용하면 클래스가 자신의 종속 객체를 구성할 필요가 없다.
      • 런타임 시 다른 클래스가 종속 객체를 제공하는 방식으로 구현된다.
        • 생성자 또는 프로퍼티를 이용
    2. Service Locator
      • 클래스가 자신의 종속 객체를 구성하는 대신 종속 객체를 가져올 수 있는 레지스트리를 제공한다.
      • 하나의 클래스에서 종속 객체들을 선언해준 후 끌어다 쓰는 형식을 의미한다.
  • 위 패턴을 적용하면 코드의 중복과 복잡성을 줄일 수 있으며, 종속 객체를 관리하기 편하므로 코드를 확장할 수 있다.
  • 안드로이드에서 DI를 적용시켜주는 라이브러리들이 있다.
    • Koin, Dagger, Hilt, …

[최종 업데이트]
2022-02-27 17:54:00 +0900

https://developer.android.com/jetpack/guide

This post is licensed under CC BY 4.0 by the author.

안드로이드 앱 구조

안드로이드 UI 레이어

Comments powered by Disqus.