JdbcTemplate (Spring Framework 6.2.0 API)
Execute a query for a result object, given static SQL. Uses a JDBC Statement, not a PreparedStatement. If you want to execute a static query with a PreparedStatement, use the overloaded JdbcOperations.queryForObject(String, Class, Object...) method with nu
docs.spring.io
- JdbcTemplate은 스프링 프레임워크에서 제공하는 JDBC API의 고도화된 도구로, 데이터베이스 작업을 간소화하고 반복적인 코드를 제거하며, SQL 실행 및 데이터 매핑을 더 효율적으로 수행할 수 있도록 설계되었습니다.
1. JdbcTemplate의 주요 특징
- 반복 코드 제거:
- JDBC의 Connection, PreparedStatement, ResultSet 관리 및 예외 처리를 자동화합니다.
- 간단한 API 제공:
- SQL 실행을 위한 간단하고 직관적인 메서드(query, update, execute)를 제공합니다.
- 예외 처리 간소화:
- 체크 예외를 런타임 예외인 DataAccessException으로 변환하여 처리합니다.
- 트랜잭션 통합:
- 스프링의 트랜잭션 관리와 완벽히 통합되어 안전한 데이터 작업을 보장합니다.
2. JdbcTemplate의 동작 흐름
- 데이터베이스 연결 설정 (DataSource를 통해 연결 관리).
- SQL 실행 (SELECT, INSERT, UPDATE, DELETE).
- 결과 처리 (ResultSet 데이터를 매핑하여 객체로 변환).
- 자원 해제 (Connection, Statement, ResultSet은 내부적으로 관리).
3.JDBCTemplate 설정 및 사용
3.1 Gradle 의존성 추가
build.gradle 파일에 spring-boot-starter-jdbc와 데이터베이스 드라이버를 추가합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mariadb.jdbc:mariadb-java-client:3.1.2'
}
3.2 데이터베이스 설정
application.properties 파일에 데이터베이스 연결 정보를 추가합니다.
spring.datasource.url=jdbc:mariadb://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
3.3 JdbcTemplate를 사용한 DAO 작성(예제)
3.3.1 테이블 매핑 클래스 작성
users 테이블과 매핑될 클래스는 다음과 같습니다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private int id;
private String name;
private String email;
}
3.3.2 DAO 클래스 작성
JdbcTemplate을 사용해 SQL 작업을 수행하는 DAO 클래스를 작성합니다.
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 테이블 생성
public void createTable() {
String sql = "CREATE TABLE IF NOT EXISTS users (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"name VARCHAR(50), " +
"email VARCHAR(100))";
jdbcTemplate.execute(sql);
}
// 데이터 삽입
public int insertUser(String name, String email) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
return jdbcTemplate.update(sql, name, email);
}
// 모든 사용자 조회
public List<User> findAllUsers() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
});
}
// ID로 사용자 조회
public User findUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
});
}
// 사용자 삭제
public void deleteUser(int id) {
String sql = "DELETE FROM users WHERE id = ?";
jdbcTemplate.update(sql, id);
}
}
3.4 DAO 실행 테스트
CommandLineRunner를 사용하여 JdbcTemplate 기능을 테스트합니다.
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class DatabaseTestRunner implements CommandLineRunner {
private final UserRepository userRepository;
public DatabaseTestRunner(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void run(String... args) throws Exception {
userRepository.createTable();
System.out.println("테이블 생성 완료");
userRepository.insertUser("홍길동", "hong@test.com");
userRepository.insertUser("이몽룡", "lee@test.com");
System.out.println("데이터 삽입 완료");
userRepository.findAllUsers().forEach(user ->
System.out.println("사용자: " + user.getName() + " - " + user.getEmail())
);
User user = userRepository.findUserById(1);
System.out.println("ID 1인 사용자: " + user.getName() + " - " + user.getEmail());
userRepository.deleteUser(1);
System.out.println("ID 1 사용자 삭제 완료");
}
}
4. 주요 메서드 정리⭐️
메서드 설명
| 메서드 | 설명 |
| execute(String sql) | SQL 실행 (DDL이나 단순 쿼리). |
| update(String sql, Object...) | INSERT, UPDATE, DELETE 같은 DML 작업. |
| query(String sql, RowMapper) | SELECT 쿼리를 실행하고 결과를 객체 리스트로 반환. |
| queryForObject(String sql, Class) | 단일 값을 반환하는 SELECT 쿼리. |
| batchUpdate(String sql, List<Object[]>) | 여러 개의 데이터를 대량으로 처리. |
5. 장점과 단점
장점
- 반복 제거: JDBC의 번거로운 작업을 간소화.
- 예외 처리: 체크 예외를 런타임 예외(DataAccessException)로 변환.
- 유연성: SQL을 직접 작성하므로 제어가 용이.
- 트랜잭션 지원: 스프링의 트랜잭션 관리와 통합.
단점
- SQL 직접 작성 필요: 쿼리를 직접 작성해야 하므로 복잡한 매핑 작업은 코드가 길어질 수 있음.
- ORM 대안 부족: 복잡한 엔터티 관계를 다루기에는 JPA(ORM)보다 비효율적.
6. 요약
- JdbcTemplate은 스프링에서 제공하는 강력한 JDBC API 도구로, SQL 기반 데이터베이스 작업을 간소화합니다.
- 반복적인 자원 관리 및 예외 처리를 제거하고, 코드 간결성을 유지하며 SQL을 직접 제어할 수 있습니다.
- 단순한 데이터 액세스 작업이나 SQL 중심의 작업에서 매우 유용하며, ORM 도구(JPA 등)와도 혼용하여 사용할 수 있습니다.
'Backend > Spring' 카테고리의 다른 글
| MyBatis (0) | 2024.11.19 |
|---|---|
| RowMapper & BeanPropertyRowMapper (0) | 2024.11.19 |
| SpringBoot : DataSource (0) | 2024.11.19 |
| SpringBoot : Logging (0) | 2024.11.19 |
| Spring Application 이벤트 리스너 (0) | 2024.11.19 |