본문 바로가기

백엔드

[Spring Boot] 순환 참조 (Circular Reference)

728x90

 

/* 순환 참조 */

순환 참조 (Circular Reference) 란 서로 다른 Bean들이 서로를 참조하고 있어서 서로가 서로에게 의존하는 구조를 말한다. 이는 스프링 컨테이너가 빈의 생명주기를 관리하는 과정에서 문제를 일으킬 수 있습니다. 스프링의 특징인 IOC/DI , AOP, PSA 중 하나인 IOC/DI와 연관있는 만큼 주의할 필요가 있다.

 

순환 참조 에러 메시지:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  securityConfig defined in file [..\java\main\com\platinouss\bookrecommend\config\SecurityConfig.class]
↑     ↓
|  authenticationProviderService defined in file [..\java\main\com\platinouss\bookrecommend\service\AuthenticationProviderService.class]
└─────┘


Action:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.


Process finished with exit code 1

 

/* 예방하는 방법*/

1. 생성자 주입 사용 : 생성자 주입 (Constructor Injection)을 사용하면 순환 의존성 문제를 컴파일 시점에서 발견할 수 있다. 

2. 세터 주입 피하기 : 세터 주입은 의존성을 나중에 주입하게 한다. 이는 구조가 복잡할 시 고치기가 매우 어렵다. (Setter 메서드가 어디에 있는 지 모를 수 있고 찾는다 하더라도 메서드 전체 뿐만 아니라 구조 전체를 바꿔야 할 수도 있다)

3. 스프링의 @Lazy 사용 : 해당 방법은 빈의 로딩을 지연시킬 수 있다. 하지만 이는 임시적인 해결책으로 알고 있다.

 

 

 

 

 

728x90