-
프록시 객체를 만드는 2가지 방법실무에서 배운 내용 정리 2018. 12. 12. 23:59
스프링에서는 클래스가 인터페이스를 구현했다면 다이내믹 프록시 기술로 프록시 객체를 만들고,
인터페이스를 구현하지 않았다면 CGLIB 기술을 이용해서 프록시 객체를 생성한다.
프록시 객체를 만드는 2가지 방법
1. 클래스에 인터페이스를 구현한 경우 => '다이내믹 프록시' 기술을 사용 (자바의 리플렉션 이용)
2. 클래스에 인터페이스를 구현 안한 경우 => 'CGLIB' 기술을 사용 (바이트 코드 조작)
하지만 프록시 객체를 만들 때 CGLIB을 사용하게 되면 아래 2가지 제약사항이 생기게 된다.
1. @Bean 메서드에 final을 붙이면 안된다.
2. 클래스에 final을 붙이면 안된다.
위의 제약 사항을 지키지 않는다면, 에러가 발생한다. 하지만 다이내믹 프록시를 사용할 경우에는 final을 붙여도 상관없이 잘 동작한다.
왜?
Cglib works by subclassing.
(링크 : https://stackoverflow.com/questions/35232648/cglib-enhancer-private-constructor)
CGLIB은 생성되는 프록시 객체가 대상 클래스를 상속받게 되는데
> 대상 클래스에 final이 붙여져있으면 자바 문법상 에러기 때문.
> 또한, 상속 받고 있기 때문에 대상 클래스의 생성자가 private이면 자식에서 부모 생성자를 호출하지 못해 에러가 난다.
스프링은 빈을 주입할 때 프록시 객체를 생성해서 주입한다.
따라서, 주입되는 객체가 인터페이스를 구현하고 있지 않다면(CGLIB) => final을 붙이거나 생성자를 private으로 해서는 안된다.
참고 : http://wonwoo.ml/index.php/post/1576
'실무에서 배운 내용 정리' 카테고리의 다른 글
Redis (0) 2019.08.09 Guava Cache 란 [1편] (0) 2018.12.24 상속보다 구성을 이용한 재사용 [1편] (3) 2018.12.21 실행 계획 (0) 2018.12.19 Clustered Index & Non-Clustered Index 차이 (0) 2018.12.17