0. Android - 아키텍처

2025. 12. 17. 11:14·Mobile_security

0. 참고 영상

https://www.youtube.com/watch?v=qX6zmKY4KP0&t=266s

 

일단 이 영상을 보고 내용을 정리한 것이다.

 

1. 아키텍처란?

아키텍처란 앱을 구성하는 책임 분리 원칙, 데이터 흐름, 의존성 방향 규칙들의 집합이다.

 

쉽게 설명하면 하나의 서비스가 어떻게 구성되며 어떻게 동작이 되는 흐름

 

안드로이드 앱을 예로 들면:

  • 화면(UI)
  • 비즈니스 로직
  • 데이터 처리(DB, Network)
  • 상태 관리

이 요소들이 어떤 방향으로 의존하고, 어디서 변경이 허용되는지를 정하는 게 아키텍처다.

 

 

2. 확장 가능한 아키텍처 구축

원래의 아키텍처가 확장이 불가능한 게 아니라 잘못 설계된 아키텍처가 확장이 어렵다는 문제점을 가지고 있었기 때문에 좋게 설계 방식을 제안하는 의미로 이야기하는 것이다.

 

앱의 아키텍처를 크게 데이터 레이어(Data Layer)와 UI 레이어(UI Layer)로 나눈다. 이 둘은 단방향 데이터 흐름(Unidirectional Data Flow) 원칙에 따라 통신한다.

 

따라서 UDF 방식은 데이터는 "요청"이 아니라 "발행" 되고 UI는 이를 "구독"이라 한다.

 

데이터의 흐름 (Data Flow) : 오직 한 방향으로만 흐른다. (데이터 레이어 => UI 레이어)

이벤트의 흐름 (Event Flow) : 사용자 액션(이벤트)은 반대방향으로 흐른다. (UI 레이어 => 데이터 레이어)

# 데이터의 흐름 (Data Flow)
# 오직 한 방향으로만 흐른다. (데이터 레이어 => UI 레이어)

┌───────────────────────────┐
│        Data Layer         │
│───────────────────────────│
│  - Data Source            │
│  - Business Logic         │
│  - State Holder           │
│  - Single Source of Truth │
└─────────────┬─────────────┘
              │
      State / Data Stream
      (Publish / Emit)
              │
              ▼
┌───────────────────────────┐
│          UI Layer         │
│───────────────────────────│
│  - State Collector        │
│  - Observe / Subscribe    │
│  - Render UI              │
└───────────────────────────┘

 

# 이벤트의 흐름 (Event Flow)
# 사용자 액션(이벤트)은 반대방향으로 흐른다. (UI 레이어 => 데이터 레이어)
┌───────────────────────────┐
│          UI Layer         │
│───────────────────────────│
│  - User Action            │
│  - Click / Input / Swipe  │
│  - Intent Creation        │
└─────────────┬─────────────┘
              │
         Event / Intent
         (Send / Dispatch)
              │
              ▼
┌───────────────────────────┐
│        Data Layer         │
│───────────────────────────│
│  - Event Handler          │
│  - Business Logic         │
│  - State Update           │
└───────────────────────────┘

 

 

3. 데이터 레이어 (Data Layer) 상세

데이터 레이어는 비즈니스 로직을 수행하며 앱 데이터를 노출한다.

핵심은 Repository와 Data Sourece이다.

 

[Data Source]

데이터를 얻는 단일 출처이다.

예시코드에서는 Jetpack DataStore를 이용해 로컬에 북마크 ID를 저장하는 예시를 보여줄 거다.

Ex)=> 재료창고 같은 개념이다. (로컬 DB, 네트워크 서버)

 

[Repository] 

UI 레이어에 데이터를 노출하는 주체이다.

여러 데이터 소스의 데이터 결합하거나 중재해 주는 역할을 한다.

Ex)=> 재료를 관리하는 사람이라고 생각하면 된다. UI가 "뉴스와 북마크를 줘"라고 요청을 하면 Repository는 LocalDataSource와 NetworkDataSource에서 각각 정보를 가져와 처리한 후 UI에 전달한다. 이때 UI는 Repositroy만 알면 된다.

 

# LocalDataSource (로컬 데이터 소스)
# DataStore를 주입받아 북마크 목록의 Flow 를 노출시킨다.

class BookmarksLocalDataSource @Inject constructor(
    private val dataStore: DataStore<Preferences> // Datastore = 안드로이드에서 제공하는 로컬 저장소 기술
) {
    // 북마크 ID 스트림 (Flow) 노출
    val bookmarkStream: Flow<List<String>> = dataStore.data
        // DataStore 데이터를 List<String> 형태로 변환
        .map { it[PreferencesKeys.BOOKMARKS]?.toList() ?: emptyList() }
    
    // 북마크를 토글(추가/제거)하는 함수
    suspend fun toggleBookmark(bookmarkId: String, save: Boolean) {
        // ... (dataStore.edit 블록 내에서 데이터 업데이트 로직)
    }
}

 

