JAVA · 객체지향
프록시 패턴 (동적 프록시)
Java의 Proxy API로 동적 프록시를 만들어 AOP 기능을 구현합니다.
객체지향고급Proxy동적프록시InvocationHandlerAOP
핵심 설명
Java의 Proxy API로 동적 프록시를 만들어 AOP 기능을 구현합니다.
Java code
import java.lang.reflect.*;
interface UserService {
String findUser(String id);
void saveUser(String name);
}
class UserServiceImpl implements UserService {
public String findUser(String id) { return "User-" + id; }
public void saveUser(String name) { System.out.println("저장: " + name); }
}
// InvocationHandler — 모든 메서드 호출을 가로챔
class LoggingHandler implements InvocationHandler {
private final Object target;
LoggingHandler(Object target) { this.target = target; }
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.printf("[LOG] %s 호출, 인자: %s%n",
method.getName(), java.util.Arrays.toString(args));
long start = System.nanoTime();
Object result = method.invoke(target, args);
long elapsed = System.nanoTime() - start;
System.out.printf("[LOG] %s 완료 (%dns)%n", method.getName(), elapsed);
return result;
}
}
class Main {
public static void main(String[] args) {
UserService real = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
UserService.class.getClassLoader(),
new Class[]{UserService.class},
new LoggingHandler(real));
System.out.println(proxy.findUser("123"));
proxy.saveUser("홍길동");
}
}학습 팁
동적 프록시는 인터페이스 기반으로만 동작합니다. 클래스 프록시가 필요하면 CGLIB이나 ByteBuddy를 사용하세요.
주의할 점
InvocationHandler에서 method.invoke(proxy, args)를 호출하면 무한 재귀가 발생합니다. 반드시 target을 전달하세요.
자주 묻는 질문
프록시 패턴 (동적 프록시)란 무엇인가요?
Java의 Proxy API로 동적 프록시를 만들어 AOP 기능을 구현합니다.
프록시 패턴 (동적 프록시) 학습 시 주의할 점은 무엇인가요?
InvocationHandler에서 method.invoke(proxy, args) 를 호출하면 무한 재귀가 발생합니다. 반드시 target 을 전달하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.