모종닷컴

Spring AOP vs AspectJ 본문

Programming/Spring

Spring AOP vs AspectJ

모종 2022. 7. 27. 22:25
반응형

AOP 주요 용어 알아보자.

용어 의미
Joinpoint Advice를 적용 가능한 지점을 의미. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당
Pointcut Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타낸다.
Advice 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다.
ex) 메서드 호출 전, 후
Weaving Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. 코드를 핵심 로직 코드에 삽입하는 것이 weaving
Aspect 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. 

Spring AOP와 AspectJ의 목표는 다르다.

Spring AOP는 프로그래머가 직면하는 가장 일반적인 문제를 해결하기 위해 Spring IoC 전반에 걸쳐 간단한 AOP 구현을 제공하는 것을 목표로 합니다. 완전한 AOP 솔루션으로 의도된 것이 아닙니다. Spring 컨테이너에 의해 관리되는 빈에만 적용할 수 있습니다.

반면 AspectJ는 완전한 AOP 솔루션을 제공하는 것을 목표로 하는 독창적인 AOP 기술입니다.Spring AOP보다 강력하지만 훨씬 더 복잡합니다. AspectJ가 모든 도메인 객체에 적용될 수 있다는 점도 주목할 가치가 있습니다.

Weaving 타입

Spring AOP와 AspectJ는 성능 및 사용 용이성과 관련된 동작에 영향을 미치는 서로 다른 유형의 위빙을 사용합니다. Spring AOP는 런타임 위빙이고 AspectJ는 컴파일 위빙과 바이너리 위빙(Post-Compile), 로드 타임 위빙 등이 있습니다.

런타임 위빙 : 어플리케이션이 JDK Dynamic Proxy 혹은 CGLIB을 사용하여 만들어진 프록시 클래스를 사용할 때 Aspect가 코드에 삽입된다는 것을 의미합니다.

컴파일 타임 위빙 : AspectJ 컴파일러는 Aspect의 소스 코드와 응용 프로그램 모두를 입력으로 받아들이고 위빙된 클래스 파일을 출력으로 생성합니다.

바이너리 위빙 : 기존 클래스 파일과 JAR 파일에 Aspect를 위빙합니다.

로드 타임 위빙 : 바이너리 위빙과 정확히 동일하며, 클래스 로더가 클래스 파일을 JVM에 로드할 때까지 위빙이 연기된다는 차이점이 있다.

구조

스프링 AOP는 프록시 기반의 AOP 프레임워크이다. 이것은 프록시가 항상 존재해야 함을 의미하며 런타임에 진행된다는 것을 알 수 있다.

반면 AspectJ는 클래스에 Aspect가 직접 컴파일되기 때문에 런타임에 아무것도 할 필요가 없다.

스프링 AOP의 제한

스프링 AOP

  • 프록시 기반이기에 타겟 클래스의 하위 클래스가 항상 필요하며, 횡단 관심사를 적절하게 적용해야 한다.
  • final이 붙은 클래스에는 aspect 적용을 할 수가 없다.
  • static, final 메서드 또한 aspect를 적용할 수 없다.
  • 아마도 스프링 AOP는 이러한 제한들로 인해 메서드 실행 조인포인트만 지원되는 것 같다.

AspectJ

  • 런타임 전에 실제 코드에 Aspect를 적용해버린다.
  • 하위 클래스가 필요 없다.
  • 스프링 AOP와 달리 여러 조인포인트가 지원된다. ex) 메서드 호출, 생성자 호출, 생성자 실행, 필드 참조, 필드 지정... 엄청 많다.

성능

성능에 대해서는 컴파일 타임 위빙이 런타임 위빙보다 훨씬 빠릅니다. Spring AOP는 프록시 기반 프레임워크이므로 애플리케이션 시작 시 프록시 생성이 있습니다. 또한 Aspect 마다 메서드 invocation이 좀 더 있어서 성능에 부정적인 영향을 미치는 면도 있습니다.

반면 AspectJ는 애플리케이션이 실행되기 전에 Aspect를 코드에 위빙하기 때문에 Spring AOP와 달리 추가적인 런타임 오버헤드가 없다. 

 

참조

https://www.baeldung.com/spring-aop-vs-aspectj

반응형