노션으로 다시 돌아갔습니다 😅

AOP의 적용 간단 플로우 (간단한 예제)

by mignon25

1. 패키지 & AOP 클래스 생성

  • AOP 관련 클래스들을 모아둘 패키지 생성
  • AOP 로직을 가지는 클래스 생성

로직의 시간을 측정하는 AOP 클래스를 작성할 예정

 

2. @Aspect 애너테이션 적용

  • TimeTraceAop 클래스에 @Aspect 애너테이션을 적용해준다. 
@Aspect // 1. AOP 적용
public class TimeTraceAop {
	// aop 로직 메서드 작성
}

 

3.  Advice(AOP 로직) 작성 및 Advice 를 사용할 위치 지정(애너테이션 사용)

각 비즈니스 로직이 수행되는 시간을 측정할 TimeTraceAop 만의 로직 작성(메서드)  
이러한 부가기능 로직 코드를 어드바이스(Advice)라고 한다.
@Around("execution(* hello.hellospring..*(..))") // Advice 적용 위치 및 범위 지정
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { // AOP 메서드의 시그니처
	// AOP 로직
}

각 어드바이스에 대한 자세한 내용은 따로 정리할 것이다.

일단 어떤 종류의 어드바이스 애너테이션들을 적용할 수 있고, 해당 어드바이스들이 어느 시점에 적용되는지만 확인해보자. 

  • @Before : 조인 포인트 실행 이전에 실행
  • @AfterReturning : 조인 포인트가 정상 완료 후 실행
  • @AfterThrowing : 메서드가 예외를 던지는 경우에 실행
  • @After(finally) : 조인 포인트의 동작(정상 또는 예외) 과는 상관없이 무조건 실행
  • @Around : 메서드 호출 전후에 수행하며, 옵션을 통해 위의 모든 애너테이션들을 대체할 수 있다. 

(참고) @Around 만 있어도 모든 기능 수행이 가능하지만, 제약을 두어 좀 더 역할을 명확하게 하는 것이 좋다. 

 

현재 @Around 적용

  • Around 의 파라미터 : 해당 AOP 를 적용할 범위 지정
  • "excution(* hello.hellospring..*(..))" : hello.hellospring 의 하위 패키지에 모두 적용하겠다는 의미 

 

4.  Advice 실제 코드 작성

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");
    }
}
  • joinPoint.proceed() : 다음 어드바이스나 타겟을 호출
    • 비즈니스 메서드에 대한 정보를 ProceedingJoinPoint 객체로 리턴받을 수 있다. 
    • @Around 애너테이션을 사용할 경우에 필요한 메서드
    • around 어드바이스의 경우 클라이언트의 호출을 가로챈다.
    • 만일 around 어드바이스 메서드에서 막바로 return 을 해버리면 비즈니스 메서드 자체가 실행되지 않는다.
    • 그러므로, around Advice 메서드에서 비즈니스 메서드 호출에 대한 책임을 감당해야 한다.
    • 그러려면 비즈니스 메서드에 대한 정보를 around Advice 메서드가 가지고 있어야 한다.
    • 그 정보를 Spring 컨테이너가 around Advice 메서드로 넘겨주는데, 그것이 ProceedingJoinPoint 객체이댜. 
    • Object 로 반환하는데, 여기에는 비즈니스 메서드가 실행한 후의 결과 값들이 담겨 있게 된다.

 

 

5. 스프링 빈으로 등록 => 설정 파일에 추가

컴포넌트스캔을 사용하고, TimeTraceAop 클래스에 @Component 를 적용하는 것도 가능하다. 

그러나 AOP 의 경우 어떤 AOP 가 적용되고 있는지 알아볼 수 있도록 직접 설정 파일을 만들어 관리해주는 것이 좋다. 

@Configuration
public class SpringConfig {

	// ...
    
    @Bean
    public TimeTraceAop timeTraceAop() {
 	   return new TimeTraceAop();
   }
   
}

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기