리포지터리 패턴
리포지터리 패턴으로 데이터 접근과 UI를 분리합니다. Room 데이터베이스와 네트워크 API 사이를 조정해 단일 진실 공급원으로 사용합니다.
리포지터리 패턴은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 6개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
Repository가 필요한 이유
앱이 커지면 ViewModel에 데이터 접근 코드(Room 쿼리, Retrofit 호출, SharedPreferences 읽기)가 뒤섞일 수 있습니다.
Repository 패턴은 모든 데이터 접근을 하나의 class 뒤에 숨깁니다. ViewModel은 Repository와만 통신하므로 데이터가 어디에서 오는지 신경 쓰지 않아도 됩니다.
아키텍처 계층
권장되는 Android 아키텍처는 세 개의 계층으로 구성됩니다.
- UI 계층 — Activity/Fragment가 데이터를 표시하고 사용자 이벤트를 전달합니다.
- ViewModel — 상태를 보관하고 이벤트를 처리하며 Repository를 호출합니다.
- Repository — Room(로컬) 또는 Retrofit(원격)에서 데이터를 가져오고 사용할 소스를 결정합니다.
간단한 Repository
DAO와 원격 API를 감싸는 Repository class를 만듭니다.
class NoteRepository(private val dao: NoteDao) {
// Expose a Flow that emits whenever data changes
val allNotes = dao.getAllNotes()
suspend fun insert(note: Note) {
dao.insert(note)
}
suspend fun delete(note: Note) {
dao.delete(note)
}
suspend fun update(note: Note) {
dao.update(note)
}
}Repository를 사용하는 ViewModel
ViewModel은 DAO에서 직접 가져오지 않고 Repository에서 데이터를 가져옵니다.
class NoteViewModel(private val repo: NoteRepository) : ViewModel() {
val notes = repo.allNotes // Flow from Repository
fun addNote(title: String, body: String) {
viewModelScope.launch {
repo.insert(Note(title = title, body = body))
}
}
fun deleteNote(note: Note) {
viewModelScope.launch {
repo.delete(note)
}
}
}캐시 우선 전략
일반적인 Repository 패턴 중 하나는 캐시 우선 전략입니다. 로컬에 캐시된 데이터를 즉시 표시한 다음 백그라운드에서 네트워크 데이터를 새로 가져옵니다.
- 1. Room의 캐시 데이터를 즉시 내보냅니다.
- 2. 최신 데이터를 API에서 가져옵니다.
- 3. Room에 저장하면 Flow가 자동으로 업데이트됩니다.
이렇게 하면 로드 시간이 짧고 최종적으로 최신 데이터를 사용할 수 있습니다.
캐시 우선 구현
네트워크에서 로컬 DB를 새로 고칩니다.
class ProductRepository(
private val dao: ProductDao,
private val api: ProductApiService
) {
// Room Flow emits local data immediately
val products = dao.getAllProducts()
// Call this to sync with the server
suspend fun refresh() {
try {
val remoteProducts = api.getProducts()
dao.insertAll(remoteProducts) // overwrites local cache
} catch (e: Exception) {
// Network failed — cached data is still shown
}
}
}ViewModelFactory
ViewModel에 생성자 매개변수가 있으면 ViewModelFactory를 사용해 생성해야 합니다.
class NoteViewModelFactory(
private val repo: NoteRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return NoteViewModel(repo) as T
}
}
// In Activity:
val db = NoteDatabase.getInstance(this)
val repo = NoteRepository(db.noteDao())
val factory = NoteViewModelFactory(repo)
val viewModel = ViewModelProvider(this, factory)[NoteViewModel::class.java]의존성 주입을 위한 Hilt
규모가 큰 앱에서 Repository와 ViewModel 인스턴스를 직접 만들다 보면 번거로워집니다. Hilt(의존성 주입)가 이 작업을 자동화합니다.
@HiltViewModel과@Inject를 class에 지정합니다.- Hilt가 의존성을 자동으로 생성하고 제공합니다.
- 반복적인 Factory 코드를 모두 제거합니다.
이점 요약
Repository 패턴은 다음과 같은 이점을 제공합니다.
- 테스트 가능성 — 단위 테스트에서 실제 API를 가짜 구현으로 바꿀 수 있습니다.
- 관심사 분리 — ViewModel은 데이터가 로컬에 있는지 원격에 있는지 알 필요가 없습니다.
- 단일 진실 공급원 — 항상 Room을 소스로 사용하고 API는 데이터를 새로 고치기만 합니다.
- 유연성 — ViewModel을 수정하지 않고 캐싱, 페이지 나누기 또는 새로운 데이터 소스를 추가할 수 있습니다.
빠른 확인
Android 아키텍처에서 Repository의 주요 책임은 무엇일까요?
복습: Repository 패턴
이제 권장되는 Android 아키텍처를 이해했습니다.
- UI → ViewModel → Repository → (Room / Retrofit)
- Repository는 단일 진실 공급원입니다.
- 캐시 우선: 로컬 데이터를 즉시 표시하고 백그라운드에서 새로 고칩니다.
- ViewModel에 생성자 매개변수가 있으면 ViewModelFactory를 사용합니다.
- 규모가 큰 앱에서는 Hilt가 의존성 주입을 자동화합니다.
마지막 과정: 네트워킹 및 마무리 — Retrofit, 이미지, 배포입니다.
자주 묻는 질문
“리포지터리 패턴” 강의는 무료인가요?
네 — “리포지터리 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
“리포지터리 패턴”에서 뭘 배우나요?
리포지터리 패턴으로 데이터 접근과 UI를 분리합니다. Room 데이터베이스와 네트워크 API 사이를 조정해 단일 진실 공급원으로 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Android Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 6개 중 4번째 강의입니다.
“리포지터리 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.