스프링/스프링 AOP
-
@Aspect 프록시스프링/스프링 AOP 2023. 9. 20. 12:57
이전까지 만들었던 포인트컷과 어드바이스를 어노테이션 하나로 만들 수 있다. @Slf4j @Aspect public class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") // 이 부분이 포인트컷 public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { // 여기 advice 로직이 들어감 TraceStatus status = null; try { String message = joi..
-
빈 후처리기스프링/스프링 AOP 2023. 9. 17. 22:13
빈 후처리기란? 빈 후처리기는 빈을 조작하고 변경할 수 있는 기능이다. 빈 객체를 조작하거나 다른 객체로 바꿔 버릴정도로 강력한 기능이다. 일반적으로 스프링 컨테이너가 등록하는 빈들, 특히 컴포넌트 스캔의 대상이 되어서 의존관계 주입이 자동으로 이루어지는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 개발자가 등록하는 모든 빈을 중간에 조작할 수 있다. 즉, 빈 객체를 프록시로 교체하는 것도 가능하다는 뜻이다. 스프링에서 지원하는 빈 후처리기 기능을 알아볼 것이다. build.gradle에 추가 implementation 'org.springframework.boot:spring-boot-starter-aop' 위의 코드를 build.gradle에 추가하면 스프링 자동 빈 후처리가 스프링으..
-
어드바이저의 실제 적용스프링/스프링 AOP 2023. 9. 17. 18:01
테스크 코드에서의 예제가 아니라 실제 적용하게 된다면 어떻게 동작하는지에 대한 포스팅이다. 실제 사용하는 어드바이스 - LogTraceAdvice.class 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 { Method method = invocation.getMetho..
-
여러 어드바이저 동시 적용스프링/스프링 AOP 2023. 9. 17. 17:00
하나의 타겟에 어드바이저 1개가 아니라 여러개를 동시에 적용하는 방법을 알아볼 것이다. 프록시를 어드바이저 개수만큼 선언해서 계속해서 프록시 팩토리를 생성해서 넣어주는 방법이 있다. 하지만 이러한 방식은 프록시의 개수만큼 프록시를 생성해야 한다는 문제점이 있기 때문에 스프링에서 제공하는 방식을 사용하면 된다. 위의 사진보다 아래있는 방식을 선호한다. 프록시를 여러개 생성하는 것이 아니라 여러 어드바이저를 하나의 프록시로 설정하는 것이다. 어드바이스 static 메서드로 선언 static class Advice1 implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable {..
-
포인트컷, 어드바이스, 어드바이저스프링/스프링 AOP 2023. 9. 17. 16:41
포인트컷 : 어디에 부가 기능을 적용할지, 안할지 판단하는 필터링 로직 어드바이스 : 이전 포스팅에서 본 것처럼 프록시가 호출하는 부가 기능. 단순하게 프록시 로직 어드바이저 : 포인트컷, 어드바이스를 하나씩 가지고 있는 것 포인트 컷은 Service 클래스 안에 로직이 여러개가 있는데, 어떤 로직에 기능을 적용할 지 필터링 하는 것이며, 어드바이스는 프록시 로직을 의미한다. 전체적인 예제 테스트 코드 @Test void advisorTest1() { ServiceInterface target = new ServiceImpl(); ProxyFactory proxyFactory = new ProxyFactory(target); DefaultPointcutAdvisor advisor = new Default..
-
프록시 팩토리(ProxyFactory)스프링/스프링 AOP 2023. 9. 17. 16:10
스프링에서 지원하는 프록시 팩토리란 동적 프록시를 통합해서 편리하게 만들어주는 기능이다. 인터페이스가 있으면 JDK 동적 프록시를 사용하고, 구체 클래스만 있다면 CGLIB를 사용한다. JDK 동적 프록시나 CGLIB를 수동으로 생성하는 것이 아니라 프록시 팩토리가 프록시를 자동으로 만들어주는 것이다. (JDK 동적 프록시와 CGLIB는 직접적으로 사용하지 않는다 해서 포스팅을 안했는데 나중에 따로 찾아봐야 한다) - 간단하게 인터페이스면 JDK 동적 프록시, 구체 클래스면 CGLIB 프록시 팩토리는 기본적으로 advice를 통해 이루어진다. TimeAdvice.class @Slf4j public class TimeAdvice implements MethodInterceptor { @Override pu..
-
프록시를 이용한 로그추적기 - 구체클래스 기반스프링/스프링 AOP 2023. 9. 10. 23:06
일반적으로 인터페이스 기반 프록시가 더 좋다. 하지만 변경이 거의 일어나지 않는 클래스는 인터페이스를 굳이 만들 필요가 없기 때문에 구체클래스 기반 프록시를 사용하기도 한다. OrderControllerConcreteProxy public class OrderControllerConcreteProxy extends OrderControllerV2 { private final OrderControllerV2 target; private final LogTrace logTrace; public OrderControllerConcreteProxy(OrderControllerV2 target, LogTrace logTrace) { super(null); this.target = target; this.logTr..
-
프록시를 이용한 로그추적기 - 인터페이스 기반스프링/스프링 AOP 2023. 9. 10. 22:13
기존에 있던 로그 추적기는 코드를 하나씩 전부 바꿔야했는데 프록시를 이용하면 그렇게 하지 않고 스프링 빈으로 등록할 때 프록시를 스프링 빈으로 등록해주면 된다. 로그 추적기 코드는 저번 포스팅에 이미 있어서 여기에는 올리지 않을테니 로그 추적기 관련 포스팅을 같이 보면 된다. OrderRepositoryInterfaceProxy @RequiredArgsConstructor public class OrderRepositoryInterfaceProxy implements OrderRepositoryV1 { private final OrderRepositoryV1 target; private final LogTrace logTrace; @Override public void save(String itemId)..