SMALL
📚 12강: JDBC (Java Database Connectivity)
🚀 1. JDBC란?
- **JDBC (Java Database Connectivity)**는 자바에서 데이터베이스와 연결하기 위한 API입니다.
- 다양한 데이터베이스(MySQL, Oracle, PostgreSQL 등)와 상호작용할 수 있습니다.
- 주요 목적:
- 데이터베이스 연결
- SQL 쿼리 실행
- 결과 처리
🚀 2. JDBC 아키텍처
📌 2.1 주요 구성 요소
- DriverManager:
- 데이터베이스 드라이버를 관리하고 연결을 담당합니다.
- Connection:
- 데이터베이스와의 연결을 나타냅니다.
- Statement:
- SQL 쿼리를 실행합니다.
- ResultSet:
- SQL 쿼리 결과를 저장하고 처리합니다.
- SQLException:
- JDBC 작업 중 발생한 오류를 처리합니다.
🚀 3. JDBC 연결 단계
📌 3.1 JDBC 프로그래밍 단계
- JDBC 드라이버 로드
- 데이터베이스 연결
- SQL 쿼리 실행
- 결과 처리
- 자원 해제
🚀 4. JDBC 예제
✅ 4.1 데이터베이스 연결 (MySQL 예제)
- MySQL 드라이버 추가:
- mysql-connector-java 라이브러리를 프로젝트에 추가해야 합니다.
- 기본 연결 예제:
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. 실습 과제
- 데이터베이스 연결:
- JDBC를 사용해 MySQL 데이터베이스에 연결하세요.
- CRUD 연습:
- users 테이블을 만들어 데이터 삽입, 조회, 수정, 삭제 기능을 구현하세요.
- 트랜잭션 사용:
- 두 개의 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. 코드 설명
- 데이터베이스 연결:
- DriverManager를 통해 데이터베이스에 연결합니다.
- 데이터 삽입 (INSERT):
- PreparedStatement를 사용해 SQL 쿼리를 안전하게 실행합니다.
- 데이터 조회 (SELECT):
- ResultSet을 사용해 조회 결과를 출력합니다.
- 데이터 수정 (UPDATE):
- 사용자 ID를 기반으로 이메일을 수정합니다.
- 데이터 삭제 (DELETE):
- 사용자 ID를 기반으로 데이터를 삭제합니다.
- 트랜잭션:
- 두 개의 SQL 쿼리를 트랜잭션으로 묶어 오류 발생 시 rollback으로 작업을 취소합니다.
🚀 5. 실습 확인
- MySQL에서 users 테이블 확인:
SELECT * FROM users;
2. 프로그램 실행 후 다음 기능 확인:
- 사용자 데이터 삽입
- 사용자 목록 조회
- 사용자 이메일 수정
- 사용자 데이터 삭제
- 트랜잭션 성공 및 롤백 확인
🎯 6. 학습 목표
- JDBC로 MySQL 연결 및 SQL 쿼리 실행
- PreparedStatement로 안전한 SQL 실행
- CRUD 기능 구현
- 트랜잭션 관리 (commit, rollback)
- 예외 처리 및 리소스 해제
✅ 다음 강의 예고: 13강 - 자바 기초 프로젝트
다음 강의에서는 자바 기초 프로젝트를 진행하며, 지금까지 학습한 내용을 통합해보겠습니다. 😊
LIST
'자바 (JAVA)' 카테고리의 다른 글
📚 자바 반복문 문제 풀이 (0) | 2025.01.06 |
---|---|
📚 자바 조건문 연습문제 (0) | 2025.01.06 |
📚 JAVA 11강: 스레드(Thread) (1) | 2025.01.03 |
📚 JAVA 10강: 파일 입출력 (File I/O) (0) | 2025.01.03 |
📚 JAVA 9강: 컬렉션 프레임워크 (Collection Framework) (0) | 2025.01.03 |