Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240121 [스프링-프레임워크] - 25강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240121 [스프링-프레임워크] - 25강 필기

Jelly-fish 2024. 1. 22. 00:25

25강 - 커넥션 풀

데이터베이스 연결을 미리 준비해 놓고 사용하는 방법에 대해서 살펴본다.

25-1 c3p0 모듈의 ComboPooledDataSource
25-2 스프링 설정파일을 이용한 DataSource 설정

 

25-1 c3p0 모듈의 ComboPooledDataSource

 

`com.mchange.v2.c3p0.ComboPooledDataSource`

dataSource = new DriverManagerDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(userid);
dataSource.setPassword(userpw);

 

▶ driver, url, 계정 ID, PW 를 set → `DataSource` 이용.


25-2 스프링 설정파일을 이용한 DataSource 설정

<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="tiger" />
    <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>

 

`DataSource`

 

데이터베이스 연결과 관련된 정보들 (driver, url, userId, password) 을 갖고 있는 객체.

     Spring 또는 c3p0 모듈에서 제공해 주는 것을 사용할 수 있다.

 

이외에도... `ComboPooledDataSource` 에서 DataSource를 얻어낼 수 있다!

 


ComboPooledDataSource 를 사용할 때, 기존 방식과의 차이점

`DriverManagerDataSource`를 이용할 때는 예외 처리를 하지 않아도 됐지만,

※ `ComboPooledDataSource` 를 이용하여 `DataSource`를 관리할 때는 반드시 예외 처리를 해 주어야 한다.

 

Ⅰ. `ComboPooledDataSource` 를 사용하되, 의존 주입(DI)을 하지 않았을 경우

 

MemberDao.java - `ComboPooledDataSource` 를 사용하여, 예외 처리한 부분.
public MemberDao()
{
    dataSource = new ComboPooledDataSource();
    try
    {
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(userid);
        dataSource.setPassword(userpw);

    } catch (PropertyVetoException e)	//-- 예외 처리 check!!!
    {
        e.printStackTrace();
    }

    template = new JdbcTemplate();
    template.setDataSource(dataSource);

}

MemberDao.java - 상단 import 구문과 생성자 부분
package com.ho.lec24.member.dao;

import java.beans.PropertyVetoException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.ho.lec24.member.Member;
import com.mchange.v3.c3p0.ComboPoolDataSource;

@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 = "tiger";
    
    private ComboPoolDataSource 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)	//-- 예외 처리 check!!!
        {
            e.printStackTrace();
        }

        template = new JdbcTemplate();
        template.setDataSource(dataSource);

    }
    
    ....
    
}

Ⅱ. `ComboPooledDataSource` 를 사용하면서, 의존 주입(DI)을 사용했을 경우

 

① 스프링 설정 파일 (servlet-context.xml)에 `ComboPooledDataSource` 객체 생성

servlet-context.xml (=dispatcher-servlet.xml)
<!-- ComboPooledDataSource 에 대한 객체 생성. -->
<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="tiger" />
    <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>

 

② DAO 에서, 의존 주입 `@Autowired`을 통해 의존객체 `ComboPooledDataSource`  주입받기.

MemberDao.java
@Repository
public class MemberDao implements IMemberDao
{
    private JdbcTemplate template;
    
    // 의존객체 자동주입!
    @Autowired
    public MemberDao(ComboPooledDataSource dataSource)
    {
    	this.template = new JdbcTemplate(dataSource);
    }
    
    ....
    
}

 

▶ 의존객체 자동 주입 `@Autowired` 을 통해, 스프링 설정파일(servlet-context.xml)에 구성해 둔

     `ComboPooledDataSource` 객체가 `MemberDao()` 생성자에 매개변수로 자동 주입 된다!

 


 

Ⅲ. `ComboPooledDataSource` 를 사용하면서, Config 파일(.java 파일)을 사용했을 경우.

 

① 스프링 설정파일의 Bean 객체를 대신할 Configuration 파일을 만든다.

DBConfig.java
package com.ho.lec24.config;

import java.beans.PropertyVetoException;

@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("tiger");
        dataSource.setMaxPoolSize(200);
        dataSource.setCheckoutTimeout(60000);
        dataSource.setMaxIdletime(1800);
        dataSource.setIdleConnectionTestPeriod(600);
        
        return dataSource;
    }
	
}

② DAO 에서, 의존 주입 `@Autowired`을 통해 의존객체 `ComboPooledDataSource`  주입받기.

MemberDao.java
@Repository
public class MemberDao implements IMemberDao
{
    private JdbcTemplate template;
    
    // 의존객체 자동주입!
    @Autowired
    public MemberDao(ComboPooledDataSource dataSource)
    {
    	this.template = new JdbcTemplate(dataSource);
    }
    
    ....
    
}

실행 결과 스크린샷

출처 : inflearn [스프링-프레임워크(renew)] - 25강