endsharp / study

1 stars 0 forks source link

@Aspect AOP + 스프링 AOP 개념 #29

Open LeeeeDain opened 1 year ago

LeeeeDain commented 1 year ago

섹션8 - @Aspect AOP

@Aspect

횡단 관심사(cross-cutting concerns)

스프링 AOP

LeeeeDain commented 1 year ago

섹션9 - 스프링 AOP 개념

AOP 소개 - 핵심 기능과 부가 기능

부가 기능 적용 문제

AOP 소개 - 애스펙트

AspectJ 프레임워크

AOP 적용 방식

  1. 컴파일 시점
    • .java 소스 코드를 컴파일러를 사용해서 .class를 만드는 시점에 부가 기능 로직을 추가
    • 컴파일 시점에 부가 기능을 적용하려면 특별한 컴파일러도 필요하고 복잡해서 잘 사용하지 않음
    • 실제 대상 코드에 애스펙트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다.
  2. 클래스 로딩 시점
    • .class 파일을 JVM 내부의 클래스 로더에 저장하기 전에 조작하여 JVM에 올림
    • 수많은 모니터링 툴들이 이 방식을 사용
    • 이 시점에 애스펙트를 적용하는 것을 로드 타임 위빙이라고 하는데, 로드 타임 위빙은 자바를 실행할 때 특별한 옵션(java-javaagent)를 통해 클래스 로더 조작기를 지정해야 하는데, 이 부분이 번거롭고 운영하기 어렵다.
    • 실제 대상 코드에 애스펙트를 통한 부가 기능 호출 코드가 포함된다. AspectJ를 직접 사용해야 한다.
  3. 런타임 시점(프록시) <- 지금까지 적용한 방법
    • 컴파일이 다 끝나고, 클래스 로더에 클래스도 다 올라가서 자바의 메인(main) 메서드가 실행된 다음ㅍ 프록시를 통해 스프링 빈에 부가 기능을 적용하는 방식
    • 프록시를 사용하기 때문에 AOP 기능에 일부 제약이 있다. (예를 들어, 생성자 안되고 오버라이드가 되는 메서드에만 적용 가능)
    • 스프링만 있으면 얼마든지 AOP를 적용할 수 있다.
    • 실제 대상 코드는 그대로 유지한다. 대신에 프록시를 통해 부가 기능이 적용된다. 따라서 항상 프록시를 통해야 부가 기능을 사용할 수 있다. 스프링 AOP는 이 방식을 사용한다.

AOP 적용 위치

AOP 용어 정리

cme10575 commented 1 year ago

AspectJ의 @Aspect 를 통해 Advisor를 간편하게 만들 수 있다.

@Aspect //Advisor로 변환해서 저장
public class LogTraceAspect {

    @Around("execution(* hello.proxy.app..*(..))") //pointcut
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { //advice
                String meesage = joinPoint.getSignature().toShortString();
        status = logTrace.begin(meesage);

        joinPoint.proceed();
    }
}

참고) @Aspect 하나에 여러 어드바이저 만들 수 있음

AOP

부가 기능 도입시 문제점

  1. 아주 많은 반복 필요
  2. 중복 코드 만들어냄
  3. 기능 변경시 많은 수정 필요
  4. 적용 대상 변경시 많은 수정 필요

Aspect(관점)

부가 기능을 한 곳에서 관리하도록 변경 어디에 적용할지 선택하는 기능 추가

AOP (Aspect-Oriented-Programming)

Aspect를 사용한 프로그래밍 방식

AspectJ

J는 Java의 J AOP의 대표적인 구현 프레임워크 스프링도 AOP를 제공하지만 대부분 AspectJ의 문법 차용(직접사용 X), 기능 일부만 제공 제공 기능

AOP 적용 방식

부가 로직을 실제로 추가하는 방법

  1. 컴파일 시점 -> .class 파일 생성시 코드를 실제로 붙여버리는 방법, AspectJ 컴파일러 사용해야함
  2. 클래스 로딩 시점 -> 자바 실행시 AspectJ 클래스 로더 조작기가 .class 파일 조작하여 JVM에 올림
  3. 런타임 시점 -> 복잡한 과정(스프링 컨테이너의 도움 받음, 프록시, DI, 빈 포스트 프로세서 등)을 통해 프록시를 적용함
otakijae commented 1 year ago