Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 한다. 어떤 기능을 구현할 때 주요 핵심 기능이 존재하고 그 외에 추가적으로 부가적인 기능이 있기 마련이다.
여기서 부가적인 기능이라고 하면 비지니스 기능을 구현 시 필요한 기타 작업(로깅, 트랜잭션 처리, 유저 인증, 입/출력 데이터의 wrapping)과 같은 작업들이 있다.
이때 이러한 부가적인 기능들이 여러 비지니스 로직에서 반복적으로 사용되는 경우에 코드의 중복이 발생하며, 이것을 흩어진 관심사 Crosscutting Concerns라 한다. 이러한 흩어진 관심사를 방지할 목적으로 부가적인 기능을 모듈화하여 개발하는 것이 AOP를 하는 주요 목적이라고 볼 수 있다.
Aspect : 위에서 설명한 흩어진 관심사를 모듈화한 것이다.
Target : Aspect를 적용할 곳을 나타낸다.
ex) 클래스, 메서드, ...
Advice : 부가기능이 해야 할 로직을 나타낸다.
JointPoint : Advice가 적용될 위치이다.
ex) 메서드 호출 전, 후, ...
PointCut : JoinPoint를 구체적으로 명시할 수 있다.
프락시 패턴 기반의 AOP 구현체, 프락시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서이다.
스프링 빈에만 AOP를 적용할 수 있다.
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복 코드, 프락시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가, ...)에 대한 해결책을 지원하는 것이 목적이다.
정리하자면 AOP를 적용할 객체를 Spring IoC에 빈으로 등록한 다음 실행할 부가적인 기능을 작성하고 해당 기능을 언제 호출할지, 어떤 핵심 기능들에 적용할지 명명하기만 하면 중복적인 코드를 작성하지 않고도 프레임워크가 알아서 부가적인 기능을 적용해 주는 방식이라 할 수 있다..!