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;
}
}
'Web[웹] > Spring Framework' 카테고리의 다른 글
[Spring] 컨트롤러에서 뷰를 분기하는 리다이렉트 & 인터셉트 (0) | 2019.12.05 |
---|---|
[Spring] 클라이언트와 서버간 연결을 유지하는 세션 & 쿠키 (0) | 2019.12.04 |
[Spring] Controller 객체 구현 : MVC 프로젝트 (2) (0) | 2019.12.03 |
[Spring] Service & Dao 객체 구현 : MVC 프로젝트 (1) (0) | 2019.11.28 |
[Spring] MVC 웹 프로그래밍 설계 모델 (With. STS) (0) | 2019.11.22 |