PHpullh
학습 라이브러리/Java/AOP(관점 지향 프로그래밍) 원리

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 문제라고 합니다.