Tech/Spring

스프링 AOP - 프록시와 내부 호출 대안(1) 자기 자신 주입

봄의 개발자 2023. 11. 7.
728x90
반응형
  • 내부 호출을 해결하는 가장 간단한 방법은 자기 자신을 의존관계 주입받는 것이다.
@Autowired
    public void setCallServiceV1(CallServiceV1 callServiceV1) {
        this.callServiceV1 = callServiceV1;
    }
  • 수정자를 통해 주입을 받는 것을 확인할 수 있다.
  • 스프링에서 AOP가 적용된 대상을 의존관계 주입 받으면 주입 받은 대상은 실제 자신이 아니라 프록시 객체이다.
/**
 * 참고: 생성자 주입은 순환 사이클을 만들기 때문에 실패함
 */
@Slf4j
@Component
public class CallServiceV1 {
    private CallServiceV1 callServiceV1;

    @Autowired
    public void setCallServiceV1(CallServiceV1 callServiceV1) {
        this.callServiceV1 = callServiceV1;
    }

    public void external() {
        log.info("call external");
        callServiceV1.internal();
    }

    public void internal() {
        log.info("call internal");
    }
}
  • extenal()을 호출하면 callServiceV1.internal()을 호출하게 됨
  • 주입받은 callServiceV1은 프록시이기 때문에 이를 통해 AOP를 적용할 수 있다.
@Slf4j
@Component
public class CallServiceV1 {
    private CallServiceV1 callServiceV1;
    @Autowired
    public void setCallServiceV1(CallServiceV1 callServiceV1) {
        this.callServiceV1 = callServiceV1;
    }
    public void external() {
        log.info("call external");
        callServiceV1.internal(); //외부 메서드 호출
    }
    public void internal() {
        log.info("call internal");
    }
}
@Import(CallLogAspect.class)
@SpringBootTest
class CallServiceV1Test {
    @Autowired
    CallServiceV1 callServiceV1;
    @Test
    void external() {
        callServiceV1.external();
    }
}

 

스프링 AOP - 프록시와 내부 호출 대안(1) 자기 자신 주입


😵 에러 발생 - 순환 에러

  • 스프링부트 2.6 이상이라면 필수 추가

스프링 AOP - 프록시와 내부 호출 대안(1) 자기 자신 주입 - undefined - 모든 영역

 

// application.properties 

spring.main.allow-circular-references=true
728x90
반응형

댓글