Spring AOP

Terror·2024년 9월 13일
0

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가지가 있다
    1. Aspect로 부가 기능 정의
    2. PointCut 경로 정의
    3. joinPoint 실제 AOP가 실행되는 위치
    4. 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가 제일 빠른 모습을 보여준다

참조 블로그

profile
테러대응전문가

0개의 댓글