DI(Dependency Injection)란 IoC 구현의 핵심 기술로, 사용하는 객체를 직접 생성하여 만드는 것이 아니라 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 말한다.
이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화할 수 있다.
DI의 장점으로 1) 개발자가 작성해야 할 코드가 단순해지며, 2) 각 객체 간의 종속 관계(결합도)를 해소할 수 있다.
한 클래스에서 필드 객체를 생성할 때 발생하는 두 객체 간의 관계를 말하며, 각 객체간의 내용이 수정될 경우 영향을 미치는 정도를 나타낸다.
예를 들어 A클래스에서 B클래스를 생성할 경우, B클래스의 생성자의 매개변수가 변경되거나 제공하는 메소드가 변경될 경우 이를 사용하는 A클래스의 일부 정보도 필히 수정해야 하는 상황이 발생하는데 이를 '두 객체간 종속관계(결합도)가 강하다.'라고 표현한다.
의존성을 주입받는 Setter 메소드를 만들고, 이를 통해 의존성을 주입한다.
<bean id="student" class="com.uni.firstSpring.person.model.vo.Student">
<property name="name" value="리사" />
<property name="wallet" ref="money" />
</bean>
<bean id="money" class="com.uni.firstSpring.wallet.model.vo.Wallet" />
필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입한다.
<bean id="student" class="com.uni.firstSpring.person.model.vo.Student">
<constructor-arg index="0" value="리사"/>
<constructor-arg index="1" ref="money"/>
</bean>
<bean id="money" class="com.uni.firstSpring.wallet.model.vo.Wallet" />
의존성을 입력받는 일반 메소드를 만들고 이를 통해 의존성을 주입한다.
※ @Repository, @Service, @Controller는 특정한 객체의 역할에 대한 @Component의 구체화된 형태이다.
<context:component-scan base-package=“com.uni.firstSpring" />
※ <context:include-filter> 태그와 <context:exclude-filter>태그를 같이 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다.
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.