이 포스팅은 인프런 김영한님의 스프링 핵심 원리 - 고급편에 기반하여 작성된 포스팅입니다. 프록시 내부 호출이 무엇인지 안다는 전제하에 포스팅을 작성합니다.
학습 환경
Spring Boot 2.5.x
목차
1. 내부 호출 대안 - 자기 자신 주입
2. 내부 호출 대안 - 지연 조회
3. 내부 호출 대안 - 구조 변경
1. 내부 호출 대안 - 자기 자신 주입
내부 호출을 사용하는 스프링 빈에 자기 자신을 주입한다. 세터 주입으로 해야한다. 스프링은 객체를 생성하는 단계와 세터로 의존관계를 주입하는 단계가 분리되어 있다. 한 편 생성자 주입은 빈 생성 시점에 의존 관계를 주입하기 때문에 순환 참조에 빠지게 된다. (스프링 빈 순환 참조 예외 BeanCurrentlyInCreationException)
이제 내부 호출을 할 때 인스턴스 자신이(this)이 아니라 의존 관계로 주입 받은 객체로 호출을 하면 된다.
2. 내부 호출 대안 - 지연 조회
앞서 생성자 주입을 사용했을 때, 순환 참조가 발생한 이유는 자기 자신을 생성하면서 의존 관계를 주입해야 하기 때문이다. 생성자 주입을 사용하더라도 지연 조회를 사용하면 내부 호출 문제를 해결할 수 있다. ObjectProvider 객체를 의존받으면 된다.
3. 내부 호출 대안 - 구조 변경
1,2 번의 해결책은 클래스 내부에 어떤 관계를 설정하거나 주입 방식의 변경이 필요하다. 하지만 스프링에서 가장 권장하는 방법은 내부 호출이 일어나지 않도록 구조를 변경하는 것이다.
구조를 변경하는 방법은 매우 많기에 어떠한 아래 예제말고도 다른 방법이 많다는 것을 알고 갔으면 좋겠다.
이게 핵심인데 internal() 메서드를 CallService에서 가지지 않는다.
아래와 같이 외부에서 ionternal() 메서드를 작성하면 된다.
이럴 경우에도 내부 호출로 인한 AOP 미적용을 방지할 수 있다.
'Spring > core' 카테고리의 다른 글
ArgumentResolver (0) | 2023.04.08 |
---|---|
HandlerAdapter (1) | 2023.04.08 |
스프링 빈 순환 참조 예외 BeanCurrentlyInCreationException (0) | 2023.03.26 |
스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (2) AOP (0) | 2023.03.25 |
스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (1) 프록시 (0) | 2023.03.25 |