JDBC(Java Database Connectivity)는 자바가 여러 DB와 통신하기 위한 표준 API이고, Hibernate·MyBatis·스프링 JDBC 모두 그 위에 있다. JdbcTemplate은 스프링이 JDBC의 반복 작업(연결 열고 닫기, 예외 변환, 결과 순회)을 대신해 주는 클래스다.
순수 JDBC가 번거로운 이유
드라이버 로드 → Connection 얻기 → Statement 준비 → 실행
→ ResultSet 순회 → 예외 처리 → ResultSet·Statement·Connection 닫기매 쿼리마다 이 보일러플레이트를 쓰고, 체크 예외(checked exception)를 직접 처리하고, 닫는 것을 깜빡하면 연결이 샌다. SQL에 DB 방언(dialect)이 섞이면(MySQL LIMIT vs Oracle FETCH FIRST) DB를 바꿀 때 전부 고쳐야 한다.
JdbcTemplate이 맡는 것
개발자는 SQL, 파라미터, 행 하나를 객체로 바꾸는 방법만 정한다. 연결 관리, 실행, 순회, 예외 변환(DataAccessException), 트랜잭션 참여, 자원 정리는 스프링이 한다.
public List<Contact> findOpen() {
return jdbc.query("SELECT id, name, status FROM contact WHERE status = ?",
(rs, rowNum) -> new Contact(rs.getLong("id"), rs.getString("name"), rs.getString("status")),
"OPEN");
}
int updated = named.update(
"UPDATE contact SET status = :status WHERE id = :id",
Map.of("status", "CLOSED", "id", id));- RowMapper: ResultSet의 한 행을 객체로 바꾸는 함수. 컬럼명과 필드명이 같으면
BeanPropertyRowMapper나DataClassRowMapper를 쓴다 - NamedParameterJdbcTemplate:
?대신:이름자리표시자. 파라미터가 많을 때 순서 실수를 막는다 - 파라미터 바인딩은 SQL 주입(SQL injection)을 막는다. 문자열 결합으로 SQL을 만들지 않는다
- 스레드 안전해서 빈 하나를 여러 DAO(Data Access Object)가 공유한다. 스프링 부트는
DataSource와 함께 자동으로 만든다 - 스프링 6.1부터는 플루언트 API인
JdbcClient도 있다(2026 기준)
H2
자바로 만든 인메모리 DB라 테스트·PoC(Proof of Concept)에 쓴다. 스프링 부트는 클래스패스에 H2가 있으면 자동으로 연결하고, schema.sql·data.sql로 시작 시 테이블과 데이터를 만든다. 웹 콘솔(/h2-console)도 켤 수 있다. 재시작하면 데이터가 사라지고 방언이 운영 DB와 달라, 운영과 같은 DB를 컨테이너로 띄우는 테스트(Testcontainers)가 더 믿을 만하다.
SQL을 직접 쓰지 않고 객체로 다루는 다음 단계는 Spring Data 리포지터리와 쿼리 메서드와 JPA다. 오라클 저장 프로시저 호출은 Oracle PL/SQL을 본다.
출처: Spring Framework 문서: JdbcTemplate · NamedParameterJdbcTemplate · JdbcClient