객체 간의 의존관계 주입을 외부에서 수행하는 것
Dependency Injection
DI를 통해 시스템에 있는 객체들이 생성될 때
해당 객체를 조정하는 외부 개체가 의존관계를 부여합니다.
IoC(Inversion of Control, 제어의 역행)의 기술 중 하나입니다.
IoC는 의존관계 제어권의 흐름이 개발자에서 프레임워크로 이동하였다는 것을 의미합니다.
프레임워크가 의존관계를 컨테이너화시켜 생명주기를 관리합니다.
DI를 적용함으로 인해서 강한 결합이 느슨한 결합이 됩니다.
느슨한 결합(loose coupling)이란,
클래스 간 결합력이 약하게 만들었다는 뜻입니다.
보통 그 방법으로 인터페이스를 사용하는데,
객체는 인터페이스에 의한 의존 관계만을 알고 있고, 이 의존 관계가 외부 파일을 통해 수정할 수 있는 상태로 바뀌게 됩니다.
Spring은 DI를 도와주는 DI 컨테이너 역할을 지원합니다.
태그로 데이터를 감싸는 형태의 마크업 언어
eXtensible Markup Language
데이터를 전달하는 데에 포커스를 맞춘 언어로, 형태는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<value>사과</value>
Spring에서 XML 형태로 bean의 설정 메타 정보를 기술하면,
태그를 통해 세밀한 제어가 가능해집니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dbUtil" class="com.sample.util.DBUtil"/>
<bean id="boardDao" class="com.sample.board.model.dao.BoardDaoImpl">
<constructor-arg ref="dataSource"/>
<constructor-arg ref="dbUtil"/>
</bean>
<bean id="boardService" class="com.sample.board.model.service.BoardServiceImpl">
<constructor-arg ref="boardDao"/>
</bean>
ApplicationContext context = new ClassPathXmlApplicationContext("com/ssafy/configuration/applicationContext.xml");
BoardService boardService = context.getBean("boardService", BoardServiceImpl.class);
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/db?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="dbUtil" class="com.sample.util.DBUtil"/>
<bean id="boardDao" class="com.sample.board.model.dao.BoardDaoImpl">
<constructor-arg ref="dataSource"/>
<constructor-arg ref="dbUtil"/>
</bean>
<bean id="boardService" class="com.sample.board.model.service.BoardServiceImpl">
<constructor-arg ref="boardDao"/>
</bean>
<bean id="dao" class="com.sample.board.model.dao"/>
<bean id="service" class="com.sample.board.model.service">
<property name="boardDao" ref="dao"/>
</bean>
<bean id="board" class="com.sample.board.model.dao"/>
<property name="myList">
<list>
<value>100</value>
<value type="java.lang.Integer">100</value>
<ref bean="board"/>
</list>
</property>
</bean>