AOP 기본 개념

AOP - Aspect Oriented Programming

  • 스프링의 IoC가 결합도와 관련된 기능이라면 AOP는 응집도와 관련된 기능이다.

  • 여러 비지니스 로직에서 공통적으로 수행되는 부분을 분리하여 효율적으로 관리하는데 핵심이다.

  • 결론적으로 공통 코드를 제거하고, 그 공통 코드를 효율적으로 관리하고자 하는 기법이다.

    • 보통 이런 공통 코드를 횡단 관심사라는 용어로 부르며, 실제로 주목해야하는 비지니스 로직을 핵심 관심사라고 표현한다.

AOP 용어

  • 횡단 관심사라는 용어처럼 AOP에는 다양한 용어들이 있다.

1. 조인포인트 - Joinpoint

  • 조인포인트란 클라이언트가 호출하는 모든 비지니스 메소드를 말한다.

2. 포인트컷 - Pointcut

  • 앞서 말했듯이 조인포인트가 모든 비지니스 메소드라면, 포인트컷은 필터링된 조인포인트를 말한다.
  • 예를들어, 트랜잭션 기능은 CRUD 중에 CUD에만 필요하므로 R 메소드를 필터링한 것을 포인트컷이라 한다.

3. 어드바이스 - Advice

  • 횡단 관심에 해당하는 공통 코드를 말한다.
  • 어드바이스가 언제 실행될지에 대해 설정은 before, after, after-returning … 등등으로 설정할 수 있다.

4. 위빙 - Weaving

  • 위빙은 포인트 컷으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정을 말한다.
  • 위빙을 처리하는 방식으로 크게 컴파일타임 위빙, 로딩타임 위빙, 런타임 위빙이 있지만, 스프링에서는 런타임 위빙만 지원한다.

5. 애스팩트 - Aspect / 어드바이저 - Advisor

  • 애스팩트란 포인트컷과 어드바이스의 결합으로, 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할지 결정한다.
  • 애스팩트와 어드바이저는 같은 의미의 용어이지만, 설정하는 엘리먼트는 <aop:advisor …/>가 따로 있다.
    • 대표적으로 어드바이저를 사용하는 경우가 트랜잭션 설정이다. 어드바이저를 사용하는 경우, 포인트컷의 어드바이스 객체의 메소드를 알수 없거나 하는 경우에 사용한다.
    • 아래의 예시에서보면 tx:advisor를 어떻게 설정하느냐에 따라 어드바이스의 기능과 동작방식이 달라지게 된다.
<bean id="log" class="com.nts.biz.common.LogAdvice"></bean>  
​  
<tx:advice id="txAdvice" transaction-manager="txManager">  
    <tx:attrbites>  
    <tx:method name="get*" read-only="true"/>  
    </tx:attrbites>  
</tx:advice>  
​  
<aop:config>  
    <aop:pointcut id="getPointcut" expression="execution(* com.nts.biz..*Impl.get*(..))">  
    </aop:pointcut>  
    
    <aop:aspect ref="log">  
        <aop:before pointcut-ref="getPointcut" method="printLog"/>  
    </aop:aspect>  
    
    <aop:advisor pointcut-ref="getPointcut" advice-ref="txAdvice"/>  
</aop:config>

정리

  • 클라이언트에서 여러 비지니스 메소드(조인포인트)를 호출할 것이다.
  • 이때, 특정 비지니스 메소드(포인트컷)이 호출되는 순간에 트랜잭션과 같은 공통 로직(어드바이스)가 실행될 것이다. 실행 시점은 before, after, after-returning, after-throwing, around가 있다.
  • 특정 비지니스 메소드(포인트컷)가 실행 될 때, 공통 로직(어드바이스)를 삽입되도록 설정해야한다.(애스팩트)
  • 해당 설정에 따라 비지니스 메소드들에 필요한 공통 로직들이 삽입(위빙)될 것이다.

댓글