spring aop7 스프링 AOP - 프록시와 내부 호출 대안(2) 지연 조회 자기 자신을 생성하면서 주입해야해서 실패한다. 수정자 주입이나 지연 조회 사용 스프링 빈 지연해서 조회 → ObjectProvider(Provider), ApplicationContext 사용 @Slf4j @Component public class CallServiceV2 { private final ApplicationContext applicationContext; public CallServiceV2(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void external() { log.info("call external"); CallServiceV2 callServiceV2 .. Tech/Spring 2023. 11. 10. 스프링 AOP - 프록시와 내부 호출 대안(1) 자기 자신 주입 내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입받는 것이다. @Autowired public void setCallServiceV1(CallServiceV1 callServiceV1) { this.callServiceV1 = callServiceV1; } 수정자를 통해 주입을 받는 것을 확인할 수 있다. 스프링에서 AOP가 적용된 대상을 의존관계 주입 받으면 주입 받은 대상은 실제 자신이 아니라 프록시 객체이다. /** * 참고: 생성자 주입은 순환 사이클을 만들기 때문에 실패함 */ @Slf4j @Component public class CallServiceV1 { private CallServiceV1 callServiceV1; @Autowired public void setCal.. Tech/Spring 2023. 11. 7. 스프링 AOP - 프록시와 내부 호출 문제 1. 문제점 스프링은 프록시 방식의 AOP를 사용하는데 이때 AOP를 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야한다. 프록시에서 먼저 어드바이스를 호출하고 이후에 대상 객체를 호출한다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고 어드바이스도 호출되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입 시에 항상 프록시 객체를 주입한다. 하지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. 예시를 통해 알아보자 @Slf4j @Aspect public class CallLogAspect { @Before("execution(* he.. Tech/Spring 2023. 11. 3. 스프링 AOP - this VS target this: 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target: Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 둘 다 적용 타입 하나를 정확하게 지정해야 한다. 같은 패턴 사용 불가 부모 타입 허용 this vs target 단순히 타입 하나를 정하면 되는데, this와 target은 어떤 차이가 있을까? 스프링에서 AOP 적용하면 실제 target 객체 대신 프록시 객체가 스프링 빈으로 등록된다. this는 스프링 빈으로 등록되어있는 프록시 객체를 대상으로 포인트컷을 매칭한다. target은 실제 target 객체를 대상으로 포인트컷을 매칭한다. 프록시 생성 방식에 따른 차이 스프링은 프록시를 생성할 때 JDK 동적 프록시와 CG.. Tech/Spring 2023. 10. 27. 스프링 AOP - 매개변수 전달 매개변수 전달 포인트컷 표현식을 사용해서 어드바이스에 매개변수 전달할 수 있다. this., target, args, @target, @within, @annotation, @args 포인트컷 이름과 매개변수의 이름을 맞춰야한다. 추가로 타입이 메서드에 지정한 타입으로 제한된다. 1. 가장 기본적인 방식 @Around("allMember()") public Object logArgs1(ProceedingJoinPoint joinPoint) throws Throwable { Object arg1 = joinPoint.getArgs()[0]; log.info("[logArgs1]{}, arg={}", joinPoint.getSignature(), arg1); return joinPoint.proceed();.. Tech/Spring 2023. 10. 25. AOP 용어 정리 조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다. 포인트컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체, 포인트컷으로 결정 어드바이스(Advice) 부가 기능 특정 조인 포인트에서 Aspect에 의해 취해지는 조치 .. Tech/Spring 2023. 10. 18. AOP 적용 방식 AOP를 사용할 때 부가 기능 로직은 어떤 방식으로 실제 로직에 추가될 수 있을까? 1. 컴파일 시점 .java → .class 이 시점에 부가 기능 로직 추가 가능 AspectJ 컴파일러는 Aspect를 확인해서 해당 클래스가 적용 대상인지 먼저 확인하고, 적용 대상인 경우 부가 기능 로직을 적용한다. 위빙(Weaving): 애스펙트와 실제 코드를 연결해서 붙이는 것 (원본 로직에 부가 기능 로직 추가) 단점: 특별한 컴파일러도 필요하고 복잡하다. 2. 클래스 로딩 시점 .class 파일을 JVM 내부 클래스 로더에 보관할 때 이 .class 파일을 조작한 다음 JVM에 올릴 수 있다. 로드 타임 위빙 단점: 자바 실행할 때 특별한 옵션(java -javaagent)을 통해 클래스 로더 조작기를 지정해.. Tech/Spring 2023. 10. 16. 이전 1 다음 728x90 반응형