Next-Squad/Interview-Question

[Spring] 1.Spring DI/IoC는 어떻게 동작하나요?

CMSSKKK opened this issue · 2 comments

Spring DI/IoC는 어떻게 동작하나요?

키워드

Bean, BeanFactory, ApplicationContext, Reflection, DI 방식

스프링에서 IoC(Inversion Of Controll, 제어의 역전)란 개발자가 직접 오브젝트를 생성하고 관리하는 것이 아니라
스프링 프레임워크(외부)에서 관리 대상을 생성하고 관계를 맺어주는 것을 뜻합니다.

스프링에서는 그 역할을 ApplicationContext에서 담당합니다.(BeanFactory의 확장)

ApplicationContext는 IoC 컨테이너라고 불리며, 스프링 컨테이너라고도 불립니다.

스프링에서 IoC방식으로 관리 대상이 되는 오브젝트를 빈이라고 합니다.

단순히 빈을 생성하고, 관계를 맺어주는 것뿐만 아니라, 생성 시점, 방식, 전략까지 관리합니다.
또한 빈이 사용할 수 있는 기반기술 서비스 및 외부 시스템과의 연동도 지원합니다.

DI(Dependency Injection)이란 스프링이 제공하는 IoC 방식의 핵심입니다.

두 오브젝트의 관계, 즉, 의존관계 설정을 런타임 시에 외부(스프링)에서 해주는 것입니다.

결론으로 스프링의 DI/IoC는 ApplicationContext를 이용해서 빈 설정 정보(BeanDefinition)를 생성하고,
빈 설정 정보를 토대로 관리대상인 오브젝트들(빈)의 의존관계를 설정(DI)하여 생성, 관리합니다.

References

스프링 IoC 컨테이너는 스프링프레임워크의 코어 기능이다. IoC 컨테이너는 객체를 생성하고, 의존관계를 설정하고 생명주기를 관리한다.

컨테이너는 어플리케이션을 구성하는 각 요소들을 관리하기위해 DI를 사용한다. 컨테이너는 DI에 의해서 구현되지만 스프링이 그렇다는 거고 이게 IoC를 달성하는 유일한 방법은 아니다

DI는 스프링 설정파일 (XML) 이나 어노테이션 등으로 할수있는데, 참고로 스프링부트를 사용하면 자동으로 설정된다.

이렇게 DI를 통해 생성된 객체들을 Bean 이라고 하는데, 이 빈들의 생명주기를 개발자가 직접관리하지 않기때문에 이름이 Inversion of Control 이라고 한다. 즉, 객체를 생성하는 책임이 어플리케이션 코드에서가 아니라 스프링컨 테이너로 옮겨졌기때문에 제어의 역전이라고 하는 것이다.

DI는 생성자나 Setter를 통해서 이루어진다.
DI를 하기위해 스프링은 BeanFactory 컨테이너와 ApplicationContext 컨테이너를 제공한다.

BeanFactory는 간단히 빈을 등록하고 의존성을 설정하는데 사용되고 lazy-loading 방식을 취한다. ApplicationContext는 이를 확장한 기능을 제공하고 aggressive-loading 방식을 취하기때문에 처음에 앱을 실행하면 모든 빈들이 컨테이너에 올라간다.

https://stackoverflow.com/questions/9403155/what-is-dependency-injection-and-inversion-of-control-in-spring-framework

5-2부분 https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html

https://www.geeksforgeeks.org/spring-difference-between-inversion-of-control-and-dependency-injection/