PHpullh
학습 라이브러리/Kotlin/리포지토리 패턴 (Repository)

KOTLIN · 디자인패턴

리포지토리 패턴 (Repository)

데이터 소스를 추상화하여 비즈니스 로직과 데이터 접근을 분리합니다. 캐싱과 데이터 소스 전환이 투명합니다.

디자인패턴중급repositorydata-layercachingabstraction

핵심 설명

데이터 소스를 추상화하여 비즈니스 로직과 데이터 접근을 분리합니다. 캐싱과 데이터 소스 전환이 투명합니다.

Kotlin code

data class User(val id: String, val name: String, val email: String)

interface UserRepository {
    suspend fun getById(id: String): User?
    suspend fun getAll(): List<User>
    suspend fun save(user: User)
    suspend fun delete(id: String)
}

class UserRepositoryImpl(
    private val remoteSource: RemoteDataSource,
    private val localCache: LocalCache
) : UserRepository {
    override suspend fun getById(id: String): User? =
        localCache.get(id) ?: remoteSource.fetch(id)?.also { localCache.put(it) }

    override suspend fun getAll(): List<User> = remoteSource.fetchAll()
    override suspend fun save(user: User) {
        remoteSource.save(user)
        localCache.put(user)
    }
    override suspend fun delete(id: String) {
        remoteSource.delete(id)
        localCache.remove(id)
    }
}

// 간단한 구현체
class RemoteDataSource {
    private val db = mutableMapOf<String, User>()
    suspend fun fetch(id: String): User? = db[id]
    suspend fun fetchAll(): List<User> = db.values.toList()
    suspend fun save(user: User) { db[user.id] = user }
    suspend fun delete(id: String) { db.remove(id) }
}

class LocalCache {
    private val cache = mutableMapOf<String, User>()
    fun get(id: String): User? = cache[id]
    fun put(user: User) { cache[user.id] = user }
    fun remove(id: String) { cache.remove(id) }
}

fun main() = kotlinx.coroutines.runBlocking {
    val repo: UserRepository = UserRepositoryImpl(RemoteDataSource(), LocalCache())
    repo.save(User("1", "김철수", "kim@test.com"))
    println(repo.getById("1"))
}

학습 팁

리포지토리 인터페이스에 의존하면 테스트에서 인메모리 구현으로 교체하여 빠른 단위 테스트가 가능합니다.

주의할 점

리포지토리에 UI 로직이나 프레젠테이션 로직을 넣지 마세요. 데이터 접근과 캐싱만 담당해야 합니다.

자주 묻는 질문

리포지토리 패턴 (Repository)란 무엇인가요?

데이터 소스를 추상화하여 비즈니스 로직과 데이터 접근을 분리합니다. 캐싱과 데이터 소스 전환이 투명합니다.

리포지토리 패턴 (Repository) 학습 시 주의할 점은 무엇인가요?

리포지토리에 UI 로직이나 프레젠테이션 로직을 넣지 마세요. 데이터 접근과 캐싱만 담당해야 합니다.