[Spring]그림으로 배우는 스프링 6 - 8장 스프링 JDBC : 데이터베이스 접근 (1)

Gaeng·2024년 11월 17일

[Spring] 공부

목록 보기
7/21
post-thumbnail

그림으로 배우는 스프링 6을 기반으로 내용에 대해 더 학습하고 정리하였습니다.

스프링 JDBC

스프링을 사용하는 애플리케이션에서는 다양한 데이터베이스 접근 방식을 선택할 수 있음.

8.1 스프링과 데이터베이스 접근

#다른 라이브러리와의 연동

DB 접근을 용이하게 해주는 것으로 ex)Mybatis, JPA가 있으며, 스프링의 트랜잭션 기능과 연동 가능하며, 데이터 베이스 접근 시 발생하는 예외를 스프링의 예외로 변환 가능

#스프링 데이터(Spring Data)

스프링 프로젝트 중 하나이며, RDBMS 뿐 아니라, NoSQL 데이터베이스에도 유용한 기능을 제공, 스프링 데이터가 제공하는 대표적인 기능으로는 Repository의 구상 클래스 자동 생성이 있음.
EX) 스프링 데이터 JPA와 스프링 데이터 MonggoDB가 있음
스프링프로젝트

#스프링 JDBC

스프링 프레임워크에서 제공하는 기능. JDBC를 쉽게 사용할 수 있는 방법을 제공

8.2 스프링 JDBC?

스프링 JDBC는 스프링 프레임워크가 제공하는 데이터베이스 접근 기능이며, 자바가 표준으로 제공하는 JDBC를 래핑하여 JDBC를 직접 사용할 때 필요한 정형화되고 중복된 처리를 대신해줌.
개발자가 작성하는 Repository 클래스 내에서 스프링 JDBC가 제공하는 API를 활용하여 데이터베이스 접근을 수행

출처:그림으로 배우는 스프링 6 8장
Spring JDBC 코드 보기
@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 JDBCJava JDBC
사용 방식Spring Framework의 JdbcTemplate을 사용하여 데이터베이스에 접근순수 Java 표준 JDBC API를 사용
코드 간결성간결하고 생산성이 높음장황하며 반복적인 코드가 많음
연결 관리Spring이 연결 및 리소스 관리를 처리개발자가 직접 Connection 생성 및 닫기를 처리해야 함
예외 처리Spring이 대부분의 예외를 처리하고 사용자 정의 예외로 래핑예외 처리를 개발자가 명시적으로 작성해야 함
리소스 관리자동 리소스 해제 (try-with-resources 또는 내부 처리)Connection, PreparedStatement, ResultSet 등을 명시적으로 닫아야 함
생산성높은 생산성, 더 적은 코드로 동일한 작업 가능낮은 생산성, 추가적인 구현이 필요
프레임워크 의존성Spring Framework에 의존독립적, 프레임워크에 의존하지 않음
통합성Spring 트랜잭션 관리 및 기타 기능과 손쉽게 통합 가능통합 기능 없음
오류 가능성연결 누수 및 리소스 관리 문제 발생 가능성 낮음연결 누수 및 리소스 해제 누락 가능성 높음
사용 예고생산성 애플리케이션 개발 및 Spring 기반 프로젝트단순한 애플리케이션 또는 프레임워크에 의존하지 않는 개발

다음 포스팅은 Spring JDBC를 활용한 JdbcTemplate 클래스에 대해 학습하겠다.

profile
문제를 해결하면서 나온 문제를 기록하는 노트

0개의 댓글