SpringBoot 를 배워보자

스프링 부트 AOP(Aspect Oriented Programming) 심층 분석: 예제와 함께하는 상세 가이드

_Blue_Sky_ 2024. 11. 17. 11:21
728x90

스프링 부트는 개발 생산성을 높여주는 강력한 프레임워크로, AOP(Aspect Oriented Programming)는 이러한 생산성을 더욱 향상시키는 중요한 기능 중 하나입니다. AOP는 객체 지향 프로그래밍(OOP)의 한계를 보완하여 공통 관심사(예: 로깅, 트랜잭션, 보안 등)를 핵심 관심사(비즈니스 로직)로부터 분리하여 모듈화하는 기법입니다.

AOP의 핵심 개념

  • 관점(Aspect): 공통 관심사를 모듈화한 클래스입니다. 로깅, 트랜잭션, 보안 등의 기능을 담당합니다.
  • 조인 포인트(Join Point): 어드바이스가 적용될 수 있는 프로그램 실행 시점을 의미합니다. 메서드 호출, 예외 발생 등이 대표적인 조인 포인트입니다.
  • 포인트컷(Pointcut): 조인 포인트 중 어떤 조인 포인트에 어드바이스를 적용할지 정의하는 표현식입니다.
  • 어드바이스(Advice): 조인 포인트에서 실행될 구체적인 동작을 정의합니다. before, after, around 등 다양한 타입의 어드바이스가 있습니다.
  • 위빙(Weaving): 어드바이스를 애플리케이션에 적용하는 과정을 의미합니다. 스프링 AOP는 런타임 시 위빙을 수행합니다.
728x90

스프링 부트에서 AOP 적용하기

스프링 부트에서 AOP를 적용하려면 다음과 같은 단계를 거칩니다.

  1. Aspect 클래스 정의: @Aspect 어노테이션을 사용하여 Aspect 클래스를 정의합니다.
  2. Pointcut 정의: @Pointcut 어노테이션을 사용하여 Pointcut을 정의합니다.
  3. Advice 정의: @Before, @After, @Around 등의 어노테이션을 사용하여 Advice를 정의합니다.
  4. 스프링 빈으로 등록: @Component 어노테이션을 사용하여 Aspect 클래스를 스프링 빈으로 등록합니다.

AOP 예제: 메서드 실행 시간 측정

@Aspect
@Component
public class PerformanceAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object logPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();

        try {
            return joinPoint.proceed();
        } 
        finally {
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            
            System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        }
    }
}
 
 

위 예제는 com.example.service 패키지 내 모든 메서드 실행 시간을 측정하는 Aspect입니다. @Around 어드바이스는 메서드 실행 전후에 특정 로직을 실행할 수 있도록 합니다.

execution(* com.example.service.*.*(..))의 구성

이 부분은 Pointcut 표현식으로, 어떤 메서드에 이 Advice를 적용할지 지정합니다. 다음은 각 구성 요소의 의미입니다:

(1) execution

  • 메서드 실행 시점을 기준으로 Advice를 적용합니다.

(2) * (리턴 타입)

  • 메서드의 리턴 타입이 무엇이든 상관없이 Advice를 적용합니다.

(3) com.example.service.* (패키지 및 클래스)

  • com.example.service 패키지에 속한 모든 클래스에 Advice를 적용합니다.
  • *는 해당 패키지 내 모든 클래스를 의미합니다.

(4) * (메서드 이름)

  • 모든 메서드 이름에 Advice를 적용합니다.

(5) (..) (파라미터)

  • 메서드의 파라미터 타입과 개수에 상관없이 Advice를 적용합니다.

 

728x90

AOP 활용 사례

  • 로깅: 메서드 호출 시 로그를 남겨 시스템 동작을 추적합니다.
  • 트랜잭션 관리: 메서드 실행 시 트랜잭션을 관리하여 데이터 무결성을 보장합니다.
  • 보안: 특정 메서드에 대한 접근 권한을 제어합니다.
  • 성능 측정: 메서드 실행 시간을 측정하여 성능 병목 지점을 찾습니다.
  • 예외 처리: 예외 발생 시 공통적인 예외 처리 로직을 수행합니다.

AOP의 장점

  • 코드 재사용성 증가: 공통 관심사를 별도의 모듈로 분리하여 재사용성을 높입니다.
  • 관심사 분리: 핵심 비즈니스 로직과 공통 관심사를 분리하여 코드 가독성을 향상시킵니다.
  • 유지보수성 향상: 공통 관심사의 변경이 필요할 때 Aspect만 수정하면 됩니다.

 

스프링 부트 AOP는 개발 생산성을 높이고 코드 품질을 향상시키는 강력한 도구입니다. AOP를 효과적으로 활용하면 복잡한 애플리케이션을 더욱 효율적으로 개발하고 관리할 수 있습니다.

 

728x90