[Android] 안드로이드 권장 아키텍처

2025. 7. 31. 22:27·Android

안드로이드는 보통 계층화된 구조로 설계된다.

여러 아키텍처가 있지만, 그 중 안드로이드에서 권장되고 있는 아키텍처에 대해 설명하겠다.

 

안드로이드 권장 사항

안드로이드 권장 아키텍처를 설명하기에 앞서, 현재 안드로이드가 지향하고자 하는 중요한 몇 가지에 대해서 먼저 짚고 넘어가려 한다.

 

1. 관심사 분리

 

관심사 분리는 각 구성 요소가 자신의 맡은 일만 담당하도록 책임을 나누는 것이다.

마치 SRP(Single Responsibility Principle, 단일 책임 원칙)처럼 말이다.

관심사를 분리하게 되면 테스트가 용이해지고 의존성 주입이 쉬워진다. 즉 Hilt 프레임워크를 활용하기에도 좋다.

 

2. 단방향 데이터 흐름

 

데이터 일관성과 구조적 명확성에 의해 안드로이드는 단방향 데이터 흐름을 지향한다.

 

3. 코루틴 및 Flow

 

계층 간 데이터 흐름을 관리하고 비동기 작업 처리를 위해 코루틴과 Flow를 활용하는 것을 권장한다.

 


안드로이드 권장 아키텍처

이제 안드로이드의 권장 아키텍처에 대해서 알아보자.

 

 

 

대표적으로 UI Layer, Domain Layer, Data Layer 3개의 레이어가 있다.

하지만 Domain Layer는 선택 사항이며, 해당 레이어는 비즈니스 로직을 사용해야 하는 큰 앱에 권장된다.

 

따라서 UI Layer와 Data Layer 최소 두 레이어가 포함된 아키텍처가 안드로이드의 권장 앱 아키텍처이다!

 


UI 레이어

UI 레이어(프레젠테이션 레이어)는 화면에 데이터를 표시하는 계층으로,

사용자 이벤트가 발생하면 그에 따라 업데이트된 데이터가 화면에 반영되어야 한다.

UI 레이어는 다음과 같이 두 계층으로 나뉘어진다.

 

 

UI Elements

 

UI Elements는 화면에 데이터를 렌더링하는 구성 요소이다.

사용자에게 보여지는 텍스트, 버튼, 이미지 등이 모두 UI Elements에 해당된다.

 

또한 UI의 상태(UI State)의 변화에 따라 UI Elements가 화면에 보여지는 내용이 바뀔 수 있다.

data class NewsUiState(
    val isSignedIn: Boolean = false,
    val isPremium: Boolean = false,
    val newsItems: List<NewsItemUiState> = listOf(),
    val userMessages: List<Message> = listOf()
)

 

예를 들어, isSignedIn과 isPremium이 true로 바뀌면, 북마크 버튼이 활성화될 수 있다.

 

 

State Holders

 

UI의 상태를 생성하고, 해당 상태가 변경될 때 UI가 자동으로 재구성 되도록 상태 관리 로직을 포함하는 클래스를 상태 홀더라고 한다.

그리고 상태 홀더는 곧 ViewModel 클래스를 의미한다.

class NewsViewModel(...) : ViewModel() {

    val uiState: StateFlow<NewsUiState> = …
}

 

위에서 안드로이드는 단방향 데이터 흐름(UDF)을 지향한다고 언급했었다.

UDF 작동 방식은 상태가 아래로 향하고, 이벤트는 위로 향한다.

 

사용자로부터 이벤트가 발생하면 ViewModel이 사용자 이벤트를 처리한다.

이후, 변경된 상태를 UI에서 재구성하는 과정을 반복하며 상호작용을 반복한다.

 


Data 레이어

Data 레이어는 앱이 외부 또는 내부 데이터 소스에서 정보를 가져오고 저장하는 역할을 담당하는 계층이다.

해당 레이어에서 노출된 데이터는 일관성 유지를 위해 변경될 수 없다!

 

Data 레이어도 역시 두 계층으로 나뉘어진다.

 

 

Repositories

 

저장소는 여러 데이터 소스를 가지고, ViewModel이 사용할 수 있도록 통합된 API를 제공한다.

class ExampleRepositoryImpl {
    private val exampleRemoteDataSource: ExampleRemoteDataSource, // network
    private val exampleLocalDataSource: ExampleLocalDataSource // database
) : ExampleRepository {
    val data: Flow<Example> = ...
    suspend fun modifyData(example: Example) { ... }
}

 

 

저장소 클래스는

  • 여러 데이터 소스를 통합하는 과정에서 충돌을 해결할 수 있다.(적절한 데이터를 선택할 수 있다.)
  • 비즈니스 로직을 포함할 수 있다.

또한 위처럼 인터페이스를 호출하는 경우도 있지만, 필요에 따라 다른 저장소에 종속될 수도 있다.

 

