Spring Framework의 JdbcTemplate은 데이터베이스 작업을 단순화하고 반복적인 코드를 제거하여 SQL 중심의 데이터 액세스를 쉽게 해주는 클래스입니다. JDBC API를 캡슐화하여 사용자가 직접 연결(Connection) 객체를 생성하거나 자원을 정리할 필요가 없습니다.
queryForObject
String result = jdbcTemplate.queryForObject("SELECT NOW() AS NOW", String.class);
queryForList
List<Map<String, Object>> 형식으로 반환.Map 형태로 표현되며, 열 이름이 키(Key)입니다.List<Map<String, Object>> results = jdbcTemplate.queryForList("SELECT * FROM dept");
query
BeanPropertyRowMapper를 사용하여 SQL 결과를 자바 객체로 변환.List<DeptTO> results = jdbcTemplate.query(
"SELECT * FROM dept",
new BeanPropertyRowMapper<>(DeptTO.class)
);
JdbcTemplate 객체는 Spring에서 DataSource를 주입받아 생성됩니다. Spring Boot에서는 기본적으로 HikariCP 풀링을 사용하여 효율적인 데이터베이스 연결을 제공합니다.
// JdbcDAO
@Repository
public class JdbcDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public JdbcDAO() {
System.out.println("JdbcDAO 생성자 호출");
System.out.println("JdbcDAO 생성자: " + jdbcTemplate); // null
}
public void selectType() {
System.out.println("selectType(): " + jdbcTemplate); // org.springframework.jdbc.vore.JdbcTemplate@205ac58c
String result = jdbcTemplate.queryForObject("select now() as now", String.class);
System.out.println("현재 시간: " + result);
}
}
// 메인
@SpringBootApplication
public class Jdbc02Application implements CommandLineRunner {
@Autowired
private JdbcDAO dao;
public static void main(String[] args) {
SpringApplication.run(Jdbc02Application.class, args);
}
@Override
public void run(String... args) throws Exception {
dao.selectType();
}
}
JdbcDAO 객체를 생성하며 생성자를 호출.jdbcTemplate은 아직 초기화되지 않았기 때문에 null 출력.@Autowired 등을 통해 jdbcTemplate을 주입.jdbcTemplate을 사용할 수 있으므로, 참조값이 출력됨.JdbcTemplate을 사용하여 데이터베이스에서 현재 시간을 조회하고 출력합니다.
// JdbcDAO
@Repository
public class JdbcDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public JdbcDAO() {
System.out.println("JdbcDAO 생성자 호출");
System.out.println("JdbcDAO 생성자: " + jdbcTemplate); // null
}
public void selectType() {
System.out.println("selectType(): " + jdbcTemplate); // org.springframework.jdbc.vore.JdbcTemplate@205ac58c
String result = jdbcTemplate.queryForObject("select now() as now", String.class);
System.out.println("현재 시간: " + result);
}
}
// 메인
@SpringBootApplication
public class Jdbc02Application implements CommandLineRunner {
@Autowired
private JdbcDAO dao;
public static void main(String[] args) {
SpringApplication.run(Jdbc02Application.class, args);
}
@Override
public void run(String... args) throws Exception {
dao.selectType();
}
}
queryForList를 사용하여 여러 데이터베이스 이름을 출력합니다.
List<Map<String, Object>> results = jdbcTemplate.queryForList("SHOW DATABASES");
for (Map<String, Object> map : results) {
System.out.println(map.get("Database")); // 각 데이터베이스 이름 출력
}
DeptDAO로 데이터베이스 작업DeptTO를 사용하지 않고 Map으로 처리// DeptDAO
@Repository
public class DeptDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public void listDept() {
List<Map<String, Object>> results = jdbcTemplate.queryForList("select * from dept");
for (Map<String, Object> result : results) {
System.out.println(result.get("deptno" + "/" + result.get("dname") + "/" + result.get("loc")));
}
}
}
// 실행
@SpringBootApplication
public class Jdbc02Application implements CommandLineRunner {
@Autowired
private DeptDAO dao;
public static void main(String[] args) {
SpringApplication.run(Jdbc02Application.class, args);
}
@Override
public void run(String... args) throws Exception {
dao.listDept();
}
}
DeptTO를 사용하여 객체로 변환BeanPropertyRowMapper를 활용하여 결과를 객체로 매핑.// DeptTO
@Setter
@ToString
public class DeptTO {
private String deptno;
private String dname;
private String loc;
}
// DeptDAO
@Repository
public class DeptDAO {
**@Autowired
private JdbcTemplate jdbcTemplate;
public void listDept() {
ArrayList<DeptTO> results = (ArrayList<DeptTO>) jdbcTemplate
.query("select * from dept",
new BeanPropertyRowMapper<>(DeptTO.class));**
for (DeptTO to : results) {
System.out.println(to);
}
}
}
public void listDept(String deptno) {
String sql = "SELECT * FROM dept WHERE deptno = ?";
List<DeptTO> results = jdbcTemplate.query(
sql,
new BeanPropertyRowMapper<>(DeptTO.class),
deptno
);
for (DeptTO to : results) {
System.out.println(to);
}
}
@Getter
@Setter
public class ZipcodeTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
}
@Repository
public class ZipcodeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<ZipcodeTO> searchZipcode(String strDong) {
String sql = "SELECT zipcode, sido, gugun, dong, ri, bunji FROM zipcode WHERE dong LIKE ?";
return jdbcTemplate.query(
sql,
new BeanPropertyRowMapper<>(ZipcodeTO.class),
strDong + "%"
);
}
}
@SpringBootApplication
public class Zipcode01Application implements CommandLineRunner {
@Autowired
private ZipcodeDAO dao;
public static void main(String[] args) {
SpringApplication.run(Zipcode01Application.class, args);
}
@Override
public void run(String... args) throws Exception {
List<ZipcodeTO> lists = dao.searchZipcode(args[0]);
for (ZipcodeTO to : lists) {
System.out.printf("[%s] %s %s %s %s %s %n",
to.getZipcode(), to.getSido(), to.getGugun(), to.getDong(), to.getRi(), to.getBunji());
}
}
}
JdbcTemplate 개념queryForObject, queryForList, query를 사용하여 단일 값, 다중 값, 객체로 결과 처리 가능.JdbcTemplate은 Spring이 관리하는 데이터 소스를 통해 동작하며, @Autowired로 의존성 주입됨.Map과 객체 변환(BeanPropertyRowMapper)을 통해 데이터를 유연하게 처리 가능.