Spring

[Spring] JDBC Template 정리

tudamoa 2025. 5. 31. 12:58

📌 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