
그림으로 배우는 스프링 6을 기반으로 내용에 대해 더 학습하고 정리하였습니다.
스프링을 사용하는 애플리케이션에서는 다양한 데이터베이스 접근 방식을 선택할 수 있음.
DB 접근을 용이하게 해주는 것으로 ex)Mybatis, JPA가 있으며, 스프링의 트랜잭션 기능과 연동 가능하며, 데이터 베이스 접근 시 발생하는 예외를 스프링의 예외로 변환 가능
스프링 프로젝트 중 하나이며, RDBMS 뿐 아니라, NoSQL 데이터베이스에도 유용한 기능을 제공, 스프링 데이터가 제공하는 대표적인 기능으로는 Repository의 구상 클래스 자동 생성이 있음.
EX) 스프링 데이터 JPA와 스프링 데이터 MonggoDB가 있음
스프링 프레임워크에서 제공하는 기능. JDBC를 쉽게 사용할 수 있는 방법을 제공
Spring JDBC 코드 보기스프링 JDBC는 스프링 프레임워크가 제공하는 데이터베이스 접근 기능이며, 자바가 표준으로 제공하는 JDBC를 래핑하여 JDBC를 직접 사용할 때 필요한 정형화되고 중복된 처리를 대신해줌.
개발자가 작성하는 Repository 클래스 내에서 스프링 JDBC가 제공하는 API를 활용하여 데이터베이스 접근을 수행
출처:그림으로 배우는 스프링 6 8장
@Repository
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// RowMapper 정의
private final RowMapper<User> userRowMapper = (rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
);
// 모든 사용자 조회
public List<User> findAll() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, userRowMapper);
}
// 사용자 추가
public int save(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getEmail());
}
// 사용자 ID로 조회
public User findById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper, id);
}
}
Java JDBC 코드 보기
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserRepository {
// 데이터베이스 연결 정보
private static final String URL = "jdbc:h2:mem:testdb";
private static final String USER = "sa";
private static final String PASSWORD = "";
// 모든 사용자 조회
public List<User> findAll() {
List<User> users = new ArrayList<>();
String sql = "SELECT * FROM users";
try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
users.add(new User(id, name, email));
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
// 사용자 추가
public int save(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, user.getName());
statement.setString(2, user.getEmail());
return statement.executeUpdate(); // 삽입된 행의 수 반환
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
// 사용자 ID로 조회
public User findById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setInt(1, id);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
String name = resultSet.getString("name");
String email = resultSet.getString("email");
return new User(id, name, email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return null; // 사용자 없음
}
}
Spring JDBC와 JAVA JDBC 차이
Spring JDBC는 생산성과 관리의 용이성을 중시하는 개발에 적합하고, Java JDBC는 프레임워크 독립성과 세부 제어가 필요한 경우에 더 유리
항목 Spring JDBC Java JDBC 사용 방식 Spring Framework의 JdbcTemplate을 사용하여 데이터베이스에 접근순수 Java 표준 JDBC API를 사용 코드 간결성 간결하고 생산성이 높음 장황하며 반복적인 코드가 많음 연결 관리 Spring이 연결 및 리소스 관리를 처리 개발자가 직접 Connection생성 및 닫기를 처리해야 함예외 처리 Spring이 대부분의 예외를 처리하고 사용자 정의 예외로 래핑 예외 처리를 개발자가 명시적으로 작성해야 함 리소스 관리 자동 리소스 해제 ( try-with-resources또는 내부 처리)Connection,PreparedStatement,ResultSet등을 명시적으로 닫아야 함생산성 높은 생산성, 더 적은 코드로 동일한 작업 가능 낮은 생산성, 추가적인 구현이 필요 프레임워크 의존성 Spring Framework에 의존 독립적, 프레임워크에 의존하지 않음 통합성 Spring 트랜잭션 관리 및 기타 기능과 손쉽게 통합 가능 통합 기능 없음 오류 가능성 연결 누수 및 리소스 관리 문제 발생 가능성 낮음 연결 누수 및 리소스 해제 누락 가능성 높음 사용 예 고생산성 애플리케이션 개발 및 Spring 기반 프로젝트 단순한 애플리케이션 또는 프레임워크에 의존하지 않는 개발
다음 포스팅은 Spring JDBC를 활용한 JdbcTemplate 클래스에 대해 학습하겠다.