compile 시점 .
AspectJ등 프레임워크를 사용한다.
소스코드가 컴파일되기 전에 공통구현코드(부가기능)을 소스에 삽입하는 방식.
class loading 시점.
클래스 로딩할 때 바이트 코드에 부가기능을 삽입한다.
runtime 시점.
만들어진 객체의 proxy를 생성, 프록시 객체가 공통기능 등을 호출.
타깃이 하나 이상의 인터페이스를 구현하고 있는 클래스라면 JDK Dynamic Proxy, 인터페이스 구현하지 않았다면 CGLIB.
Proxy.newProxyInstance()
를 이용해 생성 가능.spring-aop
aspectjweaver
모듈 제공. @AspectJ support
어노테이션을 많이 사용함.@Aspect
@Component
사용해야 함.EnableAspectJAutoProxy
사용해야 함. execution()
이 기본."executon(접근제한자 리턴타입 사용영역 클래스 메서드(아규먼트)"
@Pointcut()
void
여야만 함.@Transactional
안에서 또 다른 메서드를 호출했는데 그 메서드에도 @Transactional
이 적용되어 있는 경우. @Transactional
default값은 REQUIRED@Transactional
뒤에 괄호를 붙이고 propagation을 넣어 사용. 종류도 선택할 수 있다.dirty reads
non-repeatable reads
phantom reads :
스프링에서 레벨 설정 가능.