스프링

AOP(Aspect Oriented Programming, 관점지향 프로그래밍)에 대해서 알아보기

영범 2025. 6. 19. 11:56

모든 내용은 공부 후 정리해서 적어둔 내용입니다. 틀린 내용이 있다면 댓글로 말씀해 주세요.


 

관점지향 프로그래밍은 객체지향 프로그래밍(OOP)을 보완하는 개념입니다.

OOP에서는 클래스(class)가 모듈화의 기본 단위이지만, AOP에서는 관점(Aspect)이 모듈화의 단위입니다.

 

OOP에서의 모듈화

쇼핑몰의 주문을 처리하는 로직이 아래와 같다고 가정해 보겠습니다.

public class OrderService {
    public void placeOrder() {
    	... 주문 생성 로직
        ... 재고 차감 로직
    	... 결제 처리 로직
        ... 주문 완료 알림 로직
    }
}

 

모든 로직이 하나의 메서드에 뭉쳐있어서 유지보수도 어렵고 재사용이 어렵습니다.

이걸 클래스를 단위로 기능별로 나눈다면 아래와 같습니다.

 

public class OrderService {
    private StockService stockService;
    private PaymentService paymentService;
    private NotificationService notificationService;

    public void placeOrder() {
    	stockService.decreaseStock();
        paymentService.processPayment();
        notificationService.sendSuccessOrderEmail();
    }
}

이게 OOP의 모듈화입니다.

이렇게 하면 각 서비스는 독립적으로 테스트하고 유지보수도 가능하며 재사용도 용이합니다.

 

근데, 여기서 모든 서비스의 메서드마다 로그를 찍는다거나 트랜잭션을 걸고 싶다거나 하는 경우가 있을 수 있습니다.

그렇다면 여러 메서드에서 로깅이라는 반복되는 기능이 들어가야 하는데, 여기에서 AOP의 필요성이 드러나게 됩니다.

 

원래 메서드의 목적(예시의 주문)과 별개로 반복적으로 해줘야 하는 부가적인 기능(로깅)이 계속 함께 있어야 합니다.

이렇게 여러 메서드에서 반복되는 부가적인 기능을 "공통 관심사"라 부르고 이를 원래 메서드의 목적인 "핵심 관심사"에서

분리해서 따로 관리할 수 있도록 구현하는 것이 AOP의 핵심입니다.

 

 

다시 말해서, 핵심 관심사에 계속해서 끼어드는 공통 관심사를 관점이라는 별도 모듈로 분리해서 유지보수가 쉬운 구조로 만드는 방법입니다.

 


 

AOP 핵심 용어 정리

  • Advice
    실제로 실행될 부가 로직

  • JoinPoint
    프로그램 실행 중의 특정 지점
    예) 메서드가 실행되는 지점, 예외 처리가 되는 지점 등

  • Pointcut
    JoinPoint 중에서도 실제로 Advice를 적용할 지점을 선별하는 조건식
    Advice는 특정 Pointcut 표현식과 연결되어 있으며, 그 표현식에 의해 매칭된 모든 JoinPoint에 대해서 실행됩니다.
    예) 이름이 특정 패턴을 따르는 메서드 실행에만 Advice를 적용

 


 

Spring AOP Advice의 종류

  • Before Advice
    JoinPoint 전에 실행되며, 메서드 실행을 막을 수는 없습니다.
    (단, 예외를 던지면 실행을 중단시킬 수는 있습니다.)

  • After Returning Advice
    메서드가 정상적으로 완료된 후 실행됩니다.

  • After Throwing Advice
    메서드가 예외를 던지고 종료된 후 실행됩니다.

  • After (Finally) Advice
    메서드가 정상종료되든 예외를 던지든 무조건 실행됩니다.

  • Around Advice
    메서드 실행 전후로 감싸는 가장 강력한 메서드입니다.
    메서드 실행 전/후에 커스텀 동작을 수행할 수 있으며, 메서드를 실행할지 말지를 결정할 수 있고 직접 결과를 반환하거나 예외를 던질 수 있습니다.

 

주의 사항
Around Advice는 가장 범용적인 Advice입니다. 하지만 가능한 한 더 제한적인 Advice를 사용하는 것이 좋습니다.

 

 

 


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

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