4. UI 레이어 (UI Layer) 상세

UI 레이어는 화면 로직을 담당하는 State Holder (ViewModel)와 UI를 렌더링 하는 Screen (Composable)으로 구성한다.

 

[State Holder]

Data Layer에서 받은 여러 데이터 스트림을 결합하여 화면에 필요한 단일 UI State로 변환한다.

// 뉴스 기사 목록(newRepository)와 북마크ID 목록(bookmarkRepository)을 가져와서
// 어떤 기사가 북마크 되었는지 상태를 합치는 코드

val combinedData: Flow<List<SavableNewsResource>> = 
    newsRepository.newsResources.combine(
        bookmarksRepository.bookmarkStream
    ) { newsResources, bookmarks ->
        // 두 데이터 스트림이 바뀔 때마다 실행되는 변환 함수
        newsResources.map { newsResource ->
            SavableNewsResource(
                newsResource = newsResource,
                // 현재 기사가 북마크 목록에 있는지 확인
                isBookmarked = bookmarks.contains(newsResource.id)
            )
        }
    }

 

 

 

[ViewModel]

데이터베이스에서 가져온 '뉴스 기사'와 '사용자가 저장한 ID 목록'이라는 두 가지 정보를 합쳐 "뉴스 기사 목록"이라는 최종 UI 상태를 만들어준다.

//결합된 데이터(combinedData)를 UI가 수집할 수 있는 StateFlow 로 변환하여 노출시킴.
//StateFlow는 항상 초기 값(Loading)을 가지고 최신 상태를 유지한다.
//ForYouUiState (Loading/Success)는 화면이 '로딩 중'인지 '데이터를 잘 받았는지'를 명확히 구분해주는 상태표이다.

val uiState: StateFlow<ForYouUiState> = combinedData
    .map { list ->
        // 데이터를 받아 성공 상태로 변환
        ForYouUiState.Success(savableNewsResources = list) 
    }
    .stateIn(
        scope = viewModelScope,
        // UI가 구독(Foreground) 중일 때만 Flow를 활성화하고,
        // 구독자가 사라져도 5초간 대기 (화면 회전 등 대비)
        started = SharingStarted.WhileSubscribed(5_000), 
        initialValue = ForYouUiState.Loading // 초기 상태는 로딩
    )

 

5. 요약

핵심 개념: 안드로이드 앱을 Data Layer와 UI Layer로 분리하고, 단방향 데이터 흐름(UDF)으로 통신하는 아키텍처

주요 원칙:

  • 데이터 흐름: Data Layer → UI Layer (단방향, 구독 방식)
  • 이벤트 흐름: UI Layer → Data Layer (사용자 액션 전달)
  • 책임 분리: 각 레이어는 명확한 역할만 수행

구성요소:

  • Data Layer: DataSource(데이터 출처) + Repository(데이터 관리자)
  • UI Layer: ViewModel(상태 관리자) + Screen(화면 렌더링)

 

 

'Mobile_security' 카테고리의 다른 글

Android reversing - Plan  (0) 2026.02.03
0. Android - NDK 학습  (0) 2025.12.22
0. Android,IOS - 모바일 사전 지식 정리  (0) 2025.12.11
0. Android - AVD, ADB, Rooting, Pm  (1) 2025.07.22
0. Android Components (글 주의)  (0) 2025.02.01
'Mobile_security' 카테고리의 다른 글
  • Android reversing - Plan
  • 0. Android - NDK 학습
  • 0. Android,IOS - 모바일 사전 지식 정리
  • 0. Android - AVD, ADB, Rooting, Pm
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (157)
      • 모의해킹 (18)
      • CTF (22)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
      • Mobile_security (13)
        • Drozer_Android (4)
        • Frida_Android (1)
        • IOS (1)
        • tool (1)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

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

    • Github
  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    리눅스
    bandit20
    webhacking
    url encode
    bandit
    워게임
    php wrapper
    bandit30
    난독화
    Linux
    sql injection
    CTF
    정보보안기사
    리눅스 워게임
    Frida
    webhacking.kr
    overthewire
    Dreamhack
    Android
    wargame
    OSINT
    php
    insecurebankv2
    cookies
    lfi
    bandit18
    bandit17
    모의해킹
    Linux wargame
    drozer
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
0. Android - 아키텍처
상단으로

티스토리툴바