본문 바로가기
자바 (JAVA)

📚JAVA 12강: JDBC (Java Database Connectivity)

by demianpark127 2025. 1. 3.
SMALL

📚 12강: JDBC (Java Database Connectivity)


🚀 1. JDBC란?

  • **JDBC (Java Database Connectivity)**는 자바에서 데이터베이스와 연결하기 위한 API입니다.
  • 다양한 데이터베이스(MySQL, Oracle, PostgreSQL 등)와 상호작용할 수 있습니다.
  • 주요 목적:
    • 데이터베이스 연결
    • SQL 쿼리 실행
    • 결과 처리

🚀 2. JDBC 아키텍처

📌 2.1 주요 구성 요소

  1. DriverManager:
    • 데이터베이스 드라이버를 관리하고 연결을 담당합니다.
  2. Connection:
    • 데이터베이스와의 연결을 나타냅니다.
  3. Statement:
    • SQL 쿼리를 실행합니다.
  4. ResultSet:
    • SQL 쿼리 결과를 저장하고 처리합니다.
  5. SQLException:
    • JDBC 작업 중 발생한 오류를 처리합니다.

🚀 3. JDBC 연결 단계

📌 3.1 JDBC 프로그래밍 단계

  1. JDBC 드라이버 로드
  2. 데이터베이스 연결
  3. SQL 쿼리 실행
  4. 결과 처리
  5. 자원 해제

🚀 4. JDBC 예제

4.1 데이터베이스 연결 (MySQL 예제)

  1. MySQL 드라이버 추가:
    • mysql-connector-java 라이브러리를 프로젝트에 추가해야 합니다.
  2. 기본 연결 예제:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCConnectionExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb"; // 데이터베이스 URL
        String user = "root"; // 사용자 이름
        String password = "1234"; // 비밀번호

        try {
            // 1. 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            // 2. 데이터베이스 연결
            Connection connection = DriverManager.getConnection(url, user, password);
            System.out.println("데이터베이스에 성공적으로 연결되었습니다!");

            // 연결 종료
            connection.close();
        } catch (ClassNotFoundException e) {
            System.out.println("JDBC 드라이버를 찾을 수 없습니다: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("데이터베이스 연결 실패: " + e.getMessage());
        }
    }
}

📌 설명:

  • DriverManager.getConnection()을 사용하여 데이터베이스에 연결합니다.
  • Class.forName()으로 JDBC 드라이버를 로드합니다.

4.2 데이터 삽입 (INSERT 예제)

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

public class JDBCInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb";
        String user = "root";
        String password = "1234";

        String sql = "INSERT INTO users (name, age) VALUES (?, ?)";

        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

            preparedStatement.setString(1, "Alice");
            preparedStatement.setInt(2, 25);

            int rowsAffected = preparedStatement.executeUpdate();
            System.out.println(rowsAffected + "개의 행이 삽입되었습니다.");

        } catch (SQLException e) {
            System.out.println("데이터 삽입 실패: " + e.getMessage());
        }
    }
}

📌 설명:

  • PreparedStatement를 사용하여 SQL 쿼리를 안전하게 실행합니다.
  • executeUpdate()는 변경된 행의 수를 반환합니다.

4.3 데이터 조회 (SELECT 예제)

 

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

public class JDBCSelectExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb";
        String user = "root";
        String password = "1234";

        String sql = "SELECT * FROM users";

        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(sql);
             ResultSet resultSet = preparedStatement.executeQuery()) {

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                System.out.println("ID: " + id + ", 이름: " + name + ", 나이: " + age);
            }

        } catch (SQLException e) {
            System.out.println("데이터 조회 실패: " + e.getMessage());
        }
    }
}

📌 설명:

  • xecuteQuery()는 ResultSet 객체를 반환합니다.
  • ResultSet을 사용하여 결과를 반복하며 출력합니다. 

 

 4.4 데이터 수정 (UPDATE 예제)

