amplitude.init("2e2e5a386856efdf3237cf254a9d14d9"

[개념 콕] 스프링 순환참조

내일배움캠프 수료생이 개발에 꼭 필요한 핵심 개념만 콕 집어 드립니다.
May 31, 2024
[개념 콕] 스프링 순환참조
✍🏼
개발을 시작하시는 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
 

순환참조란?

순환 참조(Circular Dependency)는 두 개 이상의 객체가 서로를 직접적 또는 간접적으로 참조하는 상황을 말합니다. 이는 주로 객체 지향 프로그래밍이나 의존성 주입(Dependency Injection) 컨텍스트에서 발생합니다.
예를 들어, Spring에서 Bean A가 Bean B를 참조하고, 동시에 Bean B가 Bean A를 참조하는 경우 순환 참조가 발생합니다. 이는 두 개의 Bean이 서로를 필요로 하기 때문에 발생하는 문제입니다.
순환 참조는 복잡한 객체 그래프에서 더 긴 순환 고리를 형성할 수도 있습니다. 예를 들어, Bean A → Bean B → Bean C → Bean A와 같이 여러 객체가 연쇄적으로 참조하는 경우도 순환 참조에 해당합니다.
 
아래와 같은 상황입니다. 이 경우 BeanA는 생성자 주입으로 BeanB를 받아야 하는데 BeanB가 만들어지기 위해서는 생성자 주입으로 BeanA를 받아야 합니다.
@Component public class BeanA { private BeanB beanB; @Autowired public BeanA(BeanB beanB) { this.beanB = beanB; } }
@Component public class BeanB { private BeanA beanA; @Autowired public BeanB(BeanA beanA) { this.beanA = beanA; } }
 
순환 참조가 발생하면 객체 생성 과정에서 무한 루프에 빠질 수 있습니다. Bean A를 생성하려면 Bean B가 필요하고, Bean B를 생성하려면 Bean A가 필요한 상황에서는 어느 한 쪽을 먼저 완전히 초기화할 수 없게 됩니다. 순환 참조는 코드의 복잡성을 증가시키고 유지보수를 어렵게 만드는 요인이 될 수 있으므로, 가능한 한 피하는 것이 좋습니다.
 
 

순환 참조 해결 방법

1. 구조 재설계

가장 좋은 방법입니다. 순환 참조가 일어나지 않는 구조로 다시 설계를 진행합니다. 하지만 재설계를 못하는 경우도 많겠죠? 이때 사용할 수 있는 (임시방편)을 알아봅시다.
 

2. @Lazy 사용

@Component public class BeanA { private BeanB beanB; @Autowired public BeanA(@Lazy BeanB beanB) { this.beanB = beanB; } }
@Lazy 를 사용하게 되면 Bean A 생성 시에는 프록시 Bean B 객체를 생성하기 때문에 생성에 문제가 없습니다. 후에 실제 beanB가 사용되어야 할 때 실제 beanB 객체가 생성됩니다.
 
그러나 이 방식은 Spring 공식 문서에서도 권장하지 않습니다. 순환 참조라는 근본적인 문제를 해결한 것이 아니라 빈 생성을 억지로 시킨 것이기 때문에, 추후 런타임 환경에서의 오류가 발생할 수 있기 때문입니다. 컴파일 시점에 에러를 잡는 것이 런타임 시점보다 훨씬 좋습니다.
 
 

3. 필드 주입 or 수정자 주입 사용

이 방법 또한 임시 방책입니다. Bean 이 생성된 후에 의존성 주입이 일어나기 때문에 2번과 마찬가지로 실행은 되겠으나 추후 런타임 환경에서의 오류가 발생할 수 있습니다.
 
2, 3번 해결 방법이나 @PostConstruct 등 다른 해결방법들도 모두 임시 방책입니다. 순환 참조가 발생하는 구조는 애초에 설계부터 재고해봐야 한다는 것이 정론입니다.
 
 
 
 

내일배움캠프는 개발에 필요한 핵심만 배웁니다

지금까지 꼭 필요한 개발 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
 
 
 
CREDIT
글 | 장동하 내일배움캠프 수료생 편집 | 정효재 팀스파르타 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
 
 
Share article
Subscribe to our newsletter
RSSPowered by inblog