Spring

[Spring] AOP에 @EnableAspectJAutoProxy는 왜 필요할까?

누구세연 2024. 9. 7. 12:03

Spring 프레임워크는 애플리케이션에서 횡단 관심사(Cross-Cutting Concern)를 분리하기 위해 AOP(Aspect-Oriented Programming)를 제공합니다. AOP는 로깅, 보안, 트랜잭션 관리와 같은 횡단 관심사를 비즈니스 로직과 분리하여 더 모듈화 된 코드를 작성할 수 있게 해 줍니다.

그런데, 우리는 무심코 사용하고 있는 `@EnableAspectJAutoProxy`에 대해 알고 있을까요? 이 어노테이션은 어떻게 AOP 기능을 활성화하고, 어떤 역할을 할까요? 이번 글에서는 `@EnableAspectJAutoProxy`를 중심으로 Spring의 AOP에 대해 알아보겠습니다. 🫠

 

@EnableAspectJAutoProxy란?

횡단 관심사란 무엇일까요?

로깅, 보안, 트랜잭션 관리와 같이 애플리케이션에서 여러 곳에서 반복적으로 사용되는 기능을 의미합니다.

이러한 기능들은 각 비즈니스 로직마다 직접 처리하는 대신, AOP를 통해 한 번에 관리할 수 있습니다.

Spring에서는 AOP를 사용해 이러한 횡단 관심사들을 쉽게 분리할 수 있습니다.

그런데 AOP가 동작하려면 프록시(proxy) 객체가 필요합니다.

프록시 객체는 실제 객체를 대신해서 실행되며, 우리가 원하는 부가 기능(로깅, 보안 등)을 추가하는 역할을 합니다.

이때 등장하는 것이 바로 `@EnableAspectJAutoProxy`입니다!

 

 

@EnableAspectJAutoProxy의 역할

`@EnableAspectJAutoProxy`는 Spring에게 "AOP를 사용하겠다"라고 명확히 알려주는 어노테이션입니다.

이 어노테이션을 사용하면 Spring에서 AOP를 활성화하고, 프록시 객체가 생성되도록 설정합니다.

@EnableAspectJAutoProxy(proxyTargetClass = true) 
public class AppConfig {
	// 설정들 
}

이 코드는 Spring에게 프록시 클래스를 생성해 AOP를 활성화하라는 신호를 보냅니다.

특히 proxyTargetClass = true를 사용하면 인터페이스가 아닌 구체적인 클래스의 프록시를 만들 수 있습니다

 

 

@EnableAspectJAutoProxy 꼭 사용해야 할까요?

사실 Spring Boot에서는 이 어노테이션을 사용하지 않아도 AOP가 활성화되어 있습니다.

그래서 별도로 설정하지 않아도 로깅이나 트랜잭션 관리 같은 기능이 잘 돌아갑니다.

 

하지만, 명시적으로 AOP를 활성화하거나, AOP 동작 방식을 커스터마이징하고 싶다면 이 어노테이션을 사용해 AOP 동작을 제어할 수 있습니다.

 

예시 코드

간단한 예시를 통해 AOP가 어떻게 적용되는지 확인해 봅시다.

@Configuration 
@EnableAspectJAutoProxy 
public class AopConfig { 
    @Bean 
    public MyAspect myAspect() {
        return new MyAspect(); 
    } 
} 

@Aspect 
@Component 
public class MyAspect { 
    @Before("execution(* com.example.service.*.*(..))") 
    public void beforeMethod(JoinPoint joinPoint) { 
        System.out.println("Before method: " + joinPoint.getSignature().getName()); 
    } 
}
 

위 코드에서는 com.example.service 패키지 내의 모든 메서드가 실행되기 전에 beforeMethod라는 메서드를 통해 자동으로 로깅을 추가합니다. 이렇게 @Aspect와 @Before를 사용하여 특정 시점에 원하는 로직을 삽입할 수 있습니다.

 

💡 @EnableAspectJAutoProxy는 Spring에서 AOP를 활성화하고 프록시 동작 방식을 설정하는 중요한 어노테이션입니다.
Spring Boot에서는 기본적으로 AOP가 동작하긴 하지만, 이 어노테이션을 사용하면 좀 더 명시적으로 AOP를 설정하고 프록시 동작 방식을 커스터마이징 할 수 있습니다.