๐Ÿงถ Spring | Spring Boot/Spring Data JPA

Java๋กœ JDBC ์‚ฌ์šฉํ•˜๊ธฐ

  • -

๐Ÿ”” ์ด ๊ธ€์„ ์ฝ๊ธฐ ์ „์— JDBC ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ์ฝ๊ณ  ์˜ค๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค!

JDBC๋ž€?

  • Java Database Connectivity
  • ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ž๋ฐ” API

์ค€๋น„๋ฌผ

  • DB ๋ฒค๋”๋ณ„ ์ปค๋„ฅํ„ฐ ํ•„์š”
    • MariaDB : https://mariadb.com/kb/en/about-mariadb-connector-j/
    • MySQL : https://dev.mysql.com/downloads/connector/j/
    • Oracle : https://www.oracle.com/kr/database/technologies/appdev/jdbc.html
    • ์ธํ…”๋ฆฌ์ œ์ด์˜ ๊ฒฝ์šฐ, Project Structure → Libraries → ๋‹ค์šด๋ฐ›์€ ์ปค๋„ฅํ„ฐ ์ถ”๊ฐ€ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
      • ํ›„์— Maven์ด๋‚˜ Gradle ์“ฐ๋ฉด ๊ตณ์ด ์‚ฌ์ดํŠธ ๋“ค์–ด๊ฐ€์„œ ๋‹ค์šด๋ฐ›๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„ฃ์„ ํ•„์š”์—†์ด ์ €์žฅ์†Œ ๊ฒ€์ƒ‰ํ•ด์„œ ๋‹ค์šด๋ฐ›์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

