❗AOP 포인트컷 설정 시, 불필요한 클래스까지 잡히는 문제 해결
// 서비스 패키지 내 모든 메서드에 AOP 적용
@Pointcut("execution(* com.example.outsourcing_project.domain..service..*(..)) " +
"&& !within(com.example.outsourcing_project.domain.log..*)" +
"&& !within(com.example.outsourcing_project.domain.user..*)" +
"&& !within(com.example.outsourcing_project.domain.auth.service.JwtBlacklistService)" +
"&& !within(com.example.outsourcing_project.domain.auth.service.RefreshTokenService)")
public void loggableServiceMethods() {}
@Around 방식으로 서비스 로직 실행 전후를 감지해 로그를 남기는 것이다.JwtBlacklistService, RefreshTokenService 등은 로그와 무관한 인증 관련 처리 클래스임에도 포인트컷에 걸렸다.!within(...) 구문을 계속 추가해야 했고, 클래스가 늘어날수록 코드가 점점 복잡하고 유지보수하기 어려워졌다.@Pointcut("@annotation(com.example.outsourcing_project.global.common.Loggable)")
public void loggableMethods() {}
@Loggable 어노테이션을 부여하도록 하여, 의도를 명확히 하면서 코드 복잡도도 줄일 수 있었다.@Loggable 어노테이션은 다음과 같이 정의했다:@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}