Aspect Oriented Programming 의 약자로, 관점 지향 프로그래밍이라고도 불리며, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나눠보고 그 관점을 기준으로 각각 모듈화 하겠다는 의미입니다.
AOP는 Aspect를 분리하여 핵심기능을 설계 및 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것입니다.
Aspect : 기능적인 역할을 하는 모듈, 위의 예제에서 실제 비즈니스 로직을 제외한 기능적인 역할을 하는 코드들을 분리, 재사용 할 수 있도록한 모듈. Aspect는 Advice와 PointCut으로 이루어져 있습니다.
Advice : AOP에서 실제 실행되는 코드를 이야기합니다. 순수하게 실행되는 코드만을 뜻합니다.
Join Point : Advice를 실제로 실행 하고자 하는 위치를 뜻합니다. Spring AOP는 메서드에 한정됩니다. 즉, Spring AOP에서 모든 메서드는 Join Point가 될 수 있습니다.
PointCut : Advice가 적용될 JoinPoint를 선정하는 방법을 이야기합니다. 모든 Join Point에 Advice를 적용하는 것이 아닌 특정 Join Point에 Advice를 적용하는것이 일반적입니다. 따라서 Advice를 사용할 JoinPoint를 선정하는 방법이 PointCut입니다.
Target : Advice가 적용되어지는 기존 메서드, 클래스 등을 뜻합니다.
Proxy : 클라이언트와 타겟 사이에 투명하게 존재하며 부가기능을 제공하는
오브젝트. DI를 통해 타겟 대신 클라이언트에게 주입되며 클라이언트의 메소드 호출을 대신 받아서 타겟에 위임하며 이 과정에서 부가기능을 부여한다.

스프링 실제 동작

AOP 적용 전 전체 그림

AOP 적용 후 전체 그림

[참고]https://catsbi.oopy.io/fb62f86a-44d2-48e7-bb9d-8b937577c86c
[참고]https://sabarada.tistory.com/94