2013년 7월 23일 화요일

[Spring Framework3.2강좌]Spring AOP란(용어, 구현방법, 애스팩트, 프록시등)

스프링의 충고(Advice)는 자바로 작성

 - Pointcut의 경우 Advice를 어디에 적용할지를 정의하는 데 보통 XML 설정 파일
   에서 한다.

 - AspectJ는 자바언어를 확장한 형태로 구현. 새로운 도구와 문법을 배워야 한다.
스프링의 Aspect는 실행시간에 만들어진다.

 - 빈을 감싸는 Proxy 객체를 실행시간에 생성하므로 Aspect가 Spring 관련 빈에 위빙(Weaving)된다. Proxy 객체는 terget 객체로 위장해서 메소드의 호출을 가로채고,  target  객체로 호출을 전달한다.

 - 애플리케이션이 실제 Proxy 객체를 필요로 할 때까지 target를 생성하지 않으므로 즉 Proxy가 실시간으로 생성되므로 Aspect를 위빙 하기 위해 별도 컴파일러가 필요 없다.

스프링에서 Proxy 객체를 생성하는 방법은 2가지.
 
  1. 대상 객체가 특정 메소드를 공개하는 인터페이스를 구현한다면 JDK의  java.lang.reflect.Proxy 클래스를 이용하며 이 클래스는 필요한 인터페이스를 구현한 새로운 Proxy 객체를 동적으로 생성할 수 있으며 target 객체의 인터페이스를 통한 호출은 모두 가로채서 Advice를 수행한다.
 
  2. 대상 클래스가 어떤 인터페이스를 구현하고 있지 않다면 CGLIB이라는 라이브러리를 이용하여 대상클래스의 서브클래스를 생성 시킨다. 이 서브클래스를 생성시킴으로써 스프링은 충고를 엮을 수 있으며 서브클래스에 대한 호출을 대상 클래스에 위임 할 수 있다. 이런 유형의 프록시를 생성시에는 spring 배포 본의 lib/cglib 아래 모든 JAR 파일을 추가해야 한다. 이 경우 final 메소드는 충고를 받을 수 없으며(final Method는 대상클래스의 서브클래스를 생성해서 메소드를 재정의 해야 하는데 final인 경우 곤란함) 애플리케이션이 좀 더 느슨하게 결합되게 하기 위해 이 방법보단 인터페이스를 통해 프록시를 만드는 것이 선호된다.
스프링은 AOP연맹의  인터페이스를 구현한다.

스프링은 메소드 호출 결합점(Join Point)만 제공한다.
 
스프링의 애스팩트
 
  1. 스프링의 AOP에서 애스팩트는 Advisor 인터페이스를 구현한 클래스의 인스턴스로 표시
 
  2. 스프링의 이러한 Advisor를 구현한 몇 개의 클래스를 제공한다.

  3. Advisor의 하위 인터페이스로는 IntroductionAdvisor, PointcutAdvisor 인데 PointcutAdvisor 인터페이스는 포인트컷을 사용하여 조인포인트에 어드바이스를 적용하는 모든 Advisor가 구현한다.

댓글 없음:

댓글 쓰기