AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)의 약자이다. AOP는 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다
- 관점 지향 프로그래밍 wikipedia
횡단 관심사는 전체 코드에서 중복되어 나타나는, 로직과 강하게 결합되어 추상화를 어렵게 하는 로직을 말합니다.
대표적인 예로 로깅이 있는데 로깅 로직이 수정되면 로깅을 사용하는 모든 애플리케이션 로직의 수정이 필요해지므로 로깅은 애플리케이션 전체를 횡단하는 횡단 관심사입니다.
AOP는 OOP와 상호 보완적인 관계로서 AOP를 이용하면 애플리케이션의 핵심적인 로직과 로깅과 같은 부차적인 로직을 분리할 수 있어 더욱 효율적으로 애플리케이션을 개발할 수 있습니다.
AOP는 정적 AOP와 동적 AOP의 두 가지 종류가 존재하는데 실제 Weaving이 일어나는 지점과 Weaving이 적용되는 방식으로 구분됩니다.
애플리케이션의 빌드 단계에서 Weaving이 일어나는 방식으로 Compile-time weaving을 의미합니다. 빌드 시점에 이미 실행될 Advice의 위치가 결정되기 때문에 런타임에 추가적인 부하가 없는 방식입니다. 이 방식은 Aspect가 조금이라도 수정되면 애플리케이션을 전부 다시 컴파일해야 하는 단점이 있습니다.
애플리케이션의 런타임에 Weaving이 일어나는 방식으로 Runtime weaving을 의미합니다. 스프링 AOP가 수행될 때 기본적으로 따르는 방식입니다. 구현 방식은 다양하지만 스프링에서는 Target을 Proxy로 제공해 필요에 따라 Advice를 호출하는 방식으로 구현되어 있습니다.
Spring에서 AOP를 사용하려면 직접 ProxyFactory를 이용해 Proxy를 만들어 적용할 수도 있지만 Spring에서 제공하는 선언적인 AOP 구성 메커니즘(ProxyFactoryBean, aop, AspectJ 등...)을 이용해 만드는 게 가장 보편적입니다.
스프링 AOP의 핵심 메커니즘은 Proxy입니다. 스프링은 런타임에 빈을 등록할 때 빈 후처리기인 DefaultAdvisorAutoProxyCreator가 후처리기로 등록되어 있다면 아래와 같은 프로세스를 적용하여 빈을 Proxy로 등록합니다.
스프링 AOP의 한계점은 메서드 호출 Joinpoint만을 지원한다는 점입니다. 다른 기능이 추가적으로 필요하다면 AspectJ를 사용하여 구현하면 됩니다.