본문 바로가기

카테고리 없음

Spring AOP

반응형

https://jainkku.tistory.com/98

 

AOP란?

AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍) OOP를 보완하는 수단으로, 흩어진 관심사(Cross-cutting Concerns)를 모듈화할 수 있는 프로그래밍 기법이다. 여러 객체에 공통으로 적용할 수 있는 기

jainkku.tistory.com

 

Spring AOP 

장점

  • 컴파일러나 클래스 로더 조작기를 설정하지 않아도 됨

주의사항

  • 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에, Spring AOP는 메서드 실행 시점에만 AOP를 적용할 수 있음
    • 반면에 AspectJ는 모든 지점에 AOP를 적용할 수 있다.
  • Spring AOP는 Spring 컨테이너가 관리할 수 있는 빈에만 AOP를 적용할 수 있음

 

그렇다면 AOP 구현 시 Spring AOP 보다 기능이 많은 AspectJ를 직접 사용하는게 더 좋지 않을까?

 

위와 같이 생각했지만, 실무에서는 Spring이 제공하는 AOP 기능만 사용해도 대부분의 문제를 해결할 수 있다고 한다.

또한 AspectJ를 사용하려면 추가로 공부할 내용과 설정이 복잡하지만, Spring AOP는 별도의 추가 자바 설정 없이 편리하게 사용할 수 있다는 장점이 있다.

 

Spring AOP 사용 예제

 

1. 먼저 원하는 대상 객체를 빈에 등록한다.

 

Spring AOP는 Spring 컨테이너가 관리할 수 있는 빈에만 AOP를 적용할 수 있기 때문에 Component 애너테이션을 사용해 빈에 등록한다.

 

@Component
public class BasicCalculator implements Calculator {
 
	@Override
	public long factorial(final long num) {
    	long result = 1;
        for (long i = 1; i <= num; i++) {
        	result *= i;
        }
        return result;
    }
}

 

 

2. Aspect를 정의한다

 

  • 클래스 상단에 Aspect 애너테이션을 붙인다
  • Aspect 또한 빈으로 등록한다
  •  Pointcut을 정의한다
  • Advice를 정의하고, Pointcut을 정의할 때 사용한 시그니처를 포함한다
  • 내부에서 핵심기능인 Target을 호출하기 전후에 실행시간을 측정하는 로직을 작성한다
@Component
@Aspect
public class ExecutionTimeAspect {

	@Pointcut("execution(* fact*(..))")
    private void publicTarget() {}
    
    @Around("publicTarget()")
    public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {
    	long start = System.nanoTime();
        try {
        	// 핵심 기능인 Target 호출
        	Object result = joinPoint.proceed();
            return result;
        } finally {
        	long finish = System.nanoTime();
            Signature sig = joinPoint.getSignature();
            System.out.printf("%s.%s(%s) 실행 시간 : %d \n",
            		joinPoint.getTarget().getClass().getSimpleName(),
                    sig.getName(),
                    Arrays.toString(joinPoint.getArgs()),
                    (finish - start)
                    );
        }
    }
}

 

 

3. 실행 결과

 

 

 

 

 

reference

- https://velog.io/@seungju0000/%EC%8A%A4%ED%94%84%EB%A7%81-AOP-%EA%B0%9C%EB%85%90

- https://www.youtube.com/watch?v=hjDSKhyYK14&t=27s  

반응형