관점 지향 프로그래밍

IT위키
보안기사 (토론 | 기여)님의 2020년 3월 17일 (화) 23:49 판


AOP; Aspect Oriented Programming
객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법

AOP의 핵심관심과 횡단관심.jpg

  • 핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능
  • 부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등)

용어

AOP 개요도.png

용어 설명
Joinpoint
  • 메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
Advice
  • Joinpoint에서 실행되어야 하는 코드
  • 횡단관점에 해당함 (트랜잭션/로그/보안/인증등..)
Target
  • 실질적인 비즈니스 로직을 구현하고 있는 코드
  • 핵심관점에 해당함 (업무로직)
Pointcut
  • Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의하는 것이다
  • 예로 Advice가 실행된 Target의 특정 메소드등을 지정
Aspect
  • Advice와 Pointcut을 합쳐서 하나의 Aspect라고 한다.
  • 즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect라고 한다.
Weaving
  • AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving이라고 한다.
  • Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할이다

구현

Advice

  • Before: Target을 실행하기전에 부가 기능 실행
  • After: Target실행 후 (해당 Target Exception 또는 정상리턴 여부 상관없이) 실행
  • Around: Before + AfterReturning
  • AfterReturning: Target 실행 후 성공적인 리턴할 때 실행
  • AfterThrowing: Target을 실행하다가 Exception 던질 때 실행

Weaving

Aspect(부가기능)와 Application(핵심기능)의 Linking을 하는 과정이다. 해당 객체들을 묶어 새로운 객체를 생성한다.

Spring AOP

이미, 위에서 Weaving 절차를 설명하였다. Spring AOP의 Weaving 절차는 RunTime이다(프록시 빈 생성하는 것, IoC 컨테이너 초기화 작업할 때, 그러니까 WAS 가동할 때).

인터페이스 기준으로 하는 JDK Dynamic Proxy와 Class 기준으로 하는 CGLib Proxy가 존재한다. CGLib Proxy의 경우, AspectJ의 Weaving 처럼 바이트 코드를 조작한다. SpringAOP는 JDK Dynamic Proxy 패턴을 선호한다. 또한 Proxy 패턴 자체가 인터페이스를 끼고하는 페턴이다.

AspectJ

실제, AJC(Apsect Compiler)를 이용하여 Woven System 생성한다. 즉 부가기능과 핵심기능이 합쳐진 클래스 파일을 생성한다. AspectJ의 Weaving 타입은 아래와 같다.

  • Compile-Time Weaving: Aspect의 클래스와 Aspect를 사용하는 class들을 AJC를 통해 컴파일을 한다. JAR를 이용하여 Weaving을 하는 경우, Post-Compile Weaving(Binary Weaving)을 사용하며, 일반 소스 코드의 경우, 일반 Compile-Time Weaving을 사용한다.
  • Load-Time Weaving: 클래스로더를 통해 클래스가 JVM에 로딩되는 시점에 클래스의 바이트 코드를 조작한다. 즉, 객체를 메모리에 적재할 때 Weaving을 실현한다. 때문에, 다른 Weaving보다 속도 측면에서는 느리다.