ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프록시 객체를 만드는 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

    댓글

Designed by Tistory.