@Aspect AOP

2022. 7. 9. 22:43·개발/Spring Core
반응형
본 게시글은 인프런 김영한 선생님 강의 스프링 고급편을 완강하고 배운 것을 남기고자 적은 포스팅입니다.

강의 링크는 아래와 같습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 고급편 - 인프런 | 강의

스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

우리는 저번 포스팅 마지막 부분에서 자동 프록시 생성기가 어드바이저를 자동으로 스프링 빈으로 등록시키는 것을 학습했다.
스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다.
실무에서 프록시를 적용할 때는 대부분 이 방식을 사용한다고 한다.
정리하면 편하게 프록시를  만들어주는 것이다!

@Aspect AOP

바로 코드로 살펴보자. 등록한 클래스는 아래와 같다.

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

    }
}
  • ProceedingJoinPoint joinPoint : 어드바이스에서 살펴본 MethodInvocation invocation 과 유사한 기능이다.
    내부에 실제 호출 대상, 전달 인자, 그리고 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있다.
  • joinPoint.proceed() : 실제 호출 대상( target )을 호출한다.

이제 위 클래스를 스프링 빈으로 등록하면 설정은 마무리된다. 이제 본격적으로 알아보자.

자동 프록시 생성기는 스프링 빈으로 등록된 advisor를 자동으로 찾아와서 필요한 곳에 프록시를 생성하고 적용해준다.

자동 프록시 생성기는 추가로 하나의 역할을 더한다.

바로 @Aspect를 찾아서 이것을 advisor로 만들어주는 것이다.
쉽게 이야기해서 지금까지 학습한 기능에 @Aspect 를 Advisor 로 변환해서 저장하는 기능도 한다.

그래서 이름 앞에 AnnotationAware (애노테이션을 인식하는)가 붙어 있는 것이다.

정리하자면 자동 프록시 생성기의 2가지 역할은  아래와 같다.

  1. @Aspect를 보고 advisor로 변환해서 저장.
  2. advisor를 기반으로 프록시를 생성한다.

@Aspect advisor 생성

@Aspect를 advisor로 변환하는 세세한 과정은 아래와 같다.

  1. 실행: 스프링 애플리케이션 로딩 시점에 자동 프록시 생성기를 호출한다.
  2. 모든 @Aspect 빈 조회: 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 애노테이션이 붙은 스프링 빈을 모두 조회한다.
  3. 어드바이저 생성: @Aspect 어드바이저 빌더를 통해 @Aspect 애노테이션 정보를 기반으로 어드바이저를 생성한다.
  4. @Aspect 기반 어드바이저 저장: 생성한 어드바이저를 @Aspect 어드바이저 빌더 내부에 저장한다.

@Aspect 어드바이저 빌더

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

이제 자동 프록시 생성기의 흐름을 정리하면 아래와 같다.

자동 프록시 생성기 순서

  1. 스프링 빈 생성
  2. 빈 저장소에 등록하기 전 빈 후처리기에 전달
  3. Advisor 빈 조회
  4. @Aspect Advisor 조회
  5. 프록시 적용 대상 체크
  6. 프록시 생성
  7. 빈 등록

@Aspect를 사용해 애노테이션 기반 프록시를 매우 편리하게 적용해보았다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

반응형
'개발/Spring Core' 카테고리의 다른 글
  • 스프링 AOP 주의사항
  • 스프링 AOP
  • 스프링 빈 후처리기
  • 스프링 동적 프록시
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    docker
    리눅스
    스프링
    mysql
    SQL
    자바
    운영체제
    innodb
    AOP
    Java
    트랜잭션
    redis
    test
    인덱스
    spring boot
    JPA
    토비의 스프링
    도커
    데이터베이스
    스프링 부트
    객체
    spring mvc
    container
    컨테이너
    spring
    프록시
    AWS
    객체지향
    ORM
    코딩 #개발자 #노마드북클럽 #노개북
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
@Aspect AOP
상단으로

티스토리툴바