티스토리 뷰

반응형

필드 주입도 순환 참조를 검사해 준다?

 

 스프링의 의존성 주입과 관련하여 코드를 작성해 보던 중, 필드 주입 또한 순환 참조를 검사해 주는 것을 확인하여 의문이 생겼다.

 

 기존에 생성자 주입을 권장하는 이유는 빈의 생명주기 중 처음 두 단계 중 1번의 인스턴스 생성을 위한 생성자 호출에서 바로 의존성을 주입해야 하므로 순환 참조를 찾을 수밖에 없기 때문으로 이해했다.

  1. 빈 객체의 인스턴스 생성 단계
  2. 의존성 주입 단계
  3. @PostConstruct나 InitializingBean 인터페이스의 구현 메서드에 의한 초기화 단계
  4. 스프링 컨테이너 종료 시 @PreDistroy나 DisposableBean 인터페이스의 구현 메서드에 의한 소멸 단계

 

 이번에 새로 경험한 것은 생성자 주입이 아닌 필드 주입과 같은 방법으로 빈을 등록하여도 순환 참조를 검사해 주는 것이었다.

 

 

원인은 최신 버전의 스프링 부트

 그에 대한 원인을 찾아보니 추가적인 주입 방법들에 대한 검사를 스프링 부트에서 도와주고 있기 때문이었다.

다음은 스프링 부트 2.6의 Release Note의 일부이다.

 

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes

 

 요약하자면 스프링 부트 2.6부터 기능이 업데이트되어 순환 참조를 기본적으로 금지하게 되었다. 순환 참조가 발생했을 땐 BeanCurrentlyInCreationException을 발생시키며, 이를 허용하기 위해서는 spring.main의 allow-circular-references 옵션을 참으로 바꿔야 한다는 것이다.

반응형