Java에서 데이터베이스 연동: INSERT, UPDATE, DELETE, SELECT

고승민·2025년 3월 19일
1

DB

목록 보기
4/4

오늘 Java에서 데이터베이스를 연결하고 SQL을 실행하는 과정을 실습했다. 단순히 SQL을 실행하는 것이 아니라, JDBC의 기본적인 흐름과 각 메서드의 역할을 명확히 이해하는 것이 중요하다는 점을 배울 수 있었다.

이 글에서는 INSERT, UPDATE, DELETE 같은 데이터 변경 작업과 SELECT 조회 작업의 흐름을 정리하고, 실제 코드 예제를 통해 보다 쉽게 개념을 이해할 수 있도록 한다. 🦖


1. 데이터 변경 작업 (INSERT, UPDATE, DELETE)

데이터 변경 작업(INSERT, UPDATE, DELETE)executeUpdate() 를 사용하며, 결과로 영향을 받은 행(row) 개수를 반환한다.

🥸 작업 흐름

  1. Connection 획득DriverManager.getConnection() 또는 DataSource를 사용하여 DB 연결

  2. PreparedStatement 획득connection.prepareStatement(SQL문) 실행

  3. ?에 값 바인딩preparedStatement.setXXX(인덱스, 값); 사용

  4. SQL 전송 및 실행executeUpdate() 실행하여 DB 반영

  5. 자원 해제PreparedStatementConnection 닫기 (try-with-resources 사용 권장)

📌 코드 예제: INSERT 실행하기

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class InsertExample {
    public static void main(String[] args) {
        // 데이터베이스 연결 정보 설정
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = "password";

        // 실행할 SQL 쿼리문 작성 (?는 나중에 값 바인딩)
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";

        try (
            // 데이터베이스 연결 생성
            Connection conn = DriverManager.getConnection(url, user, password);
            // SQL 실행을 위한 PreparedStatement 객체 생성
            PreparedStatement pstmt = conn.prepareStatement(sql)
        ) {
            // 첫 번째 ? 자리에 값 바인딩 (이름 설정)
            pstmt.setString(1, "고승민");
            // 두 번째 ? 자리에 값 바인딩 (이메일 설정)
            pstmt.setString(2, "KSM@naver.com");
            
            // SQL 실행 및 변경된 행 개수 반환
            int affectedRows = pstmt.executeUpdate();
            System.out.println("추가된 행 개수: " + affectedRows);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

executeUpdate()변경된 행 개수를 반환하므로 이를 활용하여 성공 여부를 확인할 수 있다.


2. 데이터 조회 작업 (SELECT)

SELECT 작업은 executeQuery()를 사용하며, 결과를 ResultSet 객체로 반환받는다.
이후 while(rs.next())를 사용하여 데이터를 하나씩 가져와야 한다.

🥸 작업 흐름

  1. Connection 획득 → DB 연결

  2. PreparedStatement 획득connection.prepareStatement(SQL문) 실행

  3. ?에 값 바인딩preparedStatement.setXXX(인덱스, 값); 사용

  4. SQL 전송 및 실행executeQuery() 실행하여
    ResultSet 반환

  5. ResultSet 처리while (rs.next())를 이용하여 데이터 반복 조회

  6. 자원 해제ResultSet, PreparedStatement, Connection 닫기

  7. 조회 결과 반환 → 필요하면 리스트에 담아 반환

📌 코드 예제: SELECT 실행하기

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class SelectExample {
    public static void main(String[] args) {
        // 데이터베이스 연결 정보 설정
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = "password";

        // 실행할 SQL 쿼리문 작성
        String sql = "SELECT id, name, email FROM users WHERE name = ?";
        
        try (
            Connection conn = DriverManager.getConnection(url, user, password);
            PreparedStatement pstmt = conn.prepareStatement(sql)
        ) {
            // 검색할 이름 설정
            pstmt.setString(1, "고승민");
            
            // SQL 실행 및 결과(ResultSet) 반환
            ResultSet rs = pstmt.executeQuery();
            
            // 결과를 저장할 리스트 생성
            List<String> users = new ArrayList<>();
            
            // 조회된 데이터를 한 줄씩 읽기
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                users.add(id + ", " + name + ", " + email);
            }
            
            System.out.println("조회된 유저 목록: " + users);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

executeQuery()ResultSet을 반환하며, while(rs.next())를 사용하여 데이터를 하나씩 처리한다.


🦖 정리 및 권장사항

데이터 변경 작업(INSERT, UPDATE, DELETE)executeUpdate()를 사용하며, 변경된 행 개수를 반환한다.

조회 작업(SELECT)executeQuery()를 사용하며, ResultSet을 반환하여 반복문을 통해 데이터를 처리해야 한다.

SQL 실행 후에는 반드시 자원을 닫아야 하며, try-with-resources 문법을 사용하면 자동으로 자원 해제가 가능하다.

SQL Injection 방지를 위해 PreparedStatement를 활용하여 ? 바인딩을 하는 것이 필수적이다.

데이터를 리스트로 변환하여 관리하면 가독성이 좋아지고, 유지보수하기 편하다.

profile
인생을 날로 먹고 싶었지만 날로 먹지 못한다는 것을 깨달은..🦖

0개의 댓글