[Day 27 | Spring] JDBC API - JDBC Template

y♡ding·2024년 11월 19일

데브코스 TIL - Spring

목록 보기
15/46

SQL Databases :: Spring Boot
Class JdbcTemplate

  • JdbcTemplate은 스프링 프레임워크에서 제공하는 JDBC API의 고도화된 도구로, 데이터베이스 작업을 간소화하고 반복적인 코드를 제거하며, SQL 실행 및 데이터 매핑을 더 효율적으로 수행할 수 있도록 설계되었습니다.

1. JdbcTemplate의 주요 특징

  1. 반복 코드 제거:
    • JDBC의 Connection, PreparedStatement, ResultSet 관리 및 예외 처리를 자동화합니다.
  2. 간단한 API 제공:
    • SQL 실행을 위한 간단하고 직관적인 메서드(query, update, execute)를 제공합니다.
  3. 예외 처리 간소화:
    • 체크 예외를 런타임 예외인 DataAccessException으로 변환하여 처리합니다.
  4. 트랜잭션 통합:
    • 스프링의 트랜잭션 관리와 완벽히 통합되어 안전한 데이터 작업을 보장합니다.

2. JdbcTemplate의 동작 흐름

  1. 데이터베이스 연결 설정 (DataSource를 통해 연결 관리).
  2. SQL 실행 (SELECT, INSERT, UPDATE, DELETE).
  3. 결과 처리 (ResultSet 데이터를 매핑하여 객체로 변환).
  4. 자원 해제 (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 테이블과 매핑될 클래스는 다음과 같습니다.

@Getter
@Setter
public class User {
    private int id;
    private String name;
    private String email;

3.3.2 DAO 클래스 작성

JdbcTemplate을 사용해 SQL 작업을 수행하는 DAO 클래스를 작성합니다.

@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 기능을 테스트합니다.

@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. 장점과 단점

장점

  1. 반복 제거: JDBC의 번거로운 작업을 간소화.
  2. 예외 처리: 체크 예외를 런타임 예외(DataAccessException)로 변환.
  3. 유연성: SQL을 직접 작성하므로 제어가 용이.
  4. 트랜잭션 지원: 스프링의 트랜잭션 관리와 통합.

단점

  1. SQL 직접 작성 필요: 쿼리를 직접 작성해야 하므로 복잡한 매핑 작업은 코드가 길어질 수 있음.
  2. ORM 대안 부족: 복잡한 엔터티 관계를 다루기에는 JPA(ORM)보다 비효율적.

6. 요약

  • JdbcTemplate은 스프링에서 제공하는 강력한 JDBC API 도구로, SQL 기반 데이터베이스 작업을 간소화합니다.
  • 반복적인 자원 관리 및 예외 처리를 제거하고, 코드 간결성을 유지하며 SQL을 직접 제어할 수 있습니다.
  • 단순한 데이터 액세스 작업이나 SQL 중심의 작업에서 매우 유용하며, ORM 도구(JPA 등)와도 혼용하여 사용할 수 있습니다.

0개의 댓글