package com.example.practiceAop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
* @Aspect : 부가기능 모듈, 핵심기능에 부가되어 의미를 갖는 특별한 모듈(Pointcut + Advice)
* Advice : 실제로 부가기능을 담은 구현체
* PointCut : 복수의 조인 포인트를 하나로 묶은 것
* JoinPoint : Advice가 적용될 위치
public class LoggerAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// Controller, ServiceImpl, Repository 기준으로 로그 출력
@Around("execution(* com.example.practiceAop.controller.*Controller.*(..)) or execution(* com.example.practiceAop.service.impl.*Impl.*(..)) or execution(* com.example.practiceAop.repository.*Repository.*(..))")
public Object printLog(ProceedingJoinPoint joinPoint) throws Throwable {
String name = joinPoint.getSignature().getDeclaringTypeName(); // 실행되는 대상 메서드 정보
if (name.contains("Controller") == true) {
type = "Controller ===> ";
}else if (name.contains("Service") == true) {
type = "ServiceImpl ===> ";
}else if (name.contains("Repository") == true) {
type = "Repository ===> ";
logger.info(type + name + "." + joinPoint.getSignature().getName() + "( )" );
return joinPoint.proceed();