Spring
-
[Spring] @Aspect - AOPSpring 2022. 6. 19. 23:53
이전에 공부 하였듯이 자동 프록시 생성기를 통해 스프링 빈에 등록된 Advisor를 스프링이 자동으로 조회하여 해당 Advisor의 Pointcut을 통해 적용 되는 클래스, 메서드를 조회하고 Advice가 적용되어야하는 메서드를 확인한 다음 Advice가 실행되었다. 스프링은 @Aspect 애너테이션을 통해 포인트 컷과 어드바이스로 구성되어 있는 어드바이스를 생성하는 기능을 지원한다. @Aspect 애너테이션이란? AOP(관점 지향 프로그래밍)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애너테이션. @Aspect public class MyAdvisor { @Around("execution(* 패키지이름..*(..))") public Object execution(ProceedingJoinPo..
-
[Spring] 빈 후처리기 - 스프링이 제공하는 빈 후처리기Spring 2022. 6. 19. 21:22
이전 학습에서 빈 후처리기를 작성하면서 적용되는 대상을 패키지 이름을 주입 받아 적용하는 방식으로 설정해서 활용하였다. 하지만 빈 후처리기가 주입 받는 Advisor에는 Advice와 Pointcut이 있기 때문에 Pointcut을 활용하면 클래스, 메서드 단위의 적용 대상 여부를 설정할 수 있다. - Pointcut 사용 시기 1. 빈 후처리기가 자동 프록시 생성시 : 프록시 적용 대상 여부 체크 후 필요한 곳에만 프록시 적용 - 해당 빈이 프록시를 생성할 필요가 있는지 체크한다 (클래스, 메서드 조건을 모두 비교해서 조건에 맞는 것이 하나라도 있으면 프록시를 생성한다.) 2. 프록시 내부 : 해당 프록시의 메서드 중 어떤 메서드가 호출 되었을 시 Advice가 적용 될지 판단 - 포인트 컷을 통해 프..
-
[Spring] 빈 후처리기 - BeanPostProcessorSpring 2022. 6. 19. 20:49
@Bean 애너테이션 또는 컴포넌트 스캔을 활용하여 스프링 빈을 등록하면 대상 객체를 생성 후 스프링 커테이너 내부 빈 저장소에 등록되고 등록한 스프링 빈을 조회해서 사용하게 된다. 빈 후처리기(BeanPostProcessor) 위 설명대로 스프링 컨테이너에 객체를 저장할 때 이를 조작하고 싶다면 빈 후처리기를 통해 빈 생성후 처리를 하면 된다. 빈 후처리기를 통해 객체를 조작하거나 다른 객체로 변경할 수 있다. * 빈 등록 과정 1. 스프링 빈 대상이 되는 객체를 생성한다. (@Bean, 컴포넌트 스캔) 2. 생성된 객체를 빈 후처리기에 전달한다. (빈 저장소 등록 이전) 3. 빈 후처리기에서 대상 객체를 조작 또는 변경한다. 4. 빈 후처리기가 작업한 빈을 스프링 빈 저장소에 등록한다. * 빈 후처리..
-
[Spring] 포인트컷, 어드바이스, 어드바이저 (Pointcut, Advice, Advisor)Spring 2022. 6. 17. 19:40
용어 정리 1. 포인트 컷 - Pointcut : 대상 여부 확인 필터 기능 어디에 부가기능을 적용할지, 어디에 부가기능을 적용하지 않을지 판단하는 필터링 로직 클래스와 메서드 이름으로 필터링을 한다. 2. 어드바이스 - Advice : 부가 기능 로직 담당 프록시가 호출하는 부가 기능으로, 프록시 로직 3. 어드바이저 - Advisor : 포인트컷 + 어드바이스 하나의 포인트 컷과 하나의 어드바이저를 가지고 있는 것 위와 같이 3가지로 구분한 이유는 역할과 책임을 명확하게 분리하는 것이다. DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice()); /* DefaultPointcutAdvisor ..
-
[Spring] 프록시 팩토리 (ProxyFactory)Spring 2022. 6. 17. 19:16
JDK 동적 프록시나 CGLIB 는 각각 인터페이스, 구체클래스에 대한 프록시를 만들어 적용하는 기능으로 각각의 부가기능을 사용하기 위해 구현해야하는 인터페이스가 다르고 앞서 말했듯 적용대상이 인터페이스 또는 구체 클래스인지에 따라 별도로 적용해야했다. 이를 통합해서 일관성 있고 편리하게 사용할 수 있는 스프링의 추상화 기술중 프록시 팩토리 기능이 있다. 프록시 팩터리는 인터페이스가 있으면 JDK 동적 프록시를 사용하고 구체 클래스만 있다면 CGLIB를 사용하며 이 설정을 변경하는 기능도 가지고 있다. JDK 동적 프록시와 CGLIB를 사용하기 위한 각각의 인터페이스를 통합 스프링은 위 문제 해결을 위해 Advice라는 개념을 도입하였는데 이는 즉 JDK 동적 프록시 또는 CGLIB가 통합적으로 Advi..
-
[Spring] 동적 프록시 기술 - CGLIBSpring 2022. 6. 16. 22:36
JDK 동적프록시는 인터페이스를 기반으로 프록시 클래스를 만들기 때문에 인터페이스가 없다면 사용할 수 없었다. 따라서 인터페이스 없이 구체 클래스만을 가지고 동적프록시를 만드는 방법이 CGLIB를 활용하는 방법이다. (CGLIB는 외부 오픈소스 라이브러리였으나 스프링 내부 소스 코드에 포함되었다. - 별도 추가 X) JDK 동적 프록시에서 InvocationHandler를 구현했던 것 처럼 CGLIB는 MethodInterceptor을 구현한다. public interface MethodInterceptor extends Callback { Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwab..
-
[Spring] 동적 프록시 기술 - JDK 동적 프록시Spring 2022. 6. 16. 22:24
동적 프록시 기술은 개발자가 프록시 클래스를 직접 만들지 않아도 런타임 시 프록시 객체를 대신 만들어준다. 또한 동적 프록시에 원하는 실행 로직을 지정할 수 있다. JDK 동적프록시는 인터페이스를 기반으로 프록시를 동적으로 만들기에 인터페이스가 필수다. JDK 동적 프록시를 적용할 로직은 InvocationHandler 인터페이스를 구현해서 작성하면 된다. public interface InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable } 이 때 파라미터를 살펴보면 proxy 는 프록시 자신 Method method 는 호출한 메서드 Object[] args 는 메서드를 호..
-
[Spring] 동적 프록시 기술 - 리플렉션Spring 2022. 6. 16. 21:52
이전 프록시 패턴과 데코레이터 페턴을 통해 공부했듯이 프록시를 활용한다면 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있었다. 하지만 프록시를 적용하기 위해 해당 기능을 적용할 클래스의 개수만큼 프록시 클래스를 생성해야하고 생성된 프록시 클래스가 같은 기능을 가지고 있다면 그 모습이 같았다. 따라서 같은 기능을 실행하는 프록시 클래스 클래스의 경우 동적으로 대상이 결정된다면 위의 문제들을 해결할 수 있을 것 같다. 그리고 이러한 동적 프록시 기술은 JDK 동적 프록시 기술이나 CGLIB와 같은 프록시 생성 기술을 통해 만들어 낼 수 있다. 자바 리플렉션 이란? log.info("반복되는 코드1"); /* 반복되지 않는 코드 */ log.info("반복되는 코드2"); 만약 위처럼 각 메서드, 클래..