헬린코린이
[Spring Framework] AOP 본문
AOP는
Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각
모듈화 하겠다는 것이다
Aspect는 부가될 기능을 정의한 Advice와, 해당 Advice를 어디에 적용할지를 결정하는 Pointcut 정보를 가지고 있습니다.
코드를 보겠습니다
<context:component-scan base-package="com.spring.biz"/>
<bean class="com.spring.biz.common.LogAdvice" id="la"/>
<aop:config>
<aop:pointcut expression="execution(* com.spring.biz..*Impl.*(..))" id="aPointcut"/>
<!-- * 반환타입이고 com.spring.biz..*패키지명이고 Impl.* 이이름을 가진 클래스의
메서드를 가질거야 (..)인자개수는 상관없어 -->
<aop:aspect ref="la">
<aop:before method="printLog" pointcut-ref="aPointcut"/>
</aop:aspect>
</aop:config>
<!-- 반복할 건데 뭐를 LogAdvice를 언제? aPointcut이 실행되기 전에 뭐를 pirntLog메서드를 -->
- 스프링 컨테이너야 너 AOP 할 줄 알지?
앞으로 비즈니스 메서드(CRUD,핵심관심,핵심로직)를 수행하기 전에
공통관심(횡단관심,ex)로그/트랜젝션/인증/보안/Util클래스...)인 LogAdvice를 실행시켜 줘라고 설정했습니다.
aop:??? <<쓸 수 있는 태그 종류
@Befor 는 AOP가 적용될 메서드가 실행되기 전의 시점을 말한다.
@After는 AOP가 적용될 메서드가 실행된 이후의 시점을 말한다.
메서드가 성공적으로 수행된 경우와 에러가 발생하여 Exception이 생긴 경우 모두 해당된다.
finally 같은 성격 예외가 발생되든 말든 무조건 실행된다
@AfterReturning는 AOP가 적용될 메서드가 에러 없이 성공적으로 실행된 이후의 시점`을 말한다.
@AfterThrowing는 AOP가 적용될 메서드가 에러가 발생하여 Exception을 던지는 시점을 말한다.
@Around는 AOP가 적
용 될 메서드의 시작부터 끝까지 전반적인 시점을 모두 관리한다.
JoinPoint와 ProceedingJoinPoint의 차이
모든 어드바이스는 JoinPoint를 첫 번째 파라미터에 사용할 수 있습니다.
(생략은 가능하지만 두 번째 파라미터로는 사용할 수 없습니다.)
그러나 @Around는 ProceedingJoinPoint를 사용해야 합니다.
ProceedingJoinPoint는 JoinPoint의 하위 타입으로, 주요한 기능이 하나 추가됩니다.
JoinPoint의 기능으로는
- getArgs() : 메서드 인수를 반환합니다.
- getThis() : 프록시 객체를 반환합니다.
- getTarget() : 대상 객체를 반환합니다.
- getSignature() : 조인되는 메서드에 대한 설명을 반환합니다.
- toString() : 조인되는 방법에 대한 유용한 설명을 인쇄합니다.
ProceedingJoinPoint의 기능은
- proceed() : 다음 어드바이스나 타깃(실제 객체)을 호출합니다.