새 프로젝트를 시작하며 새로운 디자인 패턴(MVI)를 적용하려고 하다보니, 클린 아키텍처에 대한 고심?이 필요했습니다
들었던 의문점들을 정리해보았어요 🥹
🔒 Q1. Repository는 화면을 따라가야 할까? 데이터 주체를 따라가야 할까?
🔑 A. Repository는 무조건 “데이터 주체” 기준으로 네이밍해야 함!
- ❌ MainRepository, BookScreenRepository
- ✅ BookRepository, UserRepository
: Repository는 데이터 주체를 중심으로 만들어야 여러 화면에서 재사용 가능하고, 구조가 깔끔하게 유지
🔒 Q2. Repository는 domain 계층인데, 구현체는 왜 data에 있을까?
🔑 A. Repository의 정의는 도메인에 있고, 실제 구현은 data에 있어야 함!
- BookRepository (interface) → domain
- BookRepositoryImpl (구현체) → data
: 이유는 도메인은 외부 기술(Retrofit, Room 등)을 몰라야 하기 때문
→ 기술 독립성 유지가 클린 아키텍쳐에서 제일 중요함!
🔒 Q3. UseCase에서 Repository 호출하면, 결국 어차피 Repository의 구현체(RepositoryImpl)가 동작하는 거 아닐까?
그럼 UseCase를 사용할 필요가 있나?
🔑 1. 계층 간 의존 역전 원칙(DIP)을 지키기 위해
- 구현체가 동작하긴 하지만 UseCase나 Repository는 인터페이스 기준으로만 동작해야 함!
- UseCase는 BookRepository를 부르고, 실제로는 Hilt가 BookRepositoryImpl을 주입해주는 구조
: UseCase나 Repository에서 외부 기술을 직접 사용하면 계층 간 의존 역전 원칙(DIP)이 깨짐
상위 계층이 하위계층에 의존하면 X, 인터페이스에만 의존해야함!
🔑 2. 관심사 분리로 유지보수성과 테스트성을 높이기 위해
- ViewModel은 상태 관리와 UI 이벤트 처리만 담당
- UseCase는 비즈니스 로직, 데이터 처리 등의 실제 기능을 담당
이렇게 분리하면 각 계층이 하나의 책임만 갖게 돼서
→ 로직이 더 깔끔해지고
→ 테스트 작성, 기능 확장, 유지보수 용이
항상 프로젝트 구조를 짜는 게 제일 어려운 거 같아요 꾸준한 연습하기,, !
'📱 Android' 카테고리의 다른 글
[Android / RecyclerView] onCreateViewHolder vs onBindViewHolder: 클릭 리스너는 어디에 둘까? (0) | 2025.04.07 |
---|---|
[Android] LiveData - observeForever (0) | 2025.03.21 |
[Android] ViewPager2 감도 조절하기 (0) | 2025.02.08 |
[Android] AAC의 LiveData, ViewModel의 LiveData (0) | 2025.02.04 |
[Android] binding 즉시 업데이트 하기 executePendingBindings (0) | 2024.11.21 |