Dynamic Proxy
다이나믹 프록시
다이나믹 프록시와 리플렉션(Part 1)
1. 출발점 — 프록시는 이해되는데, “런타임 생성”이 이해되지 않았다
interface UserService {
fun add(user: String)
fun upgradeLevels()
}
class UserServiceImpl : UserService {
override fun add(user: String) {
println("사용자 등록: $user")
}
override fun upgradeLevels() {
println("사용자 등급 업그레이드")
}
}
class UserServiceTxProxy(
private val target: UserService
) : UserService {
override fun add(user: String) {
target.add(user)
}
override fun upgradeLevels() {
println("[TX] 트랜잭션 시작")
try {
target.upgradeLevels()
println("[TX] 커밋")
} catch (e: Exception) {
println("[TX] 롤백")
throw e
}
}
}2. 컴파일 시점 — 아무 일도 일어나지 않는다
3. 애플리케이션 실행 — Spring이 개입하기 시작한다
단계
수행 주체
역할
4. Bean 생성 — 아직은 순수 객체다
5. BeanPostProcessor — AOP 적용 판단
내부에서 하는 일
6. 다이나믹 프록시 — 언제 만들어지는가?
6.1 인터페이스 분석
6.2 프록시 바이트코드 생성
6.3 defineClass — 실행 중 클래스 정의
6.4 프록시 인스턴스 생성
다이나믹 프록시와 리플렉션 (Part 2)
요약
1) “메서드를 호출하면 프록시가 대신 호출된다”는 말의 정확한 의미
2) 프록시 클래스 내부는 어떤 모양인가
3) InvocationHandler는 무엇을 하는가 (그리고 무엇을 하지 않는가)
4) Method 객체는 무엇인가 (문자열이 아니다)
5) 리플렉션은 정확히 어디서 발생하는가
6) 호출 흐름을 코드로 끝까지 재현해보기
Last updated