AOP란?

2021. 1. 12. 21:09SPRING/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 동작 원리