오늘은 Spring IOC, DI에 대해서 알아보자.
- IoC는 Inversion of Control의 약자로 "제어 반전" 이라고 한다.
- 프로그램을 구동하는데에 있어 필요한 객체에 대한 생성, 변경 등의 관리를 프로그램을 개발하는 사람이 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말한다.
스프링은 IoC 구조를 통해 구동 시 필요한 객체의 생성부터 생명주기까지 해당 객체에 대한 관리를 직접 수행한다!!!
- 스프링에서 관리하는 객체를 'Bean(빈)' 이라고 하며 해당 빈들을 관리한다는 의미로 컨테이너를 'Bean Factory'라고 한다.
이름 | 기능 |
---|---|
Bean | - 스프링이 IoC 방식으로 관리하는 Class - 스프링이 직접 생성과 제어를 담당하는 객체 |
Bean Factory | - 스프링의 IoC를 담당하는 핵심 컨테이너 - Bean을 등록, 생성, 조회, 반환하는 기능을 담당 |
ApplicationContext | - BeanFactory를 확장한 IoC 컨테이너 - Bean을 등록하고 관리하는 기능은 BeanFactory와 동일하지만 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다. |
GenericXmlApplicationContext | - ApplicationContext를 구현한 Class - 일반적인 XML 형태의 문서를 읽어 컨테이너 역할을 수행 |
Configuration metadata | - ApplicationContext 또는 BeanFactory가 IoC를 적용하기 위해 사용하는 설정 정보 - 설정 메타 정보는 IoC 컨테이너에 의해 관리되는 Bean 객체를 생성하고 구성할 때 사용 |
- DI란, Dependency Injection의 약자로 의존성 주입이라고 하며, IoC 구현의 핵심 기술이라고 할 수 있다.
- 사용하는 객체를 직섭 생성하여 만드는 것이 아니라 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 의미한다.
- 이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화 할 수 있다.
개발자가 작성해야 할 코드가 단순해진다.
각 객체 간의 종속 관계(결합도)를 해소할 수 있다.
<bean id=“객체의 이름" class=“클래스 풀네임“>
<property name=“name” value=“OOO”/>
<property name=“name” ref=“OOO”/>
</bean>
<!--
name 속성 : Class에서 선언한 필드 변수의 이름
value 속성 : 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용
ref 속성 : Bean 이름을 이용해 주입할 Bean을 찾음
-->
<bean id=“불러 올 객체" class=“클래스 풀네임“>
<constructor-arg index=“0” value=“OOO”/>
<constructor-arg name=“OOO” ref=“OOO”/>
</bean>
<!--
Constructor 주입 방식은 새엉자의 파라미터를 이용하기 때문에 한번에 여러 개의 객체 주입 가능
필드 선언 순서에 따라 index 속성을 통해서도 접근이 가능하다.
-->