여니의 프로그래밍 study/Spring & Spring Boot

[스프링부트] 순환 참조 문제란?

여니's 2022. 3. 22. 11:22

 

순환 참조 문제란 정확히 무엇일까요?

 

 

A 클래스가 B 클래스의 Bean을 주입받고,

B 클래스가 A 클래스의 Bean을 주입받는 상황으로

서로 순환되어 참조할 경우, 발생하는 문제입니다.

 

 

이 문제가 왜 일어나죠?

 

필드 주입 방식과 수정자 주입 방식에서는

위 같은 상황이 일어나더라도

애플리케이션 실행 과정에서 예외가 발생하지 않습니다. 

당장에는 문제가 생기지 않지만,

문제가 되는 순간은

실제로 해당 메소드가 호출되었을 때 입니다.

 

 

 

하지만 위 상황은

순환참조 문제가 아닙니다.

서로 다른 메소드가 서로 호출을 할 때 생기는 순환호출 문제입니다.

 

 

 

생성자 주입 방식에서의 순환참조 문제에 대해 다뤄보기 전,

생성자 주입 방식의 동작원리에 대해 알아봐야합니다.

 

 

 

A클래스가 B클래스를 의존하고,

B클래스가 C클래스를 의존하고 있습니다.

 

 

 

A클래스에 대한 Bean을 만들기 위해

B클래스의 Bean을 주입해야 합니다.

근데 아직 없으니까, 

B클래스의 Bean을 만듭니다.

그런데 이 과정에서 

C클래스의 Bean을 주입해야하는데

이 마저도 없으니까

C 클래스의 Bean을 가장 먼저 만듭니다.

 

 

따라서

스프링 부트는

C -> B -> A 순으로 Bean을 생성합니다.

 

 

 

이제 처음에 다뤘던 A<->B 일때의

문제에 대해 다뤄보겠습니다.

 

 

 

A 클래스의 Bean을 만드는 과정에서는

B 클래스의 Bean이 필요합니다.

근데 없으니까 B 클래스의 Bean을 먼저 생성합니다.

근데 B 클래스는 A 클래스를 의존하고 있으므로

A 클래스의 Bean을 먼저 만듭니다.

 

 

위 상황이 반복되면서

무한 반복에 빠져버리게 됩니다. 

 

 

이렇게 순환되는 과정에서

결과적으로 어떠한 Bean도 생성하지 못하는 문제를

바로 순환참조문제라고 합니다.