Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- factory method
- Abstract Factory
- 싱글톤
- ㅓ
- 디자인패턴
- Kotlin
- android designsystem
- compose
- Functional Programming
- 팩토리 메소드
- 추상팩토리패턴
- r
- Singleton
- 디자인패턴 #
- builderPattern
- designPattern
- 안드로이드 디자인시스템
- PrototypePattern
- Observer Pattern
- ㅋㅁ
- 추상 팩토리
- F
- 함수형프로그래밍
- 프로토타입 패턴
- material3
- El
- 코틀린
- 옵저버 패턴
- Design Pattern
- 빌터패턴
Archives
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Now In Android를 분석하자 (모듈의 구조1) 본문
Core 모듈의 의존성 도식화
Level 0 Modules
core:model
- 비유: "앱의 명사 사전 (The App's Dictionary)"
- 역할: 앱의 모든 데이터가 어떤 형태를 가져야 하는지, 즉 '무엇(What)'을 정의합니다. 앱 전체에서 사용되는 공유 데이터 구조(주로 data class)를 포함합니다. 이 모듈은 앱의 모든 계층이 소통하기 위한 공통 '언어'를 제공합니다.
- 주요 내용물:
- NewsResource.kt: 뉴스 기사 하나를 나타내는 데이터 클래스.
- Topic.kt: 'Android Dev', 'Compose' 같은 주제를 나타내는 데이터 클래스.
- Author.kt, Episode.kt 등 앱에서 다루는 모든 핵심 데이터 모델.
- @Serializable 어노테이션: 네트워크(Ktor)나 DB(Room)에서 데이터를 변환할 수 있도록 kotlinx.serialization 라이브러리를 사용합니다.
- 왜 레벨 0 인가?
- 이 모듈은 오직 데이터의 '구조'만 정의합니다. 이 데이터가 어떻게 화면에 그려지는지(designsystem), 어디서 오는지(network, database), 또는 어떤 비즈니스 로직에 사용되는지(domain)에 대해 전혀 알지 못합니다. 가장 순수한 데이터 그 자체입니다.
core:designsystem
- 비유: "앱의 브랜드 가이드 & 레고 기본 블록 (The App's Brand Guide & Basic Lego Bricks)"
- 역할: 앱의 시각적 정체성, 즉 **'어떻게 보이는가(How it looks)'**를 정의합니다. 색상, 글꼴, 아이콘 등 디자인 시스템의 가장 기초적인 요소와, 이것들을 조합하여 만든 가장 단순하고 재사용 가능한 UI 컴포넌트를 제공합니다.
- 주요 내용물:
- NiaColor.kt: Material3 테마를 기반으로 한 앱의 공식 색상 팔레트.
- NiaTypography.kt: 앱 전체에서 사용되는 글꼴 스타일.
- NiaIcons.kt: 앱에서 사용하는 모든 아이콘 리소스.
- NiaButton.kt, NiaTopicTag.kt, NiaFilterChip.kt: 디자인 시스템 규칙에 따라 만들어진, 상태를 갖지 않는(stateless) 가장 기본적인 컴포저블(Composable) UI 요소.
- 왜 레벨 0 인가?
- 이 모듈은 순수한 시각적 '재료'만 제공합니다. 이 버튼이 눌렸을 때 어떤 일이 일어나는지, 이 태그에 어떤 Topic 데이터가 연결되는지에 대해 전혀 알지 못합니다. 그저 주어진 값에 따라 어떻게 보일지만 결정합니다.
core:common
- 비유: "만능 공구함 (The Universal Toolbox)"
- 역할: 특정 도메인(뉴스, UI, 데이터 등)에 속하지 않는, 앱 전반에서 사용되는 공통 유틸리티와 순수 Kotlin 코드를 모아놓은 곳입니다.
- 주요 내용물:
- NiaDispatchers.kt: IO, Default 등 Coroutine Dispatcher를 제공하여 앱 전체의 스레드 관리를 일관되게 합니다.
- Result.kt: 네트워크 요청 등의 결과를 Success 또는 Error로 감싸는 래퍼 클래스.
- WhileSubscribed 동작 정의: StateFlow를 언제 시작하고 중지할지에 대한 정책을 정의합니다.
- 왜 레벨 0 인가?
- 이 모듈은 앱의 기능이나 데이터와는 완전히 무관한, 범용적인 '도구'들만 포함하고 있습니다. 어떤 모듈이든 필요하면 가져다 쓸 수 있는 독립적인 라이브러리 같은 역할을 합니다.
core:analytics
- 비유: "사건 기록원 (The Event Scribe)"
- 역할: 앱에서 발생하는 이벤트를 기록하는 방법을 추상화하여 제공합니다. 실제 분석 도구(Firebase Analytics)의 구체적인 구현을 숨기고, 앱의 나머지 부분에는 AnalyticsHelper라는 간단한 인터페이스만 노출합니다.
- 주요 내용물:
- AnalyticsHelper.kt: logEvent(event)라는 단 하나의 메서드를 가진 인터페이스.
- AnalyticsEvent.kt: 분석 이벤트의 이름과 파라미터를 담는, 이 모듈만의 자체적인 데이터 클래스.
- FirebaseAnalyticsHelper.kt: AnalyticsHelper 인터페이스의 실제 구현체.
- 왜 레벨 0 인가?
- 이 모듈은 분석이라는 **횡단 관심사(Cross-cutting concern)**를 완벽하게 캡슐화합니다. core:model의 NewsResource가 무엇인지조차 알 필요 없이, 자신만의 AnalyticsEvent 데이터 모델을 사용하여 독립적으로 동작합니다.