AOP(Aspect Oriented Programming) 이해


AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍을 의미한다. 부가 기능(advice)을 동적(프로그램이 실행되면서 자동 추가)으로 추가해주는 기술이고, 좀 더 구체적으로 보자면 메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가해주는 것이다.

 

※ 횡단 관심사? 서로 다른 계층, 모듈 등에도 공통적으로 쓰이는 것을 표현한 것(Logging, Transaction, Security 등)

 

다음은 AOP를 이용한 공통 코드의 분리에 대한 예제 코드이다.

 

void aaa() {
    System.out.println("[before]{");
    System.out.println("aaa() is called.");
    System.out.println("}[after]");
}
void aaa2() {
    System.out.println("[before]{");
    System.out.println("aaa2() is called.");
    System.out.println("}[after]");
}
void bbb() {
    System.out.println("[before]{");
    System.out.println("bbb() is called.");
    System.out.println("}[after]");
}
class MyAdvice {
    Pattern p = Pattern.compile("a.*");

    boolean matches(Method m){
        Matcher matcher = p.matcher(m.getName());
        return matcher.matches();
    }

    void invoke(Method m, Object obj, Object... args) throws Exception {
        if(m.getAnnotation(Transactional.class)!=null)
            System.out.println("[before]{");

        m.invoke(obj, args); // aaa(), aaa2(), bbb() 호출가능

        if(m.getAnnotation(Transactional.class)!=null)
            System.out.println("}[after]");
    }
}

class MyClass {
    @Transactional
    void aaa() {
        System.out.println("aaa() is called.");
    }
    void aaa2() {
        System.out.println("aaa2() is called.");
    }
    void bbb() {
        System.out.println("bbb() is called.");
    }
}

 

위 코드 블럭을 먼저 살펴보면 [before]와 [after]를 출력해주는 코드가 앞뒤로 계속 반복되고 있음을 볼 수 있다. 따라서 핵심 기능을 수행해줄 클래스와 부가 기능을 수행해줄 클래스로 나누고 이를 동적으로 추가해줄 수 있도록 아래 코드 블럭과 같이 작성한다. 그러면 invoke 메서드를 이용해 동적으로 핵심 기능을 수행하는 각 aaa(), aaa2(), bbb() 메서드가 호출되면서 앞뒤로 부가 기능 코드(advice)가 붙게 된다.

 

이때 패턴을 통해서 특정 메서드만 호출시켜줄 수도 있다. 위 코드에서는 @Transactional 어노테이션이 붙은 메서드만 호출하도록 패턴을 지정해주었다.

 

부가 기능 코드(advice)를 자동으로 추가할 때 코드 중간에는 추가해주는 것이 불가능한데, 그 이유는 메서드마다 코드 라인 수가 다르고 메서드의 내용이 바뀔 수 있기 때문이다. 따라서 맨 앞과 맨 끝(return문이 있을 경우에는 return문 바로 위)에 추각해줄 수 있도록 한다.

 

 

 

 

AOP 관련 용어와 Advice의 종류


 

AOP 관련 용어

 

용어 설명
target advice가 추가 될 객체
advice target에 동적으로 추가 될 부가 기능(코드)
proxy target에 advice가 동적으로 추가되어 생성된 객체
weaving target에 advice를 추가해서 proxy를 생성하는 것
join point advice가 추가(join) 될 대상(메서드)
pointcut join point들을 정의한 패턴

 

※ pointcut expression => advice가 추가될 메서드를 지정하기 위한 패턴

      execution(반환타입 패키지명.클래스명.메서드명(매개변수 목록))

 

 

Advice의 종류 => Advice의 설정은 XML과 어노테이션, 두 가지 방법으로 가능(다음의 표는 어노테이션의 종류)

 

종류 어노테이션 설명
around advice @Around 메서드의 시작과 끝 부분에 추가되는 부가 기능
before advice @Before 메서드의 시작 부분에 추가되는 부가 기능
after advice @After 메서드의 끝 부분에 추가되는 부가 기능
after returning @AfterReturning 예외가 발생하지 않았을 때, 실행되는 부가 기능(try 블럭 내의 끝)
after throwing @AfterThrowing 예외가 발생했을 때, 실행되는 부가 기능(catch 블럭 내의 끝)

 

+ Recent posts