JDBC는 Java에서 데이터베이스와 연결하고 SQL 쿼리를 실행할 수 있는 표준 API예요! 🖥️ 데이터베이스 관리 시스템과 Java 애플리케이션이 독립적으로 상호작용할 수 있게 도와준답니다.
📝 ANSI SQL(1999) 지원
대부분의 SQL 문을 사용해 데이터베이스 조작이 가능해요!
📞 함수 호출 인터페이스
SQL 문을 실행하기 위해 프로그래밍 언어와 데이터베이스 간의 함수 호출을 통한 인터페이스를 제공해요.
🔗 DBMS 독립성
하나의 코드를 다양한 DBMS에서 사용할 수 있어요. 데이터베이스가 변경되더라도 드라이버와 URL만 수정하면 동일한 코드로 작업할 수 있답니다!
🌐 Java의 플랫폼 독립성
다양한 환경에서 동일한 API로 애플리케이션을 개발할 수 있어요.
🛠️ 데이터베이스 연결 설정
데이터베이스와의 연결을 설정해 데이터를 접근하고 조작할 수 있어요.
🚀 SQL 전송 및 결과 처리
SQL 문장을 DBMS에 전송하고 결과를 받아 처리할 수 있어요.
🧩 드라이버를 통한 구현
JDBC는 크게 두 가지 인터페이스로 나뉩니다:
🛠️ Driver Interface
각 DBMS 업체가 제공하는 드라이버로, JDBC API의 데이터베이스 연결 및 SQL 실행 메커니즘을 구현합니다.
👨💻 Programmer Interface
Java 프로그래머가 사용하는 API로, SQL 패키지가 제공하는 라이브러리예요. DB 연결, 쿼리 실행, 결과 처리 등의 작업을 수행할 수 있습니다.
📥 JDBC 드라이버 로드
DBMS에 맞는 드라이버를 로드하여 Java 애플리케이션이 DBMS와 통신할 수 있게 합니다.
🔗 데이터베이스 연결 생성
드라이버를 통해 데이터베이스에 연결하고, Connection 객체로 DBMS와 상호작용할 준비를 합니다.
📝 SQL 문 실행
PreparedStatement나 Statement 객체로 SQL 문을 DBMS로 전송해 실행합니다.
📊 결과 처리
SQL 실행 결과는 ResultSet 객체로 받아, 데이터를 애플리케이션 로직에 맞게 활용합니다.
🔒 연결 종료
작업이 끝나면 데이터베이스와의 연결을 종료해 자원을 해제합니다.
Java 웹 애플리케이션은 사용자가 웹 브라우저를 통해 접근하는 서버 측 애플리케이션이에요. 🌐 로그인, 상품 조회, 주문 처리 등과 같은 기능에서 데이터베이스와 상호작용이 필요할 때, JDBC API를 사용해 데이터베이스와 연결하고 SQL 명령을 전송합니다. 💬
JDBC API는 Java 프로그램이 데이터베이스와 상호작용할 수 있도록 다양한 클래스와 메서드를 제공하는 표준 인터페이스입니다. ✨ 주요 기능은 다음과 같아요:
JDBC API는 Java 애플리케이션이 DBMS의 구체적인 구현 방식에 구애받지 않고 데이터베이스와 상호작용할 수 있게 해주는 중간 계층이에요. 🛡️
JDBC Driver는 특정 DBMS와 통신할 수 있도록 JDBC API의 요청을 해석하는 드라이버입니다. 각 DBMS(예: MySQL, Oracle 등)는 자신만의 JDBC 드라이버를 제공하며, 이를 통해 Java 애플리케이션과 데이터베이스 간의 통신을 담당합니다. 📡
대부분의 최신 애플리케이션에서는 Type 4 드라이버를 많이 사용합니다. 🚀
Database는 데이터를 저장하고 관리하는 시스템으로, SQL 쿼리를 통해 데이터를 삽입, 수정, 삭제, 조회할 수 있습니다. 🛠️ JDBC는 Java 애플리케이션과 데이터베이스를 연결하는 역할을 합니다.
📥 JDBC 드라이버 로딩: Java 웹 애플리케이션이 시작되면 DBMS에 맞는 JDBC 드라이버를 로드해요. 이 드라이버는 요청을 DBMS가 이해할 수 있는 형식으로 변환해 줍니다.
🔗 데이터베이스 연결 설정: JDBC API를 사용해 데이터베이스와 연결을 설정합니다. 연결 정보를 포함한 URL, 사용자명, 비밀번호 등을 제공해요.
📝 SQL 문 전송: Java 애플리케이션이 SQL 문을 JDBC API를 통해 실행 요청하고, 이 요청은 JDBC 드라이버를 통해 DBMS로 전달됩니다.
📊 결과 처리 및 반환: DBMS는 SQL 명령을 처리하고, 그 결과를 Java 애플리케이션에 반환합니다. Java 애플리케이션은 이 결과를 화면에 표시하거나 다른 로직에 사용해요.
🔒 연결 종료: 작업이 완료되면 JDBC API를 통해 데이터베이스 연결을 종료하여 자원을 해제합니다.
Java에서 데이터베이스와 상호작용하기 위한 핵심 인터페이스들을 포함하고 있는 패키지예요. JDBC의 다양한 인터페이스를 통해 데이터베이스와 연결하고 SQL 명령을 처리할 수 있습니다.
Driver 인터페이스는 JDBC 드라이버를 나타내며, 데이터베이스 연결을 위한 다양한 기능을 제공합니다. 🌐 JDBC API가 호출한 SQL 문을 DBMS가 이해할 수 있는 형태로 변환하는 중요한 역할을 해요.
Connection 인터페이스는 데이터베이스에 대한 하나의 세션을 표현합니다. 🛡️ SQL 문을 실행하거나 데이터베이스 트랜잭션을 관리할 때 사용되며, 연결된 동안 데이터베이스와 지속적으로 상호작용할 수 있습니다.
DriverManager.getConnection()
메소드로 Connection 객체를 생성해요.setAutoCommit(true)
) 상태예요.setAutoCommit(false)
로 설정해 명시적으로 commit()
과 rollback()
을 관리할 수 있습니다.Statement 인터페이스는 SQL 문을 실행하고 그 결과를 가져오는 역할을 해요. Java 애플리케이션이 데이터베이스에 명령을 전달하고 결과를 처리할 수 있도록 도와주는 인터페이스입니다.
ResultSet
인지 여부를 반환합니다.SELECT
문을 실행해 ResultSet
객체로 결과를 반환합니다.INSERT
, UPDATE
, DELETE
같은 DML 문을 실행하고 영향을 받은 행의 개수를 반환합니다.PreparedStatement
를 사용하여 더 안전하게 처리할 수 있어요.PreparedStatement는 반복적으로 실행되는 SQL 문을 미리 컴파일하여 저장하고 성능을 개선하는 데 사용돼요. 🚀 특히 반복적인 데이터 삽입이나 업데이트 작업에서 큰 효과를 발휘합니다.
🔄 반복적인 SQL 실행 최적화: 동일한 SQL 문을 반복해서 실행할 때 성능을 크게 향상시켜줍니다.
⚙️ 미리 컴파일된 SQL: SQL 문이 미리 컴파일되어 저장되므로, 실행할 때마다 컴파일하지 않아도 되어 시간이 절약되고, SQL 인젝션 공격 방어도 강화됩니다. 🛡️
📂 대용량 데이터 처리: 대용량의 문자 데이터나 바이너리 데이터를 처리할 때 유리해요. BLOB이나 CLOB 타입의 데이터도 손쉽게 다룰 수 있습니다.
🧹 파라미터 초기화: clearParameters()
메서드를 사용하여 이전에 사용된 파라미터를 초기화하고 새로운 값을 설정할 수 있어요.
SELECT
문을 처리하여 결과를 ResultSet
으로 반환합니다.INSERT
, UPDATE
, DELETE
와 같은 DML 문을 실행하며, 영향을 받은 행의 개수를 반환합니다.PreparedStatement는 SQL 문에 파라미터를 안전하게 설정할 수 있어 코드의 안전성과 가독성을 높여줘요. 🛠️
CallableStatement는 데이터베이스에 저장된 프로시저(Stored Procedures)를 호출하는 데 사용됩니다. 🗂️
📥 Stored Procedures 호출: 직접 SQL을 실행하지 않고, 데이터베이스에 저장된 프로시저를 호출하여 작업을 처리합니다.
⚙️ 코드 독립성 및 성능 향상: 자바 코드와 SQL을 분리하여 유지보수성과 효율성을 높여줍니다.
🔧 매개변수 설정: IN, OUT, INOUT 매개변수를 지원하여 프로시저의 입력과 출력을 관리할 수 있습니다.
ResultSet은 SQL 쿼리의 결과 데이터를 처리하는 인터페이스로, SELECT
쿼리의 실행 결과를 탐색하고 데이터를 읽어오는 데 사용됩니다. 📜
📝 결과 처리: 쿼리 실행 후 반환된 결과를 행(row)과 열(column)로 구성하여 제공하며, 커서(cursor)를 통해 행 단위로 탐색할 수 있어요.
📍 커서의 위치: 커서는 첫 번째 레코드 이전에 위치하며, next()
메서드를 호출하여 다음 레코드로 이동합니다.
📥 데이터 읽기: 다양한 getXXX()
메서드를 통해 특정 필드의 값을 읽어올 수 있어요. 예를 들어:
getString()
: 문자열 값을 읽음getInt()
: 정수 값을 읽음getDate()
: 날짜 값을 읽음getFloat()
, getDouble()
, getBoolean()
등 다양한 메서드가 제공됩니다.➡️ next(): 커서를 다음 행으로 이동시키며, 더 이상 행이 없으면 false
를 반환합니다.
🔍 getXXX(): 다양한 데이터 타입을 읽어올 수 있는 메서드들이 제공되며, 열의 인덱스나 이름을 통해 접근 가능합니다.
ResultSet을 사용하면 쿼리의 결과를 효율적으로 탐색하고 데이터를 자바 애플리케이션에서 활용할 수 있습니다. 📊
Java 애플리케이션에서 데이터베이스와 상호작용하기 위해 JDBC(Java Database Connectivity)를 활용하는 기본 개발 순서를 안내해 드릴게요! 이 과정은 데이터베이스와 연결을 설정하고 SQL 명령어를 실행하며, 마지막으로 연결을 종료하는 단계로 구성됩니다.
JDBC 드라이버는 Java 애플리케이션과 데이터베이스 간의 통신을 가능하게 하는 중요한 소프트웨어입니다. 🚀 드라이버를 로딩하는 단계는 데이터베이스와의 연결을 준비하는 첫 번째 단계예요.
📥 드라이버 클래스를 적재: 드라이버 로딩은 Class.forName()
메서드를 사용하여 드라이버 클래스 이름을 지정함으로써 이루어집니다.
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 드라이버 로딩 예시
🗂️ 드라이버 클래스:
com.mysql.cj.jdbc.Driver
oracle.jdbc.driver.OracleDriver
com.microsoft.sqlserver.jdbc.SQLServerDriver
이 과정에서 애플리케이션이 데이터베이스와 통신할 수 있도록 드라이버가 JVM에 등록됩니다. 🌐
JDBC 드라이버가 로딩된 후에는 데이터베이스와 연결을 설정합니다. 이 단계는 Java 프로그램이 SQL 명령을 데이터베이스로 전송하고 결과를 받을 수 있는 상태를 만듭니다. 🔗
🔑 DriverManager를 통한 연결 요청: DriverManager.getConnection()
메서드를 사용하여 데이터베이스와 연결합니다. 이 메서드는 URL, 사용자 ID, 비밀번호를 인자로 받아요.
Connection con = DriverManager.getConnection(URL, dbid, dbpassword);
📝 JDBC URL 형식: 각 DBMS마다 고유의 URL 형식으로 데이터베이스를 식별합니다.
jdbc:mysql://HOST:PORT/DBNAME[?param1=value1¶m2=value2&...]
jdbc:oracle:thin:@Host:PORT:SID
jdbc:sqlserver://HOST:PORT;databaseName=DB
이 단계에서 데이터베이스와의 연결이 설정되어 SQL 문을 전송할 준비가 됩니다. 📡
데이터베이스와의 연결이 완료되면 SQL 명령을 실행할 준비를 해야 합니다. 이 단계에서는 Statement
또는 PreparedStatement
객체를 생성하여 SQL 문을 실행할 준비를 합니다. 📑
📝 SQL 문 작성: 실행할 SQL 문을 문자열로 작성합니다.
String sql = "SELECT * FROM users WHERE id = ?";
🛠️ Statement 생성:
Statement: 일반적인 SQL 문을 실행하는 데 사용됩니다.
Statement stmt = con.createStatement();
🛡️ PreparedStatement 생성:
PreparedStatement: SQL 문을 미리 컴파일하여 성능을 높이고, 파라미터화된 SQL 문을 안전하게 실행할 수 있게 해줍니다.
PreparedStatement pstmt = con.prepareStatement(sql);
PreparedStatement는 성능과 보안 측면에서 이점이 있어 반복 실행되는 SQL 문에 유리합니다. 🔒
SQL 문이 준비되면 Statement
또는 PreparedStatement
객체를 사용하여 SQL 문을 데이터베이스에 전송하고 실행합니다. 📝
🛠️ Statement 사용:
🔧 DML (INSERT, UPDATE, DELETE):
executeUpdate()
메서드를 사용해 DML 문을 실행하고, 영향을 받은 행의 수를 반환합니다.int cnt = stmt.executeUpdate(sql); // DML 문 실행
🔍 SELECT:
executeQuery()
메서드를 사용하여 SELECT
문을 실행하고, 결과를 ResultSet
객체로 반환받습니다.ResultSet rs = stmt.executeQuery(sql); // SELECT 문 실행
🛡️ PreparedStatement 사용:
🎯 파라미터 설정: PreparedStatement의 SQL 문 내 ?
에 값을 설정합니다.
pstmt.setInt(1, 100); // 첫 번째 ?에 100 설정
🔧 DML:
executeUpdate()
메서드를 사용하여 DML 문을 실행합니다.int cnt = pstmt.executeUpdate();
🔍 SELECT:
executeQuery()
메서드를 사용하여 SELECT
문을 실행하고, 결과를 ResultSet
으로 반환합니다.ResultSet rs = pstmt.executeQuery();
📊 ResultSet:
SELECT
문의 실행 결과는 ResultSet
객체로 관리되며, 쿼리의 결과를 행 단위로 탐색할 수 있습니다.while (rs.next()) {
String str = rs.getString("column_name");
int cnt = rs.getInt("column_name");
}
모든 작업이 완료되면 데이터베이스와의 연결을 끊어야 해요. 연결을 종료하지 않으면 시스템 리소스를 불필요하게 점유하여 성능 저하를 초래할 수 있습니다. ⚠️
🔒 연결 종료: close()
메서드를 호출하여 ResultSet
, Statement(PreparedStatement)
, Connection
객체를 연결한 순서의 역순으로 종료합니다.
rs.close();
pstmt.close();
con.close();
🛠️ 자원 관리: 데이터베이스 연결은 많은 시스템 자원을 소모하므로, 최적화된 상태를 유지하기 위해 반드시 연결을 종료해야 합니다.
🧹 Try with Resources:
try-with-resources
구문을 사용하여 자동으로 자원을 해제할 수 있어요. AutoCloseable
인터페이스를 구현한 객체는 이 구문에 포함될 수 있으며, try 블록이 종료되면 자동으로 close()
메서드를 호출합니다.try (Connection con = DriverManager.getConnection(URL, dbid, dbpassword);
PreparedStatement pstmt = con.prepareStatement(sql)) {
// SQL 실행 로직
} catch (SQLException e) {
e.printStackTrace();
}