본문 바로가기

프로그래밍

AOP 사용하지 않던 프로젝트에 AOP 추가 시 발생한 문제

Eclipse에서 개발 중에 일부 Pointcut이 정상적으로 선택이 안되는 문제가 발생했었다.

Spring AOP를 이용한 것이 아닌 순수 AspectJ로 Pointcut을 컨트롤 하려고 하였다.

일부는 예상했던데로 잘 Aspect에 할당한 Pointcut에 잡히게 되었다.

Advice : before advice, after returning advice, around advice, after throwing advice 등의 특정 동작에 대한 어떤 시점에 잡을 것인지를 정의한다.

Pointcut : 특정 제한자 / 특정 클래스 하위의 / 특정 반환기본형을 가진 / 특정 함수가 / 특정 매개변수를 이용하는 것을 말한다. wild card 나 논리 연산자를 통해 유연하게 잡아낼 수 있다. 

정리하면 특정 함수를 특정 시점에 잡아서 다른 동작을 집어 넣겠다 것을 한다는 얘기다

여튼 이러한 이유로 사용하게 되었는데 일부 AOP를 잡아 냈는데, 못잡아 내는 것이 있었다.

특이하게도 대상 Pointcut은 모두 protected의 제한자를 갖고 있었기에 더 고민이 되었다.
CGLIB를 사용하지 않고 Java의 Reflect 기반으로 AOP를 처리하려고 하면 안되는 경우가 있다고 했다.

CGLIB 참고

그래서 형태를 모두 CGLIB(Byte Code Generation Library)로 잡아 내게끔 변경하였다.
그리고 사실 문제는 여기서 부터 발생한 것이다.

변경방법 

proxy-target-class 값만 true로 설정하면 된다고… 한다... 자세히는 안들어갔다.

하지만 설정 변경하였음에도 불구하고 잡아내지 못하였다.

잡아내는 것에 대한 테스트는 AOP를 처리하는 함수 내에 실행줄에 break를 거는 것으로 처리하면 충분하다.

놓치고 있던것이 떠올랐다.. CGLIB의 약자에서 떠오른 것이다. Byte Code라... 그렇다면 compiler에서 관여사항이
생길 터인데.. 이 생각에 Project를 AspectJ로 변경하니 못잡아 내던 protected 제한자의 pointcut을 잡게 되었다.
AspectJ 컴파일러를 이용하게 되면서 해결된 것이다..

자세한 내용은 아래 링크에서 Converting a Java project   파트에서 확인 할 수 있다.

너무 대충 쓰고있는 것들이 많아서.. 하루하루 걸림돌이 너무 많다.. 심각한 문제로다...