AOP란
- Aspect Oriented Programming의 약자로 관점 지향 프로그래밍 이라고 한다
- AOP는 여러 메서드에 중복되게 나타나는, 해당 메서드에서 개발자가 집중해야할 핵심로직이라고 할 수 없는 부가기능을 Cross-Cutting-Concerns(횡단관심사, 흩어진관심사)라고 보고 이를 "모듈화" 하는 것을 목표로한다
- AOP를 통해 "비본질적"인 코드를 모듈화하여 개발자는 핵심로직에만 집중하여, 코드를 작성할 수 있도록 해주며 핵심 로직에 대한 테스트를 이전보다 쉽게 할 수 있고 코드에 대한 가독성을 올려준다
비본질적인 코드 ?
- 여기서 비본질적인 코드(부가 기능)이란 무엇일까
- 대표적으로 예시를 들 수 있는것들은 아래와 같다
- 트랜잭션 시작과 끝
- DB 연결 및 종료처리
- 로깅 남기기
- 성능 측정
- AOP는 스프링에서만 존재하는 개념이 아니지만, 쉬운 이해를 위해 스프링에서의 트랜잭션과 로깅을 예시로 들어보자
@Repository
class ...Dao {
@Autowired
private PlatformTransactionManager txManager;
public void updateAge(...) {
-트랜잭션 획득-
-Logging-
try {
************************
...
개발자가 집중해야할 핵심 로직
...
************************
-트랜잭션 commit-
-Logging-
} catch(RuntimeException e) {
-트랜잭션 rollback-
-Logging-
}
}
}
- 개발자가 나이를 업데이트 하는 메서드를 작성한다고 해보자
- 이 메서드에서 트랜잭션 처리나 로깅은 개발자가 집중해야할 핵심 코드가 아니며, 여러 메서드에 중복적으로 나타남을 알 수 있다
- 이렇게 되면 가독성은 떨어지고 핵심로직을 작성하기 위해 앞 뒤로 "비 본질적인"코드를 작성 해야한다
- 근데 또 없어서는 안되는 코드이다
- AOP는 횡단으로 나타나는 이러한 부가 기능을 관심사로 보고 모듈화 하여 "OOP"를 보완 해줄 수 있다
Java AOP
- AOP는 자바 뿐만 아니라 다른 언어에도 존재하는 개념이며 언어마다 AOP를 사용하기 위한 구현체들이 여러개 존재한다
- 자바 언어로 AOP를 구현하는 3가지 방법이 존재한다
- JDK Dynamic Proxy
- CGLib
- AspectJ
- JDK Dynamic Proxy, CGLib은 완전한 AOP 솔루션은 아니지만, 프록시 패턴으로 작동하며 AOP기능을 구현 할 수 있다. "Runtime Weaving"을 지원한다 (RunTime Weaving는 후술할 예정)
- AspectJ란 AOP를 자바에서 사용하기 위한 구현체이며 완전한 AOP 솔류션을 제공하는것을 목표로 한다, 사실상 자바표준이라고 봐도된다
- Complie Time Weaving, Load Time Weaving, Post-compile weaving(컴파일 후 워빙) 을 지원한다
Weaving
- weaving이란 우리가 모듈화한 부가 기능을 타겟에 적용하여, 핵심 기능과 연결하는 과정을 의미한다.
- RTW, CTW, LTW
- 3가지가 있다
- Aspect로 부가 기능 정의
- PointCut 경로 정의
- joinPoint 실제 AOP가 실행되는 위치
- weaving 실제 AOP가 호출될때 PointCut으로 지정한 JoinPoint의 핵심 기능에 연결하는 역할을 한다
Runtime Weaving (RTW)
- 프록시 패턴을 활용한 위빙 방식으로, Proxy 객체를 생성하여 실제 타겟 오브젝트에 변형없이 런타임 중 메서드 호출이 일어나는 시점에 위빙을 수행한다
- 단 메서드 호출에 대해서만 어드바이스를 적용 할 수 있다는 단점이 있다
Compile Time Weaving (CTW)
- 특수한 컴파일러를 활용하여 컴파일 과정에서 바이트 코드 조작을 통하여 Advicsor 코드를 직접 삽입하여 위빙을 수행한다
- AspectJ에는 AJC(AspectJ Complier)라는 컴파일러가 있다
Load Time Weaving (LTW)
- Java 파일을 컴파일한 결과물 자바 클래스가 JVM에 로드 될때 바이트 코드 조작을 통해 weaving 되는 방식이다
- RTW처럼 소스파일과 클래스 파일에 조작을 가하지 않아 컴파일 시간은 상대적으로 CTW보다 짧다
Post Compile Weaving
- 컴파일 된 후에 생성된, class 파일을 바이트 코드 조작을 통해 위빙하는 방식
한줄요약
- RTW : 런타임시에 위빙한다
- CTW : 컴파일할때 위빙한다
- LTW : 자바 파일이 JVM에 로드 될때 위빙한다
- PTW : 컴파일후 생성된, class 파일을 조작하여 위빙한다
성능차이
- CTW >>>>>> LTW >>>>> RTW
- 확실히 컴파일 타임에 위빙되는 CTW가 제일 빠른 모습을 보여준다
참조 블로그