📌 JDBC Template이란?
Spring에서 SQL 기반으로 데이터베이스에 접근할 때, JDBC를 더 편리하고 효율적으로 다룰 수 있게 도와주는 클래스이다.
- spring-jdbc 라이브러리에 포함
- 복잡한 JDBC 반복 코드 제거 (Connection, Statement, ResultSet 등)
- 개발자는 SQL과 파라미터에만 집중하면 됨
- 내부적으로 템플릿 콜백 패턴 사용
🧩 템플릿 콜백 패턴이란?
전체 실행 흐름(템플릿)은 고정하고, 바꿔야 할 부분(콜백)만 외부에서 넘겨받아 실행하는 구조이다.
- 템플릿(Template): 공통된 반복 처리 흐름
- 콜백(Callback): SQL 처리 방식 등 유동적인 부분만 외부에서 주입
- 재사용성, 가독성, 유지보수성 향상
💡 DataSource란?
DB 연결 정보를 담고, 실제 연결(Connection)을 제공하는 객체이다.
왜 필요할까?
- JDBC Template는 생성할 때 DateSource를 인자로 받고 초기화 한다.
- 기존의 DriverManager.getConnection() 방식은 매번 연결을 새로 만들어서 비효율적이다.
- DataSource는 내부적으로 커넥션 풀(Connection Pool)을 사용해서
→ Connection을 재사용하고 속도와 안정성을 개선
@Autowired
DataSource dataSource;
Connection conn = dataSource.getConnection();
//-------------
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
- Spring Boot에서는 application.properties에 DB 설정만 해주면 자동으로 DataSource를 빈으로 등록해준다.
- 보통 HikariCP를 사용한다.
✅ JDBC Template의 장/단점
✔️ 장점
- Spring에 기본 포함 → 복잡한 설정 없이 사용 가능
- JDBC의 반복 코드 제거
- 트랜잭션 연동, 예외 변환 자동 처리
❌ 단점
- 동적 SQL 작성이 어렵다
- 복잡한 조건 분기나 조합은 MyBatis 등 다른 도구가 유리
✅ 주요 사용 메서드 예시
1. queryForObject(): 단일 값 조회
int result = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class);
- queryForObject()는 SQL 쿼리를 실행하고 그 결과를 하나의 객체로 반환한다.
- SELECT COUNT(*) → 결과는 1개의 숫자
- 두 번째 인자: 반환 타입 지정 (Integer)
- result: 예) 4 같은 정수 값 저장
2. update(): INSERT, UPDATE, DELETE
public int addEmployee(int id) {
return jdbcTemplate.update(
"INSERT INTO EMPLOYEE VALUES (?, ?, ?, ?)", id, "Bill", "Gates", "USA");
}
- update() 메서드는 INSERT, UPDATE, DELETE 같이 데이터를 수정하는 SQL을 실행할 때 사용한다.
- INSERT INTO EMPLOYEE VALUES (?, ?, ?, ?) → EMPLOYEE 테이블에 1개 행 추가 (? 파라미터로 순서대로 대입)
- return 값: 변경된 행의 수
3. query(): 리스트 조회
public List<Employee> findAllEmployees() {
return jdbcTemplate.query("SELECT * FROM EMPLOYEE", new EmployeeRowMapper());
}
- SQL 조회용(SELECT) 쿼리를 실행할 때 사용하는 메서드이다.
- SELECT * FROM EMPLOYEE → EMPLOYEE 테이블의 모든 행, 열 조회
- RowMapper 객체: new EmployeeRowMapper()
- RowMapper<>는 테이블에서 한 행씩 객체로 매핑하고 리스트로 쌓는 역할을 한다.
- return 값: 쌓인 List
🔄 RowMapper(EmployeeRowMapper) 예시
public class EmployeeRowMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setFirstName(rs.getString("first_name"));
employee.setLastName(rs.getString("last_name"));
employee.setCountry(rs.getString("country"));
return employee;
}
}
- mapRow(): ResultSet의 한 행을 Employee 객체로 매핑
- rs.get~~~("컬럼명") 으로 DB 값을 가져와서 객체에 넣는다.
✍️ 마무리 요약
JDBC Template은 SQL은 직접 쓰되, 연결/실행/정리 과정을 템플릿으로 대신 처리해주는 도구이다.
단순한 DB 작업이라면 매우 유용하지만 복잡한 쿼리에는 MyBatis처럼 동적 SQL 지원 도구와 함께 쓰는 것이 좋다.
'Spring' 카테고리의 다른 글
| [Spring] AOP & Proxy 란? (3) | 2025.08.01 |
|---|---|
| [Spring] 트랜잭션 전파(Propagation) 정리 (3) | 2025.07.12 |
| [Spring] MVC 정리 (0) | 2025.04.12 |
| [Spring] IoC / DI 정리 (0) | 2025.03.22 |
| [Spring] 빈 / 빈 스코프(Bean / Bean Scope) 정리 (0) | 2025.03.19 |