Spring AOP
2024. 11. 27. 12:31

Spring AOP(Aspect-Oriented Programming)는 애플리케이션에서 공통 관심사를 모듈화하여 코드의 재사용성을 높이고, 코드의 중복을 줄이기 위한 프로그래밍 패러다임이며, Spring AOP는 주로 "로깅", "보안", "트랜잭션 관리", "성능 모니터링" 등의 공통 관심사를 모듈화하여 비즈니스 로직과는 분리된 방식으로 처리할 수 있도록 한다.

AOP의 기본 개념

AOP는 객체지향 프로그래밍(OOP)에서 발생할 수 있는 여러 관심사를 분리하는 방법을 제공, 예를 들어, 여러 곳에서 로깅을 해야 한다면, 로깅 기능을 각 클래스에 삽입하기보다는 하나의 공통된 로깅 코드로 분리하여 재사용할 수 있게 만듬

AOP의 핵심 개념은 다음과 같다

  1. Aspect (측면): 공통 관심사를 정의한 모듈입니다. 예를 들어, 로깅, 보안, 트랜잭션 관리 등이 Aspect가 될 수 있습니다.
  2. Join Point (조인 포인트): Aspect가 적용될 수 있는 실행 지점입니다. 일반적으로 메서드 호출 지점이 가장 많이 사용됩니다.
  3. Advice (어드바이스): 특정 Join Point에서 실행될 코드입니다. Advice는 실제로 "어떻게" 실행할지를 정의합니다. 예를 들어, 메서드 실행 전, 후, 예외 발생 시 등이 있습니다.
  4. Pointcut (포인트컷): 어떤 Join Point에서 Advice를 실행할지 정의하는 표현식입니다. Pointcut은 메서드 실행 조건을 명시하며, 어떤 메서드에서 Advice가 실행될지 결정합니다.
  5. Weaving (위빙): Aspect를 실제 코드에 적용하는 과정입니다. 위빙은 런타임 시점 또는 컴파일 시점에 이루어질 수 있습니다.

Spring AOP에서의 역할

Spring AOP는 주로 프록시 기반으로 동작하며, AOP를 적용하려는 객체에 대해 프록시를 생성하여, 해당 객체의 메서드를 호출할 때 필요한 Aspect를 적용하며, Spring에서는 AOP를 이용한 로깅, 트랜잭션 처리, 보안 등을 손쉽게 구현할 수 있다.

Spring AOP의 특징

  • Proxy 기반: Spring AOP는 기본적으로 프록시 객체를 사용하여 Aspect를 적용합니다. 이를 통해 기존 객체에 영향을 주지 않으면서도 공통 관심사를 처리할 수 있습니다.
  • 선언적: Spring AOP는 주로 XML 설정이나 애너테이션을 통해 선언적으로 Aspect를 정의할 수 있습니다.
  • 런타임 위빙: Spring AOP는 주로 런타임 시에 Aspect를 적용하는 "동적 프록시" 방식을 사용합니다.

Spring AOP 사용 예시

  1. 애너테이션 기반 AOP 예시
  2. Spring에서 AOP를 사용하는 가장 간단한 방법은 애너테이션을 사용하는 것입니다. 예를 들어, 메서드 실행 전에 로깅을 추가하고 싶다면 다음과 같이 할 수 있습니다.
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")  // Pointcut
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Method " + joinPoint.getSignature().getName() + " is about to be called");
    }
}

 

  • Aspect: 클래스가 AOP Aspect임을 나타냅니다.
  • @Before: 메서드 실행 전 로깅을 수행하도록 지정합니다.
  • execution(* com.example.service.*.*(..)): 특정 패키지 내의 모든 메서드를 대상으로 하는 Pointcut입니다.

 

  • XML 기반 AOP 예시
  • XML 설정을 통해 AOP를 적용할 수도 있습니다.
<aop:config>
    <aop:aspect ref="loggingAspect">
        <aop:before pointcut="execution(* com.example.service.*.*(..))" method="logBefore"/>
    </aop:aspect>
</aop:config>

 

AOP에서의 Advice 종류

Spring AOP에서 사용할 수 있는 Advice 유형은 다음과 같습니다:

  1. @Before: 메서드 실행 전에 실행됩니다.
  2. @After: 메서드 실행 후, 예외 여부와 관계없이 실행됩니다.
  3. @AfterReturning: 메서드 실행 후, 예외가 없을 경우 실행됩니다.
  4. @AfterThrowing: 메서드 실행 중 예외가 발생하면 실행됩니다.
  5. @Around: 메서드 실행 전후에 모두 실행됩니다. 가장 강력한 Advice로, 메서드의 실행을 제어할 수 있습니다.

Spring AOP의 제한 사항

  • 메서드 기반 AOP만 지원: Spring AOP는 메서드 실행 시점을 기준으로 Aspect를 적용하기 때문에, 생성자, 필드, 정적 메서드 등에는 AOP를 적용할 수 없습니다.
  • 프록시 기반: AOP는 기본적으로 프록시를 사용하므로, final 클래스나 final 메서드에 대해서는 적용할 수 없습니다.

결론

Spring AOP는 공통 관심사를 분리하여 코드의 재사용성을 높이고, 비즈니스 로직의 복잡성을 줄이는 데 매우 유용합니다. 이를 통해 애플리케이션의 유지보수성을 개선하고, 로깅, 보안, 트랜잭션 관리 등의 기능을 간단하게 구현할 수 있습니다.

'Back-End > Spring' 카테고리의 다른 글

Flash Attributes / RedirectAttributes  (0) 2024.11.29
Point cut  (0) 2024.11.27
Spring - AutoWired  (0) 2024.11.27
Spring bean  (0) 2024.11.26
Spring기본  (0) 2024.11.26