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&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&serverTimezone=UTC
[2.4] 스프링 테스트 적용 (0) | 2020.10.28 |
---|---|
[2.3] 개발자를 위한 테스팅 프레임워크 Junit (0) | 2020.10.28 |
[1.7] 의존관계 주입 (0) | 2020.10.27 |
[1.6] 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2020.10.27 |
[1.5]Spring IoC (0) | 2020.10.27 |
댓글 영역