๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/Java

[Java] JDBC(Java Database Connectivity)๋ž€? ์˜ˆ์‹œ ์ฝ”๋“œ๋กœ ์ž‘๋™ ๋ฐฉ๋ฒ• ๋ณด๊ธฐ

by HanaV 2023. 4. 17.
728x90

 JDBC: ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ž๋ฐ” API

JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

JDBC ์ฃผ์š” ์š”์†Œ

- JDBC ๋“œ๋ผ์ด๋ฒ„: JDBC API์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰
- JDBC API: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์ฟผ๋ฆฌ ์‹คํ–‰, ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” API(Connection, Statement, ResultSet ๋“ฑ)

 

JDBC ์ž‘๋™ ์ˆœ์„œ

1. JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค url, ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์•”ํ˜ธ ๋“ฑ์˜ ์—ฐ๊ฒฐ ์ •๋ณด ์ด์šฉ) ํ•˜๊ธฐ ์œ„ํ•ด Connection ๊ฐ์ฒด ์ƒ์„ฑ
3. Connection ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ Statement ๊ฐ์ฒด ์ƒ์„ฑ
4. Statement ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ -> ๊ฒฐ๊ณผ๋ฅผ ResultSet ๊ฐ์ฒด์— ๋ฐ›์Œ
5. ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌ
6. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ResultSet, Statement, Connection ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ์Œ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ข…๋ฃŒ)

 

์ด์ œ ์‚ฌ์šฉ๋˜๋Š” ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‚ดํŽด๋ณด์ž.

๋ฐ‘์€ ์ „์ฒด ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

package com.test.jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import com.test.member.Member;

public class JDBCConnection {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String uri = "jdbc:mysql://localhost:3306/webdev";
        String userid = "webmaster";
        String userpw = "12345";
        String query = "select userid, username, age from tbl_test order by userid"; //order ์•ˆ์ ์œผ๋ฉด ๊ทธ๋ƒฅ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋จ
        
        Connection con; //Statement ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ JDBC ์—ฐ๊ฒฐ ์ข…๋ฃŒ
        Statement stmt; //ResultSet ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
        ResultSet rs; //SQL๋ฌธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด์˜ค๋Š” ๊ฐ์ฒด๋กœ ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ํ–‰(๋ ˆ์ฝ”๋“œ ์œ„์น˜)์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฟผ๋ฆฌ

        Class.forName("org.mariadb.jdbc.Driver"); //JDBC ๋“œ๋ฆฌ์ด๋ฒ„ ๋กœ๋”ฉ
        con = DriverManager.getConnection(uri, userid, userpw);
        stmt = con.createStatement();
        rs = stmt.executeQuery(query);
        
        List<Member> list = new ArrayList<>(); //DTO
        
        while(rs.next()) {
            list.add(new Member(rs.getString("userid"), 
                                rs.getString("username"), 
                                rs.getInt("age")));
                
        }

        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(con != null) con.close();
        
        for(Member member: list)
            System.out.println("ID: " + member.getUserid() + 
                              "\nNAME:" + member.getUsername() +
                              "\nAGE: " + member.getAge());
        
    }
    
}

 

์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

๋จผ์ € ์—ฐ๊ฒฐ ์ •๋ณด๋“ค์„ ์„ค์ •ํ•ด์ฃผ๊ณ , Connection, Statement, ResultSet์„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด ์ค€๋‹ค.

        String uri = "jdbc:mysql://localhost:3306/webdev"; //๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค url
        String userid = "webmaster"; //์‚ฌ์šฉ์ž ์ด๋ฆ„
        String userpw = "12345"; //์•”ํ˜ธ
        String query = "select userid, username, age from tbl_test order by userid"; //์ฟผ๋ฆฌ๋ฌธ
        
        Connection con; //Connection ๋ณ€์ˆ˜ ์„ ์–ธ
        Statement stmt; //Statement ๋ณ€์ˆ˜ ์„ ์–ธ
        ResultSet rs; //ResultSet ๋ณ€์ˆ˜ ์„ ์–ธ

