[Spring AOP] @Aspect AOP

2025. 7. 6. 16:56·Spring/AOP

@Aspect AOP

@Aspect 프록시 - 적용

이전 챕터에서 Advisor를 직접 구현하여 스프링 빈으로 등록하면 스프링의 자동 프록시 생성기가 자동으로 처리해주는 것을 배웠다.

스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다.
지금까지 어드바이저를 직접 만들었던 부분을 @Aspect 애노테이션을 사용해서 만들어보자.

(@Aspect 는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 스프링은 이것을 차용해서 프록시를 통한 AOP를 가능하게 한다고 한다.)

@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;

        // log.info("target={}", joinPoint.getTarget()); //실제 호출 대상
        // log.info("getArgs={}", joinPoint.getArgs()); //전달인자
        // log.info("getSignature={}", joinPoint.getSignature()); //join point 시그니처

        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;
        }
    }
}
  • @Aspect: 애노테이션 기반 프록시를 적용할 때 필요하다.
  • @Around("execution(* hello.proxy.app..*(..))")
    • @Around 의 값에 포인트컷 표현식을 넣는다. 표현식은 AspectJ 표현식을 사용한다.
    • @Around 의 메서드는 어드바이스(Advice)가 된다.
    • 즉, @Around의 value와 @Around가 붙어 있는 메서드를 통해 Advice를 만들어낸다.
  • ProceedingJoinPoint joinPoint: 어드바이스에서 살펴본 MethodInvocation invocation 과 유사한 기능이다. 내부에 실제 호출 대상, 전달 인자, 그리고 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있다.
  • joinPoint.proceed(): 실제 호출 대상(target)을 호출한다.
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {

    @Bean
    public LogTraceAspect logTraceAspect(LogTrace logTrace) {
        return new LogTraceAspect(logTrace);
    }
}
  • @Bean logTraceAspect(): @Aspect 가 있어도 스프링 빈으로 등록을 해줘야 한다. 물론 LogTraceAspect 에 @Component 애노테이션을 붙여서 컴포넌트 스캔을 사용해서 스프링 빈으로 등록해도 된다.

@Aspect 프록시 설명

스프링에서 사용하는 자동 프록시 생성기의 이름은 AnnotationAwareAspectJAutoProxyCreator이다. 이전 챕터에서 AutoProxyCreater와 AspectJ까지는 알아봤다.

위에서 우리는 @Aspect와 @Around 정보를 통해 Advisor로 만들어주는 것을 배웠다. 애노테이션을 인식한다는 의미에서 AnnotationAware 이 부분이 붙은 것이다.

정리히자면, 자동 프록시 생성기는 2가지 일을 한다.

  1. @Aspect 를 보고 어드바이저(Advisor)로 변환해서 저장한다.
  2. 어드바이저를 기반으로 프록시를 생성한다.

@Aspect 어드바이저 빌더
BeanFactoryAspectJAdvisorsBuilder 클래스이다. @Aspect 의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 내부 저장소에 보관하는 것을 담당한다. (캐싱한다). 캐시에 어드바이저가 이미 만들어져있으면 해당 어드바이저를 반환한다.

“@Aspect 스프링 빈 객체를 Advisor로 만들어 자신만의 내부 저장소 저장한다”

  • 3-1. Advisor 빈 조회: 스프링 컨테이너에서 Advisor 빈을 모두 조회한다.
  • 3-2. @Aspect Advisor 조회: @Aspect 어드바이저 빌더 내부에 저장된 Advisor 를 모두 조회한다.

정리

지금까지 우리가 진행한 애플리케이션 전반에 로그를 남기는 기능은 특정 기능 하나에 관심이 있는 기능이 아니다. 애플리케이션의 여러 기능들 사이에 걸쳐서 들어가는 관심사이다. 이것을 바로 횡단 관심사(cross-cutting concerns)라고 한다.

스프링 AOP는 이런 횡단 관심사 문제를 해결해준다. (다음 챕터부터 자세히 다룸)

Ref) 스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런

'Spring > AOP' 카테고리의 다른 글

[Spring AOP] 스프링 AOP 구현  (0) 2025.07.06
[Spring AOP] 스프링 AOP 개념  (0) 2025.07.06
[Spring AOP] 빈 후처리기  (0) 2025.07.06
[Spring AOP] 스프링이 지원하는 프록시  (0) 2025.07.06
[Spring AOP] 동적 프록시 기술  (0) 2025.07.06
'Spring/AOP' 카테고리의 다른 글
  • [Spring AOP] 스프링 AOP 구현
  • [Spring AOP] 스프링 AOP 개념
  • [Spring AOP] 빈 후처리기
  • [Spring AOP] 스프링이 지원하는 프록시
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (463)
      • 개발 일지 (0)
        • Performance (0)
        • TroubleShooting (0)
        • Refactoring (0)
        • Code Style, Convetion (0)
        • Architecture (0)
      • Software Engineering (36)
        • Test (8)
        • 이론 (18)
        • Clean Code (10)
      • Java (72)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (13)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (16)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Spring AOP] @Aspect AOP
상단으로

티스토리툴바