Spring

AOP의 정의와 특징, 구현(Spring AOP,AspectJ)

KimGeonWoo 2023. 8. 30. 06:36

지난 포스팅에서 AOP의 구조는 프록시형태로 구성되어있으며, 해당 프록시들을 관리하는 방법은

CGLib와 JDK Dynamic Proxy가 있으며 각각의 차이점이 있다고 작성하였습니다.

이번 포스팅에서는 스프링 프레임워크에서 AOP를 구현하는 방식에는 대표적으로 어떤 방법이 있는지,

그리고 각각의 특징 및 차이점은 무엇인지 알아보겠습니다.

 

AOP(Aspect Orient Programming)

 

정의

AOP란 핵심적인 기능(비즈니스 로직)에서 부가적인 기능을 분리한 Aspect를 모듈화하여 개발하는 방법입니다.

스프링 프레임워크 3가지 특징 중 AOP는 자바 어플리케이션 개발 환경에서 웹 계층, 비즈니스 계층 등의 여러가지 레이어에서 나타나는 보안,로깅,캐싱과 같은 공통적인 로직(Cross-Cutting-Concern)을 모듈화 하여 개발시 코드의 유지보수 및 간결화를 하기위해 고안된 방법입니다.

즉, 어플리케이션을 독립적으로 모델링하고 설계하여 개발할 수 있도록 만드는 방법입니다.

 

특징 및 장점

  • 비 침투적 : 기술이 코드에 직접 반영되지 않으며, 코드의 설계와 구현방식을 제한하지 않는다.
  • AOP를 사용하여 관점들을 분리. 느슨한 결합성을 유지시키며 복잡성을 감소시킨다.
  • 다이나믹 프록시, AspectJ등을 통한 조인포인트를 제공하여 OOP의 기술적인 한계와 단점들을 보완시켜주는 보조적인 기술이다.

관련 용어

조인 포인트(JoinPoint)

  • 어드바이스의 적용가능 지점
  • 타깃 오브젝트가 구현한 인터페이스의 모든 메서드

어드바이스(Advice)

  • 타깃의 특정 조인포인트에 제공할 부가기능을 담은 오브젝트
  • 어드바이스가 호출되는 위치에 따라 Before, After, Around, After Throwing, After Returning등이 있다.

포인트컷(PointCut)

  • 어드바이스를 적용할 메서드 선정 알고리즘을 담은 오브젝트 (Method Matcher)
  • 빈이 프록시 적용대상인지 확인하는 클래스 필터 (Class Filter)

타깃(Target Object)

  • 어드바이스가 적용되는 오브젝트
  • 핵심기능을 담고있는 모듈이며 부가기능(Aspect)를 부여할 대상

에스펙트,관점(Aspect)

  • 어드바이스 + 포인트컷
  • 싱글톤 형태의 오브젝트이며 AOP의 기본 모듈이다

위빙(Weaving)

  • 포인트컷에 의해 결정된 타깃 오브젝트의 조인포인트에 어드바이스를 적용하는 과정

Spring AOP 와 AspectJ

Spring AOP와 AspectJ는 스프링 프레임워크에서 AOP를 구현하는데에 있어 사용할 수 있는 구현 방식중 하나입니다.

두가지의 구현 방식의 장점과 단점들에 대하여 알아보겠습니다.

 

Spring AOP

스프링 프레임워크에서 제공하며, Dynamic Proxy, CGLib Proxy를 사용한 프록시 생성, 메서드 실행의 전후의 조인포인트에 어드바이스를 삽입하는 방식으로 AOP를 구현합니다

즉, 런타임 환경에서 위빙을하는 런타임 위빙의 방식입니다.

 

장점

  • 스프링 프레임워크의 일부 기능으로 추가적인 컴파일러가 필요없어 AspectJ에 비하여 더 간단하다.
  • JDK Dynamic Proxy 또는 CGLib를 사용하여 인터페이스와 클래스 모두에 AOP를 적용할 수 있다.
  • XML을 통하여 설정을 하거나 @Aspect 어노테이션을 사용하여 설정할 수 있다.

