스프링은 이전의 DaoFactory 같은 자바 클래스를 설정 정보로 이용하는거 외에도 XML을 이용해서 설정 정보를 제공할 수 있다.
자바에서의 @Configuration 을 <Beans.>
자바에서의 @Bean 을 <Bean.> 로만 바꾸면 Xml 에서 애플리케이션 컨텍스트에 Di정보를 제공할 수 있다.
- 빈 설정파일 : @Configuration -> <beans.>
- 빈 이름 : @Bean methodName() -> <bean. id ="methodName"
- 빈의 클래스 return new BeanClass(); -> class="a,b,c...BeanClass">
<bean id="connectionMaker" class="full_package_path.DconnectionMaker">
userDao()에는 Di정보의 세 가지 요소가 들어있따.
그 중하나는 수정자 메소드를 사용해 의존관계를 주입해주는 부분이다.
수정자 메소드를 사용하는 이유는 XML로 의존관계 정보를 만들 때 편리하기 때문이다
자바빈의 관례를 따라 수정자 메소드는 프로퍼티가 된다.
프로퍼티 이름은 메서드 이름에서 set을 제외한 나머지 부분을 사용한다.
<property.>
name 어트리뷰트 : 프로퍼티의이름
ref 어트리뷰트 : 수정자 메소드를 통해 주입해줄 오브젝트 빈 이름.
userDao.setConnectionMaker(connectionMaker());
- <.property name="connectionMaker" ref="connectionMaker"/ >
완성된 DaoFactory 로부터 Xml로의 변환의 코드이다
<.beans>
<.bean id="connectonMaker" class="com.example.tobyspringboot3.user.dao.DConnectionMaker"/>
<.bean id="userDao" class="com.example.tobyspringboot3.user.dao.UserDao">
<.property name="connectionMaker" ref="connectionMaker"/>
<./bean>
<./beans>
XML에서 빈의 의존관계 정보를 이용하는 IoC/Di 작업에는 GenericXmlApplicationContext를 사용한다. (생성자 파라미터로는 XMl 클래스 패스를 지정해주면 된다.)
자바에는 DB 커넥션을 가져오는 오브젝트의 기능을 추상화해서 비슷한 용도로 사용할 수 있게 만들어진 DataSource 인터페이스가 존재한다
단 DataSource는 getConnection() 이라는 커넥션을 가져오는 기능 외에도 여러 개의 메소드가 존재하기에 인터페이스를 직접 구현하는 것은 무담스럽다.
일반적으로 DataSource을 구현하는 일은 없고, 이미 DataSource 구현 클래스를 사용한다.
DataSource 인터페이스와 구현클래스를 사용할 수 있도록 Userdao 를 수정한다.
in UserDao
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
DataSource의 구현 클래스 중 테스트 한경에서 간단히 사용할 수 있는 SimpleDriverDataSource 를 사용해서 DI를 재구성할 것이다.
in UserDaoFactory
@Bean
public DataSource dataSource(){
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(com.mysql.jdbc.Driver.class);
dataSource.setUrl("jdbc:mysql://localhost:3306/toby_stringboot");
dataSource.setUsername("아이디");
dataSource.setPassword("비밀번호");
return dataSource;
}
@Bean
public UserDao userDao(){
UserDao userDao = new UserDao();
userDao.setDataSource(dataSource());
return userDao;
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/> // 스트링 값이 클래스 형태로 자동으로 변경된다 , 스트링 뿐 아니라 Integer 등 ..
<property name="url" value="jdbc:mysql://localhost:3306/toby_stringboot"/>
<property name="username" value="아이디"/>
<property name="password" value="비밀번호"/>
</bean>
텍스트나 단순 오브젝트 등을 수정자 메소드에 넣ㅇ는 것을 '값의 주입'이라고 말한다.
다르 빈의 오브젝트의 레퍼런스가 아닌 단순 값을 주입하는 경우에는 value 애트리뷰트를 쓴다.