AOP란?
2021. 1. 12. 21:09ㆍSPRING/SPRING CORE
AOP
- 공통 관심 사항과 핵심 관심 사항을 분리하는 프로그래밍 법
스프링 AOP
구현예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
|
cs |
용어정리
ASPECT
- AOP에서 관점이라 부르며 여러 객체에 공통으로 적용되는 기능을 담당, 예제에서는 TimeTraceAop CLASS에 @Aspect 애노테이션으로 정의.
ADVICE
- 언제 적용할지에 대한 개념.
- @Before - 핵심 비즈니스 로직이 실행되기 전에 적용
- @AfterReturning - 핵심 비즈니스가 정상 종료되어 리턴했을 때 적용
- @AfterThrowing - 핵심 비즈니스에서 예외가 났을 때 적용
- @After - 핵심 비즈니스에서 정상 종료됐거나 예외가 났을 때, 즉, 어쨌든 종료됐을 때 적용
- @Around - 핵심 비즈니스 로직 실행전과 실행후에 적용
JOINPOINT
- ADVICE가 적용될 곳. 메서드가 호출될 때, 변수에 접근할 때, 객체에 접근할 때, 객체를 초기화할 때 등의 개념이 있지만 스프링에서는 프록시 기반의 AOP를 구현하고 있기 때문에 메서드가 호출될 때밖에 지원하지 않는다.
POINTCUT
- ADVICE를 적용할 JOINPOINT를 선별하는 작업 또는 범위를 정의.
- 예제에서는 “execution(* hello.hellospring..*(..))” 이렇게 정의하려 해당 패키지의 모든 메소드를 지정.
- 어노테이션을 정의해서 POINTCUT을 정의할 수 있음. 예) @Transactional
TARGET
- POINTCUT에 의해 AOP가 적용될 최종적인 대상.
- POINTCUT은 범위를 정의하는 것이고 TARGET은 그 대상 하나하나를 지침.
원리
- 스프링 AOP는 CGLIB 라이브러리를 통해 POINTCUT 대상에 프록시를 생성함.
Proxy 동작 원리
'SPRING > SPRING CORE' 카테고리의 다른 글
도메인 모델 패턴, 트랜잭션 스크립트 패턴 장단점 (0) | 2021.01.28 |
---|---|
빌드패턴, lombok의 @Builder (0) | 2021.01.26 |
IOC 제어의 역전 (0) | 2021.01.12 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2021.01.12 |