UserRepository는 LoginRepository와 RegistrationRepository에 종속된 저장소 클래스이다.

 

 

Data Sources

 

데이터 소스는 외부 또는 내부에서 데이터를 실제로 가져오는 역할을 담당한다.

 

외부 데이터 소스는 → 네트워크, 즉 api 호출을 통해 외부 DB에서 데이터를 가져오는 것이고,

내부 데이터 소스는 → 안드로이드 내부의 DB인 Room과 같은 로컬 DB에서 데이터를 가져오는 것이다.

 

데이터 요청이 들어오면 데이터 소스가 실제로 데이터를 제공한다.

class NewsRemoteDataSource(
  private val newsApi: NewsApi,
  private val ioDispatcher: CoroutineDispatcher
) {
    suspend fun fetchLatestNews(): List<ArticleHeadline> =
        withContext(ioDispatcher) {
            newsApi.fetchLatestNews()
        }
    }

interface NewsApi {
    fun fetchLatestNews(): List<ArticleHeadline>
}

 

외부 네트워크를 이용해 API를 비동기로 호출하는 코드이다.

 


 

이로써 안드로이드 권장 아키텍처를 모두 알아보았다.

하지만 각 레이어마다의 권장 사항도 세부적으로 존재한다.

이는 공식 문서에도 적혀있으니 필요하면 읽어보면 좋을 것 같다!

https://developer.android.com/topic/architecture/recommendations?hl=ko#layered-architecture

 

Android 아키텍처 권장사항  |  App architecture  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Android 아키텍처 권장사항 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에서는 여러 아키

developer.android.com

 

또한 틀린 부분이 있을 수 있다...! 발견한다면 차차 수정하도록 하겠다 😊

 

:)

 

출처

https://developer.android.com/topic/architecture?gclid=CjwKCAjw6raYBhB7EiwABge5Klm_5PN8nJF0Jrb_ymrPP0JAEsbmemmGv_nsn0nBQKQtQMCBuvjehRoC7qcQAvD_BwE&%3Bgclsrc=aw.ds&hl=ko&_gl=1*f3rj61*_up*MQ..*_ga*MzM4NzUxMDAuMTc1Mzk1OTc4MA..*_ga_6HH9YJMN9M*czE3NTM5NTk3ODAkbzEkZzAkdDE3NTM5NTk3ODAkajYwJGwwJGgxOTkyMjI3NTM.#recommended-app-arch

https://developer.android.com/topic/architecture/ui-layer?hl=ko&_gl=1*3n1ajf*_up*MQ..*_ga*MzM4NzUxMDAuMTc1Mzk1OTc4MA..*_ga_6HH9YJMN9M*czE3NTM5NTk3ODAkbzEkZzAkdDE3NTM5NTk3ODAkajYwJGwwJGgxOTkyMjI3NTM.

https://developer.android.com/topic/architecture/data-layer?hl=ko&_gl=1*cus8r*_up*MQ..*_ga*MzM4NzUxMDAuMTc1Mzk1OTc4MA..*_ga_6HH9YJMN9M*czE3NTM5NTk3ODAkbzEkZzAkdDE3NTM5NTk3ODAkajYwJGwwJGgxOTkyMjI3NTM.

'Android' 카테고리의 다른 글

[Android] 클린 아키텍처(Clean Architecture)  (2) 2025.08.11
[Android] Work Manager(+Job Scheduler)  (2) 2025.08.09
[Android] Fragment의 데이터 통신  (1) 2025.06.16
[Android] 스레드(Thread)  (0) 2025.06.12
[Android] 안드로이드의 4대 컴포넌트  (0) 2025.06.11
'Android' 카테고리의 다른 글
  • [Android] 클린 아키텍처(Clean Architecture)
  • [Android] Work Manager(+Job Scheduler)
  • [Android] Fragment의 데이터 통신
  • [Android] 스레드(Thread)
jjangsudiary
jjangsudiary
jjangsudiary 님의 블로그 입니다.
  • jjangsudiary
    jjangsudiary 님의 블로그
    jjangsudiary
  • 전체
    오늘
    어제
    • 분류 전체보기 (81) N
      • 이모저모 (0)
        • 회고 (0)
      • Development (17) N
        • 개발 공부 (14) N
        • 프로젝트 (2)
      • Android (10)
        • Compose (1)
      • AI (15)
      • Computer Science (25)
        • 네트워크 (8)
        • 데이터베이스 (10)
        • 운영체제 (6)
        • 자료구조 (0)
        • 컴퓨터구조 (1)
      • Java (9)
        • 디자인패턴 (2)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    os
    파이썬
    머신러닝
    TensorFlow
    프로그래머스
    android
    코딩 테스트
    java
    db
    Ai
    백준
    안드로이드
    database
    딥러닝
    Python
    자바
    baekjoon
    CS
    인공지능
    운영체제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
jjangsudiary
[Android] 안드로이드 권장 아키텍처
상단으로

티스토리툴바