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
  • 전체
    오늘
    어제
    • 분류 전체보기 (55) N
      • Backend (10) N
        • JAVA (5)
        • DB (5) N
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • Computer Science (15)
        • 네트워크 (9)
        • 운영체제 (5)
      • PS (11)
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (0)
        • 알고리즘 (8)
      • Dev Trivia (4)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    function
    html
    dom
    트리
    list
    javascript
    tcp
    udp
    dfs
    상속
    DNS
    속성
    함수
    개념 스키마
    Vue3
    HTTP
    Props
    MySQL
    select
    BFS
    DP
    JS
    map
    슈퍼 키
    set
    leetcode
    java
    JDBC
    그래프
    https
  • 최근 댓글

  • 최근 글

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

티스토리툴바