SpringFrameWork에서는 어떻게 어노테이션을 이용하여 AOP를 구현할 수 있을까? 먼저 Spring의 Aop 구현에 들어가는 핵심적인 어노테이션 및 용어에 대해서 알아보자.
타겟(Target)
어드바이스(Advice)
조인포인트(Join Point)
어드바이스가 적용될 수 있는 위치를 말한다.
타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다.
포인트 컷(Pointcut)
어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.
포인트컷 표현식은 execution으로 시작하고 메서드의 Signature를 비교하는 방법을 주로 이용한다.
애스펙트(Aspect)
애스펙트는 AOP의 기본 모듈이다.
애스펙트 = 어드바이스 + 포인트컷
애스펙트는 싱글톤 형태의 객체로 존재한다.
어드바이저(Advisor)
어드바이저 = 어드바이스 + 포인트컷
어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.
위빙(Weaving)
위빙은 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(어드바이스)를 삽입하는 과정을 뜻한다.
위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)를 추가할 수 있도록
해주는 핵심적인 처리과정이다.
다음은 해당 코드이다.
@Aspect //Aspect 역할을 할 클래스라고 명시해줌
public class LogAop {
//Pointcut이라고 명시된 메서드가 필요
//@Pointcut의 속성에 핵심코드의 어느 부분까지 공통기능을 사용하겠다고 명시
@Pointcut("within(com.aopEx2.*)")
private void pointcutMethod(){
}
@Around("pointcutMethod()") //around가 적용될 포인트컷을 명시 : pointcutMethod()
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
//공통 기능이 적용되는 메서드가 어떤 메서드인지 출력하기 위해 메서드명을 얻어옴
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + "시작"); //메서드 실행
//공통기능
System.out.println("핵심 기능 전에 실행 할 공통 기능입니다. "+System.currentTimeMillis());
try {
Object obj = joinpoint.proceed(); //핵심 기능 실행
return obj;
} finally {
//공통기능
System.out.println("핵심 기능 후에 실행 할 공통 기능입니다. "+System.currentTimeMillis());
System.out.println(signatureStr + "끝");
}
}
@Before("within(com.aopEx2.*)")
public void beforeMethod(){
System.out.println("beforeMethod()실행");
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Logging {
}
@Component
@Aspect
public class LogAop {
@Around("@annotation(Logging)")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
.
.
.
.
}
큰 흐름을 요약하자면 다음과같다.
1. @Aspect 어노테이션 선언
2. AOP를 진행하고 싶은 원하는 경로및 함수를 PointCut에 표시.
(1)마크 어노테이션을 생성해서 표시 or
(2)within(~)을 통하여 경로지정
//이때 @PointCut 생성하지 않고 바로 @Around어노테이션을 통하여 PointCutting 가능하다.//
3.구현 부분에서 joinPoint의 실행 전후 원하는 비즈니스 로직코드 삽입
참고사이트
https://shlee0882.tistory.com/206
https://engkimbs.tistory.com/746
https://private.tistory.com/44