AOP 부분 적용 안 되는 문제 --> 포인트컷
❓ 문제 상황
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 아래 모든 패키지에서 해당하는 클래스를 찾아 메서드를 호출한 로그를 찍을 수 있었다!
친절하게 도움을 주신 스터디 교수님께 감사드린다👍 늘 해결하고 나면 드는 생각이지만 꺼진 불도 다시 보자......!
'Error Handling Log' 카테고리의 다른 글
No candidates found for method call useJUnitPlatform (0) | 2023.07.02 |
---|---|
[코딩테스트] incompatible types: String cannot be converted to boolean (0) | 2023.06.26 |
Exception in thread "main" java.util.ConcurrentModificationException (0) | 2023.05.18 |
[Java] array lengths differ, expected: <2> but was: <3> (0) | 2023.05.09 |
[Java] 실행 파일 오류 (0) | 2023.05.09 |