728x90
JDBC (Java Database Connectivity)
자바에서 DB에 접근하기 위한 표준 API
즉, 자바 애플리케이션이 DBMS 종류와 상관 없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성
JDBC API (java.sql 패키지에 포함) | 자바 프로그램에서 DB와 연결하고 SQL문을 실행하며, 결과를 처리할 수 있도록 돕는 표준 라이브러리 |
JDBC 드라이버 | 특정 DB에 맞는 구현체 예) MySQL 용 JDBC 드라이버 = mysql-connector-j |
👉 DB가 바뀌더라도, 구현체만 바꾸면 애플리케이션에서 수정 사항을 최소화 할 수 있음
JDBC의 핵심 인터페이스 / 클래스
- DriverManager: JDBC 드라이버 로드, DB 연결 관리
- Connection: DB와의 연결을 나타냄
- Statement: SQL 문을 실행하기 위한 객체 (기본 쿼리)
- Prepared Statement: 파라미터화된 쿼리 실행 (보안 & 성능)
- ResultSet: SQL 쿼리 실행 결과 저장객체
장점 & 단점
장점 | 단점 |
모든 RDBMS와 표준 방식으로 연동 가능 | 반복 코드 多, 가독성 ↓ |
자바 언어와의 높은 통합성 | 트랜잭션 관리나 자원 해제 번거로움 👉 Spring JDBC, JPA, MyBatis 등의 프레임워크 사용 |
JDBC 개발 절차
1) 드라이버 로드 & DB 연결
- 드라이버 확인: Class.forName("com.mysql.cj.jdbc.Driver") 👉 없으면 ClassNotFound 예외 발생
- Connection 객체: DB에 연결 세션 만듦
Connection conn = DrivreManager.getConnection("연결 문자열", "사용자", "비밀번호")
- 연결 문자열: jdbc:mysql://[host]:[포트]:[dbd이름]
👉 ` → jdbc:mysql://127.0.0.1:3306/jdbc_ex`
모듈화해야 할 코드
DB 연결 및 닫기 작업은 항상 필요함 = `common.JDBCUtil`
1. main > resource > application.properties 파일 작성
2. main > java > Common > JDBCUtil.java 클래스 작성
package org.scoula.Common;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtil {
static Connection conn = null;
static{
try {
Properties prop = new Properties();
prop.load(JDBCUtil.class.getResourceAsStream("/application.properties"));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String id = prop.getProperty("id");
String password = prop.getProperty("password");
Class.forName(driver);
conn = DriverManager.getConnection(url, id, password);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return conn;
}
public static void close(){
try {
if(conn != null){
conn.close();
conn=null;
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
3. ConnectionTest.java
2) Statement 생성 - Statement, PreparedStatement
Statement
- Statement는 정적인 SQL 쿼리를 실행할 때 사용
- SQL 문자열을 코드에 직접 작성해서 실행
- SQL 쿼리를 실행할 때마다 SQL이 컴파일되고 실행됨.
- 문자열 연결을 이용해서 동적으로 쿼리를 구성해야 함.
- SQL 인젝션에 취약함.
// Connection 객체를 통해 생성
Statement stmt = connection.createStatement();
// SQL 실행
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE age > 20");
int count = stmt.executeUpdatae("INSERT, UPDATE, DELETE 문");
⭐ PreparedStatement (주로 사용)
- PreparedStatement는 파라미터화된 SQL 쿼리를 미리 준비(컴파일)해서 실행
- 쿼리 구조는 고정하고, 실행 시 값만 바꾸는 형태입니다.
- SQL 쿼리가 한 번만 컴파일되고, 여러 번 재사용 가능.
- 입력값 바인딩(setInt, setString 등)을 통해 SQL 인젝션 방지에 안전함.
- 성능 및 보안 측면에서 Statement보다 우수함.
// SQL문에 값을 넣을 때 파라미터화 해서 처리
String query = "SELECT * FROM users WHERE age > ?";
// Connection 객체를 통해 생성
PreparedStatement pstmt = connection.prepareStatement(query);
// 파라미터 설정
pstmt.setInt(1, 20);
// SQL문 실행
ResultSet rs = pstmt.executeQuery();
항목 | Statement | PreparedStatement |
SQL 컴파일 | 매번 실행 시마다 | 한 번 컴파일, 재사용 가능 |
성능 | 낮음 | 높음 (쿼리 재사용 가능) |
가독성 | 낮음 (문자열 연결 필요) | 높음 (파라미터 바인딩) |
보안 | SQL Injection에 취약 | SQL Injection에 강함 |
용도 | 간단한/일회성 쿼리 | 반복 실행, 사용자 입력 포함 쿼리 |
📌 정리
간단하고 일회성 쿼리: Statement 사용
보안이 중요하거나 반복 실행하는 쿼리: PreparedStatement를 사용
3) 결과 받기 - ResultSet
- SQL SELECT 쿼리의 결과 집합을 담는 객체.
- 데이터베이스에서 가져온 결과를 행(row) 단위로 탐색할 수 있도록 해줌.
- 데이터는 테이블 형태로 저장되어 있으며, 커서를 이용해 행을 순차적으로 접근.
기본 사용 예시
String query = "SELECT id, name FROM users";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
주요 메서드
메서드 | 설명 |
next() | 다음 행으로 커서를 이동. 없으면 false 반환 |
getInt("컬럼명") | 정수 타입 데이터 읽기 |
getString("컬럼명") | 문자열 데이터 읽기 |
getDouble(), getBoolean(), getDate() 등 | 다양한 타입 지원 |
wasNull() | 마지막 읽은 값이 NULL이었는지 확인 |
📌 주의
ResultSet은 데이터베이스 연결이 닫히면 사용할 수 없음.
읽고 난 후에는 반드시 rs.close()와 stmt.close()를 호출해서 리소스를 해제해야 함.
728x90