일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 그리디
- Thymeleaf
- java
- 스프링
- SpringBoot
- jpa
- spring
- http
- QueryDSL
- 스프링 핵심 원리
- Exception
- Proxy
- springdatajpa
- Spring Boot
- 스프링 핵심 기능
- 백준
- 알고리즘
- kotlin
- JDBC
- db
- Android
- JPQL
- Greedy
- pointcut
- AOP
- Servlet
- 자바
- 김영한
- 인프런
- transaction
- Today
- Total
목록cglib (6)
개발자되기 프로젝트
스프링에서 CGLIB는 구체 클래스를 상속 받아서 AOP 프록시를 생성할 때 사용한다. CGLIB는 구체 클래스를 상속 받기 때문에 다음과 같은 문제가 있다. 대상 클래스에 기본 생성자 필수 생성자 2번 호출 문제 final 키워드 클래스, 메서드 사용 불가 1. 대상 클래스에 기본 생성자 필수 CGLIB는 구체 클래스를 상속 받는다. 자바 언어에서 상속을 받으면 자식 클래스의 생성자를 호출할 때 자식 클래스의 생성자에서 부모 클래스의 생성자도 호출해야 한다. (이 부분이 생략되어 있다면 자식 클래스의 생성자 첫줄에 부모 클래스의 기본 생성자를 호출하는 super() 가 자동으로 들어간다.) 이 부분은 자바 문법 규약이다. CGLIB를 사용할 때 CGLIB가 만드는 프록시의 생성자는 우리가 호출하는 것이..
JDK 동적 프록시를 사용하면서 의존관계 주입을 할 때 어떤 문제가 발생하는지 코드로 알아보자. 1. ProxyDIAspect, Test @Slf4j @Aspect public class ProxyDIAspect { @Before("execution(* hello.aop..*.*(..))") public void doTrace(JoinPoint joinPoint){ log.info("[proxyDIAdvice] {}", joinPoint.getSignature()); } } @Slf4j @SpringBootTest(properties = {"spring.aop.proxy-target-class=false"}) //jdk 동적 프록시 @Import(ProxyDIAspect.class) public clas..
JDK 동적 프록시와 CGLIB를 사용해서 AOP 프록시를 만드는 방법에는 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 생성한다. CGLIB는 구체 클래스를 기반으로 프록시를 생성한다. 물론 인터페이스가 없고 구체 클래스만 있는 경우에는 CGLIB를 사용해야 한다. 그런데 인터페이스가 있는 경우에는 JDK 동적 프록시나 CGLIB 둘중에 하나를 선택할 수 있다. 스프링이 프록시를 만들때 제공하는 ProxyFactory 에 proxyTargetClass 옵션에 따라 둘중 하나를 선택해서 프록시를 만들 수 있다. proxyTargetClass=false --> JDK 동적 프록시를 사용해서 인터페이스 기반 프록시 생성 proxyTargetClass=true..
1. 정의 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 2. 설명 this , target 은 다음과 같이 적용 타입 하나를 정확하게 지정해야 한다. this(hello.aop.member.MemberService) target(hello.aop.member.MemberService) * 같은 패턴을 사용할 수 없다. 부모 타입을 허용한다. 3. this vs target 스프링에서 AOP를 적용하면 실제 target 객체 대신에 프록시 객체가 스프링 빈으로 등록된다. this 는 스프링 빈으로 등록되어 있는 프록시 객체를 대상으로 포인트컷을 매칭한다. Targe..
1. 구체 클래스만 있는 경우 @Test @DisplayName("구체클래스만 있으면 CGLIB 사용") void concreteProxy(){ ConcreteService target = new ConcreteService(); ProxyFactory proxyFactory = new ProxyFactory(target); proxyFactory.addAdvice(new TimeAdvice()); ConcreteService proxy = (ConcreteService) proxyFactory.getProxy(); log.info("targetClass={}", target.getClass()); log.info("proxyClass={}", proxy.getClass()); proxy.call(); ..
1. CGLIB: Code Generator Library CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다. CGLIB를 사용하면 인터페이스가 없이 구체 클래스만 가지고 동적 프록시를 만들어낼 수 있다. CGLIB는 원래는 외부 라이브러리인데, 스프링 프레임워크가 스프링 내부 소스 코드에 포함했다. 따라서 스프링을 사용한다면 별도의 외부 라이브러리를 추가하지 않아도 사용할 수 있다. 참고로 우리가 CGLIB를 직접 사용하는 경우는 거의 없다. 이후에 설명할 스프링의 ProxyFactory 라는 것이 이 기술을 편리하게 사용하게 도와주기 때문에, 너무 깊이있게 파기 보다는 CGLIB가 무엇인지 대략 개념만 잡으면 됨. 2. 예제 - 준비 public interfa..