본문 바로가기

안드로이드/클린 아키텍처

[안드로이드 클린 아키텍처 시리즈] 클린 아키텍처 소개 및 UI Layer 설명 #1


1. 클린 아키텍처 도입 배경

안녕하세요. 개발을 하면서 점점 복잡하고 거대해지는 소스코드 관리를 어떻게 하면 좋을까?라는 의문은 항상 쫓아다니는 것 같습니다. 저는 7년 경력의 개발자인데, 안드로이드 개발을 할 때도 MVC, MVP, MVVM 등 수많은 아키텍처 패턴 중 어떤 것을 사용할지는 프로젝트의 성격이나 규모에 따라서 정했던 것 같습니다. 그러던 중 희한한 구조를 볼 수 있었는데, 안드로이드 공식 개발 문서에서 권장되는 아키텍처로 소개하고 있는 클린 아키텍처였습니다. 그래서 신규 프로젝트는 클린 아키텍처를 도입해 보기로 결심했으나 상대적으로 높은 러닝커브가 작용하고 있었고, 이를 쉽게 정리해서 여러분께 소개하기 위해 포스팅을 작성하게 되었네요. 클린 아키텍처에 대해 최대한 간단하고 쉽게 정리해 보겠습니다.

클린 아키텍처 구조

2. 안드로이드 클린 아키텍처의 구조는 어떨까?

클린 아키텍처는 아래와 같이 3개의 계층으로 나뉘게 됩니다.

2-1. UI Layer

사용자에게 데이터를 렌더링 하는 역할을 합니다. 안드로이드에서는 XML 또는 Jetpack Compose를 사용하여 화면을 구성합니다. 이때, ViewModel을 통해 데이터 상태를 관리하게 됩니다. ViewModel은 UI 상태 데이터를 저장하고, UI 컨트롤러(예: Activity, Fragment)가 화면에 필요한 데이터를 ViewModel로부터 받아 사용자에게 표시하도록 합니다.

2-2. Domain Layer (optional)

비즈니스 로직이나 애플리케이션의 핵심 기능을 처리합니다. UI 레이어와 데이터 레이어 사이에서 동작하며, 애플리케이션의 비즈니스 규칙을 캡슐화하고 독립적으로 유지합니다. 이 계층은 선택적이기는 하지만, 복잡한 로직이나 다수의 데이터 소스를 다루는 경우 도입하여 애플리케이션의 유연성을 높일 수 있습니다.

2-3. Data Layer

애플리케이션에서 사용하는 데이터와 관련된 작업을 처리합니다. 데이터베이스, 웹 서비스, 캐시 등의 데이터 소스로부터 데이터를 가져오거나 저장하는 역할을 담당합니다. 데이터 레이어는 데이터를 UI 레이어로 전달하기 전에 필요한 처리(예: 가공, 변환)를 수행할 수도 있습니다.

3. 클린 아키텍처의 UI Layer

UI Layer는 화면에 데이터를 렌더링 하는 역할을 합니다. 안드로이드의 XML 또는 Jetpack Compose로 렌더링 해서 보이는 화면입니다. 렌더링 할 때 UI뿐만 아니라 데이터도 포함되는 경우가 있으므로 데이터를 관리할 수도 있어야 합니다. 아래 그림에서의 State holders가 데이터를 보유하고 로직을 처리하는 ViewModel입니다.

  1. 화면에 데이터를 렌더링 하는 역할 (XML or Jetpack compose)
  2. 화면에 보이는 데이터를 관리하기 위해 상태 홀더 (ViewModel)

UI 레이어의 역할

3-1. UI Layer의 첫 번째 목표

UI Layer의 첫 번째 목표는 사용자에게 데이터를 시각적으로 표현하는 것입니다. Android에서는 주로 XML 레이아웃을 사용했지만 최근에는 Jetpack Compose를 사용하는 사례도 많아지고 있습니다.

  1. XML 레이아웃
    전통적인 안드로이드 개발 방식에서는 XML 파일을 사용하여 UI 구성요소들을 정의했습니다. 버튼, 텍스트 뷰, 이미지 뷰 등과 같은 UI 요소들을 포함합니다. XML 레이아웃을 사용하면, 디자이너와 개발자가 UI를 더 명확하게 시각화하고 구성할 수 있습니다.
  2. Jetpack Compose
    Jetpack Compose는 최신 안드로이드 UI 툴킷으로, 선언적 UI를 가능하게 합니다. 이는 UI의 상태가 변경될 때 자동으로 UI를 업데이트하는 방식으로 동작합니다. Jetpack Compose를 사용하면 더 간결하고 직관적인 코드로 복잡한 UI를 만들 수 있으며, 라이브러리 자체가 Kotlin과 밀접하게 통합되어 있어 Kotlin의 장점을 최대한 활용할 수 있습니다.

3-2. UI Layer의 두 번째 목표

UI Layer의 두 번째 목표는 사용자와의 상호작용을 처리합니다. 예를 들어, 사용자가 버튼을 클릭하거나 스크롤을 하는 등의 동작에 대한 반응을 구현합니다. ViewModel은 이러한 UI Layer에 속하며, UI와 관련된 데이터와 로직을 관리합니다. ViewModel은 화면 회전과 같은 구성 변경에서도 UI 상태를 유지하는 역할을 하며, UI 컨트롤러(예: Activity, Fragment)와 Data Layer 사이의 중간자 역할을 합니다. 이를 통해 UI 코드가 더욱 간결하고 관리하기 쉬워지며, 테스트와 유지보수가 용이해집니다.

4. 클린 아키텍처의 소개 및 UI Layer 정리

이렇게 클린 아키텍처의 기본 구조와 UI Layer의 역할에 대해 살펴보았습니다. UI Layer는 사용자와의 상호작용을 담당하며, Domain Layer와 Data Layer는 각각 비즈니스 로직과 데이터 관리를 책임집니다. 이러한 계층화는 코드의 유연성과 확장성을 높여주며, 유지보수를 용이하게 합니다. 물론, 처음에는 이러한 아키텍처에 익숙해지기까지 시간이 걸릴 수 있습니다. 하지만 장기적으로 봤을 때, 클린 아키텍처는 복잡한 애플리케이션을 체계적으로 관리하고, 향후 확장성 있는 개발을
위한 훌륭한 기반을 제공한다고 생각합니다.

클린 아키텍처의 주요 목적은 각 계층을 독립적으로 유지하여, 한 계층의 변경이 다른 계층에 미치는 영향을 최소화하는 것입니다. 이를 통해 유지보수가 용이해지고, 애플리케이션의 확장성 및 테스트 용이성이 향상됩니다. 처음 접하는 분들이라면 다소 어렵게 느껴질 수 있습니다. 러닝커브가 높을 수 있지만, 장기적으로 볼 때, 애플리케이션의 유지보수성과 확장성을 크게 향상할 수 있는 중요한 접근 방식이라고 생각합니다.

다음 포스팅에서는 데이터를 관리하는 Data Layer에 대해 설명하겠습니다.