JDBC

2025. 5. 21. 11:50·Backend/JAVA
728x90

JDBC (Java Database Connectivity)

자바에서 DB에 접근하기 위한 표준 API

즉, 자바 애플리케이션이 DBMS 종류와 상관 없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성

JDBC API (java.sql 패키지에 포함) 자바 프로그램에서 DB와 연결하고 SQL문을 실행하며,
결과를 처리할 수 있도록 돕는 표준 라이브러리
JDBC 드라이버 특정 DB에 맞는 구현체
예) MySQL 용 JDBC 드라이버 = mysql-connector-j

👉 DB가 바뀌더라도, 구현체만 바꾸면 애플리케이션에서 수정 사항을 최소화 할 수 있음


JDBC의 핵심 인터페이스 / 클래스

JDBC (java.sql 패키지)

  • 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`

JDBC DB 연결 코드


모듈화해야 할 코드

DB 연결 및 닫기 작업은 항상 필요함 = `common.JDBCUtil`

1. main > resource > application.properties 파일 작성

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

JDBCUtil을 활용한 db 연결


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
'Backend/JAVA' 카테고리의 다른 글
  • JDBC 프로젝트 생성
  • 컬렉션 프레임워크
  • 추상 클래스 & 봉인 클래스
  • 상속 관계에서 타입 변환의 이유와 사용 목적
0woy
0woy
Algorithm, CS, Web 등 배운 내용을 기록합니다.
  • 0woy
    0woy dev
    0woy
  • 전체
    오늘
    어제
    • 분류 전체보기 (51) N
      • Backend (6) N
        • JAVA (5) N
        • DB (1)
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • Computer Science (15) N
        • 네트워크 (9) N
        • 운영체제 (5)
      • PS (11) N
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (0)
        • 알고리즘 (8) N
      • Dev Trivia (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    JS
    진입 차수
    set
    MySQL
    DP
    dfs
    HTTP
    https
    함수
    topologysort
    list
    udp
    속성
    JDBC
    javascript
    Props
    map
    function
    DNS
    tcp
    dom
    select
    leetcode
    java
    트리
    상속
    Vue3
    그래프
    html
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
0woy
JDBC
상단으로

티스토리툴바