▼ Backend/스프링 (Spring)

Spring Boot | 간단하게 AOP 적용하기

Valar 2022. 5. 9. 16:37
반응형

Spring AOP (Aspect Oriented Programming)

AOP란 관점 지향 프로그래밍이라고 하며 어떤 로직을 기준으로 핵심, 부가적인 관점으로 나누어서 어떤 관점을 기준으로 모듈화 하는것으로 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 

 

📌 Dependency 추가

Maven

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

Gradle

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

Java Code

Application 클래스에 @EnableAspectJAutoProxy 추가

 

// Aop 활성화
@EnableAspectJAutoProxy
@SpringBootApplication
public class AopDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(AopDemoApplication.class, args);
    }
}

 

 

@Around("execution(적용할 클래스 또는 메서드명을 패키지 경로와 함께 아래 코드처럼 작성한다.)")
@Around("bean(적용할 빈의 이름을 지정한다.)")

 

package com.admin.aspect;

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

@Slf4j
@Aspect
@Component
public class LogAspect {
    /*
      com.admin.service.MemberService의 모든 메서드에 대해 적용한다.
    */
    //@Around("execution(* com.admin.service.MemberService.*(..))")

    /*
      com..service 경로에 있는 모든 ~Service.java의 update~로 시작하는 메서드에 대해 적용한다.
    */
    @Around("execution(* com..service.*Service.update*(..))")
    public Object logging(ProceedingJoinPoint pjp) throws Throwable {
        Object result = pjp.proceed();
        log.info("==> LogAspect Root:: " + pjp.getSignature().getDeclaringTypeName());
        log.info("==> LogAspect Method:: " + pjp.getSignature().getName());
        return result;
    }
}

 

결과

[io-20020-exec-6] com.admin.aspect.LogAspect      : ==> LogAspect Root:: com.admin.service.MemberService
[io-20020-exec-6] com.admin.aspect.LogAspect      : ==> LogAspect Method:: updateMemberRole

 

에러

존재하지 않는 경로의 클래스, 빈, 잘못된 패턴을 적용하면 아래와 같은 메시지가 출력된다.
@Around에 작성한 내용을 다시 확인해본다.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: warning no match for this type name: com.service.service [Xlint:invalidAbsoluteTypeName]

 

반응형