스프링 AOP
AOP의 구현체를 제공하며 AspectJ와 연동하여 사용할 수 있으며 스프링 내부적으로 구현한 Spring AOP를 사용할 수 있음. 이를 기반으로 다양한 기능이 제공되고있다.
AOP?
흩어진 Aspect를 모듈화 하는 프로그래밍 기법이다. OOP와 서로 보완하는 관계이다. 즉 OOP를 더 잘할 수 있게 도와줌
AOP는 Aspect로 흩어져 있는것을 모은다. 모을 때는 관심별로 각각 독립적으로 만든다.
즉 해야할 일과 어디어디에 적용해야 할지 묶어둔것!
AOP의 주요개념
Aspect : 공통적인것을 꺼내서 모듈화 한것.
Target: 적용이 되는 대상
Advice : 해야할 일
Joint Point : 메서드 실행시점. 즉 생성자 호출하기 직전, 생성자 호출했을때, 필드에 접근하기전, 필드에서 값을 가져갔을 때 등 여러가지의 합류접이 있다.
Pointcut : “A라는 클래스의 B라는 메소드를 호출할 때 만 해당 어디바이스를 적용할 것이다”라는것으로 즉 어디에 적용해야 하는지.
AOP 구현체
자바에는 대표적으로 AspectJ, Spring AOP가 있다.
AOP 적용하는 방법
컴파일타임
: 자바파일을 클래스 파일로 만들 때 조작이된 바이트 코드를 생성해 내는것.
로드타임, 런타임때 성능 부하가 없지만 이렇게 만들기 위해서는 별도의 컴파일 과정을 거쳐야함
로드타임
: 컴파일은 아주 순수하게 됐다. 그런데 A라는 클래스를 로딩하는 시점에 뭔가를 끼워서 넣는것(로드타임 위빙이라 함)
클래스 로딩시점에 약간의 부하가 발생하며 로드타임 위버를 설정해줘야함. 다양한 문법을 사용할 수 있다(AspectJ)
런타임
: A라는 빈에 Aspect X를 적용해야 한다는것을 스프링이 알고있다. A라는 빈을 만들 때 A 타입의 프록시 빈을 만들어서 이 프록시 빈이 A가 갖고있는 메소드를 호출하기 직전에 Aspect X의 요소를 호출한 후 A것을 호출한다.
스프링 AOP를 사용하는 방법으로 빈을 만드는 초기성능이 추가된다. 하지만 최초의 빈을 만들때만 비용이 들어가므로 로드타임 위빙이랑 비용이 비슷할것!
런타임이 가장 합리적이고 현실적이다. 경우에 따라 AspectJ가 제공하는 jopoint를 사용해야한다면 로드타임을 사용해야 한다.