새롭게 시작할 뉴스 앱 프로젝트를 기획하고, 왜 이 앱을 개발하게 되었는지 그 배경과 함께 아키텍처 설계 전략을 공유하려고 합니다.
저는 다음과 같은 이유로 이 앱을 개발하고 싶었습니다.
매일 뉴스와 기사를 보는데, 내가 원하는 뉴스와 기사만을 선별해서 볼 수는 없을까?
한국 뿐만 아니라 해외 기사들도 함께 볼 수는 없을까?
내가 원하는 카테고리(IT, 경제, 주식)의 기사를 한 곳에 모아서 볼 수 있다면 좋을 것 같아!
MyNewsTaste 앱은 유저가 원하는 카테고리(IT, 경제, 주식 등)를 선택할 수 있고 각 카테고리의 기사들이 등장하는 비율을 설정할 수 있는 기능을 제공할 예정입니다. 마치 IT 기사 2개, 경제 1개, 주식 1개와 같이 우선순위와 빈도를 정하여 기사를 접하는데 지루함이 느껴지지 않게 말이죠.
이 프로젝트를 시작하며 개발자로서 달성하고 싶은 설계 목표가 있습니다.
1. 멀티 모듈 구조
2. 클린 아키텍처 기반, 관심사의 분리 철칙 준수
프로젝트가 커지면 코드베이스가 복잡해지기 마련입니다. 유지보수성, 빌드 속도, 테스트 커버리지, 팀 협업 모든 것을 고려했을 때, 모듈 단위로 책임을 잘게 쪼개고 각 모듈이 오직 자신의 역할만 수행하도록 설계하는 것이 핵심이라 믿습니다.
프로젝트 개요
이 앱은 크게 다음 세 가지 화면을 포함합니다.
- 메인 화면
- 5개의 탭을 배치
- 각 탭은 1) MyNewsTaste 2) 종합 뉴스, 3)사회 4) 경제 5) 찜한 기사
- 설정 화면
- 사용자가 관심 카테고리와 비율을 지정
- 상세 화면
- 기사를 클릭했을 때 본문과 이미지를 보여주는 화면
백엔드 데이터는 News API와 Naver API에서 가져오고,
사용자가 저장한 기사는 Room DB에 영구 저장합니다.
멀티모듈 구조
:app - 최상위 Application, 네비게이션 호스트
:core:ui - 공통 UI 컴포넌트(ArticleCard, LoadingIndicator 등)
:core:local - Room DB, SharedPreferences
:core:network - API 정의(NewsApiService, NaverApiService), Retrofit/OkHttp 설정
:core:domain - UseCase, 인터페이스(ArticleRepository, SettingsRepository)
:core:data - domain 인터페이스 구현체
:feature-articlelist - 5개의 탭을 제공하는 UI, ViewModel, Fragment
:feature-settings - 설정 UI, ViewModel, Fragment
:feature-articledetail - 기사 상세 내용 UI, ViewModel, Fragment
필요한 기능들을 위와 같이 멀티모듈로 구성하였습니다.
Compose로 Ui단을 구성할 수 있으나 View로 개발할 예정입니다.
그 이유는 View에서 Compose로 전환하는 단계의 경험을 쌓고 싶기 때문입니다.
또한, 멀티모듈과 클린아키텍처를 기반으로 한다면 더더욱 View에서 Compose로 전환하기 쉬울것으로 예상됩니다.
클린아키텍처를 실현하기 위하여 의존 관계는 항상 유의하며 지켜야합니다.
app → feature
feature → domain
data → domian
core-local, core-network → data
멀티모듈 구조와 관심사의 분리를 철칙으로 삼아:
- 유지보수성 높은 코드
- 확장성 보장된 설계
- 테스트와 협업 모두 효율적인 환경
을 만들어 갈 예정입니다.
앞으로 이 구조를 바탕으로 각 기능을 하나씩 구현하며,
학습한 내용과 실전 꿀팁을 공유하겠습니다.











