이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
AOP : 적용 방법
컴파일 타임
-
자바 파일을 클래스 파일로 만들 때
-
그 타이밍에 바이트 코드들을 조작하여
-
조작이된 바이트 코드를 생성해낸다.
-
이게 컴파일 타임에 AOP를 적용하는 방법이다.
A라는 클래스에 foo()라는 메소드가 있다.
그리고 Hello를 출력하는 Aspect가 있다.
여기서 foo()를 호출하면 Hello가 먼저 출력이 되야한다.
-
위와 같은 상황에 컴파일 타임에 AOP를 적용한다면
-
클래스 파일에 Hello를 출력하는 메소드가 같이 들어있게 된다.
컴파일 타임 시점에 AOP 적용 시 장단점
-
장점
- 로드 타임이나 런타임보다 시간이 단축된다.
- 로드 타임이나 런타임보다 시간이 단축된다.
-
단점
- 별도의 컴파일 과정이 필요하다.
로드 타임
-
로드 타임은 A라는 클래스는 순수한 클래스로 컴파일이 된다.
-
foo() 메소드 또한 순수한 기능만 정의된다.
-
그런데 A라는 클래스 파일을 로딩하는 시점에
-
로딩하는 클래스 정보를 변경한다.
-
이게 로드 타임에 AOP를 적용하는 방식이다.
-
이 방식을 로드타임 위빙(=Load-time weaving)이라고도 한다.
-
A 클래스의 바이트 코드는 순수하게 있지만
-
JVM가 로딩을 하면서
-
JVM 메모리상에 foo()라는 메소드를 호출하기 전
-
Hello를 출력하는 Aspec가 포함되어 있는 상태로 로딩이 된다.
-
즉 JVM에서 클래스를 로딩하는 시점에 AOP를 적용한다.
로드 타임 시점에 AOP 적용 시 장단점
-
단점
-
클래스 로딩 시 약간의 부하가 생길 수 있다.
-
로드타임 위버를 위한 설정이 필요하다.
-
런타임
-
스프링 AOP가 동작하는 방식이다.
-
스프링 환경이기 때문에 A 클래스는 Bean이 된다.
-
A라는 Bean에 Aspect를 적용해야 함을 스프링이 알고있다.
-
A라는 클래스를 읽어와
-
A라는 클래스 타입의 빈을 만들때
-
A라는 타입의 Proxy Bean을 생성한다.
-
이 Proxy Bean은 A라는 Bean을 감싼다.
-
그리고 Proxy Bean이 실제 A가 갖고 있는 foo() 메소드를 실행하기 전에
-
Hello를 먼저 찍는 일을 하고
-
foo() 메소드를 호출한다.
-
이게 스프링 AOP이다.
-
Proxy 기반의 AOP는 이 글을 참고하자.
런타임 시점에 AOP 적용 시 장단점
- 장점
-
AOP를 위한 설정이 필요하지 않다.
-
별도의 컴파일이 필요하지 않다.
-
문법이 쉽다.
-
-
단점
-
초기 Bean 생성 시 부하가 생긴다.
-
하지만 요청이 들어올 때 성능을 잡아먹는게 아니고 최초에만 추가 비용이 든다.
-