BackEnd/Spring & Springboot Study

[토비의 스프링] 1.8 XML을 이용한 설정

스프링에선 다양한 방법으로 DI 의존관계 설정정보를 만들 수 있다.

그 중 하나인 XML을 이용한 설정에 대해서 알아보자.

(xml을 이용한 설정은 최근에 많이 사용하지 않는 추세이다.)

 

1. XML 설정

 

xml설정에 대한 기본적인 내용에 대해 다룹니다.

더보기

ConnectionMaker() 전환

  자바 코드 설정정보 XML 설정정보
빈 설정파일 @Configuration <beans>
빈의 이름 @Bean methodName() <bean id="methodName"
빈의 클래스 return new BeanClass(); class="a.b.c... BeanClass">
@Bean ---------------------------------> <bean
public ConnectionMaker
connectionMaker() { -------------------> id="connectionMaker"
    return new DConnectionMaker(); ----> class="springbook...DConnectionMaker" />
}

userDao() 전환

 

<bean id="userDao" class="springbook.dao.UserDao">
	<property name="connectionMaker" ref="connectionMaker"	/>
</bean>

XML의 의존관계 주입 정보

<beans>
	<bean id="connectionMaker" class="springbook.user.dao.DConnectionMaker" />
    <bean id="userDao" class="springbook.user.dao.UserDao">
    	<property name="connectionMaker" ref="connectionMaker" />
    </bean>
</beans>

 

<beans>
	<bean id="myConnectionMaker" class="springbook.user.dao.DConnectionMaker" />
    
    <bean id="userDao" class="springbook.user.dao.UserDao">
    	<property name ="connectionMaker" ref="myConnectionMaker" />
    </bean>
</beans>

같은 인터페이스 타입의 빈을 여러개 정의한 경우

<beans>
    <bean id="localDBConnectionMaker" class="...LocalDBConnectionMaker" />
    <bean id="testDBConnectionMaker" class="...TestDBConnectionMaker" />
    <bean id="productionDBConnectionMaker" class="...ProductionDBConnectionMaker" />
    
    <bean id="userDao" class="springbook.user.dao.Userdao">
    	<property name="connectionMaker" ref="localDBConnectionMaker" />
    </bean>
</beans>
// userDao를 localDBConnectionMaker로 만들겠다는 얘기

 

2. XML을 이용하는 애플리케이션 컨텍스트

 

xml을 이용해 application context를 설정하는 방법에 대해 다룹니다.

더보기

XML 설정정보를 담은 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlls="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="connectionMaker" class="springbook.user.dao.DConnectionMaker" />
    
    <bean id="userDao" class="springbook.user.dao.UserDao" />
    	<property name="connectionMaker" ref=connectionMaker" />
    </bean>
</beans>

작성해둔 xml파일을 GenericXmlApplication을 통해 ApplicationContext로 생성

ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

 

3. DataSource 인터페이스로 변환

 

DataSource 인터페이스 적용

ConnectionMaker는 DB 커넥션을 생성해주는 기능 하나만을 정의한 단순한 인터페이스다.
자바에는 DB 커넥션을 가져오는 오브젝트의 기능을 추상화해 비슷한 용도로 사용할 수 있게 만들어진 DataSource 인터페이스가 이미 존재한다.
DB연결과 풀링 기능을 갖춘 많은 DataSource 구현 클래스가 존재하여 DataSource를 사용하면 된다.

DataSource 인터페이스

package javax.sql

public interface DataSource extends CommonDataSource,Wrapper {
	Connection getConnection() throws SQLException;
	...
}

 

 

DataSource Interface를 활용해 기존 UserDao를 리팩토링하는 방법을 다룹니다.

더보기

DataSource를 사용하는 UserDao

import java.sql.DataSource;

public class UserDao {
	private DataSource dataSource;
    
    public void setDataSource(DataSource dataSource) {
    	this.dataSource = dataSource;
    }
    
    public void add(User user) throws SQLException {
    	Connection c = dataSource.getConnection();
        ...
    }
    ...
}

 

자바 코드 설정 방식

DataSource 타입의 dataSource 빈 정의 메소드

@Bean
public DataSource dataSource() {
	SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
    
    //DB 연결정보를 setter로 넣어준다. 이렇게 하면 오브젝트 레벨에서 DB 연결 방식을 변경가능
    dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
    dataSource.setUrl("jdbc:mysql://localhost/springbook?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false");
    dataSource.setUsername("spring");
    dataSource.setPassword("book");
    
    return dataSource;
}

 

DataSource 타입의 빈을 DI받는 userDao() 빈 정의 메소드

@Bean
public UserDao userDao() {
	UserDao userDao = new UserDao();
    userDao.setDataSource(dataSource());
    return userDao;
}

 

xml로 dataSource 생성하기

<bean id="dataSource"
	class="org.springframework.jdbc.dataSource.SimpleDriverDataSource" />

 

4. 프로퍼티 값의 주입

 

XML을 이용하여 dataSource에 연결정보를 주입하는 내용에 대해 다룹니다.

더보기
// 코드를 통한 DB 연결정보 주입
dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
dataSource.setUrl("jdbc:mysql://localhost/springbook?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false");
dataSource.setUsername("spring");
dataSource.setPassword("book");

==>

// XML을 이용한 DB 연결정보 설정
<property name="driverClass" value="com.mysql.cj.jdbc.Driver" /> // 해당 텍스트를 class object로 인식
<property name="url" value="jdbc:mysql://localhost/springbook?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false" />
<property name="username" value="spring" />
<property name="password" value="book" />

 

DataSource를 적용 완료한 applicationContext.xml

<?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="com.mysql.cj.jdbc.Driver" /> // 해당 텍스트를 class object로 인식
        <property name="url" value="jdbc:mysql://localhost/springbook?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false" />
        <property name="username" value="spring" />
        <property name="password" value="book" />
    </bean>

    <bean id="userDao" class="springbook.user.dao.UserDao">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>