Spring boot

[스프링 핵심 원리 고급편] 동적 프록시 기술

리플랙션:

런타임 시점에 동적으로 클래스 정보를 추출해낼 수 있는 프로그래밍 기법

클래스 타입을 몰라도 메서드와 변수에 접근할수 있게 해주는 자바 API

클래스 로더를 통해 읽어온 정보를 사용

 

파라미터를 통해 클래스와 메서드 메타정보 획득 가능 메타정보로 호출가능

장점: 동적으로 호출가능, 추상화를 통해 공통화 가능

단점: 런타임에 동작하여 컴파일시점에 오류 잡기 불가, 가급적 쓰지말기

 

 

 

JDK 동적 프록시

프록시 객체를 런타임에 개발자 대신 생성해줌, 동적 프록시에 원하는 로직 저장 가능

* 인터페이스를 기반으로 작동함, 인터페이스는 필수

 

 

1. 프록시에 적용할 로직은 InvocationHandler 인터페이스를 구현해서 작성하기

2. 프록시 만들기 (타겟클래스의 클래스로더, 타겟클래스, 프록시 적용할 로직 클래스를 인자로 넣음). 프록시 반환 타입은 타겟인터페이스로도 가능

3. 프록시의 메서드(인터페이스 메서드) 호출하면, 프록시 적용할 로직 클래스의 invoke가 실행됨 

4. invoke의 인자로 호출한 인터페이스 메서드 메타정보가 넘어가 실행됨

 

 

장점: 적용 대상만큼 프록시 객체 만들지 않아도 됨, 부가 로직 한번만 개발해 공통 적용 가능

단점: 인터페이스가 필수 -> CGLIB (바이트코드 조작라이브러리) 사용 필요

 

CGLIB

바이트코드 조작해 동적으로 클래스 생성하는 기술 제공하는 라이브러리

ProxyFactory를 통해 편리하게 사용가능

MethodInterceptor(JDK 동적프록시의 InvocationHandler) 제공

콘크리트 객체를 상속받아 프록시를 만듦 (Enhancer)

 

제약: "상속"으로부터 오는 제약

부모클래스에 기본생성자 있어야 함

클래스에 final키워드가 붙으면 상속 불가

메서드에 final붙으면 메서드 오버라이딩 불가능, 프록시 로직 동작못함

 

 

인터페이스가 있는 경우에는 JDK, 없는 경우에는 CGLIB?

복잡하다 알아서 해줬으면

 

==> ProxyFactory