Aspect-Oriented Programming
AOP는 관점(Aspect)지향 프로그래밍으로, 관점을 기준으로 다양한 기능을 분리하여 보는 프로그래밍이다. 관점(Aspect)이란, 부가 기능과 그 적용처를 정의하고 합쳐서 모듈로 만든 것이다
즉 어떠한 로직을 핵심적인 관점, 부가적인 관점으로 나누어 보고, 그 관점을 기준으로 나누어 모듈화 하는것이다.
Crosscutting Concerns
코드를 짜다보면 소스코드상에서 각각 다른 곳에서 반복적으로 쓰이는 똑같은 코드들을 발견하게 된다. 이것을 흩어진 관심사 라고 부른다.
이 흩어진 관심사들을 모듈화 하고 비즈니스 모델에서 분리해내서 재사용하는것이 AOP의 취지이다.
반복되는 코드를 묶어 재사용한다.
코드의 반복을 줄이기 위해 공통되는 기능이나 컨샙을 묶어 재사용하게 된다.
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.*(..))")
public Object logPerf(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
Object reVal = pjp.proceed();
System.out.println(System.currentTimeMillis() - begin);
return reVal;
}
}
@Around
의 excution에서 적용하고자 하는 범위를 지정할수 있다.
excution이 아닌 annotation을 사용하면 해당 어노테이션이 있는 곳에서만 실행시킬수 있다.