WEB/Spring

[Spring]AOP 완전 정복하기(개념과 구성 요소)

MoonSta 2023. 9. 13. 22:00

Spring AOP(Aspect-Oriented Programming)은 스프링 프레임워크에서 제공하는 기능 중 하나로, 애플리케이션의 여러 부분에서 로깅, 트랜잭션 관리, 보안 등과 같은 공통 기능을 분리하고 모듈화 하는 데 사용됩니다. 이를 통해 애플리케이션의 핵심 비즈니스 로직과 관심 사항을 분리하여 코드의 재사용성, 유지 보수성, 확장성을 향상할 수 있습니다.

 


Spring AOP의 주요 개념과 구성 요소

 

Spring AOP 완전 정복하기
Spring AOP 완전 정복하기

 

Spring AOP의 주요 개념과 구성 요소는 다음과 같습니다.

 

1.Aspect(관점) 

Aspect는 공통 관심 사항을 정의하는 모듈입니다. Aspect는 Advice, PointCut 및 Introduction의 세 가지 주요 구성 요소를 포함합니다.

 

2.Advice(조언) 

Advice는 Aspect의 동작을 정의하는 부분입니다. 스프링 AOP에서는 다섯 가지 종류의 Advice를 지원합니다.

  • Before Advice : 메서드 실행 전에 동작을 추가합니다.
  • After Returning Advice : 메서드가 성공적으로 실행된 후 동작을 추가합니다.
  • After Throwing Advice : 메서드가 예외를 던진 후 동작을 추가합니다.
  • After Advice : 메서드가 실행된 후(성공 또는 예외 발생 여부에 상관없이) 동작을 추가합니다.
  • Around Advice : 메서드 실행 전후에 동작을 추가하며 가장 강력한 유형의 Advice입니다.

 

3.Pointcut (포인트컷)

Pointcut은 어떤 메서드가 어떤 Advice를 받을지를 결정하는 표현식입니다. 예를 들어, 모든 서비스 계층의 메서드에 로깅 Advice를 적용하려면 특정 패키지 또는 클래스의 메서드를 지정하는 Pointcut을 작성할 수 있습니다.

 

4.Join Point(조인 포인트)

Join Point는 프로그램 실행 중 특정 시점(메서드 호출, 객체 생성 등)을 나타냅니다. Advice가 적용될 수 있는 위치입니다.

 

5.Weaving(위빙)

Weaving은 Aspect를 대상 코드에 적용하는 프로세스를 의미합니다. Spiring AOP에서는 컴파일 시점, 클래스 로딩 시점, 런타임 시점에 Weaving을 수행할 수 있습니다.

 

이제 Spring AOP를 사용한 간단한 예제를 작성해 보도록 하겠습니다. 이번에 작성할 테스트 예제는 메서드 호출 시간을 측정하는 Aspect를 만들도록 하겠습니다.

 

https://docs.spring.io/spring-framework/reference/core/aop.html

 

Aspect Oriented Programming with Spring :: Spring Framework

Aspect-oriented Programming (AOP) complements Object-oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enabl

docs.spring.io


 

Spring AOP 예제 알아보기

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class PerformanceAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        try {
            Object result = joinPoint.proceed();
            return result;
        } finally {
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        }
    }
}

 

 위의 코드는 @Aspect 어노테이션을 사용하여 Aspect를 정의하고, @Around 어노테이션을 사용하여 Around Advice를 정의하였습니다. 이 Aspect는 'com.example.service' 패키지 내의 모든 메서드 호출 시간을 측정하고 로그를 출력합니다.

 


Spring AOP 적용을 위한 config 설정

위의 작성한 예제 코드를 적용하기 위해서는 Spring Config 파일에 아래의 코드를 추가해야 합니다.

<aop:aspectj-autoproxy/>
<bean id="performanceAspect" class="com.example.aspect.PerformanceAspect"/>

위의 코드를 삽입하였다면, 이제 'com.example.service' 패키지에 있는 메서드를 호출하였을 때 Aspect가 적용되는 것을 확인할 수 있습니다. 또한 이렇게 작성한 Aspect는 Spring AOP에서 공통으로 관리되어 효율적인 애플리케이션을 개발할 수 있습니다.