2025. 10. 20. 06:02ㆍ코딩 도구/백엔드 개발 (Backend Development)
@Aspect AOP 정리
이 글은 인프런 김영한님의 "스프링 핵심 원리 - 고급편" 강의를 수강하고 정리한 내용이다.
1. AOP와 @Aspect 기반 프록시 적용
스프링 애플리케이션에 프록시를 적용하려면, 포인트컷과 어드바이스로 구성된 어드바이저(Advisor) 를 만들어 스프링 빈으로 등록해야 한다. 이 과정에서 자동 프록시 생성기가 어드바이저를 기반으로 필요한 스프링 빈에 자동으로 프록시를 적용한다.
스프링은 이 작업을 @Aspect 애노테이션으로 매우 간편하게 처리할 수 있게 해준다. 즉, 어드바이저를 직접 만들 필요 없이 @Aspect를 붙인 클래스를 빈으로 등록하기만 하면 된다.
@Slf4j
@Aspect
public class LogTraceAspect {
private final LogTrace logTrace;
public LogTraceAspect(LogTrace logTrace) {
this.logTrace = logTrace;
}
@Around("execution(* hello.proxy.app..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
TraceStatus status = null;
try {
String message = joinPoint.getSignature().toShortString();
status = logTrace.begin(message);
Object result = joinPoint.proceed();
logTrace.end(status);
return result;
} catch (Exception e) {
logTrace.exception(status, e);
throw e;
}
}
}
2. AOP 적용을 위한 설정
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {
@Bean
public LogTraceAspect logTraceAspect(LogTrace logTrace) {
return new LogTraceAspect(logTrace);
}
}
- @Aspect 를 붙였다고 끝이 아니라 반드시 빈으로 등록해야 적용된다.
- 또는 @Component 를 붙여 컴포넌트 스캔 대상이 되게 할 수 있다.
3. AOP 개념 요약
| Join Point | 어드바이스가 적용될 수 있는 지점. (스프링 AOP는 메서드 실행만 가능) |
| Pointcut | 어떤 Join Point에 어드바이스를 적용할지 결정하는 필터 |
| Advice | 부가 기능 (로깅, 트랜잭션 등) |
| Aspect | 포인트컷 + 어드바이스의 결합체. @Aspect 로 정의 |
| Advisor | 어드바이스 + 포인트컷. 스프링 AOP에서 사용하는 특별한 용어 |
| Weaving | 부가 기능을 핵심 기능에 적용하는 과정 |
| AOP 프록시 | 스프링 AOP가 생성하는 프록시 객체 (JDK 동적 프록시 또는 CGLIB 프록시) |
4. 자동 프록시 생성기의 역할과 동작 방식
스프링이 제공하는 자동 프록시 생성기인 AnnotationAwareAspectJAutoProxyCreator 는 2가지 역할을 수행한다.
- @Aspect 를 기반으로 Advisor 생성 및 등록
- 어드바이저를 기반으로 프록시 생성 및 적용
작동 흐름 요약
- 빈 생성: 스프링이 @Bean 또는 컴포넌트 스캔으로 빈을 생성한다.
- 전달: 생성된 객체를 빈 저장소에 등록하기 직전에 자동 프록시 생성기에게 전달한다.
- Advisor 조회: 스프링 컨테이너에서 Advisor 빈을 모두 조회하고, @Aspect 어노테이션 기반으로 생성된 Advisor도 함께 수집한다.
- 프록시 적용 대상 판단: 포인트컷 조건을 기반으로 클래스의 모든 메서드를 검사하여 하나라도 매칭되면 프록시 생성 대상으로 판단한다.
- 프록시 생성: 조건이 맞으면 프록시를 생성하고 반환, 아니면 원본 객체를 반환
- 빈 등록: 반환된 객체(프록시 또는 원본 객체)를 스프링 빈으로 최종 등록한다.
자동 프록시 생성기의 핵심은 프록시 생성 대상을 동적으로 판단하고 적용하는 유연성에 있다.
5. 횡단 관심사와 AOP의 목적
우리가 지금까지 적용해온 로깅 기능처럼, 특정 기능 하나가 아니라 여러 레이어와 컴포넌트에 걸쳐 반복적으로 적용되는 기능을 횡단 관심사(cross-cutting concern) 라 한다.
AOP의 주 목적은 이러한 횡단 관심사를 깔끔하게 분리하고, 핵심 로직과 부가 로직을 효과적으로 나누는 것이다.
핵심 기능과 부가 기능 분리
오랜 시간 동안 많은 개발자들이 부가 기능을 효과적으로 적용하는 방법을 고민해왔고, 이를 모듈화하고 적용 범위를 지정하는 방식으로 해결하려 했다. 그 결과 등장한 개념이 바로 애스펙트(Aspect) 이다.
애스펙트는 어드바이스(부가 기능) 와 포인트컷(적용 위치) 를 조합한 모듈이다. 우리가 사용하는 @Aspect가 그 대표적인 예이다.
이러한 애스펙트를 활용한 프로그래밍 방식을 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming) 이라 한다.
참고: AOP는 OOP를 대체하기 위한 것이 아니라, OOP가 처리하기 힘든 횡단 관심사 문제를 보완하기 위해 등장한 개념이다.
6. AOP 적용 시점 차이
| 적용 시점 | 설명 | 대표 기술 |
| 컴파일 시점 | 애스펙트 호출 코드가 대상 클래스에 삽입됨 | AspectJ 컴파일러 |
| 클래스 로딩 시점 | 바이트코드를 조작하여 부가 기능 적용 | AspectJ LTW |
| 런타임 시점 | 프록시를 통해 부가 기능 적용 | 스프링 AOP |
스프링 AOP는 런타임 프록시 기반으로 작동하며, 프록시를 통해 메서드를 실행하는 시점에 AOP가 적용된다.
7. AspectJ vs Spring AOP
스프링 AOP는 AspectJ 문법 일부를 차용하지만, 실제 AspectJ를 사용하는 것은 아니다.
- AspectJ는 컴파일 타임 및 클래스 로딩 타임에 AOP를 적용할 수 있어 더 다양한 기능을 제공한다.
- 하지만 설정이 복잡하고 별도 컴파일러나 옵션이 필요하다.
- 반면 스프링 AOP는 스프링 컨테이너와 프록시 기반으로 작동하여 설정이 간단하고, 실무에서 사용하기 적합하다.
실무에서는 스프링 AOP만으로도 대부분의 요구사항을 처리할 수 있다. 따라서 스프링 AOP의 구조와 기능을 정확히 이해하고 익숙해지는 것이 훨씬 현실적인 선택이다.
8. 정리 및 실무 팁
- @Aspect 기반 AOP는 가장 실용적이고, 스프링 부트와 함께 사용 시 별도 설정 없이 쉽게 적용된다.
- 스프링 AOP는 런타임 프록시 방식을 사용하므로 메서드 실행 시점에만 AOP 적용 가능하다.
- @Around, @Before, @AfterReturning, @AfterThrowing 등 다양한 Advice 타입이 존재한다.
- 자동 프록시 생성기는 모든 스프링 빈에 대해 프록시를 적용하지 않고, 포인트컷 조건에 따라 꼭 필요한 곳에만 적용하여 효율성을 유지한다.
핵심 요약: @Aspect 를 사용하면 최소한의 설정으로 AOP를 적용할 수 있으며, 스프링의 프록시 메커니즘을 통해 애플리케이션 전체에 걸쳐 부가 기능을 깔끔하게 적용할 수 있다.
'코딩 도구 > 백엔드 개발 (Backend Development)' 카테고리의 다른 글
| [Spring] AOP 포인트컷 (0) | 2025.11.03 |
|---|---|
| [Spring] AOP 구현 (0) | 2025.10.27 |
| [Spring] 빈 후처리기 (0) | 2025.10.13 |
| [Spring] 스프링이 지원하는 프록시 (0) | 2025.10.06 |
| [Spring] 동적 프록시 기술 (0) | 2025.09.29 |