Spring Boot & MySQL

1.4. JDBC를 이용한 데이터 처리

backend 따라쟁이 2024. 12. 22. 23:03

Spring Boot에서는 JdbcTemplate을 사용하여 MySQL 데이터베이스와 쉽게 상호작용할 수 있습니다. 이 섹션에서는 JDBC를 이용한 데이터 삽입, 조회, 수정, 삭제 작업을 단계별로 설명합니다. 이를 통해 애플리케이션에서 데이터를 효율적으로 처리할 수 있는 방법을 배우게 됩니다.


4.1 JdbcTemplate란?

JdbcTemplate은 Spring Framework에서 제공하는 유틸리티 클래스입니다. JDBC(Java Database Connectivity)를 간소화하여 다음과 같은 작업을 쉽게 처리할 수 있습니다:

  1. 데이터베이스 연결 및 쿼리 실행.
  2. PreparedStatement를 사용한 안전한 SQL 실행.
  3. SQL 실행 후 결과를 객체로 매핑.

JdbcTemplate의 주요 특징

  • JDBC의 반복적인 작업(예: 커넥션 관리, 쿼리 실행, 예외 처리)을 자동화.
  • 간결하고 가독성 높은 코드 작성 가능.
  • SQL Injection 방지를 위한 PreparedStatement 지원.

4.2 JdbcTemplate 설정

JdbcTemplate을 사용하려면 먼저 Spring Boot에 이를 설정해야 합니다.

설정 코드 예제

@Configuration 클래스를 사용하여 JdbcTemplate을 Bean으로 등록합니다:

 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("cohttp://m.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/my_database");
        dataSource.setUsername("app_user");
        dataSource.setPassword("password123");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

4.3 데이터 삽입 (INSERT)

데이터를 테이블에 삽입하는 방법입니다. 사용자 정보를 저장한다고 가정해보겠습니다.

예제 코드

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {

    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public int addUser(String name, String email) {
        String sql = "INSERT INTO user (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, name, email);
    }
}
 

설명

  • jdbcTemplate.update: SQL 쿼리를 실행하고, 영향을 받은 행의 개수를 반환합니다.
  • ?는 PreparedStatement를 사용하여 SQL Injection 방지에 도움을 줍니다.

4.4 데이터 조회 (SELECT)

데이터를 조회하여 결과를 객체로 매핑하는 방법입니다.

예제 코드

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 List<User> getAllUsers() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                user.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
                return user;
            }
        });
    }
}
 

설명

  • jdbcTemplate.query: SQL 쿼리를 실행하고 결과를 리스트로 반환합니다.
  • RowMapper: 데이터베이스의 각 행을 Java 객체로 매핑합니다.

4.5 데이터 수정 (UPDATE)

테이블의 데이터를 수정하는 방법입니다.

예제 코드

public int updateUser(Long id, String name, String email) {
    String sql = "UPDATE user SET name = ?, email = ? WHERE id = ?";
    return jdbcTemplate.update(sql, name, email, id);
}
 

설명

  • 업데이트할 데이터와 조건을 PreparedStatement를 통해 전달합니다.
  • 반환값은 영향을 받은 행의 개수입니다.

4.6 데이터 삭제 (DELETE)

테이블에서 데이터를 삭제하는 방법입니다.

예제 코드

public int deleteUser(Long id) {
    String sql = "DELETE FROM user WHERE id = ?";
    return jdbcTemplate.update(sql, id);
}
 

설명

  • 특정 ID의 데이터를 삭제하며, PreparedStatement로 안전한 SQL 실행이 가능합니다.

4.7 예외 처리

SQL 실행 중 오류가 발생하면 Spring은 DataAccessException을 던집니다. 이를 처리하려면 try-catch 블록 또는 전역 예외 처리기를 사용할 수 있습니다.

예제 코드

public int addUserSafe(String name, String email) {
    try {
        String sql = "INSERT INTO user (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, name, email);
    } catch (DataAccessException e) {
        System.err.println("Database error: " + e.getMessage());
        return 0; // 실패 시 0 반환
    }
}

4.8 전체 예제

아래는 CRUD 작업을 포함한 완전한 코드입니다.

UserRepository.java

 
@Repository
public class UserRepository {

    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public int addUser(String name, String email) {
        String sql = "INSERT INTO user (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, name, email);
    }

    public List<User> getAllUsers() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            user.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
            return user;
        });
    }

    public int updateUser(Long id, String name, String email) {
        String sql = "UPDATE user SET name = ?, email = ? WHERE id = ?";
        return jdbcTemplate.update(sql, name, email, id);
    }

    public int deleteUser(Long id) {
        String sql = "DELETE FROM user WHERE id = ?";
        return jdbcTemplate.update(sql, id);
    }
}

 


결론

이 섹션에서는 JDBC와 MySQL을 사용하여 데이터를 삽입, 조회, 수정, 삭제하는 방법을 배웠습니다. Spring의 JdbcTemplate을 활용하면 데이터베이스 작업을 간소화하고 안전하게 처리할 수 있습니다. 다음 섹션에서는 REST API와 연동하여 이 작업들을 수행하는 방법을 알아보겠습니다.

'Spring Boot & MySQL' 카테고리의 다른 글

1.6. 데이터 타입 변환과 오류 처리  (0) 2024.12.25
1.5. REST API와 연동  (1) 2024.12.22
1.3. MySQL 데이터베이스 설정  (0) 2024.12.22
1.2. 개발 환경 설정  (0) 2024.12.22
1.1. 개요  (1) 2024.12.22