Spring | AOP 이용 | AOP 실행하기

자, 이제 겨우 준비가 되었다. 그러면 실제로 AOP를 사용하여 보도록 하자. com.devkuma.spring.aop 패키지에 “App"클래스를 만들고 아래와 같이 소스 코드로 작성하자.

package com.devkuma.spring.aop;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
 
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
         
        SampleAopBean bean1 = (SampleAopBean) app.getBean("sampleAopBean");
        bean1.printMessage();
 
        System.out.println("--------------------");
 
        SampleAopBean bean2 = (SampleAopBean) app.getBean("proxyFactoryBean");
        bean2.printMessage();
    }
 
}

실행하면 bean.xml에서 SampleAopBean를 얻어 printMessage을 실행하는데, 자세히 보면 2번 반복하고 있다.

첫 번째 SampleAopBean는 getBean(“sampleAopBean”)에서 Bean을 얻고 있다. 이것은 지금까지대로의 방식이다. 그리고 두 번째는 getBean(“proxyFactoryBean”)에서 Bean을 얻고 있다. 이것으로얻어지는 Bean이 ProxyFactoryBean처럼 생각되지만, 정확히 SampleAopBean에 캐스팅하고 SampleBean으로서 기능을 한다.

이것은 ProxyFactoryBean의 신기한 기능이다. 이 Bean은 target 속성에 지정된 Bean으로 얻어 올 수 있는 것이 가능하다는 것이다.

그럼 얻어온 SampleAopBean의 printMessage를 호출 처리는 어떤 출력을하고있는 것일까? 보면 이렇게 되어 있는 것이다.

message : [this is AOP bean!]
--------------------
* before : printMessage [com.devkuma.spring.aop.SampleAopBean@de3a06f]
message : [this is AOP bean!]
* after : printMessage [com.devkuma.spring.aop.SampleAopBean@de3a06f]

첫 번째 SampleAopBean은 단순히 printMessage의 출력이 될뿐이다. 하지만 두 번째 SampleAopBean는 printMessage의 실행 전후에 SampleMethodAdvice 클래스에 제공되는 before / afterReturning의 실행 결과가 삽입되어 있는 것을 알 수 있다. 메소드의 실행 전후에 자동으로 다른 처리가 추가되어 있는 것이다.

이것이 AOP의 위력이다. getBean로 취득하는 Bean을 ProxyFactoryBean로 하는 것은 이런 방식으로 자동 처리가 추가 될 수 있다. 불필요하게 되면 getBean 인수를 SampleAopBean으로 돌아가면 된다.