0Pricing
Android Academy · 강의

리포지터리 패턴

리포지터리 패턴으로 데이터 접근과 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ViewModel과 LiveData
  2. Room 데이터베이스
  3. 코루틴과 일시 중단 함수
  4. 리포지터리 패턴
  5. Navigation Component
  6. Hilt를 사용한 의존성 주입
← Android Academy(으)로 돌아가기