SpringFramework

[Spring] AOP(Aspect Oriented Programming)와 동작방식

마디니 2022. 2. 24. 21:37
반응형

AOP(Aspect Oriented Programming)란?

Aspect란, 그 자체로 애플리케이션의 핵심기능을 담고 있지는 않지만, 애플리케이션을 구성하는 중요한 한가지 요소이고, 핵심기능에 부가되어 의미를 갖는 특별한 모듈을 가리킨다.(대표적인 예로 로깅이나 트랜잭션과 같은 기능이 있다.)

 

대게 애플리케이션은 핵심기능과 여러 부가기능들이 함께 어우러져서 동작하게 되어있다. 따라서 런타임시에는 각 부가기능 애스펙트가 자기가 필요한 위치에서 dynamic하게 참여한다. 하지만 설계와 개발은 서로 다른 특성을 띈 애스펙트들을 독립적인 관점으로 작성할 수 있다.


그리고 이렇게 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 관점지향프로그래밍(Aspect Oriented Programming) 또는 줄여서 AOP 라고 말한다.

애스펙트는 부가될 기능을 정의한 코드인 어드바이스와, 어드바이스를 어디에 적용할지를 결정하는 포인트컷을 함께 갖고 있다.

AOP 관련 용어 정리

  • 타킷(target)
    타깃은 부가 기능을 부여할 대상을 말한다. 핵심기능이 있는 클래스나 다른 부가기능을 제공하는 프록시 객체일 수 있다.
  • 어드바이스(advice)
    타깃에게 제공할 부가기능을 담은 모듈이다. 메소드 호출과정에 전반적으로 참여하는 것도 있지만, 예외가 발생했을때만 동작하는 어드바이스처럼 메소드 호출 일부에서만 동작하는 어드바이스도 있다.
  • 조인포인트(joinpoint)
    어드바이스가 적용될 수 있는 위치를 말한다. 즉, 메소드의 실행 단계이다.
  • 포인트컷(pointcut)
    어드바이스를 적용할 조인포인트를 선별하는 작업 또는 그 기능을 정의한 모듈을 말한다.
    대게 표현식으로 메소드의 시그니처를 비교하는 방법을 주로 이용해 메소드를 선정하는 과정을 거치게 된다.
  • 프록시(Proxy)
    프록시는 클라이언트와 타깃 사이에 투명하게 존재하면서 부가기능을 제공하는 오브젝트다. DI를 통해 타깃 대신 클라이언트에게 주입되며, 클라이언트의 메소드 호출을 대신 받아서 타깃에 위임해주면서 그 과정에서 부가기능을 부여한다.
  • 애스펙트(aspect)
    aop의 기본 모듈이다. 한개 또는 그 이상의 포인트컷과 아더바이스의 조합으로 만들어지며 보통 싱글톤 형태의 오브젝트로 존재한다.

AOP 동작원리

스프링은 데코레이터 패턴, Ioc/DI등 다양한 기술을 조합해 AOP를 지원하고 있다. 그중에서도 가장 핵심은 프록시의 사용이다.

프록시로 만들어 DI로 연결된 빈 사이에 적용해 타깃의 메소드 호출 과정에 참여해 부가기능을 제공한다.

 

출처:https://docs.spring.io/spring-framework/docs/2.5.x/reference/aop.html#aop-understanding-aop-proxies

 

위 그림에서 보듯이 프록시는 마치 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서  클라이언트의 요청을 받고,

실제 타깃 오브젝트의 핵심 기능으로 요청을 위임해 준다. 그리고  요청을 위임해주는 과정에서 자신이 가진 부가적인 기능을 적용해 줄 수 있다. 

 

스프링에서는 프록시 부가기능을 실행 시킬수 있는 시점을 애노테이션을 통해 간단히 설정할 수 있는데 각 자주 쓰는 실행 시점은 다음과 같다.

- @Before : 타깃 메소드 실행 전에 동작

- @After : 타깃 메소드 실행 후에 동작

- @Around : 타깃 메소드 실행 전,후 모두 동작

 

반응형