AOP 부분 적용 안 되는 문제 --> 포인트컷

2023. 6. 8. 17:03

❓ 문제 상황

AOP의 핵심 개념을 활용하여 프로그램의 로깅(Logging) 기능을 공통화하는 작업 중 일어난 문제. 

구현 조건은 아래와 같았다.

Aspect 클래스를 작성하고 실행시키니 메서드 호출이 아래와 같이 잘 되는 것을 확인 할 수 있었다. 하지만 Discount 클래스의 메서드와 Order 클래스의 메서드에서 로깅 기록이 남지 않는 것을 발견했다. 

 

  • 주문하기를 누르고 수강생인지 확인하는 것과 나이를 확인하는 부분에서 checkAllDiscountConditions() 메서드가 호출되면서 로깅 기록이 남아야 하는데 누락되었다. 
  • 금액 합계를 구하고 나서 discount() 메서드가 호출되면서 할인 적용 금액에 대한 로깅 기록이 남아야 하는데 누락되었다. 

 

빈이 잘 등록되는 것도 확인했고 포인트컷도 이상 없다고 생각했다... 그랬었다.

포인트컷을 한 개가 아닌 여러 개를 두고 연산자(||, &&) 로 연결할 수도 있다고 해서 해당 클래스들만 따로 포인트컷 설정을 만들어주기도 해봤지만 그것도 실패했다. 

예를 들자면 이런 식......

 

도저히 문제점이 무엇인지 찾지 못해 스터디원에게 도움을 청했고 그 결과 문제는 아주 잘 해결되었다. 

 

상황 공유드리고 깃헙 주소도 드리고 난 후 몇 분 안 되어 받은 답변...!! 👍

심지어 이때 Order() 적용 안 되는 것도 깨달았다...😇 << 꼼꼼하자 제발

 

 

 

  • 말씀해주신대로 포인트컷 설정을 변경해주니 아주 잘 출력되는 것을 확인할 수 있었다.

 

// 수정 전 포인트컷
@Pointcut("execution(public * com.codestates.*.Discount.*(..)) || execution(public * com.codestates.*.Order.*(..)) || execution(public * com.codestates.*.Cart.*(..)) || execution(public * com.codestates.*.Menu.*(..))")

// 수정 후 포인트컷
@Pointcut("execution(public * com..Discount.*(..)) || execution(public * com..Order.*(..)) || execution(public * com.codestates.*.Cart.*(..)) || execution(public * com.codestates.*.Menu.*(..))")
  • 수정 전 포인트컷을 보면 com.codestates.*.Discount.*(..) 이렇게 되어 있는데 의미를 해석해보자면 
    • "com.codestates.*." 패키지와 그 직계 하위 패키지 안에서 즉, burgerqueenspring
    • "Discount" 이름을 가진 클래스에 있는 
    • public 접근 지정자를 가진
    • * 어떠한 반환 타입이든지
    • *(..) 매개변수를 0개 이상 가진 어떠한 메서드든지 

➡️ com.codestates 와  Discount 사이의  이 그 아래의 모든 패키지를 의미하는 줄 알았는데 알고보니 직계 하위 패키지 하나만 의미하는 것이었다. (아래 그림 참고)

즉, com.codestates 의 직계 하위 패키지는 burgerqueenspring 이고 그 안에 Discount 나 Order 클래스를 찾아야하는데 클래스가 존재하지 않으니 당연히 로그 기록이 찍힐 수가 없었다.

 

수정 후 포인트 컷에서 com.. 에서 의미하는   ..   은 패키지를 표현할 때 임의의 패키지 0 개 이상의 계층을 의미한다. 
그래서 com 아래 모든 패키지에서 해당하는 클래스를 찾아 메서드를 호출한 로그를 찍을 수 있었다!

친절하게 도움을 주신 스터디 교수님께 감사드린다👍 늘 해결하고 나면 드는 생각이지만 꺼진 불도 다시 보자......!

BELATED ARTICLES

more