PHpullh
학습 라이브러리/Kotlin/프록시 패턴 (Proxy)

KOTLIN · 디자인패턴

프록시 패턴 (Proxy)

원본 객체 접근을 제어하는 프록시를 구현합니다. 캐싱, 접근 제어, 로깅 프록시를 by 위임으로 간결하게 작성합니다.

디자인패턴중급proxycaching-proxyloggingdelegation

핵심 설명

원본 객체 접근을 제어하는 프록시를 구현합니다. 캐싱, 접근 제어, 로깅 프록시를 by 위임으로 간결하게 작성합니다.

Kotlin code

interface ImageLoader {
    fun load(url: String): String
    fun getInfo(url: String): String
}

class RealImageLoader : ImageLoader {
    override fun load(url: String): String {
        println("  [원본] 이미지 다운로드: $url")
        Thread.sleep(100) // 시뮬레이션
        return "이미지 데이터($url)"
    }
    override fun getInfo(url: String) = "정보: $url"
}

// 캐싱 프록시
class CachingProxy(private val real: ImageLoader) : ImageLoader by real {
    private val cache = mutableMapOf<String, String>()

    override fun load(url: String): String {
        return cache.getOrPut(url) {
            println("[캐시] 캐시 미스, 원본 호출")
            real.load(url)
        }.also { println("[캐시] 반환: ${it.take(20)}...") }
    }
}

// 로깅 프록시
class LoggingProxy(private val real: ImageLoader) : ImageLoader by real {
    override fun load(url: String): String {
        println("[로그] load 호출: $url")
        val start = System.currentTimeMillis()
        val result = real.load(url)
        println("[로그] 소요: ${System.currentTimeMillis() - start}ms")
        return result
    }
}

fun main() {
    val loader: ImageLoader = CachingProxy(LoggingProxy(RealImageLoader()))
    loader.load("https://example.com/img.jpg")
    println("---")
    loader.load("https://example.com/img.jpg") // 캐시 히트
    println(loader.getInfo("test.jpg")) // 위임된 메서드
}

학습 팁

by 위임으로 프록시를 만들면 오버라이드하지 않은 메서드는 자동으로 원본에 위임됩니다.

주의할 점

프록시 계층이 깊어지면 디버깅이 어려워집니다. 3단계 이상 중첩되면 AOP 프레임워크를 고려하세요.

자주 묻는 질문

프록시 패턴 (Proxy)란 무엇인가요?

원본 객체 접근을 제어하는 프록시를 구현합니다. 캐싱, 접근 제어, 로깅 프록시를 by 위임으로 간결하게 작성합니다.

프록시 패턴 (Proxy) 학습 시 주의할 점은 무엇인가요?

프록시 계층이 깊어지면 디버깅이 어려워집니다. 3단계 이상 중첩되면 AOP 프레임워크를 고려하세요.