๊ทธ๋Ÿผ ์ด์ œ JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค. JDBC ๋“œ๋ผ์ด๋ฒ„๋Š”
MariaDB๋ฉด Class.forName("org.mariadb.jdbc.Driver");
MySQL์ด๋ฉด Class.forName("com.mysql.jdbc.Driver");
Oracle์ด๋ฉด Class.forName("oracle.jdbc.driver.OracleDriver");
๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

        Class.forName("org.mariadb.jdbc.Driver"); //JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ

JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œํ–ˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„๊นŒ ์„ค์ •ํ•œ ์—ฐ๊ฒฐ ์ •๋ณด๋“ค์„ ์ „๋‹ฌํ•œ๋‹ค. ์ „๋‹ฌํ•  ๋•Œ๋Š” Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. DriverManager.getConnection(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งํฌ, ์‚ฌ์šฉ์ž์ด๋ฆ„, ์•”ํ˜ธ)๋กœ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

        con = DriverManager.getConnection(uri, userid, userpw);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ธ ์ •๋ณด๋“ค๋กœ ์ ‘์†์ด ๋œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐ๋œ ํ›„์—๋Š” Statement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, Connection ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ .createStatement() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

        stmt = con.createStatement();

๊ทธ๋Ÿผ ์ด์ œ Statement ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด SQL๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. SQL๋ฌธ๊ณผ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์— ๋”ฐ๋ผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค.
์ œ์ผ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฉ”์„œ๋“œ๋งŒ ๋ช‡ ๊ฐœ ์†Œ๊ฐœํ•˜์ž๋ฉด,
-SELECT ๋ฌธ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” executeQuery()
-INSERT, UPDATE, DELETE๋ฌธ(DML๋ฌธ)์„ ์‹คํ–‰ํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ํ–‰์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” executeUpdate() -> ๋ฐ˜ํ™˜์€ int๊ฐ’
-SELECT๋ฌธ์ด๋‚˜ DML, DDL๋ฌธ์„ ์‹คํ–‰ํ•  ๋• execute() -> SELECT๋ฌธ์ด๋ฉด true ๋ฐ˜ํ™˜, DML, DDL๋ฌธ์ด๋ฉด false ๋ฐ˜ํ™˜

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” select๋ฌธ์ด๊ณ  selectํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— executeQuery()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

        rs = stmt.executeQuery(query);

๊ทธ๋Ÿผ ์ด์ œ ResultSet ๊ฐ์ฒด์—์„œ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์•ผ ํ•œ๋‹ค.

์šฐ์„  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ list๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•ด ์ค€๋‹ค. (Member ๊ฐ์ฒด์— ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋ฐ›์•„์˜ค๋ฏ€๋กœ List ํƒ€์ž…์„ Member ๊ฐ์ฒด๋กœ ํ•ด์ค€๋‹ค)

        List<Member> list = new ArrayList<>(); //DTO

์ด์ œ ๊ทธ list์— rs์˜ ๊ฐ’์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค. Member ๊ฐ์ฒด๋กœ ๋ฐ›์•„์•ผ ํ•˜๋ฏ€๋กœ ๋„ฃ์„ ๋•Œ๋งˆ๋‹ค Member ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

        while(rs.next()) {
            list.add(new Member(rs.getString("userid"), 
                                rs.getString("username"), 
                                rs.getInt("age")));
        }

next() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ํ–‰์œผ๋กœ ์ด๋™ํ•ด์„œ ๋‹ค์Œ ํ–‰์ด ์กด์žฌํ•˜๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ list์— ๋‹ค ๋ฐ›์•˜์œผ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ResultSet, Statement, Connection ๊ฐ์ฒด๋ฅผ ๋‹ซ์•„์ค€๋‹ค.

        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
        if(con != null) con.close();

๊ฐ์ฒด๊ฐ€ null์ด๋ฉด ๋‹ซ์„ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ close() ๋ฉ”์„œ๋“œ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•ด ์ค€๋‹ค.

์ด์ œ list์— ์ž˜ ๋‹ด๊ฒผ๋Š”์ง€ ํ™•์ธ์„ ํ•ด๋ณด๋ฉด

        for(Member member: list)
            System.out.println("ID: " + member.getUserid() + 
                              "\nNAME:" + member.getUsername() +
                              "\nAGE: " + member.getAge());

์ด๋ ‡๊ฒŒ list์— ์ •๋ณด๊ฐ€ ์ž˜ ๋‹ด๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

728x90

"); wcs_do();