AOP란?(3)

Developer:Bird·2020년 10월 16일
0

Spring

목록 보기
6/17

SpringFrameWork에서는 어떻게 어노테이션을 이용하여 AOP를 구현할 수 있을까? 먼저 Spring의 Aop 구현에 들어가는 핵심적인 어노테이션 및 용어에 대해서 알아보자.
타겟(Target)

  • 핵심 기능을 담고 있는 모듈로 타겟은 부가기능을 부여할 대상이 된다.

어드바이스(Advice)

  • 어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈이다.

조인포인트(Join Point)

  • 어드바이스가 적용될 수 있는 위치를 말한다.

  • 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다.

포인트 컷(Pointcut)

  • 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.

  • 포인트컷 표현식은 execution으로 시작하고 메서드의 Signature를 비교하는 방법을 주로 이용한다.

애스펙트(Aspect)

  • 애스펙트는 AOP의 기본 모듈이다.

  • 애스펙트 = 어드바이스 + 포인트컷

  • 애스펙트는 싱글톤 형태의 객체로 존재한다.

어드바이저(Advisor)

  • 어드바이저 = 어드바이스 + 포인트컷

  • 어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.

위빙(Weaving)

  • 위빙은 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(어드바이스)를 삽입하는 과정을 뜻한다.

  • 위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)를 추가할 수 있도록

해주는 핵심적인 처리과정이다.

다음은 해당 코드이다.

Version1: 경로:위치

@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()실행");
    }
}

Version2 경로: 어노테이션

@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

profile
끈임없이 발전하자.

0개의 댓글