Aspect : 어플리케이션의 여러위치에흩어져있고, 일반적으로 실제 비즈니스 로직(예. 트랜잭션 관리, 캐싱)과 다른 표준 코드, 기능이다. 각 Aspect는 Cross-Cutting 기능에 중점을 둔다. (여러 객체에 공통 적용되는 부가 기능의 관심사항)(cf. 핵심로직)
Joinpoint: 프로그램 실행 중 특정 지점이다. (예. 메서드 실행, 생성자 호출, 또는 필드 할당 )
Advice: 특정 Joinpoint에서 Aspect가 취한 조치
Pointcut: Joinpoint과일치하는 정규식,Joinpoint가 Pointcut과 일치할때마다 해당Pointcut과 관련된 지정된 Advice가 실행된다.
Weaving: Advice된 객체를 생성하기 위해 대상 객체와 Aspect을 연결하는 프로세스이다.
Spring AOP 와 AsepctJ
기능 및 목표
Spring AOP
Spring Ioc 전반에 걸쳐 간단한 AOP 구현을 제공하는 것을 목표.
→ 완전한 AOP 솔루션으로 의도된 것이 아니다.
→ Spring 컨테이너에 의해 관리되는 빈에만 적용할 수 있다.
AspectJ
완전한 AOP 솔루션을 제공하는 것을 목표로 하는 독창적인 AOP
SpringAOP 보다 강력하지만 훨씬 복잡하다.
AspectJ 는 모든 도메인 객체에 적용될 수 있다.
Weaving
AspectJ와 Spring AOP는 성능 및 사용 편의성과 관련하여 동작에 영향을 미치는 다른 유형의 Weaving을 사용한다.
Spring AOP
Runtime weaving 을 사용을 한다. 프록시패턴을 기반으로 한다.
→ 즉, 대상 객체에 Aspect 를 적용하기 위해 대상 객체의 Proxy 를 생성한다.
Runtime weaving: Aspect 가 대상 객체의 Proxy(JDK 동적 Proxy 나 CGLIB 의 Proxy)를 실행시 Weaving 된다.
Spring AOP는 사용자의 특정 호출 시점에 IoC 컨테이너에 의해 AOP를 할 수 있는 Proxy Bean을 생성해준다. 동적으로 생성된 Proxy Bean은 타깃의 메소드가 호출되는 시점에 부가기능을 추가할 메소드를 자체적으로 판단하고 가로채어 부가기능을 주입해준다. 이처럼 호출 시점에 동적으로 위빙을 한다 하여 런타임 위빙(Runtime Weaving)이라 한다
JDK Dynamic Proxy vs CGLIB
JDK 는 인터페이스 기반, CGLIB 는 클래스 기반 ( 클래스의 바이트코드 조작) 으로 프록시를 생성한다.
Spring AOP에서는 이때 만약 타깃이 하나 이상의 인터페이스를 구현하고 있는 클래스라면JDK Dynamic Proxy의 방식으로 생성되고 인터페이스를 구현하지 않은 클래스라면CGLIB의 방식으로 AOP 프록시를 생성한다
Spring AOP 와 AspectJ 의 차이가 뭘까 ?
AOP 의 개념
Aspect
: 어플리케이션의 여러위치에흩어져있고, 일반적으로 실제 비즈니스 로직(예. 트랜잭션 관리, 캐싱)과 다른 표준 코드, 기능이다. 각Aspect
는 Cross-Cutting 기능에 중점을 둔다. (여러 객체에 공통 적용되는 부가 기능의 관심사항)(cf. 핵심로직)Joinpoint
: 프로그램 실행 중 특정 지점이다. (예. 메서드 실행, 생성자 호출, 또는 필드 할당 )Advice
: 특정Joinpoint
에서 Aspect가 취한 조치Pointcut
:Joinpoint
과일치하는 정규식,Joinpoint
가Pointcut
과 일치할때마다 해당Pointcut
과 관련된 지정된Advice
가 실행된다.Weaving
:Advice
된 객체를 생성하기 위해 대상 객체와Aspect
을 연결하는 프로세스이다.Spring AOP 와 AsepctJ
기능 및 목표
Spring AOP
Spring Ioc 전반에 걸쳐 간단한 AOP 구현을 제공하는 것을 목표.
→ 완전한 AOP 솔루션으로 의도된 것이 아니다.
→ Spring 컨테이너에 의해 관리되는 빈에만 적용할 수 있다.
AspectJ
Weaving
AspectJ와 Spring AOP는 성능 및 사용 편의성과 관련하여 동작에 영향을 미치는 다른 유형의 Weaving을 사용한다.
Spring AOP
Runtime weaving 을 사용을 한다. 프록시패턴을 기반으로 한다.
→ 즉, 대상 객체에 Aspect 를 적용하기 위해 대상 객체의 Proxy 를 생성한다.
Aspect
가 대상 객체의 Proxy(JDK 동적 Proxy 나 CGLIB 의 Proxy)를 실행시 Weaving 된다.JDK Dynamic Proxy
vsCGLIB
Spring AOP에서는 이때 만약 타깃이 하나 이상의 인터페이스를 구현하고 있는 클래스라면
JDK Dynamic Proxy
의 방식으로 생성되고 인터페이스를 구현하지 않은 클래스라면CGLIB
의 방식으로 AOP 프록시를 생성한다JDK Dynamic Proxy와 CGLIB의 차이점은 무엇일까?
AspectJ
AspectJ 는 3가지 유형의 weaving 을 사용한다.
Compile-time Weaving
Post-compile Weaving
Load-Time Weaving
→ 즉, 런타임에는 아무것도 안한다.!!
JointPoint
Cross-Cutting Concerns
과Aspect
를 적용 할 수 없다. 런타임 예외가 한다.static
과final
메서드에도 동일하다. Spring Aspect는 그 메서드들이 오버라이드될 수 없기 때문에 적용될 수 없다. 이러한 한계 때문에 Spring AOP는 메서드 실행에만 Joinpoint를 지원한다.Cross-Cutting Concerns
를Weaving
하기 때문에 더 많은 JoinPoint 를 지원한다.성능
결론