String sql = "UPDATE users SET age = ? WHERE name = ?";
preparedStatement.setInt(1, 30);
preparedStatement.setString(2, "Alice");
int rowsAffected = preparedStatement.executeUpdate();
System.out.println(rowsAffected + "개의 행이 수정되었습니다.");

4.5 데이터 삭제 (DELETE 예제)

String sql = "DELETE FROM users WHERE name = ?";
preparedStatement.setString(1, "Alice");
int rowsAffected = preparedStatement.executeUpdate();
System.out.println(rowsAffected + "개의 행이 삭제되었습니다.");

🚀 5. JDBC 트랜잭션

  • 트랜잭션(Transaction): 여러 SQL 쿼리를 하나의 작업 단위로 묶어서 실행.
  • commit: 모든 작업 완료.
  • rollback: 오류 발생 시 작업 취소.
connection.setAutoCommit(false); // 자동 커밋 비활성화

try {
    preparedStatement1.executeUpdate();
    preparedStatement2.executeUpdate();
    connection.commit(); // 성공 시 커밋
} catch (SQLException e) {
    connection.rollback(); // 실패 시 롤백
}

🚀 6. 실습 과제

  1. 데이터베이스 연결:
    • JDBC를 사용해 MySQL 데이터베이스에 연결하세요.
  2. CRUD 연습:
    • users 테이블을 만들어 데이터 삽입, 조회, 수정, 삭제 기능을 구현하세요.
  3. 트랜잭션 사용:
    • 두 개의 SQL 쿼리를 트랜잭션으로 묶고 오류 발생 시 롤백되도록 설정하세요.

 

🚀 JDBC 실습 과제: MySQL 데이터베이스 연결 및 CRUD + 트랜잭션


📚 1. 데이터베이스 및 테이블 준비

1.1 MySQL 데이터베이스 생성

CREATE DATABASE testdb;
USE testdb;

1.2 users 테이블 생성

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    email VARCHAR(100)
);

📚 2. JDBC를 사용한 MySQL 데이터베이스 연결

JDBC 설정

  • MySQL 드라이버(mysql-connector-java)가 필요합니다.
  • MySQL 서버가 실행 중이어야 합니다.

🚀 3. JDBC CRUD 및 트랜잭션 예제

📌 3.1 데이터베이스 연결 및 CRUD 구현

import java.sql.*;

public class JDBCCRUDExample {

    private static final String URL = "jdbc:mysql://localhost:3306/testdb";
    private static final String USER = "root";
    private static final String PASSWORD = "1234";

    public static void main(String[] args) {
        try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {
            System.out.println("✅ 데이터베이스 연결 성공!");

            // 1. 데이터 삽입
            insertUser(connection, "Alice", 25, "alice@example.com");

            // 2. 데이터 조회
            selectUsers(connection);

            // 3. 데이터 수정
            updateUser(connection, 1, "alice_updated@example.com");

            // 4. 데이터 삭제
            deleteUser(connection, 1);

            // 5. 트랜잭션 예제
            transactionExample(connection);

        } catch (SQLException e) {
            System.out.println("❌ 데이터베이스 연결 실패: " + e.getMessage());
        }
    }

    // 데이터 삽입
    private static void insertUser(Connection connection, String name, int age, String email) {
        String sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, name);
            preparedStatement.setInt(2, age);
            preparedStatement.setString(3, email);

