
JdbcTemplate은 Spring Framework에서 제공하는 JDBC 작업을 간소화하는 핵심 클래스입니다. 데이터베이스 작업 중 반복적이고 번거로운 작업(예: 연결 관리, 예외 처리, 자원 해제)을 자동화하여 개발자가 SQL 작성과 비즈니스 로직에 집중할 수 있도록 도와주는 클래스
JdbcTemplate 주요 기능
- SQL 실행
SQL 쿼리를 작성하고 실행하여 데이터베이스와 상호작용.- 결과 매핑
데이터베이스 쿼리 결과를 Java 객체로 변환하는 기능 제공.- 자원 관리 자동화
연결과 리소스를 자동으로 열고 닫아줌(개발자가 직접 관리하지 않아도 됨).- 예외 처리
JDBC 예외를 Spring의 데이터 접근 예외로 변환(DataAccessException).
JdbcTemplate 객체 준비
@Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/your_database"); dataSource.setUsername("your_username"); dataSource.setPassword("your_password"); return dataSource; }JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

- 하나의 컬럼을 가져오는 경우
queryForObject를 사용하여 특정 컬럼의 값을 가져옵니다.String title = jdbcTemplate.queryForObject( "SELECT title FROM trainning WHERE id = ?", String.class, "t01");
- 설명:
첫번째 인수는 ? / 두번째 인수는 반환 할 객체의 타입 / 세번째 인수는 ?에 인수에 맞는 값을 지정(세번 째 이후부터는 가변 -> ? 갯수만큼 파라미터 값을 지정.
- 여러 개의 파라미터 지정
String title = jdbcTemplate.queryForObject( "SELECT title FROM trainning WHERE id = ? AND title = ?", String.class, "t01", "비즈니스");
- 날짜형식으로 가져오기
LocalDateTime date = jdbcTemplate.queryForObject( "SELECT date_result FROM trainning WHERE id = ?", LocalDateTime.class, "t01");
- 여러 레코드에서 한 컬럼 가져오기
List<Integer> reversed = jdbcTemplate.queryForList( "SELECT reserved FROM trainning", Integer.class);
- 레코드를 Map 객체로 변환
queryForMap을 사용하여 레코드를 키-값 쌍으로 가져옵니다.Map<String, Object> map = jdbcTemplate.queryForMap( "SELECT * FROM training WHERE id = ?", "t01");
- 설명:
- SQL 쿼리: 특정 ID에 해당하는 전체 레코드를 가져옴.
queryForMap: 결과를Map으로 반환하며, 키는 컬럼 이름이고 값은 해당 컬럼의 데이터.
- 여러 레코드를 Map으로 가져오기
List<MAP<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM training");- 설명
- 리스트의 형태로 Map의 값을 불러올 수 있음
Entity 객체로 변환하여 가져오기query 또는 queryForObject를 사용해 결과를 사용자 정의 객체로 매핑.
public YourEntity getRecordAsEntity(int id) {
String sql = "SELECT id, name, age FROM your_table WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) ->
new YourEntity(
rs.getInt("id"),
rs.getString("name"),
rs.getInt("age")
)
);
}
queryForObject: 한 개의 레코드만 매핑.RowMapper를 사용하여 결과를 YourEntity 객체로 변환.public class YourEntity {
private int id;
private String name;
private int age;
public YourEntity(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter & Setter 생략
}
갱신 계열 처리는 Insert(추가), Update(변경), Delete(삭제)로 나뉨
Insert
jdbcTemplate.update("INSERT NITO training VALUES (?,?,?,?,?,?)", "t03", "Spring 교육", StartDateTime, endDateTime, 0, 8);
UPDATE
int count = jdbcTemplate.update( "UPDATE training SET title=?, start_date_time=?,end_date_time=?, reserved=?, capacity = ? WHERE id = ?、 "Spring 교육",startDateTime, endDateTime, 0, 8, "t03");
DELETE
int count = jdbcTemplate.update("DELETE FROM training WHERE id=?", "t03");
JdbcTemplate 객체는 하나의 객체를 여러 곳에서 재사용 가능.
애플리케이션이 DI 컨테이너를 사용하는 경우 DI 컨테이너를 JdbcTemplate 객체를 Bean으로 등록하는 것이 좋음.(스프링 부트에서는 자동 정의 임으로 정의할 필요가 없음)
@Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); }@Bean 메소드를 정의하고 반환 값으로 JdbcTemplate 객체를 반환하고, DataSOurce로 객체를 넘겨줌.
그리고 JdbcTemplate를 사용하고 싶은 곳에 DI를 하면 됨.//예시코드 @Repository public class JdbcTrainingRepository implements TrainingRepository { private final JdbcTemplate jdbcTemplate; public JdbcTrainingRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public Training selectById(String id) { return jdbcTemplate.queryForObject...); } }
요약
JdbcTemplate은 데이터베이스 작업을 간편하게 도와주는 클래스이고, Spring에서는 이를 DI를 통해 관리
@Bean을 사용하여 JdbcTemplate을 Bean으로 등록하고, 필요한 클래스에서는 DI를 통해 이를 주입받아 사용
이를 통해 코드의 재사용성과 관리 편의성이 높아.