상세 컨텐츠

본문 제목

[3.4] 컨텍스트와 DI

토비의스프링

by kwanghyup 2020. 10. 29. 01:18

본문

# 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

관련글 더보기

댓글 영역