관심사(공통 로직)을 모아 실행한다고 생각하면 될것같다.
횡단 관심사(cross-cutting concern)의 분리를 허용하여 모듈성을 증가시킨다.
관심사의 분리(기능의 분리), 핵심적인 기능에서 부가적인 기능을 분리
- 컴파일 시점 -> AspectJ framework
- 클래스 로딩시점
- 런타임 시점 -> Spring에서 Proxy를 통해 제공한다.
interface 기반은 JDK, class 기반은 CGlib
Target, 타겟 : 핵심 기능을 담고있는 모듈, 대상 = 객체(클래스)
JoinPoint, 조인포인트 : 어드바이스가 적용될 위치 = 타겟 객체가 구현한 모든 메서드
Advice, 어드바이스 : 제공할 부가기능
PointCut, 포인트컷 : 어드바이스를 적용할 타겟을 선별하는 정규표현식
Aspect, 에스팩트 : PointCut + Advice. 스프링에서는 빈으로 등록해서 사용
Weaving, 위빙 : 포인트컷에 의해 결정된 타겟의 조인포인트에 어드바이스를 삽입하는 과정.
- 프록시 기반
- Runtime때 프록시를 생성
- 프록시가 타겍 객체에 대한 호출을 가로챈(Intercept) 후에 어드바이스의 부가기능을 수행 후 타겟 객체의 로직이 실행, 그 이후 어드바이스가 실행된다.
- 메서드 조인포인트만 지원한다.
- XML 기반 POJO 클래스를 이용한 구현
- @Aspect 어노테이션을 이용한 구현
- Around
JoinPoint 전, 후처리- Before
JoinPoint 전처리- Atter Returning
JoinPoint 메서드 호출이 정상적으로 종료된 이후 후처리- After Trowing
타겟의 메서드에서 예오가 발생할 경우에 후처리