이번 장에서는 스프링의 @AspectJ AOP를 만드는 방법을 설명한다. 스프링은 AspectJ라는 뛰어난 AOP 프레임워크로부터 포인트컷 표현식과 함께 애노테이션을 이용해 AOP모듈을 개발 하는 방법을 도입했다. 또, 스프링의 프록시 방식 AOP 대신 AspectJ 라이브러리를 직접 활용하는 방법과 로딩 시점의 바이트코드 조작을 통해 DI 기능을 확장하는 방법 등을 알아볼 것이다.
AOP는 모듈화된 부가기능(어드바이스)과 적용 대상(포인트컷)의 조합을 통해 여러 오브젝트에 산재해서 나타나는 공통적인 기능을 손쉽게 개발하고 관리할 수 있는 기술이다.
스프링은 자바 JDK에서 지원하는 다이내믹 프록시 기술을 이용해, 복잡한 빌드 과정이나 바이트코드 조작 기술 없이도 유용한 AOP를 적용할 수 있는 프록시 기반 AOP 개발 기능을 제공한다.
프록시 방식의 AOP는 객체지향 디자인 패턴의 데코레이터 패턴 또는 프록시 패턴을 응용해서, 기존 코드에 영향을 주지 않은 채로 부가기능을 타깃 오브젝트에 제공할 수 있는 객체지향 프로그래밍 모델로 시작한다.
여기서 포인트컷이라는 적용 대상 선택 기법과 자동 프록시 생성이라는 적용 기법을 접목하면 AOP라고 부를 수 있다.
스프링은 가장 기초적이고 단순한 방법부터 최신 AOP 기술의 개발 방법을 차용한 방법에 이르기까지 여러가지 종류의 프록시 기반 AOP개발 방법을 지원한다.
가장 기초적인 프록시 AOP 개발 방법은 AOP의 구성요소를 모두 클래스로 개발하고 이를 빈으로 등록해서 적용하는 방법이다. 가장 오래되고 원시적인 방법이지만 AOP가 어떻게 동작하고 적용되는지를 이해하기에 가장 쉽다.
2. AOP 인터페이스 구현과 aop 네임스페이스의 aop:advisor 태그를 이용하는 방법
어드바이스 개발은 여전히 Advice 인터페이스를 직접 구현해야 하지만 포인트컷 표현식을 적극 활용해서 포인트컷과 어드바이저, 그리고 이를 모두 적용하는 자동 프록시 생성기 빈 등록을 aop 스키마의 간결한 전용 태그만으로 가능하게 하는 방법이다.
3. 임의의 자바 클래스와 aop 네임스페이스의 aop:aspect를 이용하는 방법