얼마전 Spring 의 Circular Dependency 이슈가 있어서 좀 더 자세히 알아보다가 궁금해져서 정리한 내용이다.
본 포스팅은 이슈를 정리한 내용이므로 다음 내용을 선행적으로 참조해볼 필요가 있다.
(https://jins-dev.tistory.com/entry/Spring-DIDependency-Injection-%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EC%82%AC%EC%9A%A9?category=760012)
먼저 이슈가 된 내용은 서버가 올라갈 때 Circular Dependency 관계에 있는 Bean 들 간의 설정에 있어서 @Autowired 어노테이션을 실수로 빼먹은 부분이었는데, 그로인해 참조된 Bean 이 null 상태로 초기화되는 문제 때문이었다.
Spring Reference manual 에 따르면 스프링은 먼저 각 Bean 들을 초기화하고 다른 Bean 들에 Inject 하는 방식으로 기본적으로 Circular Dependency 문제를 해결한다.
즉, 껍데기만 만들어놓고 Bean 을 먼저 Injection 한다는 것이 옳다.
여기서 주의할 부분은 상호간에 Bean 이 Inject 될 시에 Inject 되는 Bean 은 완전히 Initialized 된 상태가 아니라는 것이다.
하지만 이런 Spring Framework 레벨에서의 처리가 있음에도 Spring team 은 결국 Circular Dependency 문제는 발생하지 않는 경우가 최선이며, 그런 안전한 구조를 설계하기 위한 Constructor Injection 을 권장하고 있다.
Spring framework 를 이용한 생산성과 편의성을 보다 추구하는 측에서도 Setter Injection 의 사용이나 @Lazy 어노테이션을 이용한 Lazy Init 을 권장하고 있다.
참조
https://stackoverflow.com/questions/3485347/circular-dependency-in-spring
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#d0e2299
https://www.logicbig.com/tutorials/spring-framework/spring-core/circular-dependencies.html
'Server > Spring' 카테고리의 다른 글
Spring AOP 의 개념과 이해 (0) | 2019.06.02 |
---|---|
Spring의 Filter 와 Interceptor 에 대하여 (0) | 2019.03.15 |
Spring DI(Dependency Injection) 의 정의와 사용 (0) | 2019.03.06 |
Spring 의 FlashMap (0) | 2019.02.15 |
Spring 의 Caching 기능 이용하기 (0) | 2018.12.03 |