빙응의 공부 블로그

[Spring] Spring AOP로 성능 측정하기 본문

Spring/개인공부_실습

[Spring] Spring AOP로 성능 측정하기

빙응이 2024. 10. 15. 15:21

📝 AOP(Aspect Oriented Programming)

AOP는 프로그램의 관심사를 분리하여 코드의 모듈성을 높이고 재사용성을 향상시키는
프로그래밍 패러다임이다. 

 

📌 이 패러다임이 왜 필요해?

예를 들어, 비즈니스 로직의 실행 속도를 측정하는 경우를 생각해봅시다. 각 메서드에 currentTimeMillis()를 추가해야 한다면, 코드의 중복이 발생할 수 있습니다.

 

AOP의 아이디어는 관점에 따라 분류 가능한 로직을 모듈화하여 따로 관리하며, 공통적으로 사용 가능한 로직은 재사용 가능한 형태로 만드는 것입니다. 이렇게 하면 공통 관심 사항(예: 시간 측정)을 분리하여 처리할 수 있습니다.

해당 사진처럼 공통으로 처리하는 시간 측정 로직을 공통 관심 사항으로 분리하여 처리할 수 있게 해준다.

 

📝 AOP로 Spring 성능 측정하기

이번에는 AOP로 Spring 성능 측정을 하는 공통 관심사를 만들어보겠습니다.

 

📌@Component 방식

@Aspect
@Component
public class PerformanceAspect {

    private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class);

    @Around("execution(* com.yourpackage..*(..))") // AOP 적용할 패키지 및 메서드 지정
    public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        Object proceed = joinPoint.proceed(); // 타겟 메서드 실행

        long executionTime = System.currentTimeMillis() - start;

        logger.info("Method {} executed in {} ms", joinPoint.getSignature(), executionTime);
        return proceed;
    }
}

설명

  • @Aspect: 이 클래스가 AOP의 Aspect임을 나타낸다.
  • @Around: 지정한 Join Point(여기서는 패키지 내의 모든 메서드)에 대해 전후에 수행될 로직을 정의한다.
  • measureExecutionTime: 타겟 메서드의 실행 시간을 측정하고 로그로 기록합니다. joinPoint.proceed()를 호출하여 실제 메서드를 실행한다.
  • Logger: 로그를 기록합니다. 로그는 메서드의 이름과 실행 시간을 포함한다.

 

📌config 설정

@Aspect가 실행되기 위해서는 Config에 등록해줘야한다.

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 기타 빈 설정
}

@EnableAspectJAutoProxy만 넣어주면 된다

 

 

📝 AOP의 동작원리는 무엇일까요?

 

📌 @EnableAspectJAutoProxy

AOP의 동작원리를 이해하려면 해당 어노테이션을 자세히 알아보아야 합니다. 

해당 어노테이션은 AspectJ의 프록시 기반 AOP 활성화 어노테이션으로 Aspect를 사용하여 정의된 로직을 비즈니스 로직에 적용할 수 있게 합니다.

주요 특징은 다음과 같습니다.

프록시 기반 AOP 활성화
  • 해당 어노테이션을 선언하면 Spring이 Aspect를 인식하고 이를 사용하여 가상의 프록시 객체를 생성한다.
  • 이 프록시 객체는 실제 비즈니스 로직을 감싸고, 해당 로직의 전후에 AOP로 정의된 기능을 추가한다.

즉 해당 어노테이션을 선언하면 Spring이 로직 진행 전에 프록시 가상 객체를 만들어 AOP 설정된 기능을 사용합니다.

AspectJ 지원
  • 이 어노테이션은 AspectJ를 사용하여 정의된 Join Point와 Pointcut을 사용할 수 있게 해줍니다.
  • 예를 들어, 특정 패키지 내의 메서드 호출에 대해 로깅을 추가할 수 있습니다.

 

정리하면 다음과 같습니다.

AOP 어노테이션을 사용하면 객체 호출 전 프록시 객체(Proxy Serivce)를 만들고 먼저 실행하여 앞서 필요한 기능을 수행하고 내부 로직에 따라 joinPoint.proceed()가 실행되면, 그 때 실제 Service가 동작합니다.

 

 

 

 

 

🧷참고

[번역] Spring 공식문서 - Aspect Oriented Programming (velog.io)

 

[번역] Spring 공식문서 - Aspect Oriented Programming

Ref. Spring Framework Documentation v.5.3.16 📌 이 글에서는 공식문서의 Aspect Oriented Programming 부분만 다룹니다.

velog.io