JDBC Template
JdbcTemplate은 스프링 프레임워크에서 제공하는 JDBC(Java Database Connectivity) 작업을 간소화하고 개발자가 더 효율적으로 데이터베이스와 상호작용할 수 있도록 도와주는 클래스입니다. JdbcTemplate은 스프링의 JDBC 추상화 계층 중 하나로, JDBC를 사용하여 데이터베이스와 상호작용하는 코드를 더 간결하게 작성할 수 있도록 지원합니다.
기존 JDBC 코드 작업 → Template 패턴
유사하거나 반복되는 알고리즘을 캡슐화하여 재사용하는 패턴입니다. 코딩 순서가 정해져있는(정형화된) 기술에서 특히 유용하게 활용됩니다.
※ JDBC, 트랜잭션, Mybatis, JPA, ...
pom.xml에 Spring JDBC, DBCP 의존성 추가
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
...
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
...
</project>
pom.xml
DB연결
DB연결은 conn을 DB로부터 확보하는 것에서부터 시작합니다. JDBC Template 클래스는 DataSource 객체를 통해 conn을 확보 및 관리합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<context:component-scan base-package="com.spring.biz" />
<!-- DataSource 객체 생성 -->
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="JUN" />
<property name="password" value="1234" />
</bean>
<!-- JdbcTemplate에 DI할 객체 생성 -->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<aop:aspectj-autoproxy />
</beans>
applicationContext.xml
DataSource 객체를 생성해야하며 스프링 컨테이너가 생성하도록 해야하기 때문에 applicationContext.xml에 정의합니다. 위 코드에서 DataSource 객체 bean 등록 시 setter 의존 주입을 함께 설정하였습니다.
DAO 클래스 멤버변수 등록
package com.spring.biz.member;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository("memberDAO")
public class MemberDAO2 {
@Autowired
private JdbcTemplate jdbcTemplate;
private final String insert="INSERT INTO MEMBER VALUES(?,?,?,'USER')";
private final String selectOne="SELECT * FROM MEMBER WHERE MID=? AND MPW=?"; // getOne
private final String selectAll="SELECT * FROM MEMBER"; // getAll
private final String update="UPDATE MEMBER SET MPW=?,NAME=? WHERE MID=?";
private final String delete="DELETE FROM MEMBER WHERE MID=?";
public MemberVO selectOne(MemberVO mVO) {
System.out.println("MemberDAO2 로그 selectOne() 메서드");
Object[] args = { mVO.getMid(), mVO.getMpw() };
return jdbcTemplate.queryForObject(selectOne, args , new MemberRowMapper());
}
public List<MemberVO> selectAll(MemberVO mVO) {
System.out.println("MemberDAO2 로그 selectAll() 메서드");
return jdbcTemplate.query(selectAll, new MemberRowMapper());
}
public boolean insert(MemberVO mVO) {
System.out.println("MemberDAO2 로그 insert() 메서드");
int rs=jdbcTemplate.update(insert,mVO.getMid(),mVO.getMpw(),mVO.getName());
if(rs<=0) {
return false;
}
return true;
}
public boolean update(MemberVO mVO) {
System.out.println("MemberDAO2 로그 update() 메서드");
int rs=jdbcTemplate.update(update,mVO.getMpw(),mVO.getName(),mVO.getMid());
if(rs<=0) {
return false;
}
return true;
}
public boolean delete(MemberVO mVO) {
System.out.println("MemberDAO2 로그 delete() 메서드");
int rs=jdbcTemplate.update(delete,mVO.getMid());
if(rs<=0) {
return false;
}
return true;
}
}
class MemberRowMapper implements RowMapper<MemberVO> {
@Override
public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
MemberVO data=new MemberVO();
data.setMid(rs.getString("MID"));
data.setMpw(rs.getString("MPW"));
data.setName(rs.getString("NAME"));
data.setRole(rs.getString("ROLE"));
return data;
}
}
DAO 클래스의 멤버변수로 JdbcTemplate을 등록하였습니다. JdbcTemplate의 의존 주입은 applicationContext.xml에서 dataSource객체를 setter 의존 주입하였습니다.
JDBC Template 메서드
Spring의 JdbcTemplate은 데이터베이스 작업을 수행하기 위한 다양한 메서드를 제공합니다. 메서드들은 SQL 쿼리 실행, 파라미터 바인딩, 결과 데이터 매핑, 예외 처리 등 다양한 작업을 수행할 수 있도록 도와줍니다.
- query(String sql, RowMapper<T> rowMapper) : 여러 결과 값을 조회하며, 각 결과를 RowMapper를 사용하여 매핑합니다.
- queryForObject(String sql, RowMapper<T> rowMapper) : 단일 결과 값을 조회합니다.
- queryForObject(String sql, Class<T> requiredType) : 단일 결과 값을 조회하며, 결과를 지정한 클래스 타입으로 매핑합니다.
- queryForObject(String sql, Class<T> requiredType, Object... args) : 파라미터를 포함하는 SQL 쿼리를 실행하고 단일 결과 값을 반환합니다.
- update(String sql): INSERT, UPDATE, DELETE 등의 SQL을 실행하고 영향을 받은 행의 수를 반환합니다.
- update(String sql, Object... args): SQL에 파라미터를 바인딩하여 실행하고 영향을 받은 행의 수를 반환합니다.
GitHub
https://github.com/Qkrwnsgus0522/Spring