스프링 AOP6 스프링 AOP - 프록시와 내부 호출 대안(3) 구조 변경 스프링에서 가장 권장하는 방법 clienct → external() client → internal() 클라이언트에서 둘 다 호출하는 것 물론 external()에서 internal을 내부 호출하지 않도록 코드를 변경해야 한다. 클라이언트가 모두 호출하도록 구조를 변경 하면 된다. (가능한 경우에) 💡 참고) aop는 주요 트랜잭션 적용이나 주요 컴포넌트의 로그 출력 기능에 사용된다. 인터페이스에 메서드가 나올 정도의 규모에 aop 적용하느 것이 적당하다. aop는 public 메서드만 적용한다. private 메서드처럼 작은 단위에는 AOP를 적용하지 않는다. AOP 적용을 위해 private 메서드를 외부 클래스로 변경하고 public 으로 변경하는 일은 거의 없다. 그러나 위 예제와 같이 publi.. Tech/Spring 2023. 11. 14. 스프링 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. 이전 1 다음 728x90 반응형