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
'백엔드' 카테고리의 다른 글
[Spring] 스프링의 작동 원리 (0) | 2024.10.26 |
---|---|
[Java] 리액티브 프로그래밍 - RxJava (0) | 2024.04.08 |
[Docker] 도커란 무엇인가 (0) | 2024.03.25 |
[Spring Boot] RESTAPI - 예외처리 (1) | 2024.01.11 |
[Spring Boot] JsonIgnore, JsonIgnoreProperty, JsonFilter (2) | 2024.01.04 |