관점 지향 프로그래밍, 어떤 프로그램에서 부가적인 기능들을 분리해 분리된 기능의 관점에서 기능을 모듈화 하여 설계 및 개발하는 것
핵심 기능과 부가적인 기능들이 분리되어 있기 때문에 핵심 기능의 수정 없이 쉽게 부가 기능을 붙이거나 수정할 수 있고 코드의 재사용성을 높일 수 있다.
즉, 공통적으로 사용되는 기능적인 역할을 하는 코드를 재활용하여 사용할 수 있도록 만들어주는 방법
Ex) 시간 측정을 하는 경우
N개의 메서드가 있을 때 N개의 시간측정 메서드가 필요하며 만약 Log출력에서 Log내용을 바꿔야한다면 N번 작업해야한다.
비즈니스 로직과 기능적인 역할을 하는 코드가 같은 Class 안에 혼재될 수 밖에 없다.
시간측정 코드는 중복코드가 된다.
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가 적용되어지는 기존 메서드, 클래스 등을 뜻합니다.
AOP Proxy : Spring에서 AOP는 Dynamic Proxy 기법으로 AOP를 구현하고 있습니다. 즉 , 우리가 AOP가 적용된 Target 메서드를 호출 할 때 바로 그 메서드가 호출되는 것이 아니라 Advice가 요청을 대신 랩핑(Wrraping) 클래스로써 받고 그 랩핑 클래스가 Target을 호출합니다. AOP의 자세한 원리는 다음에 자세히 알아보도록 하겠습니다.
Introduction : AOP를 적용할 때 내부적으로 코드를 생성 (Spring의 경우 wraaping class)하는 것을 말합니다.
Weaving : Aspect가 target에 적용되는 전체적인 과정을 말합니다. 즉, PointCut으로 지정된 JoinPoint에 Advice가 적용되어 Target을 호출 시 AOP Proxy가 만들어지는 과정입니다.