JDBC ์ˆœ์„œ ๐ŸŽจ

  1. JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
    • Class.forName(”๋“œ๋ผ์ด๋ฒ„ ๊ฒฝ๋กœ”)
      • Java Reflection์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜
      • JVM์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ JVM์— ๋กœ๋”ฉ์‹œํ‚จ๋‹ค.
      • ๋“œ๋ผ์ด๋ฒ„ ๊ฒฝ๋กœ๋Š” ๋ฒค๋”๋ณ„๋กœ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ €์žฅ๋œ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•ด๋ณด๊ณ  ์‚ฌ์šฉ
        • MariaDB : org.mariadb.jdbc.Driver
        • MySQL : com.mysql.cj.jdbc.Driver
        • Oracle : oracle.jdbc.driver.OracleDriver
  2. DB Connection ์ƒ์„ฑ
    • DriverManager.getConnection(”url”,”id”,”password”)
      • DriverManager
        • DB ๋“œ๋ผ์ด๋ฒ„๋“ค์„ ๊ด€๋ฆฌ,๋กœ๋”ฉํ•˜๊ณ , DB์— ์—ฐ๊ฒฐ์„ ์ฑ…์ž„์ง€๋Š” ํด๋ž˜์Šค
        • ์‚ฌ์šฉํ•  ๋“œ๋ผ์ด๋ฒ„๋Š” ๋“œ๋ผ์ด๋ฒ„ ๋งค๋‹ˆ์ €๊ฐ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๊ธฐ ์ „์— ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค.
          • new Driver() ์—†์ด๋„ DriverManager๊ฐ€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” Class.forName์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œํ•  ๋•Œ, ์ด๋ฏธ DriverManager์— ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
            Drive ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ฝ”๋“œ
  3. SQL์„ ์œ„ํ•œ Statement ๊ฐ์ฒด ์ƒ์„ฑ
    • Statement
      • ์ฟผ๋ฆฌ๋ฅผ ๋‹ด์•„ ์ „๋‹ฌํ•œ ๊ทธ๋ฆ‡
      • ์ข…๋ฅ˜
        • Statement
          • ๋‹จ์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋น ๋ฅธ ์†๋„๋ฅผ ์ง€๋‹˜
          • ๋งค๋ฒˆ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ
          • ์ฟผ๋ฆฌ์— ์ธ์ž๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์Œ
          • ์ทจ์•ฝ์ ์ด ์žˆ์–ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ถŒ๊ณ ๋˜์–ด์ง
          • String sql = "SELECT name, class FROM player"; Statement stmt = conn.createStatement(); ResultSet rs = s.executeQuery(sql);
        • PreparedStatement
          • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” statement
          • ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰๋  ๋•Œ ๋น ๋ฅธ ์†๋„๋ฅผ ์ง€๋‹˜
          • ์ฒ˜์Œ ํ”„๋ฆฌ ์ปดํŒŒ์ผ ๋œ ํ›„, ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
          • ์ฟผ๋ฆฌ์— ์ธ์ž ๋ถ€์—ฌ ๊ฐ€๋Šฅ ( = ๋™์  ์ฟผ๋ฆฌ ๊ฐ€๋Šฅ)
            • sql๋ฌธ์— ?๋ฅผ ์ด์šฉํ•ด์„œ setXXX()๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
            • ?๋Š” ์•ž์—์„œ๋ถ€ํ„ฐ 1,2,3~ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง
            String sql = "UPDATE player SET name = ?, position = ? where name = ?; ";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "ํ† ๋ฆฌ");
            pstmt.setString(2, "๊ณต๊ฒฉ์ˆ˜");
            pstmt.setString(3, "์ดˆ์ฝ”");
            
            ps.executeQuery();
        • CallableStatement
          • PreparedStatement + ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  4. SQL ๋ฌธ์žฅ ์‹คํ–‰
    • Execute
      • execute()
        • ๋ชจ๋“  ๊ตฌ๋ฌธ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
        • Boolean ๊ฐ’ ๋ฐ˜ํ™˜
          • ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ResultSet ์ผ ๊ฒฝ์šฐ true, ์•„๋‹ ๊ฒฝ์šฐ false
      • executerQuery()
        • ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ResultSet์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜
        • ์ฃผ๋กœ Select ๋ฌธ์— ์‚ฌ์šฉ
      • executeUpdate()
        • INSERT, UPDATE, DELETE ๋‚˜ CREATE, DROP ๋“ฑ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
        • ์˜ํ–ฅ์„ ๋ฐ›์€ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  5. SQL ์‹คํ–‰ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
    • ResultSet
      • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ ์ €์žฅํ•œ ์ธ์Šคํ„ด์Šค
      • ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌํ–‰์ผ ๊ฒฝ์šฐ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด๋ถ€์ ์œผ๋กœ ์ปค์„œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
        • ResultSet.next()
          • ์ปค์„œ๋ฅผ ๋‹ค์Œํ–‰์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
          • ๋ฐ˜ํ™˜๊ฐ’์€ Boolean (์ปค์„œ ์œ„์น˜์— ์ฒ˜๋ฆฌํ•  ํ–‰์ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false)
        • ResultSet.getXXX(int ์ปฌ๋Ÿผ ์œ„์น˜), ResultSet,getXXX(String ์ปฌ๋Ÿผ๋ช…)
          • ์ปค์„œ ์œ„์น˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
          • ๋ณดํ†ต ์ปฌ๋Ÿผ๋ช…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  6. JDBC ๊ฐ์ฒด ์—ฐ๊ฒฐ ํ•ด์ œ
    • ResultSet ํ•ด์ œ
    • Statement ํ•ด์ œ
    • Connection ํ•ด์ œ

์˜ˆ์‹œ

import java.sql.*;

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mariadb://localhost:3306/practice";
        String user = "admin";
        String password = "test";

        try {
            // 1. ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
            Class.forName("org.mariadb.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // ๋„์ค‘์— ์˜ค๋ฅ˜ ๋“ฑ์œผ๋กœ try๋ฌธ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ finally์—์„œ jdbc๊ฐ์ฒด๋“ค์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธ
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 2. Connection ๊ฐ์ฒด ์ƒ์„ฑ
            conn = DriverManager.getConnection(url, user, password);

            // 3. Statement ๊ฐ์ฒด ์ƒ์„ฑ
            String sql = "SELECT * FROM player WHERE position = ?;";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "๊ณต๊ฒฉ์ˆ˜");

            // 4. ์ฟผ๋ฆฌ ์‹คํ–‰
            rs = pstmt.executeQuery();

            // 5. ๊ฒฐ๊ณผ ์ˆ˜ํ–‰
            while (rs.next()) {
                String name = rs.getString("name");
                String pos_name = rs.getString("position");
                System.out.println(name + " / " + pos_name);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                // 6. JDBC ๊ฐ์ฒด ์—ฐ๊ฒฐ ํ•ด์ œ
                if (rs != null && !rs.isClosed()) {
                    rs.close();
                }

                if (pstmt != null && !pstmt.isClosed()) {
                    pstmt.close();
                }

                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.