AOP
란 Aspect Oriented Programming
의 약자로 관점 지향 프로그래밍이라고 불린다. AOP
는 여러 메서드에 중복되게 나타나는, 해당 메서드에서 개발자가 집중해야할 핵심로직이라고 할 수 없는 부가 기능을 cross-cutting concerns(횡단관심사, 흩어진관심사) 로 보고 이를 모듈화하는 것을 목표로 한다.
AOP
를 통해 비본질적인 코드를 모듈화하여 개발자는 필요한 핵심 로직에만 집중해 코드를 작성할 수 있도록 해주며 핵심 로직에 대한 테스트를 이전보다 쉽게 할 수 있고 코드에 대한 가독성을 올려준다.
여기서 비본질적인 코드(부가 기능)란 무엇이 있을까, 트랜잭션 시작과 끝, DB연결 및 종료처리, 로깅남기기, 성능 측정 등이 대표적이다.
AOP는 스프링에서만 존재하는 개념이 아니지만 쉬운 이해를 위해 스프링에서의 트랜잭션과 로깅을 예로 들어보겠다.
@Repository
class ...Dao {
@Autowired
private PlatformTransactionManager txManager;
public void updateName(...) {
-트랜잭션 획득-
-Logging-
try {
************************
...
개발자가 집중해야할 핵심 로직
...
************************
-트랜잭션 commit-
} catch(RuntimeException e) {
-트랜잭션 rollback-
-Logging-
}
}
public void updateAge(...) {
-트랜잭션 획득-
-Logging-
try {
************************
...
개발자가 집중해야할 핵심 로직
...
************************
-트랜잭션 commit-
-Logging-
} catch(RuntimeException e) {
-트랜잭션 rollback-
-Logging-
}
}
}
개발자가 이름과 나이를 업데이트하는 메서드를 작성한다고 해보자.
이 메서드에서 트랜잭션 처리나 로깅은 개발자가 집중해야할 핵심 코드가 아니며 여러 메서드에 중복적으로 나타남을 알 수 있다. 가독성은 떨어지고 핵심로직을 작성하기 위해 앞 뒤로 비본질적인 코드를 반복해 작성해야한다. 그렇다고 없어서도 안되는 코드이다.
AOP
는 횡단으로 나타나는 이러한 부가 기능을 관심사로 보고 모듈화하여 OOP(객체 지향 프로그래밍)을 보완해준다.
AOP
는 자바 뿐만 아니라 다른 언어에도 존재하는 개념이며 언어마다 AOP
를 사용하기 위한 구현체들이 여러개 존재한다.
자바 언어로 AOP를 구현하는 3가지 방법이 존재한다. JDK dynamic proxy
, CGLib
, AspectJ
이다.
JDK dynamic proxy
, CGLib
는 완전한 AOP 솔루션은 아니지만 프록시 패턴으로 작동하며 AOP기능을 구현할 수 있다. Runtime Weaving을 지원한다.
AspectJ
란 AOP
를 자바에서 사용하기 위한 구현체이며 완전한 AOP 솔루션을 제공하는 것을 목표로 한다. 여러 구현체가 있는데 사실상 자바 표준이라고 한다.
Compile Time Weaving, Load Time Weaving, Post-compile weaving(컴파일 후 위빙)을 지원한다.
weaving
이란 우리가 모듈화한 부가 기능을 타켓에 적용해 핵심 기능과 연결하는 과정을 의미한다.
RTW
, CTW
, LTW
3가지가 있다.
프록시 패턴을 활용한 위빙 방식으로, Proxy객체를 생성해 실제 타깃 오브젝트의 변형없이 런타임 중 메서드 호출이 일어나는 시점에 위빙을 수행한다.
메소드 호출에 대해서만 어드바이스를 적용 할 수 있다는 단점이 있다.
특수한 컴파일러를 활용해 컴파일 과정에서 바이트 코드 조작을 통해 Advisor 코드를 직접 삽입하여 위빙을 수행한다.
AspectJ에는 AJC (AspectJ Compiler)라는 컴파일러가 있다.
java 파일을 컴파일한 결과물 자바 클래스가 JVM에 로드될 때 바이트 코드 조작을 통해 위빙되는 방식이다.
RTW처럼 소스파일과 클래스 파일에 조작을 가하지 않아 컴파일 시간은 상대적으로 CTW보다 짧다. 하지만 오브젝트가 메모리에 올라가는 과정에서 위빙이 일어나기 때문에 런타임 시, 시간은 CTW보다 상대적으로 느리다.
말 그대로 컴파일 후에 생성된 class
파일을 바이트코드 조작을 통해 위빙하는 방식이다.
CTW >>>>>> LTW >>>>>> RTW 순이다. 역시 컴파일 타임 위빙이 가장 빠르다.
https://engkimbs.tistory.com/746
https://dahye-jeong.gitbook.io/spring/spring/2020-04-10-aop-aspectj
도움 많이 받았습니다 감사합니다