프밍일기

DI(Dependency Injection, 의존성주입) 본문

Spring

DI(Dependency Injection, 의존성주입)

스에조theLED 2017. 1. 28. 21:58

■ DI(Dependency Injection, 의존성 주입)

    - 빈(Bean)이 외부로부터 의존관계가 성립되는 객체를 인자로 넘겨받아 처리하는것.

    - 의존관계 설정을 컴파일 시점이 아니 실행 시점에 결정한다.

    - 의존관계 설정이 실행 시점에 결정되기 위해서는 넘겨받는 인자가 특정 클래스(Class)가 아닌 인터페이스(Interface) 이어야 한다.

    - 메소드가 사용하는 인자를 인터페이스로 설정 함으로써 인터페이스를 구현하기만 하면 다양한 object를 받아서 일관된 동작을 할 수 있도록 정의한다.


■ 어노테이션(Annotation)을 이용한 DI

[ ConnectionMaker.java ]
public interface ConnectionMaker {
	
	public Connection makeConnection() throws ClassNotFoundException, SQLException;
	
}
[ UserDao.java ]
public class UserDao {
	
	private ConnectionMaker connectionMaker;
	
	public UserDao(ConnectionMaker connectionMaker) {
		this.connectionMaker = connectionMaker;
	}
}
[ DaoFactory.java ]
@Configuration
public class DaoFactory {
	
	@Bean
	public UserDao userDao() {
		return new UserDao(connectionMaker());
	}
	
	@Bean
	public ConnectionMaker connectionMaker() {
		return new NConnectionMaker();
	}
}

    - UserDao.java 에서 생성자가 ConnectionMaker 라는 인터페이스형을 인자로 설정함으로써 이 인터페이스를 구현한 어떤 object라도 넘어올 수 있으며 어떤 object인지는 실행시에 결정됨.

    - ConnectionMaker 인터페이스를 인자로 넘겨받아 사용하는 userDao() 메소드도 빈(Bean)이어야 DI가 성립한다.


■ XML을 이용한 DI

<?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-3.0.xsd">
	<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="org.mariadb.jdbc.Driver"></property>
		<property name="url" value="jdbc:mariadb://localhost:3306/dynaboard"></property>
		<property name="username" value="user_name"></property>
		<property name="password" value="user_password"></property></bean>
	<bean id="userDao" class="com.fannell.board.dao.UserDao">
		<property name="dataSource" ref="dataSource"></property></bean>
</beans>

    # beans : 빈 설정 root. 어노테이션의 @Configuration에 해당.

    # bean : 빈 설정 항목. 어노테이션의 @Bean에 해당

        - id : 메소드명

        - class : 주입되는 구현클래스

    # 7) property : 리턴될 빈의 속성값 설정. 여기서는 SimpleDriverDataSource 객체의 멤버

        - name : set을 뺀 메소드명

        - value : set메소드에 넘겨질 값

    # 12) property : 7라인 property와 동일.

        - ref : 주입된 다른 빈(Bean) 객체. 여기서는 6라인의 객체

    # 7라인에서 dirverClass 수정자는 원래 java.lang.Class 타입을 받는다. 스프링은 설정된 값을 메소드의 파라미터 타입을 참고하여 적절한 형태로 변환해줌.


■ Constructor Injection

스프링 컨테이너는 XML 설정 파일에 등록된 클래스의 객체 생성시 기본적으로 매개변수가 없는 Default 생성자를 호출한다. 매개변수를 이용하는 생성자를 호출하려고 할때는 constructor-arg 항목으로 선언한다.

	<bean id="tv" class="com.fannell.site.polymorphism.SamsungTV">
		<constructor-arg ref="apple"></constructor-arg>
		<constructor-arg value="2700000"></constructor-arg>
	</bean>

- ref : 참조형(object type) 파라미터 일때

- value : 기본형(primitive type) 파라미터 일때






'Spring' 카테고리의 다른 글

Spring과 MyBatis 연동 예제  (2) 2017.04.07
AOP - Annotation  (0) 2017.03.24
AOP - XML  (0) 2017.03.24
스프링 컨테이너 <beans> 설정 유의사항  (0) 2017.03.03
IoC(Inversion of Control, 제어역전)  (0) 2017.01.28
Comments