✅ 환경설정
pom.xml
에서 dependency 추가@Aspect
어노테이션을 추가할 수 있음 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
✅ AOP 적용시 자주일어나는 오류
-> Common causes of this problem include using a final class or a non-visible class
컨트롤러나, 서비스에서 싱글톤 패턴을 주입할 때 기본생성자의 접근제어자가 private일 경우 발생
해결책 : private
-> public
ex)
// controller
public class MemberController {
private MemberService service;
private MemberController(MemberService service) { // 오류발생
this.service = service;
}
}
// 해결책
public class MemberController {
private MemberService service;
public MemberController(MemberService service) { // 해결
this.service = service;
}
}
✅ 예시 코드
package com.joo.usedmarket1.comm.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Aspect
@Component
@Slf4j
public class LoggerAop {
// 지정한 패키지안의 메소드까지 세밀하게 조정해서 전 후로 동작을 구별할 수 있음
@Before("execution(* com.joo.usedmarket1..*(..))")
public void logger(JoinPoint jp) {
Signature sig = jp.getSignature();
log.debug("========== aop before ===========");
log.debug(sig.getDeclaringTypeName() + " " + sig.getName());
log.debug("==================================");
}
// 지정한 패키지안의 메소드까지 세밀하게 조정해서 전 후로 동작을 구별할 수 있음
@After("execution(* com.joo.usedmarket1..*(..))")
public void loggerA(JoinPoint jp) {
Signature sig = jp.getSignature();
log.debug("========== aop after ===========");
log.debug(sig.getDeclaringTypeName() + " " + sig.getName());
log.debug("==================================");
}
}