AOP

호떡·2022년 10월 12일
0

AOP란

Spring Framework이 지원하는 관점지향 프로그래밍(AOP, Aspect Oriented Programming). 트랜잭션, 로깅 등 여러 모듈에서 공통적으로 사용하는 기능에 대해서 별도로 분리하여 작성, 관리할 수 있는 기능을 제공한다.

  • OOP에서 모듈화의 핵심 단위는 클래스인 반면, AOP에서 모듈화의 단위는 Aspect
  • Aspect는 여러 타입과 객체에 거쳐서 사용되는 기능(Cross Cutting, 트랜잭션 관리 등)의 모듈화
    (* 공통 관심사항에 대해서 모듈화한 것)
  • Springframework의 필수 요소는 아니지만, AOP 프레임 워크는 Spring IoC를 보완한다.
💡 핵심 기능이 실행될 때 자동으로 공통 관심사항도 함께 실행될 수 있도록 만드는 것이 AOP이다.

👉 logging, security, transaction, 예금 인출, 예금 송금 각각이 모두 관심사이다.
(* 어떤 기능을 구현할 것인지에 대한 그 주제가 관심사 concern)
👉 logging, security, transaction 처럼 공통적으로 적용되는 관심사들을 공통 관심사항이라고 한다. 각각 자신만의 핵심 기능을 핵심 관심사항이라고 한다.
👉 모듈화된 공통 관심사항(Aspect)을 각각의 핵심 관심사항에 끼워넣어서 합체되어 실행된다.



AOP용어

  • Aspect: 여러 클래스에 공통적으로 구현되는 관심사(Concern)의 모듈화
    👉 공통 관심사항에 대한 구현 코드
  • Join Point: 메서드 실행이나 예외 처리와 같은 프로그램 실행 중의 특정 지점, 일반적으로 Spring에서는 메서드 실행을 의미한다.
    👉 Aspect가 들어갈(실행될) 수 있는 시점들의 후보군
  • Pointcut: Join Point에 Aspect를 적용하기 위한 조건 서술. Aspect는 지정한 pointcut에 일치하는 모든 join point에서 실행된다.
    👉 Join Point들 중에서 지정한 1개가 Pointcut
    👉 Pointcut에 Aspect가 합체되는 것
  • Advice: 특정 조인 포인트(Pointcut)에서 Aspect에 의해서 취해진 행동, Around, Before, After 등의 Advice 타입이 존재
    👉 어떤 Aspect가 어떤 Pointcut의 전에 실행될 것이냐, 후에 실행될 것이냐의 정보들까지 있는 것이 Advice
  • Target 객체: 하나 이상의 advice가 적용될 객체. Spring AOP는 Runtime Proxy를 사용하여 구현되므로 객체는 항상 Proxy 객체가 된다.
    👉 Advice가 적용되고자 하는 대상이 Target
  • AOP Proxy: AOP를 구현하기 위해 AOP 프레임워크에 의해 생성된 객체, Spring Framework에서 AOP 프록시는 JDK dynamic proxy 또는 CGLIB proxy이다.
    👉 Advice가 Target에 적용되어 만들어진 완성체
  • Weaving: Aspect를 다른 객체와 연결하여 Advice 객체를 생성. 런타임 또는 로딩 시 수행할 수 있지만 Spring AOP는 런타임에 위빙을 수행
    👉 Advice가 Target에 끼어드는 과정, 동작

AOP의 동작


Person 클래스의 doSomething( ) 메서드를 호출하면, doSomething( )만 실행되는 것이 아니라 Advice가 적용된 상태로 즉, AOP Proxy 전체가 실행된다.


자바 코드로 흉내낸 Spring AOP

프록시 패턴


AOP 활용을 위한 pom.xml 설정

(Maven 프로젝트 전환, Spring Context 라이브러리 추가는 기본)
AspestJ 관련 라이브러리 추가

  • AspectJ Weaver
  • AspectJ Runtime

구현과정

  1. 핵심 관심사항 구현
  2. Aspect(공통 관심사항) 구현
  3. 핵심 관심사항 호출을 Pointcut으로 지정
  4. Pointcut에 Aspect들을 Advice 지정

0개의 댓글