# JdbcContext의 분리
현재 전략패턴의 구조는 다음과 같다.
UserDa의 메소드 : 클라이언트
익명내부클래스 : 개별적 전략
jdbcContextWithStatementStrategy() : 컨텍스트
jdbcContextWithStatementStrategy()메소드는 다른 DAO에서도 사용가능하다.
따라서 이 메소드를 UserDao클래스 밖으로 독립시켜 모든 DAO가 사용할 수 있게 해보자.
# 클래스 분리
JDBC작업 흐름을 분리해서 만든 JdbcContext클래스
package springbook.user.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.sql.DataSource;
public class JdbcContext {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void workWithStatementStrategy(StatementStrategy stmt) throws SQLException {
Connection c = null;
PreparedStatement ps = null;
try {
c = dataSource.getConnection();
ps = stmt.makePreparedStatement(c);
ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
if(ps!=null) {try{ps.close();}catch(SQLException e){}}
if(c!=null) {try{c.close();}catch(SQLException e){}}
}
}
}
JdbcContext를 DI받아서 사용하도록 만든 UserDao
public class UserDao {
// ...
private JdbcContext jdbcContext;
public void setJdbcContext(JdbcContext jdbcContext) {
this.jdbcContext = jdbcContext;
}
//...
public void add(final User user) throws ClassNotFoundException, SQLException {
//...
}
this.jdbcContext.workWithStatementStrategy(st);
public void deleteAll() throws SQLException {
//...
this.jdbcContext.workWithStatementStrategy(st);
}
}
빈 의존관계 변경
test-applicationContext.xml
<bean id="jdbcContext" class="springbook.user.dao.JdbcContext">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userDao" class="springbook.user.dao.UserDao">
<property name="dataSource" ref="dataSource"/>
<property name="jdbcContext" ref="jdbcContext"/>
</bean>
UserDaoTest가 test-applicationContext.xml을 사용할 수 있게 설정한다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="/test-applicationContext.xml")
public class UserDaoTest {
@Autowired
private UserDao dao;
//...생략
@Before
public void setUp() {
// 기존에 직접 UserDao 오브젝트를 생성하던 코드를 제거한다.
//... 생략
}
}
이제 테스트를 수행하면 성공한다.
[3.6] 스프링의 JdbcTemplate (0) | 2020.10.29 |
---|---|
[3.5] 템플릿과 콜백 (0) | 2020.10.29 |
[3.3] JDBC 전략 패턴의 최적화 (0) | 2020.10.28 |
[3.2] 변하는 것과 변하지 않는 것 (0) | 2020.10.28 |
[3.1] 다시 보는 초난감DAO (0) | 2020.10.28 |
댓글 영역