            int rows = preparedStatement.executeUpdate();
            System.out.println("✅ " + rows + "개의 행이 삽입되었습니다.");
        } catch (SQLException e) {
            System.out.println("❌ 데이터 삽입 실패: " + e.getMessage());
        }
    }

    // 데이터 조회
    private static void selectUsers(Connection connection) {
        String sql = "SELECT * FROM users";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
             ResultSet resultSet = preparedStatement.executeQuery()) {

            System.out.println("✅ 사용자 목록:");
            while (resultSet.next()) {
                System.out.println(
                        "ID: " + resultSet.getInt("id") +
                        ", 이름: " + resultSet.getString("name") +
                        ", 나이: " + resultSet.getInt("age") +
                        ", 이메일: " + resultSet.getString("email")
                );
            }
        } catch (SQLException e) {
            System.out.println("❌ 데이터 조회 실패: " + e.getMessage());
        }
    }

    // 데이터 수정
    private static void updateUser(Connection connection, int id, String newEmail) {
        String sql = "UPDATE users SET email = ? WHERE id = ?";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, newEmail);
            preparedStatement.setInt(2, id);

            int rows = preparedStatement.executeUpdate();
            System.out.println("✅ " + rows + "개의 행이 수정되었습니다.");
        } catch (SQLException e) {
            System.out.println("❌ 데이터 수정 실패: " + e.getMessage());
        }
    }

    // 데이터 삭제
    private static void deleteUser(Connection connection, int id) {
        String sql = "DELETE FROM users WHERE id = ?";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setInt(1, id);

            int rows = preparedStatement.executeUpdate();
            System.out.println("✅ " + rows + "개의 행이 삭제되었습니다.");
        } catch (SQLException e) {
            System.out.println("❌ 데이터 삭제 실패: " + e.getMessage());
        }
    }

    // 트랜잭션 예제
    private static void transactionExample(Connection connection) {
        String insertSql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
        String updateSql = "UPDATE users SET email = ? WHERE name = ?";

        try {
            connection.setAutoCommit(false); // 자동 커밋 비활성화

            try (PreparedStatement insertStmt = connection.prepareStatement(insertSql);
                 PreparedStatement updateStmt = connection.prepareStatement(updateSql)) {

                // 첫 번째 작업: 삽입
                insertStmt.setString(1, "Bob");
                insertStmt.setInt(2, 30);
                insertStmt.setString(3, "bob@example.com");
                insertStmt.executeUpdate();

                // 두 번째 작업: 수정
                updateStmt.setString(1, "updated_bob@example.com");
                updateStmt.setString(2, "Bob");
                updateStmt.executeUpdate();

                // 커밋
                connection.commit();
                System.out.println("✅ 트랜잭션이 성공적으로 완료되었습니다.");

            } catch (SQLException e) {
                connection.rollback(); // 오류 발생 시 롤백
                System.out.println("❌ 트랜잭션 실패: 롤백되었습니다. 오류: " + e.getMessage());
            } finally {
                connection.setAutoCommit(true); // 자동 커밋 재활성화
            }

        } catch (SQLException e) {
            System.out.println("❌ 트랜잭션 설정 실패: " + e.getMessage());
        }
    }
}

📚 4. 코드 설명

  1. 데이터베이스 연결:
    • DriverManager를 통해 데이터베이스에 연결합니다.
  2. 데이터 삽입 (INSERT):
    • PreparedStatement를 사용해 SQL 쿼리를 안전하게 실행합니다.
  3. 데이터 조회 (SELECT):
    • ResultSet을 사용해 조회 결과를 출력합니다.
  4. 데이터 수정 (UPDATE):
    • 사용자 ID를 기반으로 이메일을 수정합니다.
  5. 데이터 삭제 (DELETE):
    • 사용자 ID를 기반으로 데이터를 삭제합니다.
  6. 트랜잭션:
    • 두 개의 SQL 쿼리를 트랜잭션으로 묶어 오류 발생 시 rollback으로 작업을 취소합니다.

🚀 5. 실습 확인

  1. MySQL에서 users 테이블 확인:
SELECT * FROM users;

2. 프로그램 실행 후 다음 기능 확인:

  • 사용자 데이터 삽입
  • 사용자 목록 조회
  • 사용자 이메일 수정
  • 사용자 데이터 삭제
  • 트랜잭션 성공 및 롤백 확인

🎯 6. 학습 목표

  1. JDBC로 MySQL 연결 및 SQL 쿼리 실행
  2. PreparedStatement로 안전한 SQL 실행
  3. CRUD 기능 구현
  4. 트랜잭션 관리 (commit, rollback)
  5. 예외 처리 및 리소스 해제

다음 강의 예고: 13강 - 자바 기초 프로젝트

다음 강의에서는 자바 기초 프로젝트를 진행하며, 지금까지 학습한 내용을 통합해보겠습니다. 😊

LIST