본문 바로가기
BackEnd/Spring

[Spring] AOP

by summer_light 2021. 9. 8.

AOP: Aspect Oriented Programming

(OOP: Object Oriented Programming, 객체지향 프로그래밍보다 큰 개념이다.)

방법론. AOP를 구현할 때 Spring이 도움을 준다. 

개발자 관점의 단위 업무, 관리자의 관점의 단위 업무 등으로 나눈다.                                           

ex) 로그 처리, 보안 처리, 트랜잭션 처리 등의 사용자의 필요 외의 업무

 

 

Primary(Core) Concern: 업무 로직. 

 

 

Cross-cutting Concern (Cross-cutting: 원래의 실행 방향을 잠시 끊으므로, cross): 부 업무 로직. 

 

소스 코드가 있는 사람만 가능한 한계. 

 

프록시를 이용하여 구현. 

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"></bean>

 

두 가지 설정 필요: 

1) target에 해당되는 개체의 classLoader

<property name="target" ref="target">

2) 곁다리 업무에 해당하는 로직(핸들러)

<property name="interceptorNames">

</property>

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target" ref="target">
      <property name="interceptorNames"> 
          <list>
              <value>logAroundAdvice</value>
          </list>
      </property>
</bean>

 

//LogAroundAdvice(implements Method Interceptor)가 필요하다. 
<bean id="logAroundAdvice" class="spring.aop.LogAroundAdvice" />

Exam exam = new NewlecExam(1,1,1,1);

Exam proxy = Proxy.newProxyInstance(loader, interfaces, h); 

==> Exam proxy = Proxy.newProxyInstance(NewlecExam.class, h);

 

Before 어드바이스 (전)

After returnning 어드바이스 (후) : 둘 중 하나만 실행됨 0

After throwing 어드바이스 (예외처리) : 둘 중 하나만 실행됨 

Around 어드바이스 (전+후)

 

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"></bean>

 

 

 

AOP 구현 방식

포인트 컷

조인 포인트: 조인하게 될 녀석으로서의 메소드

위빙: 곁다리 업무와 주업무를 연결하는 것

 

//위빙이 가능한 조인 포인트가 될 수 있는 함수로 total만 설정한 것
<bean id="classicPointCut" class="org.springframework.aop.support.NameMatch"MethodPointcut">
	<property name="mappedName" value="total" />                                                                    
</bean>

//이 포인트컷이 어떤 어드바이스와 연결될 것인지? : 어드바이저(adviser)가 결정
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.DefaultPointcut">
	<property name="advice" ref="logBeforeAdvice" />
    <property name="pointcut" ref="classicPointCut" />
</bean>

댓글