JAVA · 디자인패턴
AOP(관점 지향 프로그래밍) 원리
횡단 관심사를 분리하는 AOP의 원리를 프록시로 구현합니다.
디자인패턴고급AOP프록시횡단관심사어노테이션
핵심 설명
횡단 관심사를 분리하는 AOP의 원리를 프록시로 구현합니다.
Java code
import java.lang.reflect.*;
import java.lang.annotation.*;
// 커스텀 어노테이션
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Logged {}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Timed {}
interface OrderService {
@Logged @Timed
String placeOrder(String item);
}
class OrderServiceImpl implements OrderService {
public String placeOrder(String item) {
return "주문완료: " + item;
}
}
// AOP 프록시 핸들러
class AOPHandler implements InvocationHandler {
private final Object target;
AOPHandler(Object target) { this.target = target; }
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method targetMethod = target.getClass().getMethod(
method.getName(), method.getParameterTypes());
// @Logged 처리
if (targetMethod.isAnnotationPresent(Logged.class)) {
System.out.printf("[LOG] %s(%s)%n",
method.getName(), java.util.Arrays.toString(args));
}
// @Timed 처리
long start = 0;
if (targetMethod.isAnnotationPresent(Timed.class)) {
start = System.nanoTime();
}
Object result = method.invoke(target, args);
if (start > 0) {
System.out.printf("[TIME] %s: %dns%n",
method.getName(), System.nanoTime() - start);
}
return result;
}
}
class Main {
public static void main(String[] args) {
OrderService service = (OrderService) Proxy.newProxyInstance(
OrderService.class.getClassLoader(),
new Class[]{OrderService.class},
new AOPHandler(new OrderServiceImpl()));
System.out.println(service.placeOrder("노트북"));
}
}학습 팁
Spring AOP는 이와 동일한 원리로 동작합니다. @Transactional, @Cacheable 등이 모두 프록시 기반 AOP입니다.
주의할 점
Spring AOP에서 같은 클래스 내부의 메서드 호출은 프록시를 거치지 않아 AOP가 적용되지 않습니다. 이를 self-invocation 문제라고 합니다.
자주 묻는 질문
AOP(관점 지향 프로그래밍) 원리란 무엇인가요?
횡단 관심사를 분리하는 AOP의 원리를 프록시로 구현합니다.
AOP(관점 지향 프로그래밍) 원리 학습 시 주의할 점은 무엇인가요?
Spring AOP에서 같은 클래스 내부의 메서드 호출은 프록시를 거치지 않아 AOP가 적용되지 않습니다. 이를 self-invocation 문제라고 합니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.