AOP는 우리의 코드에서 횡단 관심 사항을 분리해 줌으로 엄청난 자동화를 이룰 수 있다. 하지만 잘못 사용하면 큰 난관에 부딪힐 수도 있으니 주의해야 한다.
AOP 작성 주의 사항
일반적인 작성 시 주의 사항
AOP를 잘못 사용하면 예기치 못한 큰 문제를 일으킬 수 있다. 좀 억지로 만들어본 코드지만 다음과 같이 advice를 설정하면 어떤 일이 발생할까?
@Before("execution(* *(..))")
public void toAllMethod(JoinPoint jp) {
// do something
}
이 코드는 프로젝트의 모든 빈의 메서드에게 영향을 줄것이다. 이로 인한 부작용은 심각할 수 있다.따라서 AOP를 사용할 때는 적용 대상을 정확히 파악하고 꼭 필요한 내용만 AOP로 작성해야 한다.
AOP를 적용하면 코드의 복잡도가 크게 증가한다. AOP 이전에는 main 메서드에서 부터 차근차근 따라가면 전체적인 흐름을 이해할 수 있었다. 하지만 AOP가 적용되면 target의 메서드 만으로는 도저히 분석할 수가 없다. 따라서 작성 시 반드시 테스트를 통해 동작을 확인해야 하고 문서화를 잘 해두어야 나중에 유지보수가 용이하다.
AOP는 runtime에 proxy를 만드는 등 코드를 변경하므로 성능에 영향을 줄 수 있다. 따라서 성능이 중요한 경우에는 AOP 사용을 신중히 고려해야 한다.
Spring에서 AOP의 대상 파악 주의
스프링의 AOP는 빈을 대상으로만 적용이 가능하다. 즉 일반 객체를 대상으로는 동작하지 않는다. 관리 대상을 빈에서 proxy로 변경해서 적용할 뿐이니 너무 당연한 일이다.
그리고 spring의 AOP는 proxy를 기반으로 하므로 proxy를 통하지 않은 접근은 AOP의 대상이 아니다.
빈 내부에 AOP의 대상인 methodA와 methodB가 있다고 생각해 보자. 이 메서드들을 외부에서 호출할 때는 당연히 Proxy를 통하게 된다. 이 과정에서 methodB가 methodA를 내부적으로 호출한다면 어떻게 될까?
직접 methodA를 호출했을 때와는 달리 proxy 입장에서는 methodB만 호출된 것이므로 advice를 동작하지 않는다. 즉 내부에서 호출되는 methodA는 AOP의 적용대상이 아님을 주의하자.