널리
쓰이는 AOP
프레임워크
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍
실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)
-
AspectJ(http://eclipse.org/aspectj)
-
JBOSS AOP
-
Spring AOP
Spring과
AspectJ의
결합으로 시너지 가능
Spring은
아래 4가지
형태로 AOP
지원
-Proxy
기반
AOP(Spring모든
버전에서 지원)
-@AspectJ
애너테이션
기반 Aspect(Spring
2.0 이상
지원)
-순수
POJO
Aspect(Spring
2.0 이상
지원)
-AspectJ
애스팩트에
빈 주입(Spring
모든
버전에서 지원)
Spring
AOP는
메소드 가로채기로 제한,
만약
그이상의
기능
(생성자
또는 멤버변수에 대한
가로채기)을
필요로 하는 경우 Proxy
기반
AOP
대신
AspectJ를
이용해서 Aspect를
구현해야
한다.
§스프링의
충고(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)만
제공한다
댓글 없음:
댓글 쓰기