일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringBoot
- JDBC
- 알고리즘
- AOP
- http
- 백준
- QueryDSL
- 스프링
- Spring Boot
- java
- 그리디
- Servlet
- Greedy
- transaction
- spring
- 스프링 핵심 기능
- Android
- Thymeleaf
- 김영한
- 자바
- kotlin
- 스프링 핵심 원리
- Exception
- Proxy
- 인프런
- springdatajpa
- pointcut
- db
- jpa
- JPQL
- Today
- Total
목록인프런/[인프런] 스프링 핵심 원리 - 고급 (105)
개발자되기 프로젝트

빈 후처리기를 사용해서 실제 객체 대신 프록시를 스프링 빈으로 등록해보자. 이렇게 하면 수동으로 등록하는 빈은 물론이고, 컴포넌트 스캔을 사용하는 빈까지 모두 프록시를 적용할 수 있다. 더 나아가서 설정 파일에 있는 수 많은 프록시 생성 코드도 한번에 제거할 수 있다. 1. PackageLogTracePostProcessor @Slf4j public class PackageLogTracePostProcessor implements BeanPostProcessor { //특정 패키지 하위의 빈이 대상 private final String basePackage; private final Advisor advisor; public PackageLogTracePostProcessor(String basePack..

1. 스프링 빈 등록과정 - 바꿔치기 객체를 바꿔치기 한다며 빈 이름은 변경되지 않고 객체만 변경된다. 2. BeanPostProcessor Interface - 스프링 제공 public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException } 빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현하고, 스프링 빈으로 등록하면 된다. postProcessBeforeI..

1. 일반적인 스프링 빈 등록 public class BasicTest { @Test void basicConfig (){ //스프링 컨테이너 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BasicConfig.class); //A는 빈으로 등록됨. A a = applicationContext.getBean("beanA", A.class); a.helloA(); //B는 스프링 빈으로 등록되지 않음. Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(B.class)); } @Slf4j @Conf..

1. 일반적인 스프링 빈 등록 @Bean 이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다. 그리고 이후에는 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다. 2. BeanPostProcessor 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다. 빈 포스트 프로세서( BeanPostProcessor )는 번역하면 빈 후처리기인데, 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용한다. 빈 후처리기 기능 객체를 조작할 수도 있고, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다. 3. 빈 후처리기 과정 생성: 스프링 빈 대상이 되는..
프록시 팩토리 덕분에 개발자는 매우 편리하게 프록시를 생성할 수 있게 되었다. 추가로 어드바이저, 어드바이스, 포인트컷 이라는 개념 덕분에 어떤 부가 기능을 어디에 적용할 지 명확하게 이해할 수 있었다. 남은 문제 프록시 팩토리와 어드바이저 같은 개념 덕분에 지금까지 고민했던 문제들은 해결되었다. 프록시도 깔끔하게 적용하고 포인트컷으로 어디에 부가 기능을 적용할지도 명확하게 정의할 수 있다. 원본 코드를 전혀 손대지 않고 프록시를 통해 부가 기능도 적용할 수 있었다. 그런데 아직 해결되지 않는 문제가 있다. 문제1 - 너무 많은 설정 바로 ProxyFactoryConfigV1 , ProxyFactoryConfigV2 와 같은 설정 파일이 지나치게 많다는 점이다. 예를 들어서 애플리케이션에 스프링 빈이 1..
이번에는 인터페이스가 없고, 구체 클래스만 있는 v2 애플리케이션에 LogTrace 기능을 프록시 팩토리를 통해서 프록시를 만들어 적용해보자. Advice는 동일하니 Config만 새로 만들면 된다. 1. Config @Slf4j @Configuration public class ProxyFactoryConfigV2 { @Bean public OrderControllerV2 orderControllerV2(LogTrace logTrace){ OrderControllerV2 orderController = new OrderControllerV2(orderServiceV2(logTrace)); ProxyFactory proxyFactory = new ProxyFactory(orderController); p..
지금까지 학습한 프록시 팩토리를 사용해서 애플리케이션에 프록시를 만들어보자. 먼저 인터페이스가 있는 v1 애플리케이션에 LogTrace 기능을 프록시 팩토리를 통해서 프록시를 만들어 적용해보자. 1. Advice public class LogTraceAdvice implements MethodInterceptor { private final LogTrace logTrace; public LogTraceAdvice(LogTrace logTrace) { this.logTrace = logTrace; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { TraceStatus status = null; try{ Metho..

어드바이저는 하나의 포인트컷과 하나의 어드바이스를 가지고 있다. 만약 여러 어드바이저를 하나의 target 에 적용하려면 어떻게 해야할까? 쉽게 이야기해서 하나의 target 에 여러 어드바이스를 적용하려면 어떻게 해야할까? 프록시를 여러 개 만들면 될까? 1. 예제 public class MultiAdvisorTest { @Test @DisplayName("여러 프록시") void multiAdvisorTest(){ //client -> proxy2(advisor2) -> proxy1(advisor1) -> target //프록시1 생성. ServiceInterface target = new ServiceImpl(); ProxyFactory proxyFactory1 = new ProxyFactory(t..