=> 기존 객체지향 프로그래밍의 한계를 보완하기 위해 AOP 활용
애플리케이션의 핵심적인 비즈니스 로직으로부터 부가적인 기능 을 분리해서 애스펙트(Aspect)로 정의하고 설계하여 개발하는 방식.
Advice 동작 시점
Weaving 방식
장점
단점
Proxy 생성 방식
Proxy 생성 방식 특징
maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
gradle
implementation 'org.springframework.boot:spring-boot-starter-aop'
Aspect
@Component
@Aspect
public class PerfAspect {
@Around("execution(* com.example..*.EventService.*(..))")//com.example 패키지 밑에 있는 모든 클래스에 적용을 하고, EventService 밑에 있는 모든 메소드에 적용해라
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
Object reVal = pjp.proceed();//실제 대상 객체 메소드 호출
System.out.println(System.currentTimeMillis() - begin);
return reVal;
}
}
또는
@Component
@Aspect
public class PerfAspect {
@Around("@annotation(CheckProcessTime)")
//CheckProcessTime 어노테이션 사용시 해당 Advice 실행
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
Object reVal = pjp.proceed(pjp.getArgs());//실제 대상 객체 메소드 호출
System.out.println(System.currentTimeMillis() - begin);
return reVal;
}
}
Aspect
@Aspect
public class PerfAspect {
Advice
@Around("execution(* com.example..*.EventService.*(..))") // -> pointcut
//또는
@Around("@annotation(CheckProcessTime)")
Target
@Target
public class SendMailController{
// 또는
@CheckProcessTime
public class SendMailController{
JointPoint
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
Object reVal = pjp.proceed(pjp.getArgs());//실제 대상 객체 메소드 호출
System.out.println(System.currentTimeMillis() - begin);
return reVal;
}
Spring AOP | AspectJ |
---|---|
순수 java로 구현 가능 | 추가 도구를 통해 구현 |
복잡한 과정 필요 X | AspectJ compiler가 필요 |
RTW 지원 | RTW,CTW,LTW 지원 |
Spring Container에 의해 관리되는 beans에만 적용 가능 | 모든 객체 대상으로 적용 가능 |
프록시 패턴을 필요로함 | 디자인 패턴 필요 x |
비교적 성능이 안좋음 | 비교적 성능 좋음 |
배우고 적용하기 쉽다 | Spring AOP에 비해 복잡 |
Spring AOP를 보편적으로 사용하되, 필요에 따라 AspectJ 사용(성능이슈, 위빙 방식 변경 등)
실행 순서 : Filter -> Interceptor -> AOP -> Interceptor -> Filter
Filter
Interceptor
AOP