PHpullh

JAVA · 파일/IO

JDBC 심화

JDBC로 데이터베이스를 안전하고 효율적으로 다루는 방법입니다.

파일/IO중급JDBCPreparedStatementSQL데이터베이스

핵심 설명

JDBC로 데이터베이스를 안전하고 효율적으로 다루는 방법입니다.

Java code

import java.sql.*;

public class JDBCAdvanced {
    public static void main(String[] args) {
        String url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";

        try (Connection conn = DriverManager.getConnection(url);
             Statement stmt = conn.createStatement()) {

            // 테이블 생성
            stmt.execute(
                "CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100))");

            // PreparedStatement — SQL 인젝션 방지
            String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
            try (PreparedStatement ps = conn.prepareStatement(sql)) {
                ps.setInt(1, 1);
                ps.setString(2, "홍길동");
                ps.setString(3, "hong@test.com");
                ps.executeUpdate();

                // 배치 삽입
                for (int i = 2; i <= 5; i++) {
                    ps.setInt(1, i);
                    ps.setString(2, "사용자" + i);
                    ps.setString(3, "user" + i + "@test.com");
                    ps.addBatch();
                }
                int[] counts = ps.executeBatch();
            }

            // 조회
            try (ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
                while (rs.next()) {
                    System.out.printf("ID:%d, 이름:%s, 이메일:%s%n",
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getString("email"));
                }
            }

        } catch (SQLException e) {
            System.err.println("SQL 에러: " + e.getMessage());
        }
    }
}

학습 팁

반드시 PreparedStatement를 사용하세요. 문자열 연결로 SQL을 만들면 SQL 인젝션 공격에 노출됩니다.

주의할 점

Connection, Statement, ResultSet을 닫지 않으면 커넥션 풀이 고갈됩니다. try-with-resources를 사용하세요.

자주 묻는 질문

JDBC 심화란 무엇인가요?

JDBC로 데이터베이스를 안전하고 효율적으로 다루는 방법입니다.

JDBC 심화 학습 시 주의할 점은 무엇인가요?

Connection , Statement , ResultSet 을 닫지 않으면 커넥션 풀이 고갈됩니다. try-with-resources를 사용하세요.