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 프레임워크를 고려하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.