관리 메뉴

오늘도 더 나은 코드를 작성하였습니까?

Now In Android를 분석하자 (Core 모듈의 구조3) 본문

카테고리 없음

Now In Android를 분석하자 (Core 모듈의 구조3)

hik14 2025. 10. 16. 01:37

core:data

비유: "데이터 계층의 총괄 지휘자" 또는 "앱의 최고 데이터 책임자(Chief Data Officer)"
역할: 이 모듈은 앱의 데이터에 관한 모든 정책을 결정하고 실행하는 심장부입니다. 

 

'단일 진실 공급원(Single Source of Truth, SSOT)' 원칙을 구현하는 책임을 지며, 상위 계층(도메인, 기능)에 깨끗하고 일관된 데이터 API(Repository)를 제공합니다.

 

어떻게 지휘하는가? 

  • 데이터 동기화: core:network(레벨 1)를 호출하여 서버로부터 최신 데이터를 가져옵니다.
  • 데이터 캐싱: core:network에서 받아온 데이터를 core:database(레벨 1)를 사용하여 로컬 DB에 저장(Upsert)합니다.
  • 데이터 제공: 상위 계층에서 데이터를 요청하면, 네트워크가 아닌 **로컬 DB(core:database)**에서 데이터를 읽어 제공합니다. 이를 통해 오프라인 지원과 일관성을 보장합니다.
  • 데이터 필터링: core:datastore(레벨 1)에서 사용자 설정(예: 팔로우한 주제)을 읽어와, DB에서 데이터를 조회할 때 필터링 조건을 적용합니다.

주요 내용물

  • TopicsRepository.kt, NewsRepository.kt: 데이터 접근을 위한 인터페이스(계약서).
  • DefaultTopicsRepository.kt, DefaultNewsRepository.kt: 위 인터페이스의 구현체. 모든 지휘 로직이 여기에 담겨 있습니다.

주요 의존성

  • core:network (레벨 1): 원격 데이터 소스로 사용.
  • core:database (레벨 1): 로컬 데이터 소스(SSOT)로 사용.
  • core:datastore (레벨 1): 사용자 데이터 참조용.
  • core:model (레벨 0): 데이터 구조를 알기 위해.
  • core:common (레벨 0): Coroutine Dispatcher 등을 사용.
  • core:analytics (레벨 0): 데이터 동기화 상태를 로깅하기 위해.

 

core:sync

비유: "성실한 백그라운드 작업자" 또는 "야간 순찰대"

역할: WorkManager 사용하여, 앱이 실행 중이지 않을 때에도 주기적으로 백그라운드에서 데이터를 동기화하는 작업을 책임집니다.

 

어떻게 동작하는가?

  • 안드로이드 OS에 의해 WorkManager가 SyncWorker를 실행시킵니다.
  • SyncWorker는 core:data 모듈이 제공하는 SyncManager 또는 Repository의 sync() 메서드를 호출합니다. (중요: sync 모듈은 데이터 동기화 '방법'을 직접 구현하지 않고, core:data에게 '위임'합니다.)
  • core:data로부터 동기화가 성공적으로 완료되었다는 신호를 받으면,
  • core:notifications(레벨 1)를 호출하여 사용자에게 "새로운 소식이 업데이트되었습니다"와 같은 알림을 보낼 수 있습니다.

주요 내용물

  • SyncWorker.kt: WorkManager가 실행하는 실제 작업 로직.
  • SyncManager.kt: 동기화 작업을 초기화하고 관리하는 인터페이스 및 구현체.

주요 의존성

  • core:data (레벨 2): 실제 동기화 로직을 수행하도록 위임하기 위해.
  • core:notifications (레벨 1): 동기화 완료 후 알림을 보내기 위해.
  • core:datastore (레벨 1): 동기화 관련 설정을 읽기 위해.
  • core:common (레벨 0)

 

레벨 2 모듈의 중요성

  • 복잡성 캡슐화: 상위 계층(도메인, 기능)은 데이터가 네트워크와 DB 사이에서 어떻게 오고 가는지 전혀 알 필요가 없습니다. core:data가 이 모든 복잡성을 숨겨주기 때문입니다.
  • 중앙 집중화된 정책: 데이터 캐싱 전략(예: 1시간마다 동기화)이나 오프라인 처리 정책이 변경되면, 오직 core:data 모듈만 수정하면 됩니다. 앱의 다른 부분은 영향을 받지 않습니다.
  • 역할의 명확한 분리: core:data **'데이터 정책'**, sync **'백그라운드 실행 정책'** 담당하며 역할이 명확하게 나뉩니다.