본문 바로가기

Web[웹]/Spring Framework

[Spring] JDBC 와 JdbcTemplate 그리고 커넥션 풀

 

JDBC와 JdbcTemplate

 

JDBC

 

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

 

 

 

JDBC로 데이터 베이스 중  mysql을 이용하는 방법을 한번 보자.

 

/* Insert 쿼리 실행 */
@Repository
public class MemberDao implements IMemberDao {

    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String userid = "scott";
    private String userpw = "1234";

    private Connection conn = null;
    private PreparedStatement pstmt = null;
    private ResultSet rs = null;

    @Override
    public int memberInsert(Member member) {
		
        int result = 0;
		
        try {
            /* 1. 드라이버 로딩 */
            Class.forName(driver);
            
            /* 2. 연결하기 */
            conn = DriverManager.getConnection(url, userid, userpw);
            String sql = "INSERT INTO member (memId, memPw, memMail) values (?,?,?)";
            
            /* 3. SQL 쿼리 준비 */
            pstmt = conn.prepareStatement(sql);
            
            /* 4. 데이터 binding */
            pstmt.setString(1, member.getMemId());
            pstmt.setString(2, member.getMemPw());
            pstmt.setString(3, member.getMemMail());
            
            /* 5. 쿼리 실행 및 결과 처리 */
            result = pstmt.executeUpdate();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                /* 자원해제 */
                if(pstmt != null) pstmt.close();
                if(conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }	
        return result;	
    }
    ....

 

 

 

JdbcTemplate

 

어떠한 데이터베이스와 통신을 하기 위해서 드라이버를 로딩 하고, DB연결, 자원 해제 같은 작업을 매번 동일한 작업을 취했었다. JdbcTemplate은 위 같은 작업은 스프링 프레임워크에 맡기고, 개발자는 쿼리문을 가지고 질의 응답만을 할 수 있다. 즉, JdbcTemplate는 JDBC의 단점을 보완했다고 볼 수 있다.

 

 

데이터베이스 연결과 관련된 정보를 가지고 있는 DataSource 클래스는 스프링 또는 c3p0에서 제공하는 클래스를 이용할 수 있다.

 

JdbcTemplate를 사용하기 위해선 레파지토리 의존 설정(pom.xml) 을 미리 해주어야 한다.

 

<!-- pom.xml -->
<repositories>
    <repository>
        <id>oracle</id>
        <name>ORACLE JDBC Repository</name>
        <url>http://maven.jahia.org/maven2</url>
    </repository>
</repositories>

<!-- DB -->
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.2</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5</version>
</dependency>

 

 

c3p0에서 제공하는 클래스를 이용해서 Insert 구문을 구성해보자.

 

import com.mchange.v2.c3p0.DriverManagerDataSource;

@Repository
public class MemberDao implements IMemberDao {

    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String userid = "scott";
    private String userpw = "1234";
	
    private DriverManagerDataSource dataSource;
	
    private JdbcTemplate template;
    
    public MemberDao() {
        dataSource = new DriverManagerDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(userid);
        dataSource.setPassword(userpw);
		
        template = new JdbcTemplate();
        template.setDataSource(dataSource);
    }
	
    @Override
    public int memberInsert(Member member) {
		
        int result = 0;
		
        String sql = "INSERT INTO member (memId, memPw, memMail) values (?,?,?)";
        result = template.update(sql, member.getMemId(), member.getMemPw(), member.getMemMail());

        return result;
    }
    ....

 

 


커넥션 풀

 

이번에는 데이터베이스 연결을 미리 준비해 놓고 사용하는 커넥션 풀을 알아볼 것이다. 클라이언트의 어떠한 요청이 있을 때 미리 만둘어 둔 것으로 주는 것인데, 서버의 부하를 최소화 해줄 수 있다.

 

c3p0 모듈의 ComboPooledDataSource를 이용해서 만들 수 있다. 이때 반드시 예외처리를 해주어야 한다.

 

import com.mchange.v2.c3p0.ComboPooledDataSource;

@Repository
public class MemberDao implements IMemberDao {

    private String driver = "oracle.jdbc.driver.OracleDriver";
    private String url = "jdbc:oracle:thin:@localhost:1521:xe";
    private String userid = "scott";
    private String userpw = "1234";
	
    private ComboPooledDataSource dataSource;

    private JdbcTemplate template;
	
    public MemberDao() {
    dataSource = new ComboPooledDataSource();
    try {
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(userid);
        dataSource.setPassword(userpw);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
		
        template = new JdbcTemplate();
        template.setDataSource(dataSource);
    }
    ....

 

 

위와 똑같은 동작을 하게 스프링 설정 파일을 통해서도 만들 수 있다. (servlet-context.xml)

 

<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <beans:property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <beans:property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
    <beans:property name="user" value="scott" />
    <beans:property name="password" value="1234" />
    <beans:property name="maxPoolSize" value="200" />
    <beans:property name="checkoutTimeout" value="60000" />
    <beans:property name="maxIdleTime" value="1800" />
    <beans:property name="idleConnectionTestPeriod" value="600" />
</beans:bean>
@Repository
public class MemberDao implements IMemberDao {

    private JdbcTemplate template;
	
    @Autowired
    public MemberDao(ComboPooledDataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }

 

마지막으로 빈 객체를 자바를 통해 만들고자 하면 다음과 같이 만들 수도 있다.

 

@Configuration
public class DBConfig {

    @Bean
    public ComboPooledDataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
		
        dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
        dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUser("scott");
        dataSource.setPassword("1234");
        dataSource.setMaxPoolSize(200);
        dataSource.setCheckoutTimeout(60000);
        dataSource.setMaxIdleTime(1800);
        dataSource.setIdleConnectionTestPeriod(600);
		
        return dataSource;

    }
}