[JDBC / Java] JDBC

DevelopHeoยท2025๋…„ 1์›” 4์ผ
post-thumbnail

๐Ÿ“™ JDBC ๋ž€?

JDBC(Java Database Connectivity)๋Š” ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.
Java ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธJDBC์˜ ํŠน์ง•

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ
    • JDBC๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๊ธ‰์ž๋Š” JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. Java์™€ SQL ํ†ตํ•ฉ
    • JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ์ฝ”๋“œ์—์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. API ํ‘œ์ค€ํ™”
    • Java SE์— ํฌํ•จ๋œ ํ‘œ์ค€ API๋กœ, ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธJDBC์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

1. JDBC Driver

  • JDBC์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘๊ฐ„ ๊ณ„์ธต ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต๊ธ‰์ž๊ฐ€ ์ œ๊ณตํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์ธ ๋“œ๋ผ์ด๋ฒ„ ์œ ํ˜•:
    • 1) JDBC-ODBC Bridge Driver: ODBC๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ (Deprecated)
    • 2) Native-API Driver: DB ์ œ๊ณต API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„
    • 3) Network Protocol Driver: ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด DBMS์™€ ์—ฐ๊ฒฐ
    • 4) Thin Driver: Java๋กœ ์ž‘์„ฑ๋œ ์ˆœ์ˆ˜ ๋“œ๋ผ์ด๋ฒ„ (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ)

2. JDBC API

JDBC API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. DriverManager
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค.
    • ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ ๋ฐ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. Connection
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. Statement
    • SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • Statement, PreparedStatement, CallableStatement ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Œ.
  4. ResultSet
    • SQL ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  5. SQLException
    • JDBC ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

JDBC ํด๋ž˜์Šค์˜ ์ƒ์„ฑ๊ด€๊ณ„

โœ๏ธJDBC ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ

  • JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
Class.forName("com.mysql.cj.jdbc.Driver");

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

  • DriverManager๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/mydb", "username", "password");

3. SQL ์‹คํ–‰

  • Statement ๋˜๋Š” PreparedStatement๋ฅผ ์‚ฌ์šฉํ•ด SQL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
String query = "SELECT * FROM users";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);

4. ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

  • ResultSet์„ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
while (rs.next()) {
    System.out.println("User ID: " + rs.getInt("id"));
    System.out.println("User Name: " + rs.getString("name"));
}

5. ๋ฆฌ์†Œ์Šค ๋‹ซ๊ธฐ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
rs.close();
stmt.close();
conn.close();

โœ๏ธJDBC ์ฝ”๋“œ ์˜ˆ์ œ

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String username = "root";
        String password = "password";

        try {
            // 1. ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ
            Connection conn = DriverManager.getConnection(url, username, password);

            // 3. SQL ์‹คํ–‰
            String query = "SELECT * FROM users";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);

            // 4. ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
            while (rs.next()) {
                System.out.println("ID: " + rs.getInt("id"));
                System.out.println("Name: " + rs.getString("name"));
            }

            // 5. ๋ฆฌ์†Œ์Šค ๋‹ซ๊ธฐ
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

โœ๏ธJDBC์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

1. Statement

  • SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค.
  • ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์‹ค๋ฌด์—์„œ๋Š” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ.
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

2. PreparedStatement

  • SQL Injection ๋ฐฉ์ง€์™€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();

3. CallableStatement

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ €์žฅ ํ”„๋กœ์‹œ์ €(Stored Procedure)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
CallableStatement cstmt = conn.prepareCall("{CALL my_procedure(?)}");
cstmt.setInt(1, 10);
cstmt.execute();

โœ๏ธJDBC์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ: ๋‹ค์–‘ํ•œ DBMS์™€ ํ†ต์‹  ๊ฐ€๋Šฅ.
  2. ํ‘œ์ค€ API ์ œ๊ณต: Java์—์„œ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ API๋ฅผ ์‚ฌ์šฉ.
  3. ์œ ์—ฐ์„ฑ: ๋™์  SQL ์‹คํ–‰ ๊ฐ€๋Šฅ.

๋‹จ์ 

  1. ์ฝ”๋“œ ์ค‘๋ณต: ์ž์› ๊ด€๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.
  2. ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€: SQL์ด ์ฝ”๋“œ์— ์ง์ ‘ ํฌํ•จ๋˜์–ด ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  3. ํผํฌ๋จผ์Šค: ๋ฐ˜๋ณต์ ์ธ SQL ์‹คํ–‰ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜.

โœ๏ธJDBC๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ์ˆ 

  1. Hibernate
    • ORM(Object-Relational Mapping) ๊ธฐ์ˆ ๋กœ, ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งคํ•‘์„ ์ง€์›.
  2. JPA (Java Persistence API)
    • Java EE ํ‘œ์ค€ ORM ๊ธฐ์ˆ ๋กœ, Hibernate๊ฐ€ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  3. MyBatis
    • SQL์„ XML๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ JDBC์˜ ๋‹จ์ ์„ ๋ณด์™„.

โœ๏ธ๊ฒฐ๋ก 

JDBC๋Š” Java์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ดํ•ดํ•˜๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€๋งŒ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ์ง€๋ณด์ˆ˜์™€ ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•ด JPA๋‚˜ MyBatis์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“™ Spring JDBC

Spring JDBC๋Š” Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” JDBC ๋ชจ๋“ˆ์ด๋‹ค.
์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋งํ•˜๋ฉด Spring Framwork์—์„œ ์ œ๊ณตํ•˜๋Š” JDBC ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.
Spring JDBC๋Š” JDBC ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ , ๋” ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ๋” ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

Spring JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  1. JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ ,
  2. ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€