Spring 빈 설정 : XML로 의존성 주입하기

롱롱·2022년 10월 30일
0

spring

목록 보기
2/4
post-thumbnail

1. 의존성 주입이란?

객체 간의 의존관계 주입을 외부에서 수행하는 것

Dependency Injection

DI를 통해 시스템에 있는 객체들이 생성될 때
해당 객체를 조정하는 외부 개체가 의존관계를 부여합니다.

IoC(Inversion of Control, 제어의 역행)의 기술 중 하나입니다.

IoC는 의존관계 제어권의 흐름이 개발자에서 프레임워크로 이동하였다는 것을 의미합니다.
프레임워크가 의존관계를 컨테이너화시켜 생명주기를 관리합니다.

DI를 적용함으로 인해서 강한 결합이 느슨한 결합이 됩니다.

느슨한 결합(loose coupling)이란,
클래스 간 결합력이 약하게 만들었다는 뜻입니다.
보통 그 방법으로 인터페이스를 사용하는데,
객체는 인터페이스에 의한 의존 관계만을 알고 있고, 이 의존 관계가 외부 파일을 통해 수정할 수 있는 상태로 바뀌게 됩니다.

Spring은 DI를 도와주는 DI 컨테이너 역할을 지원합니다.


2. XML이란?

태그로 데이터를 감싸는 형태의 마크업 언어

eXtensible Markup Language

데이터를 전달하는 데에 포커스를 맞춘 언어로, 형태는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<value>사과</value>

Spring에서 XML 형태로 bean의 설정 메타 정보를 기술하면,
태그를 통해 세밀한 제어가 가능해집니다.


3. XML을 통해 의존성 주입하기 (순서)


순서는 다음과 같습니다.

1. applicationContext.xml 문서를 통해 Spring 자원 설정

<?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">

2. 1의 문서에 빈 객체 생성 및 주입 (applicationContext.xml)

<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>

3. java file에서 빈 객체 얻기 (Controller java 파일)

ApplicationContext context = new ClassPathXmlApplicationContext("com/ssafy/configuration/applicationContext.xml");	
BoardService boardService = context.getBean("boardService", BoardServiceImpl.class);

4. 객체 또는 값을 주입받음 - 생성자를 통해 주입받는 경우 (아래 예시는 reference data 주입, applicationContext.xml)

<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&amp;useUniCode=yes&amp;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>

5. 객체 또는 값을 주입받음 - property를 통해 주입받는 경우 (아래 예시는 reference data 주입, applicationContext.xml)

<bean id="dao" class="com.sample.board.model.dao"/>
<bean id="service" class="com.sample.board.model.service">
	<property name="boardDao" ref="dao"/>
</bean>

6. <constructor-arg>나 <property>의 하위 태그로 Collection 계열 주입 (아래 예시는 list 주입, applicationContext.xml)

<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>

0개의 댓글