일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- kotlin
- transaction
- 스프링 핵심 기능
- JDBC
- SpringBoot
- QueryDSL
- pointcut
- Greedy
- 스프링
- springdatajpa
- 백준
- JPQL
- 스프링 핵심 원리
- http
- AOP
- spring
- 그리디
- java
- jpa
- Servlet
- 자바
- 알고리즘
- Android
- Proxy
- Exception
- Spring Boot
- Thymeleaf
- 인프런
- db
- 김영한
- Today
- Total
목록인프런/[인프런] 스프링 핵심 원리 - 고급 (105)
개발자되기 프로젝트
스프링은 우리가 필요한 포인트컷을 이미 대부분 제공한다. 이번에는 스프링이 제공하는 NameMatchMethodPointcut 를 사용해서 구현해보자 1. NameMatchMethodPointcut @Test @DisplayName("스프링이 제공하는 포인트컷") void advisorTest3(){ ServiceInterface target = new ServiceImpl(); ProxyFactory proxyFactory = new ProxyFactory(target); NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut(); pointcut.setMappedName("save"); //save인 경우에만 true/ DefaultPointc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/AmyXD/btrpjviKIjH/bVd7NfE0KZL2iY0WPUKPx1/img.png)
save() 메서드에는 어드바이스 로직을 적용하지만, find() 메서드에는 어드바이스 로직을 적용하지 말자. 이런 기능에 특화되어서 제공되는 것이 바로 포인트컷이다. 1. Pointcut관련 인터페이스 - 스프링 public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } public interface ClassFilter { boolean matches(Class clazz); } public interface MethodMatcher { boolean matches(Method method, Class targetClass); //.. } 포인트컷은 크게 ClassFilter 와 MethodM..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cmrgPC/btrppzYyGvO/FRfYn8re68K0MAvqibiZr0/img.png)
어드바이저는 하나의 포인트컷과 하나의 어드바이스를 가지고 있다. 프록시 팩토리를 통해 프록시를 생성할 때 어드바이저를 제공하면 어디에 어떤 기능을 제공할 지 알 수 있다. 1. 예제코드 public class AdvisorTest { @Test void advisorTest1(){ ServiceInterface target = new ServiceImpl(); ProxyFactory proxyFactory = new ProxyFactory(target); DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice()); proxyFactory.addAdvisor(advisor); ServiceInterf..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/shfBf/btrpmfMUwbf/TjBuC9SKg1RrQMOTC6hSf1/img.png)
1. Pointcut? Advice? Advisor? 포인트컷( Pointcut ) 어디에 부가 기능을 적용할지, 어디에 부가 기능을 적용하지 않을지 판단하는 필터링 로직이다. 주로 클래스와 메서드 이름으로 필터링 한다. 이름 그대로 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이다. 어드바이스( Advice ) 이전에 본 것 처럼 프록시가 호출하는 부가 기능이다. 단순하게 프록시 로직이라 생각하면 된다. 어드바이저( Advisor ) 단순하게 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것이다. 어드바이저 = 포인트컷1 + 어드바이스1 정리하면 부가 기능 로직을 적용해야 하는데, 포인트컷으로 어디에? 적용할지 선택하고, 어드바이스로 어떤 로직을 적용할지 선택하..
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. Advice Advice 는 프록시에 적용하는 부가 기능 로직이다. 이것은 JDK 동적 프록시가 제공하는 InvocationHandler 와 CGLIB가 제공하는 MethodInterceptor 의 개념과 유사. 둘을 개념적으로 추상화 한 것이다. 프록시 팩토리를 사용하면 둘 대신에 Advice 를 사용하면 된다. Advice 를 만드는 방법은 여러가지가 있지만, 기본적인 방법은 다음 인터페이스를 구현하면 된다. Methodinterceptor - 스프링이 제공하는 코드 -> Advice는??? : Interceptor가 Advice를 상속함 ㅋㅋㅋ package org.aopalliance.intercept; public interface MethodInterceptor extends Interc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bsyFNS/btrpox0t3Ls/h5Cvu3vsEHYnDSFcfwgVwK/img.png)
1. 동적 프록시를 사용할 때의 문제점 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면 어떻게?? 두 기술을 함께 사용할 때 부가 기능을 제공하기 위해 JDK 동적 프록시가 제공하는 InvocationHandler 와 CGLIB가 제공하는 MethodInterceptor 를 각각 중복으로 ?? 특정 조건에 맞을 때 프록시 로직을 적용하는 기능도 공통으로 제공되었으면? 2. 의문?? Q: 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용하려면?? 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고, 더욱 편리하게 사용할 수 있는 추상화된 기술을 제공한다. 스프링은 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bwRqAF/btrpgzL0a5j/GdYDl405bVsWXafRXhAEbk/img.png)
1. CGLIB: Code Generator Library CGLIB는 바이트코드를 조작해서 동적으로 클래스를 생성하는 기술을 제공하는 라이브러리이다. CGLIB를 사용하면 인터페이스가 없이 구체 클래스만 가지고 동적 프록시를 만들어낼 수 있다. CGLIB는 원래는 외부 라이브러리인데, 스프링 프레임워크가 스프링 내부 소스 코드에 포함했다. 따라서 스프링을 사용한다면 별도의 외부 라이브러리를 추가하지 않아도 사용할 수 있다. 참고로 우리가 CGLIB를 직접 사용하는 경우는 거의 없다. 이후에 설명할 스프링의 ProxyFactory 라는 것이 이 기술을 편리하게 사용하게 도와주기 때문에, 너무 깊이있게 파기 보다는 CGLIB가 무엇인지 대략 개념만 잡으면 됨. 2. 예제 - 준비 public interfa..