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 :
스프링에서 레벨 설정 가능.
