Framework | Library | Tool/Spring Core

스프링의 AOP

주정용 2022. 5. 1. 12:55
728x90

애플리케이션은 핵심 기능과 부가 기능으로 로직을 구별할 수 있습니다.

  • 핵심 기능 : 특정 객체가 제공하는 객체 고유의 기능
  • 부가 기능 : 핵심 기능을 보조하는 기능. 로그, 트랜잭션 등

부가 기능은 주로 공통 로직입니다.

  • 반복된 코드가 곳곳에서 나타납니다. 중복이 발생합니다.
  • 변경이 일어날 때, 그만큼 수정해야 합니다.

AOP

  • 관점 지향 프로그래밍(Aspect-Oriented Programming)
  • 반복되는 부가 기능을 모아 모듈화하는 개발방법입니다.
  • 객체 지향 프로그래밍에서 발생하는 중복을 제한하는 보조 방법입니다.

AspectJ Framework

  • AOP를 구현한 프레임워크입니다.
  • 오류 검사, 오류 처리, 동기화, 캐싱, 모니터링, 로깅 등을 모듈화할 수 있습니다.
  • 스프링은 AspectJ의 문법을 차용하여 AOP 기능을 제공합니다.

JVM Application에 AOP를 적용하는 방법

  • JVM에서 AOP를 적용하는 구간은 크게 3가지가 있습니다.
  • 컴파일 시점, 클래스 로딩 시점, 런타임 시점

컴파일 시점

  • java 소스코드를 가지고 컴파일러가 class 파일로 생성하는 시점에 AOP를 적용합니다. (Compile Time Weaving)
  • AspectJ가 제공하는 컴파일러는 소스코드를 컴파일할 때, AOP가 구현된 코드를 붙여서 컴파일합니다.
  • AspectJ 컴파일러는 해당 클래스가 AOP 적용대상인지 판단하고, 적용대상에 한해서 AOP 기능을 적용합니다.
  • 컴파일 시점에 AOP 기능을 원본에 합성하기 때문에, 특별한 컴파일러를 사용해야 합니다.

클래스 로딩 시점

  • 자바 프로그램을 실행하면 class 파일은 JVM의 class loader에 보관됩니다.
  • class loader에 class 파일이 보관되기 이전에 AspectJ는 바이트코드를 조작해서 AOP 기능을 추가할 수 있습니다.(Load Time Weaving)
  • 클래스 로딩 시점에 AOP를 적용하는 방법은 javaagent를 통해서 클래스 로더 조작기를 지정해야 합니다.

런타임 시점

  • 자바 프로그램이 실행되고 나서 AOP 기능을 프록시 방식을 통해 제공할 수 있습니다. (Runtime Weaving)
  • 스프링 프레임워크를 사용하는 경우, 애플리케이션이 실행될 때 스프링 컨테이너에 빈을 등록하는 과정이 있습니다.
  • 빈을 등록하는 과정에서 Bean Post Processor를 사용하여 특정 인스턴스의 프록시를 대신 빈 컨테이너에 등록할 수 있는데, 런타임 시점에 AOP는 이러한 방식으로 제공됩니다.
  • 프록시를 통해서 AOP를 제공하기 때문에 위 2가지 방법보다는 제한적으로 기능이 제공됩니다.

프록시 기반 AOP 제약사항

  • AOP는 생성자, 필드 접근, static 메서드 접근, 메서드 실행 지점에서 적용할 수 있습니다. (Join Point)
  • 프록시 AOP는 메서드 오버라이딩을 통해서 제공됩니다.
  • 프록시 방식의 AOP는 오직 메서드 실행 시점에서만 제공됩니다.
  • 스프링 AOP는 빈 컨테이너가 관리하는 빈에 대해서만 적용됩니다.

AOP 용어

  • Advice : 부가 기능. AOP로 구현하는 로직
  • Join Point : Advice가 적용될 수 있는 위치
  • Pointcut : Advice가 적용될 Join Point를 결정하는 기능
    • 스프링 AOP는 메서드 실행 시점만 포인트 컷으로 결정 가능
  • Target : Advice 적용 대상
  • Aspect : Advice + Pointcut
  • Advisor : 1개의 advice와 1개의 pointcut으로 구성
    • 스프링 AOP에서만 사용되는 용어
  • AOP 프록시 : AOP 기능을 제공하는 프록시 객체
    • 스프링에서 AOP는 JDK 다이나믹 프록시나 CGLIB 프록시로 구현