JDK Dynamic Proxy 와 CGLib
Dynamic Proxy와 CGLib은 모두 런타임 위빙 방식이며 프록시 패턴으로 동작한다.
따라서 메서드 실행 시에만 위빙이 가능하다.
그래서 Dynamic Proxy와 CGLib를 사용하는 스프링 AOP도 메서드 실행 조인포인트만 지원한다.
위빙 이란 ?
위빙(Weaving)은 AOP(Aspect-Oriented Programming)에서 사용되는 중요한 개념으로,
어드바이스(Advice)와 타겟 객체 사이에 관점 지향 기능을 적용하는 프로세스를 의미합니다.
클래스 로딩 시점이나 프록시 객체 생성 시점에,
AOP 프레임워크가 바이트코드를 수정하여 어드바이스를 적용하는 방식입니다.
이 방식은 JDK Dynamic Proxy나 CGLIB Dynamic Proxy와 같은 동적 프록시를 사용하는 AOP 프레임워크에서 사용됩니다.
위빙은 프록시 객체를 생성하거나 바이트코드를 수정하여 어드바이스가 원하는 지점에서 실행되도록 한다.
이렇게 하므로 어드바이스(특정 기능) 는
조인 포인트(Join Point)라 불리는 특정 시점에서 타겟 객체의 메서드 실행 전, 후 또는 예외 발생 시점 등에서 원하는 동작을 수행할 수 있습니다.
JDK Dynamic Proxy - Interface 기반
JDK 에서 제공하는 Dynamic Proxy는 Interface를 기반으로 Proxy를 생성해주는 방식이다.
Object에 대해 Reflection을 사용하기 때문에 성능이 떨어지는 단점이 있다.
Interface를 기반으로 Proxy를 생성해주기 때문에 인터페이스의 존재가 필수적이다.
CGLIB(Code Generator Library) - Class 기반
코드 생성 라이브러리로서 런타임에 동적으로 자바 클래스의 프록시를 생성해주는 기능을 제공한다.
Spring AOP는 프록시 기반으로 JDK Dynamic Proxy와 CGLIB을 활용하여 AOP 제공하고 있다.
인터페이스가 아닌 클래스를 대상으로 동작 가능하고 바이트코드를 조작해 프록시를 만들기 때문에 Dynamic Proxy에 비해 성능이 우수하다는 장점이 있지만
Extends(상속) 방식을 이용해서 Proxy화 할 메서드를 오버라이딩하는 방식인만큼
final이나 private와 같이 상속된 객체에 오버라이딩을 지원하지 않는 경우 Proxy에서 해당 메소드에 대한 Aspect를 적용할 수 없다.
주로 프록시 객체를 생성하고 확장하는 데에 많이 사용된다.
스프링 부트에선 기본적으로 CGLiB 을 사용하고 있다.
application.properties에 아래 설정을 적용하면 JDK Proxy를 활용 할 수 있다.
//JDK proxy 호출
spirng.aop.proxy-target-class = false
정리
JDK Dynamic Proxy
- 인터페이스 필수
- Reflection API 기반 Proxy 생성 (속도 저하 원인)
CGLIB
- 바이트 코드를 조작하여 프록시 생성
- 상속 기반 Proxy 생성 ( private , final 사용불가 )
참고
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[MSA] 분산 시스템 이벤트 소싱 구현 ( Transaction OutBox Pattern ) (0) | 2024.07.26 |
---|---|
[MSA] Transaction Outbox 패턴 (0) | 2024.07.10 |
[Spring] Transaction 트랜잭션의 이해 (0) | 2024.04.24 |
[Spring] Jasypt 중요 정보를 암호화 하자 (0) | 2024.04.12 |
[Spring] Fixture Monkey 테스트 라이브러리 (0) | 2024.04.06 |