프록시 기술과 한계 - CGLIB

현시기얌·2021년 12월 7일
0

AOP

목록 보기
18/19

CGLIB 구체 클래스 기반 프록시의 문제점

  • 대상 클래스에 기본 생성자가 필수다.
  • 생성자 2번 호출 문제가 발생한다.
  • fianl 키워드 클래스, 메소드가 사용 불가하다.

대상 클래스에 기본 생성자 필수

CGLIB는 구체 클래스를 상속 받는다.
자바 언어에서 상속을 받으면 자식 클래스의 생성자를 호출할 때 자식 클래스의 생성자에서 부모 클래스의 생성자도 호출해야 한다.
(이 부분이 생략되어 있다면 자식 클래스의 생성자 첫줄에 부모 클래스의 기본 생성자를 호출하는 super()가 자동으로 들어간다.)
이 부분은 자바 문법 규약이다.

CGLIB를 사용할 때 CGLIB가 만드는 프록시 생성자는 우리가 호출하는 것이 아니다.
CGLIB 프록시는 대상 클래스를 상속 받고, 생성자에서 대상 클래스의 기본 생성자를 호출한다.
따라서 대상 클래스에 기본 생성자를 만들어야 한다.
(기본 생성자는 파라미터가 하나도 없는 생성자를 뜻한다. 생성자가 하나도 없으면 자동으로 만들어진다.)

생성자 2번 호출 문제

CGLIB는 구체 클래스를 상속 받는다.
자바 언어에서 상속을 받으면 자식 클래스의 생성자를 호출할 때 부모 클래스의 생성자도 호출해야 한다.
그런데 왜 2번일까?

  • 실제 target의 객체를 생성할 때
  • 프록시 객체를 생성할 때 부모 클래스의 생성자 호출

final 키워드 클래스, 메소드 사용 불가

fianl 키워드가 클래스에 있으면 상속이 불가능 하고, 메소드에 있으면 오버라이딩이 불가능하다.
CGLIB는 상속을 기반으로 하기 때문에 두 경우 프록시가 생성되지 않거나 정상 동작하기 않는다.

정리

JDK 동적 프록시는 대상 클래스 타입으로 주입할 때 문제가 생기고,
CGLIB 프록시는 대상 클래스에 기본 생성자 필수, 생성자 2번 호출 문제가 있다.

profile
현시깁니다

0개의 댓글