AOP (Aspect Oriented Programming)
정의
횡단 관심(Crosscutting Concerns) : 메소드마다 공통으로 등장하는 로깅, 예외, 트랜잭션 처리 같은 코드들
핵심 관심(Core Concerns) : 사용자 요청에 따라 실제로 수행되는 핵심 비지니스 로직
AOP의 핵심은 관심 분리(Separation of Concerns)이다.
따라서, 핵심 관심을 변경하지않고, 횡단 관심을 중간 중간에 추가할 수 있는 개발방법이다.
기존의 OOP 언어에서는 횡단 관심을 완벽하게 독립적인 모듈로 분리해내기가 어렵다.
왜 어려운가?
LogAdvice.java
pulic class LogAdive {
public void printLog() {
System.out.println("공통로그....");
}
}
TestServiceImpl.java
@Service
public class TestServiceImpl implements TestService {
@Autowired
private LogAdvice log; //수정되어야함
public void a() {
...
log.printLog(); //수정되어야함
}
public void b() {
...
log.printLog(); //수정되어야함
}
}
LogAdvicer객체와 TestServiceImpl클래스는 강하게 결합되어있다. 그래서, LogAdvice클래스를 다른 클래스로 변경하거나, printLog()메소드 이름이 다른 이름으로 변경되는 상황에서는 LogAdvice객체명을 수정하거나, 모든 메소드를 수정해야한다. 이러한 OOP의 한계를 스프링의 AOP가 극복하게 해준다.
AOP로 변경하기
applicationContext.xml
<bean id="log" class="com.test.LogAdvice"></bean>
<aop:config>
<aop:pointcut id="allPointcut"
expression="execution(* com.test.biz..*Impl.*(..))"/>
<aop:aspect ref="log">
<aop:before porintcut-ref="allPointcut" method="printLog"/>
</aop:aspect>
</aop:config>
method나 class수정시 설정 파일만 바꿔주면 된다.
스프링 AOP는 비즈니스 메소드를 호출할 때, 횡단 관심에 해당하는 메소드를 적절하게 실행시켜준다. 이때, 핵심 관심 메소드와 횡단 관심 메소드는 소스상으로 결합되지 않는다. (중요!)
AOP 용어 정리
조인포인트 (Joinpoint)
클라이언트가 호출하는 모든 비즈니스 메소드 (TestServiceImpl, UserServiceImpl ... )
포인트컷(Pointcut)
로그, 예외, 트랜잭션 등의 횡단 관심을 적용할 대상 (필터링된 조인포인트)<br/>
포인트컷 표현식
\* com.test.biz..*Impl.get*(..)
리턴타입 | 페키지 경로 | 클래스명 (Impl로끝나는 모든 class) | 메소드명 및 매개변수
어드바이스 (Advice)
횡단 관심에 해당하는 공통 기능의 코드
어드바이스 동작 시점
동작시점 | 설명 |
---|---|
Before | 비즈니스 메소드 실행 전 동작 |
After Returning | 비즈니스 메소드가 성공적으로 리턴되면 동작 |
After Throwing | 비즈니스 메소드 실행중 예외가 발생하면 동작 (catch) |
After | 비즈니스 메소드가 실행된 후, 무조건 실행 (finally) |
Around | 메소드 호출 자체를 가로채 비즈니스 메소드 실행 전후에 처리할 로직 삽입 |
위빙 (Weaving)
포인트컷으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정
이 위빙을 통해서 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.
처리 방식 1. 컴파일타임 위빙 2. 로딩타임 위빙 3. 런타임 위빙
스프링에서는 런타임 위빙 방식만 지원한다.
애스팩트 또는 어드바이저 (Aspect or Advisor)
포인트컷과 어드바이스의 결합
어떤 포인트컷 메소드에 대해서 어떤 어드바이스 메소드를 실행할지 결정한다.
Aspect 설정에 따라 AOP의 동작 방식이 결정되므로 AOP 용어 중 가장 중요한 개념!
Aspect | Advisor |
---|---|
advice의 id와 method이름을 알아야함 | advice의 메소드명을 확일할 수 없을 때 (트랜잭션) |
<!-- Transaction -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
<tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allPointcut"
expression="execution(* com.test.biz..*Impl.*(..))"/>
<aop:advisor pointcut-ref="allPointcut" advice-ref="txAdvice"/>
</aop:config>
'Spring > Spring' 카테고리의 다른 글
@RestController @Controller (0) | 2018.10.25 |
---|---|
@RequestParam (0) | 2018.08.10 |
[Spring] Lombok (0) | 2018.08.07 |
[Spring] Spring을 이용하여 간단 로그인하기 (0) | 2018.01.09 |