단점

  • 프록시 기반 AOP이므로 런타임시. 즉, 메서드 실행 전후에서만 조인포인트를 사용할 수 있다.
  • 동일한 클래스 내에서 다른 메서드를 호출하면 Aspect가 적용되지 않는다.
  • Spring AOP는 Spring 컨테이너에게 제어받는 Bean에게만 적용이 가능하다.

 

AspectJ

AspectJ는 자바언어를 기반으로 완전한 AOP 솔루션을 제공하는 독립적인 라이브러리입니다.

바이트코드형태의 생성과 조작을 통해 AOP를 구현하며, Target오브젝트에 명시적인 코드로 부가적인 기능을 직접 넣어주는 방식입니다.

 

장점

  • 모든 조인포인트를 지원한다.
  • AsepctJ Compiler(ajc)를 사용하여 컴파일 하기 때문에 런타임 시에는 아무것도 하지않는다. 런타임 오버헤드가 적다.
  • 컴파일 시점, 컴파일 후, 로드시점 위빙의 3가지 방식의 위빙을 사용할 수 있다.
  • Spring AOP는 스프링 컨테이너에 있는 빈에게만 사용가능하지만, AspectJ는 모든 오브젝트에 가능하다.

단점

  • AJC를 사용하여 추가 빌드프로세스가 필요하거나 로드시점의 LTW 위빙을 설정해야한다.
  • 컴파일러와 라이브러리를 추가해야한다. 즉 Spring AOP보다 구현방식이 더 어렵고 복잡성이 높다.
  • AJC를 사용한 컴파일을 하기때문에 런타임 위빙은 불가능하다.

 

Spring AOP vs AspectJ

  Spring AOP AspectJ
조인포인트 메서드 실행시에 가능 모든 조인포인트 지원
위빙 런타임 위빙만 지원 컴파일 시점, 컴파일 후, 로드시점의 위빙 지원
적용 대상 스프링 컨테이너에 제어받는 빈 모든 오브젝트
Aspect 적용  메서드 단위에만 적용 가능 필드,메서드,생성자, final클래스/메서드 등을 지원
성능 AspectJ에 비해 훨씬 느리다 Spring AOP에 비해 빠르다
복잡성 XML 혹은 어노테이션을 통해 간단한 설정이 가능, 프록시 패턴을 활용하여 복잡성이 낮다. AJC컴파일러와 라이브러리 패키징이 필요하다.

 

느낀점

저번 포스팅에 이어 이번 포스팅에서는 스프링 프레임워크에서 AOP가 어떻게 객체를 관리하는지와 AOP를 어떻게 구현하는지에 대한 방법들에 대해 알아보았습니다.

지금까지의 이론적인 지식은 책을 통하여 학습을 하였는데, 자바 언어와 스프링을 학습을 시작한지 오래되지 않은 저로써는 학습중 새로나오는 용어들에 대하여 처음 접근하거나 햇갈리는 부분들이 많았습니다.

하지만 개발블로그를 작성하기위해 다양한 방법들을 통하여 학습을 하여 책과 동영상들에 대한 이해도가 더 높아졌습니다. 

처음에는 많은 개발자 분들이 개발블로그를 작성하는것에 대해 이해가 안가는 부분들이 있었지만 스프링 프레임워크에 대한 학습을 하며 개발블로그를 작성하는것이 저에게 있어서도 얼마나 도움이 되는지 다시한번 깨닫게 된것같습니다.

 

 

 

 

 

출처 및 참고내역

https://shlee0882.tistory.com/206

https://scshim.tistory.com/429

https://www.springcloud.io/post/2023-02/spring-aop-vs-aspectj/#gsc.tab=0

https://ehdvudee.tistory.com/22

https://stackoverflow.com/questions/1606559/spring-aop-vs-aspectj