AOP는 관점 지향 프로그래밍이라고 불린다.
관점(Aspect) 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 부가적인 관점(기능)을 각각 Aspect라는 형태로 모듈화하겠다는 것이다.
모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 이때, 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다.

Aspect는 AOP의 기본 모듈로 부가기능의 코드를 정의한(구현체) Advice와 어디에 적용할지를 결정하는 PointCut을 합친 개념이다.

gradle의 build.gradle에서 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-aop'
@Aspect라는 어노테이션을 붙여서 이 클래스가 Aspect라는 것을 명시하고
@Component를 붙여 컴포넌트 스캔에 의해 빈으로 등록되도록 한다.
@Around 어노테이션은 타겟 메서드를 감싸서 Advice를 실행한다는 의미이다.
@Component
@Aspectpublic
class PerfAspect {
@Around("execution(* com.example..*.EventService.*(..))")
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable{
long begin = System.currentTimeMillis();
Object retVal = pjp.proceed(); // 메서드 호출 자체를 감쌈
System.out.println(System.currentTimeMillis() - begin);
return retVal;
}
}
@Component
@Aspectpublic
class PerfAspect {
@Around("@annotation(PerLogging)")
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable{
long begin = System.currentTimeMillis();
Object retVal = pjp.proceed();
System.out.println(System.currentTimeMillis() - begin);
return retVal;
}
}
// 어노테이션 등록
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerLogging {
}
// 어노테이션 적용
@Component
public class SimpleEventService implements EventService {
@PerLogging
@Override
public void publishEvent() {
System.out.println("Published an event");
}
}
@Component
@Aspectpublic
class PerfAspect {
@Around("bean(simpleEventService)")
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable{
long begin = System.currentTimeMillis(); Object retVal = pjp.proceed();
System.out.println(System.currentTimeMillis() - begin);
return retVal;
}
}
참조