본문 바로가기
Debugging&Solution/Debugging

스프링 빈 순환 참조 (The dependencies of some of the beans in the application context form a cycle) 해결법

by 코딩의성지 2023. 2. 22.

어딘가 면접을 가보면 간혹 듣는 질문이 있다. 

왜 생성자 주입을하는가?

 

그 이유중 하나가 빈의 순환 참조를 방지하기 위함인데,

 

스프링 빈 순환 참조는 어플리케이션 컨텍스트에서 일부 빈의 종속성이 순환주기를 만들어서 생기는 문제이다.

즉, 둘 이상의 빈이 생성자를 통해 서로 주입할 때 발생한다.

 

일반적으로 스프링은 어플리케이션 컨텍스트의 시작 되즌 과정에서 모든 싱긅톤 빈을 즉시 생성하는데, 이렇게 하는 이유가 컴파일단계에서 에러를 잡기 위해서이다. 지금 내가 알려드리는 방법은 이렇게 생성되는 빈을 프록시 객체로 생성하고 추후에 지연로딩으로 생성되도록하는 임시방편의 방법이다.

 

@Lazy 어노테이션을 통해서 지연로딩을 시켜주면 어플리케이션이 실행될때 즉시 객체가 초기화되는 것이아니라 프록시 객체를 주입해 사용한다.

 

@Autowired
public WebSecurity(Environment env, @Lazy UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder) {
    this.userService = userService;
    this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    this.env = env;
}

 

이방법은 이상적인 방법은 아니다. 허나 레거시한 코드를 고치다 보면 이렇게 임시방편으로 처리해야할 경우가 있으니 잘알아두자.

반응형

댓글