Post

Spring AOP 적용하기

운영중인 서버에서 mongo DB 지연이 발생하여 AOP를 적용하여 지연되는 쿼리를 로그를 추가하는 방법을 공유하고자 합니다.

AOP란

AOP(Aspect Oriented Programming: 관점 지향 프로그래밍)는 소프트웨어 설계 패러다임 중 하나로, 프로그램의 핵심 비즈니스 로직과 공통적으로 적용해야 하는 부가적인 기능(로깅, 트랜잭션 관리, 보안 등)을 분리해서 관리하는 방법입니다.

주요 용어

  • Aspect:
    • 공통 관심사를 구현한 모듈입니다.
    • 예: 로깅, 트랜잭션 관리, 보안 등.
  • Join Point:
    • AOP가 적용될 수 있는 지점입니다.
    • 예: 메서드 실행, 예외 처리, 필드 접근 등.
  • Advice:
    • Join Point에서 실행할 실제 로직입니다.
    • AOP가 해야 할 일을 정의하는 부분으로, 종류는 다음과 같습니다:
      • @Before: 메서드 실행 이전에 실행.
      • @After: 메서드 실행 후에 실행.
      • @Around: 메서드 실행 전, 실행 중, 실행 후 모든 시점에 실행.
  • Pointcut:
    • Advice를 적용할 Join Point를 필터링하는 조건입니다.
    • 예: 특정 패키지, 클래스, 메서드에만 적용.
  • Weaving:
    • AOP 코드를 애플리케이션의 비즈니스 로직에 동적으로 결합하는 과정입니다.
    • Spring은 주로 프록시 기반의 런타임 Weaving을 사용합니다.

Mongo DB 지연 쿼리 로그 추가하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Aspect
@Component
public class MongoDBMonitor {
	protected Logger logger = LogManager.getLogger(this.getClass());

    @Around("execution(* org.springframework.data.mongodb.core.MongoTemplate.*(..))")
    public Object logOperation(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        
        // {...mongo DB 쿼리에 필요 정보 추출}
        
        joinPoint.proceed();
        
        long executionTime = System.currentTimeMillis() - startTime;
        
        // 지연 시간이 특정 임계값을 초과하는 경우 경고 로그 출력
          if (executionTime > 3000) {  // 3초 이상 걸리는 쿼리에 대해 경고
              logger.error("Slow MongoDB Query Detected - Method: {}, Collection: {}, Query: {}, Execution Time: {}ms",
                                         methodName, collectionName, operationInfo, executionTime);
          }

    }

}

AOP 동작 과정

sequenceDiagram
    participant Client
    participant Proxy
    participant Around Advice
    participant Target Method

    Client->>Proxy: 메소드 호출
    Note over Proxy: Spring AOP가 생성한 프록시
    
    Proxy->>Around Advice: @Around 어드바이스 실행
    Note over Around Advice: 메소드 실행 전 로직
    
    Around Advice->>Target Method: proceed() 호출
    Note over Target Method: 실제 비즈니스 로직 실행
    
    Target Method-->>Around Advice: 결과 반환
    Note over Around Advice: 메소드 실행 후 로직
    
    Around Advice-->>Proxy: 최종 결과 반환
    Proxy-->>Client: 결과 전달

AOP 적용후 지연 쿼리 로그

2025-02-11-01.png

MongoDB 쿼리의 지연 문제를 AOP를 적용하여 분석한 결과, count 명령어에서 7~9초 정도 지연되는 것을 확인할 수 있었습니다. 이를 통해 성능 개선의 방향을 설정할 수 있었으며, AOP를 활용하는 방법도 익힐 수 있었습니다.

This post is licensed under CC BY 4.0 by the author.