스프링의 트랜잭션 AOP는 기본적으로 서비스 계층의 interface를 JDK 다이내믹 프록시 기술을 이용하여 AOP를 지원하지만 인터페이스가 없다면 CGLib를 이용하여 클래스 프록시를 생성한다.
만약 CGLib를 이용한 클래스 프록시를 사용한다면 클래스 패스의 라이브러리에 cglib-x.x.jar 가 있어야 한다.
주의 사항은 final 클래스에는 클래스 프록시를 적용할 수 없다는 것이다.
클래스 프록시는 타깃 클래스를 상속해서 프록시를 만들기 때문에 상속을 할 수 없는 final 클래스에는 적용하지 못한다.
또한, 클래스 프록시를 적용하면 클래스의 생성자가 두 번 호출된다.
첫 번째 생성자 호출 로그 (프록시 오브젝트)
create bean : com.kyu.svc.component.user.service.UserService$$EnhancerByCGLIB$$61c133f5
두 번째 생성자 호출 로그 (타깃 오브젝트)
create bean : com.kyu.svc.component.user.service.UserService
위의 로그는 UserService 클래스의 생성자에 남긴 것이며 WAS기동 시 찍힌다.
결국 위와 같이 프록시 객체를 생성함으로써 UserController에 정의된 userService 레퍼런스 변수는 UserService$$EnhancerByCGLIB$$61c133f5 이름을 가진 프록시 객체를 참조하게 되는 것이다.
@Controller
@RequestMapping(“/user”)
public class UserController {
@Autowired
private UserService userService; <- UserService$$EnhancerByCGLIB$$61c133f5