트러블 슈팅 - AOP 커스텀 어노테이션

Zyoon·2025년 6월 20일

트러블슈팅

목록 보기
7/11
post-thumbnail

❗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() {}
  • 서비스 패키지 내부의 클래스 메서드에 AOP를 적용하기 위해 패키지 기반 포인트컷을 설정했다.
  • 로그 저장 AOP의 핵심은 @Around 방식으로 서비스 로직 실행 전후를 감지해 로그를 남기는 것이다.

문제점

  • 이 방식은 처음에는 간편했지만, 시간이 지나며 점점 불필요한 클래스들까지 포인트컷에 잡히는 문제가 발생했다.
  • 예를 들어, JwtBlacklistService, RefreshTokenService 등은 로그와 무관한 인증 관련 처리 클래스임에도 포인트컷에 걸렸다.
  • 이를 방지하기 위해 !within(...) 구문을 계속 추가해야 했고, 클래스가 늘어날수록 코드가 점점 복잡하고 유지보수하기 어려워졌다.

해결 방법

@Pointcut("@annotation(com.example.outsourcing_project.global.common.Loggable)")
public void loggableMethods() {}
  • 포인트컷 조건을 패키지 경로 기반에서 커스텀 어노테이션 기반으로 변경했다.
  • 로그를 남기고 싶은 메서드에만 @Loggable 어노테이션을 부여하도록 하여, 의도를 명확히 하면서 코드 복잡도도 줄일 수 있었다.

결과

  • 로그와 무관한 메서드까지 AOP가 적용되는 문제를 완전히 제거할 수 있었다.
  • 로그 대상이 되는 메서드를 명시적으로 선택할 수 있게 되어 유지보수성과 가독성이 크게 향상되었다.
  • 포인트컷 관리도 간단해지고, 새로운 서비스 클래스 추가 시에도 실수로 로그가 발생하는 일을 방지할 수 있게 되었다.

참고 사항

  • @Loggable 어노테이션은 다음과 같이 정의했다:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
  • AOP 대상이 명확히 구분되어야 하는 경우, 어노테이션 기반 포인트컷이 더 직관적이고 안전하다.
profile
기어 올라가는 백엔드 개발

0개의 댓글