상세 컨텐츠

본문 제목

[1.8] XML을 이용한 설정

토비의스프링

by kwanghyup 2020. 10. 27. 22:16

본문

1. Xml 설정을 이용하는 애플리케이션 컨텍스트 

 

애플리케이션 컨텍스트가 DaoFactory 대신 

Xml 설정정보를 활용하도록 만들어보자.

 

Xml설정 파일을 저장할 폴더를 만든다.

src/main/resources

(maven project 구조에서 이 곳이 classthpass이다.)

이 폴더 안에 applicationContext.xml을 생성하자.

 

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.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설정파일을 읽기 위해서는

AnnotationConfigApplicationContext 대신

GenericXmlApplicationContext 이용한다.

 

UserDaoTest를 다음과 같이 수정한다.

ApplicationContext context =
			new GenericXmlApplicationContext("/applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);

 

생성자에는 applicationContext.xml의 클래스패스를 넣는다.

다음과 같이 루트(/)는 생략할 수도 있다.

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

 

DB를 초기화하고 테스트 결과를 확인하자.

 


2. DataSource 인터페이스로 변환

 

지금까지 DB커넥션을 생성해주는 기능을 가진

ConnectionMaker 인터페이스를 직접 정의하고 사용했다.

 

그런데 자바에는 DB 커넥션을 가져오는 오브젝트의 기능을 추상화해서

비슷한 용도로 사용할 수 있게 만들어진 DataSource라는 인터페이스가 존재한다.

 

DataSource인터페이스와 다양한 DataSource 구현클래스를 사용할 수 있도록

UserDao를 리펙토링 해보자.

 

UserDao

package springbook.user.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import springbook.user.domain.User;

 
public class UserDao {
	
	//private ConnectionMaker connectionMaker; 삭제 
	private DataSource dataSource;
	  
	public UserDao(){};
	
	// 생성자의 파라미터 및 내용을 변경한다.  
	public UserDao(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	//세터메소드도 새로 정의한다.
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}


	public void add(User user) throws ClassNotFoundException, SQLException {
		 
		// 변경 
		Connection c = dataSource.getConnection();  
		
		String sql = "insert into users values(?,?,?)";
		PreparedStatement ps = c.prepareStatement(sql);
		ps.setString(1, user.getId());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());
		
		ps.executeUpdate();
		
		ps.close();
		c.close();
	}
	
	public User get(String id) throws ClassNotFoundException, SQLException {
		
		// 변경 
		Connection c = dataSource.getConnection(); 
		
		String sql = "select * from users where id = ?";
		PreparedStatement ps = c.prepareStatement(sql);
		ps.setString(1,id);
		
		ResultSet rs = ps.executeQuery(); 
		rs.next(); 
		User user = new User(); 
		user.setId(rs.getString("id"));
		user.setName(rs.getString("name"));
		user.setPassword(rs.getString("password"));
		
		rs.close();
		ps.close();
		c.close();
		
		return user;
	}	

}

 

다음은 DataSource 구현클래스가 필요하다.

 

스프링이 제공하는 DataSource클래스 중에 

테스트 환경에서 간단히 사용할 수 있는

SimpleDriverDataSource라는 것이 있다.

 

이 클래스를 이용하기 위해 

다음의 의존관계를 추가한다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

 

 

먼저 DaoFactory설정방식을 이용해보자. 

DaoFactory클래스를 아래와 같이 변경한다.

package springbook.user.dao;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;


@Configuration
public class DaoFactory {
	
	@Bean
	public DataSource dataSource() {
		SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
		dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
		dataSource.setUrl("jdbc:mysql://localhost:3306/tobiespring?characterEncoding=utf8&serverTimezone=UTC");
		dataSource.setUsername("root");
		dataSource.setPassword("12345678");
		return dataSource;
	}
	
	@Bean
	public UserDao userDao() { 
		UserDao userDao = new UserDao();
		userDao.setDataSource(dataSource());
		return userDao;
	}	 
}

 

이제 UserDaoTest를 실행하여 테스트 해보자.

 

이번에는 Xml설정 방식으로 해보자. 

 

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.xsd">

	<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://localhost:3306/tobiespring?characterEncoding=utf8&amp;serverTimezone=UTC"/>
		<property name="username" value="root"/>
		<property name="password" value="12345678"/>
	</bean>
	<bean id="userDao" class="springbook.user.dao.UserDao">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
</beans>

 

DaoFactory에서 dirverClass를 복사해올때 

dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);

com.mysql.cj.jdbc.Driver 까지만 복사한다.

 

DaoFactory에서는 Url코드는 다음과 같았다.

즉 자바코드에서는 다음과 같다.

jdbc:mysql://localhost:3306/tobiespring?characterEncoding=utf8&serverTimezone=UTC

 

 

xml설정파일에서는 &연산자를 를 다음과 같이 써야한다.

jdbc:mysql://localhost:3306/tobiespring?characterEncoding=utf8&amp;serverTimezone=UTC

 

 

 

 

관련글 더보기

댓글 영역