12. AOP(1)

8916 단어 SpringSpring

AOP(1)


AOPAspect Oriented Programming관점 지향 프로그래밍을 뜻합니다. 이 관점 지향 프로그래밍은 다양한 로직이 있을 때 이것들을 횡단 관심사 기준을 나누고 중복되는 로직들을 분리해주는 것입니다. 가장 대표적인 예로는 transaction 관리가 있습니다. dao의 경우 transaction 관리를 해주기 위해서 autoCommit을 false로 설정해주고 문제가 없을시 commit, 예외 발생시 rollback을 시킨다는 중복되는 로직이 필요합니다. 이때 이 부분을 AOP를 적용해서 분리해주는 것입니다.

AOP는 join point 기준으로 before(join point 전), after(join point 후), around(join point 전,후)로 크게 어드바이스 구분 가능합니다. 물론 상세하게 따지면 총 5개의 어드바이스가 존재합니다. 스프링에서 AOP를 사용할 때 주의해야할 것은 AOP는 원래 메소드 뿐 아니라 클래스, 필드등 광범위하게 적용되지만 SpringAOP는 메소드만 지원한다는 것입니다.

AOP Proxies


AOP Proxies란 A라는 클래스가 있을경우 AProxy라는 클래스로 A를 감쌉니다. 그리고 A를 실행하기 위해서 외부에서는 AProxy를 동작시키고 AProxy는 특정코드를 동작시킨후 A를 동작시키는 식(물론 A를 동작시키고 어떠한 동작 실행도 가능)의 처리를 해주는 것이 AOP Proxies입니다. 아래의 예를 보여드리겠습니다.

package kr.co.fast.cli.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;

public class Main {
    public static void main(String[] args) {
        ProxyFactory factory = new ProxyFactory(new SimplePojo());
        factory.addInterface(Pojo.class);
        factory.addAdvice(new RetryAdvice());
        Pojo pojo = (Pojo) factory.getProxy();
        System.out.println(">>>>");
        pojo.foo();
        System.out.println(">>>>");
    }
}

class RetryAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("before");
        Object proceed = methodInvocation.proceed(); // 이때 foo는 실행
        System.out.println("after");
        return proceed;
        // return null; -> foo 실행 X
        // return methodInvocation.proceed(); -> foo 실행
    }
}

interface Pojo {
    void foo();
}

class SimplePojo implements Pojo {

    @Override
    public void foo() {
        System.out.println("run foo");
    }
}

좋은 웹페이지 즐겨찾기