관점 지향 프로그래밍
From CS Wiki
- AOP; Aspect Oriented Programming
- 객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법
- 핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능
- 부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등)
용어
용어 | 설명 |
---|---|
Joinpoint |
|
Advice |
|
Target |
|
Pointcut |
|
Aspect |
|
Weaving |
|
구현
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보다 속도 측면에서는 느리다.