@Aspect는 애스펙트라는 표식이지 컴포넌트 스캔이 아니다. 따라서 AOP를 사용하려면 스프링 빈으로 등록해야한다.

스프링 빈으로 등록하는 방법은 다음과 같다.

  • @Bean 을 사용해서 직접 등록
  • @Component 컴포넌트 스캔을 사용해서 자동 등록
  • @Import 주로 설정 파일을 추가할 때 사용( @Configuration )

@Import 는 주로 설정 파일을 추가할 때 사용하지만, 이 기능으로 스프링 빈도 등록할 수 있다.

package com.example.demo.order.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Slf4j
@Aspect
public class AspectV1 {

    @Around("execution(* com.example.demo ..*(..)) ")
    public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{
        log.info("[log] {}",joinPoint.getSignature()); // join point 시그니처
        return joinPoint.proceed();
    }
}

 

기존의 @Aspect를 사용할때는 위와 같이 @Around만 사용했지만,  @Pointcut도 같이 사용 가능하다.

 

package com.example.demo.order.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Slf4j
@Aspect
public class AspectV2 {
    //패키지와 하위 패키지
    @Pointcut("execution(* com.example.demo ..*(..)) ")
    private void allOrder(){} //pointcut signature

    @Around("allOrder()")
    public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{
        log.info("[log] {}",joinPoint.getSignature()); // join point 시그니처
        return joinPoint.proceed();
    }
}

@Pointcut

@Pointcut에 포인트컷 표현식을 사용한다.

메서드 이름과 파라미터를 합쳐서 포인트컷 시그니처(signature)라 한다.

메서드의 반환 타입은 void여야 한다.

코드 내용은비워둔다.

@Around 어드바이스에서는 포인트컷을 직접 지정해도 되지만, 포인트컷 시그니처를 사용해도 된다. 여기서는
@Around("allORder()")를 사용한다.

private, public 같은 접근제어자는 내부에서만 사용하면 private를 사용해도 되지만, 다른 애스팩트에서 참고하려면 public을 사용해야한다.

 

결과적으로 AspectV1과 같은 기능을 수행하지만, 이렇게 분리하면 하나의 포인트컷 표현식을 여러 어드바이스에서 함께 사용할 수 있다. 또한, 다른 클래스에 있는 외부 어드바이스에서도 포인트컷을 함께 사용 할 수 있다.

'Java > 스프링 AOP' 카테고리의 다른 글

스프링 AOP - execution(1)  (0) 2023.09.12
Spring AOP - 어드바이스 종류  (0) 2023.09.11
Spring AOP 용어정리  (0) 2023.09.06
Spring AOP - 핵심기능, 부가기능 , 애스펙트  (0) 2023.09.05
@Aspect 프록시  (0) 2023.08.31

+ Recent posts