새 프로젝트 생성. 라이브러리는 롬복만 포함함. + spring-boot-starter-aop

💡 @Aspect 를 사용하려면 원래 @EnableAspectJAutoProxy를 스프링 설정에 추가해야 한다. 하지만 스프링 부트를 사용하면 이를 자동으로 추가해준다.

예제 프로젝트 만들기

학습을 위한 리포지, 서비스를 만들어주자…

스프링 AOP 구현1 - 시작

애스팩트를 직접 만들어 사용해보자.

@Slf4j
@Aspect
public class AspectV1 {
    
    @Around("execution(* hello.aop.order..*(..))")
    public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("[log] {}", joinPoint.getSignature()); //joinPoint.getSignature()는 메소드 시그니처를 반환한다.
        return joinPoint.proceed(); //실제 타겟 호출
    }
}

@Around 애노테이션의 값은 포인트 컷이 된다. 내부 표현식은 AspectJ의 포인트컷 표현식임. 앞으로는 간단히 포인트컷 표현식이라고 하겠음.

@Around가 붙은 메서드는 어드바이스(Advice)가 된다.

위의 애스펙트를 이용해 서비스, 리포지에 AOP를 적용할 수 있다.

💡@Aspect 를 포함해 org.aspectj 패키지는 aspectjweaver.jar 라이브러리가 제공한다. 프로젝트에 포함한 spring-boot-start-aop가 스프링 AOP 기능과 함께 aspectjweaver.jar도 함께 사용할 수 있도록 의존관계에 포함시켜준다.

스프링에서 aspectj 애너테이션을 사용하고 있지만, 로드타임 위빙이나 컴파일 타임 위빙을 사용하고 있진 않다.

위처럼 애스팩트를 만들었으면 이제 할일은 해당 애스팩트를 스프링 빈으로 등록하는 것 뿐이다. 이전에 언급한 자동프록시 생성기가 알아서 어드바이저를 찾아 프록시를 생성해버리기 때문.