dependencies {
implementation("org.springframework.boot:spring-boot-starter-aop")
}
main이 있는 최상위 클래스에 어노테이션을 등록해 AOP(@Aspect)를 찾을 수 있게 해준다.
@EnableAspectJAutoProxy
@SpringBootApplication
class LoggingApplication
fun main(args: Array<String>) {
runApplication<LoggingApplication>(*args)
}
아래 코드는 단순히 로그를 출력해 주는 기능의 코드다.
@Aspect
@Component
class LogAspect {
val log: Logger = LoggerFactory.getLogger(LogAspect::class.java)
@Before("bean(*Controller)")
fun beforeLog(joinPoint: JoinPoint) {
log.info("이름이 Controller로 끝나는 모든 @Bean 호출 전 실행되는 로그 입니다.")
}
@After("execution(* com.miot2j.service.*.*(..))
fun beforeLog(joinPoint: JoinPoint) {
log.info("service 패키지내의 모든 메소드 호출 후 실행되는 로그 입니다.")
}
}
JoinPoint라는 개념을 설명하기 전에 기본적인 AOP의 개념을 설명 하겠다.
위 코드에서 알 수 있듯이 @Before("bean(*Controller)")
와 같이PointCut을 이름이 Controller로 끝나는 모든 @Bean 호출 전 실행
으로 설정 할 수있다.
대표적인 PointCut 어노테이션은 다음과 같다