๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ข ๋“ค์–ด๊ฐ€๋ฉฐ

์ตœ๊ทผ์— node-jdbc๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ—ท๊ฐˆ๋ ธ๋˜

JDBC api ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๋‹ค์‹œ ๋ณต์Šตํ•˜๊ณ ์ž ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•œ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  JDBC์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

๐Ÿค JDBC๋ž€?

Java Database Connectiviy ์˜ ์ค„์ž„๋ง์ด๋‹ค.
์ง์—ญํ•˜๋ฉด, ์ž๋ฐ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ฑ์ด๋ž€ ๋œป์ด๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ JDBC๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 


Javaํ”„๋กœ๊ทธ๋žจ๊ณผ์™€ DB ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Java API์˜ ์ง‘ํ•ฉ์ด๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, API ๊ฐœ๋…์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์•„๋ž˜ ๋‘ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ .

 

JDBC๋Š” JDK์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
JAVA๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณ„๋„์˜ ๋‹ค์šด๋กœ๋“œ ๊ณผ์ •์ด ํ•„์š” ์—†๋‹ค.

 

JDBC API ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

  1. ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ DB ๊ฐ„์˜ ์—ฐ๊ฒฐ
  2. SQL ๋ฌธ ๋งŒ๋“ค๊ธฐ
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ SQL ๋ฌธ ์‹คํ–‰
  4. SQL ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ณด๊ธฐ

๐Ÿ’ก ์ฐธ๊ณ ) ODBC ์™€ JDBC ์˜ ์ฐจ์ด

ODBC๋Š”
Open Database Connectivity ์˜ ์•ฝ์ž์ด๋‹ค.
JDBC ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  JDBC ODBC
์–ธ์–ด ์ง€์› ์ž๋ฐ” ์–ธ์–ด์— ํŠนํ™”๋˜์–ด ์žˆ๋‹ค. C/C++ ๊ธฐ๋ฐ˜ ์–ธ์–ด๋ฅผ ์ง€์›ํ•œ๋‹ค.
ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ Java ์–ธ์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. Windows ์šด์˜์ฒด์ œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
๋“œ๋ผ์ด๋ฒ„ ๊ด€๋ฆฌ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•œ๋‹ค. ODBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.
์„ฑ๋Šฅ ODBC ์— ๋น„ํ•ด ๋น ๋ฅด๋‹ค. JDBC์— ๋น„ํ•ด ๋Š๋ฆฌ๋‹ค.
๋ณด์•ˆ ์ž๋ฐ” ํ”Œ๋žซํผ์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณด์•ˆ C/C++ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ํ”Œ๋žซํผ์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์— ์˜์กด

๐Ÿค JDBC ๊ตฌ์กฐ

 

JDBC ๋Š” ํฌ๊ฒŒ JDBC API ์™€ JDBC Driver Maner๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

JDBC API๋Š” JDBC API ์™€ JDBC DRIVER API ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

JDBC API ๋Š” ์ž๋ฐ” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ JDBC Manager ๊ฐ„ ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๊ณ ,
JDBC DRIVER API ๋Š” JDBC Manager ์™€ JDBC DRIVER ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•œ๋‹ค.

 

JDBC Driver Manager ๋Š” JDBC API ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
๊ฐ DB์— ์—‘์„ธ์Šค ์˜ฌ๋ฐ”๋ฅธ JDBC Driver ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

JDBC DRIVER ๋Š” DB ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” jar ํŒŒ์ผ์ด๋‹ค.
์ด ํŒŒ์ผ์„ ํ†ตํ•ด DB ์™€์˜ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿค JDBC ๊ตฌ์„ฑ ๊ฐ์ฒด

JDBC Driver Manager ์ฒ˜๋Ÿผ JDBC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—”
๊ฐ์ข… Class ๋‚˜ Interface ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ๋ช‡๊ฐ€์ง€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.
์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  ๊ฐ์ฒด๋Š” Java Application ๊ตฌํ˜„ ์‹œ,
JDBC ๋ฅผ ์ ์šฉํ•  ๋•Œ ์ง์ ‘ ์ฝ”๋“œ์— ์จ๋ณด๊ฒŒ ๋ ํ…Œ๋‹ˆ, ์ž˜ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.

๐Ÿคš DriverManager

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„(jar ํŒŒ์ผ)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.
Java ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ์˜จ DB ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

๐Ÿคš Driver

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค.
๋Œ€์‹  DriverManager ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿคš Connection

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ๋ชจ๋“  ํ†ต์‹ ์€ Connection ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ˆ˜ํ–‰๋œ๋‹ค.

๐Ÿคš Statement

SQL ๋ฌธ์„ DB๋กœ ๋ณด๋‚ผ๋•Œ(์‹คํ–‰ํ•  ๋•Œ) ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿคš ResultSet

Statement ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿคš SQLException

DB์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์œ„ ๊ฐ์ฒด๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
DB ์—ฐ๊ฒฐ Java ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•ด ๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆˆ์— ์ต์ˆ™ํ• ์ง€๋„.

๐Ÿคš ์˜ˆ์ œ

import java.sql.*;

public class FirstExample {
   static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
   static final String USER = "guest";
   static final String PASS = "guest123";
   static final String QUERY = "SELECT id, first, last, age FROM Employees";

   public static void main(String[] args) {
      // Open a connection
      try(Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(QUERY);) {
         // Extract data from result set
         while (rs.next()) {
            // Retrieve by column name
            System.out.print("ID: " + rs.getInt("id"));
            System.out.print(", Age: " + rs.getInt("age"));
            System.out.print(", First: " + rs.getString("first"));
            System.out.println(", Last: " + rs.getString("last"));
         }
      } catch (SQLException e) {
         e.printStackTrace();
      }
   }
}

๐Ÿค JDBC ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

JDBC๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ํฌ๊ฒŒ 6๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.

  1. DB ์„ ํƒํ•˜๊ธฐ (ex. MySQL, PostgreSQL ๋“ฑ)
  2. ์„ ํƒํ•œ DB ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋‹ค์šด๋กœ๋“œ
  3. Java ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋‹จ์—์„œ JDBC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import
  4. ๋‹ค์šด๋กœ๋“œํ•œ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ฝ”๋“œ ๋‹จ์—์„œ ๋“ฑ๋ก
  5. ์—ฐ๊ฒฐํ•  DB๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” URL์„ ๋“ฑ๋ก
  6. DriverManager ๊ฐ์ฒด์˜ getConnection() ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœ์„ ์ฝ”๋”ฉํ•˜์—ฌ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์„ค์ •

์œ„ ๊ณผ์ •์„ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

๐Ÿคš Import JDBC Package

1, 2๋ฒˆ ๊ณผ์ •์€ ํฌ๊ฒŒ ๋” ์„ค๋ช…ํ•  ๋ถ€๋ถ„์ด ์—†์œผ๋‹ˆ 3๋ฒˆ์œผ๋กœ ๋„˜์–ด๊ฐ€์ž.

JDBC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
import ๋ฌธ์œผ๋กœ JDBC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด JAVA ์†Œ์Šค ์ฝ”๋“œ ๋‹จ์—์„œ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

import java.sql.*; // ํ‘œ์ค€ JDBC
import java.math.*; // BigDecimal, BigInteger ์ง€์›

๐Ÿคš JDBC ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ๋ก

DB ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
๋ฐฉ๋ฒ•์€ Class.forName(), DriverManager.registerDriver() ๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ• ์ด ๋‘๊ฐ€์ง€์ด๋‹ค.

Class.forName()

๋™์ ์œผ๋กœ JDBC ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ž๋™ ๋“ฑ๋ก ๋ฐ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„ ๊ตฌ์„ฑ๊ณผ ์ด๋™์ด ํŽธํ•ด ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŽธ์ด๋‹ค.

DriverManager.registerDriver()

Microsoft ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋น„ JDK ํ˜ธํ™˜ JVM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿคš DB URL ๋“ฑ๋ก

JDBC ๋กœ ์–ด๋–ค DB์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.
JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œํ•œ ํ›„ DriverManager.getConnection() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
DriverManager.getConnection() ๋ฉ”์†Œ๋“œ ์ธ์ž๋กœ ๊ฐ DB์˜ JDBC URL ์„ ์ž…๋ ฅํ•ด์„œ ๋“ฑ๋กํ•˜๋ฉด ๋œ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด DB ๋งˆ๋‹ค JDBC ์šฉ DB URL ์ด ๋‹ค๋ฅด๋‹ค.

RDBMS JDBC ๋“œ๋ผ์ด๋ฒ„ URL ํ˜•์‹
MySQL com.mysql.jdbc.Driver jdbc:mysql:// hostname/databaseName
ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@ hostname:port Number:databaseName
DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2: hostname:port Number/databaseName
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds: hostname: port Number/databaseName

์ง„ํ•˜๊ฒŒ ์น ํ•ด์ง„ ๊ธ€์”จ ๋ถ€๋ถ„์ด ๊ณ ์ •๋œ JDBC URL ๊ฐ’์ด๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋งŒ ๊ฐ DB ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

DriverManager.getConnection(String url);

๐Ÿคš User, Password ๋“ฑ๋ก

DriverManager.getConnection() ๋ฉ”์†Œ๋“œ ์ธ์ž๋กœ JDBC URL ์„ ๋„ฃ์–ด ์–ด๋–ค DB์— ์—ฐ๊ฒฐํ• ๊ฑด์ง€ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•ž์„œ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ,
์‚ฌ์‹ค ์ด ์ •๋ณด๋งŒ์œผ๋กœ๋Š” DB์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
DB์— ์ ‘์†ํ•˜๊ธฐ์œ„ํ•ด์„  ์ด DB์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผํ•œ๋‹ค.
์ฆ‰, User์™€ Password ์ •๋ณด๋ฅผ DriverManager.getConnection() JDBC URL๊ณผ ํ•จ๊ป˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์•ผํ•œ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ DriverManager.getConnection() ์— JDBC URL ๊ณผ User, Password๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ž์—ด ํ•˜๋‚˜๋กœ ํ†ต์งธ๋กœ ๋„˜๊ธฐ๊ธฐ

String URL = "jdbc:oracle:thin:username/password@amrood:1521:EMP";
Connection conn = DriverManager.getConnection(URL);

๊ฐ๊ฐ ์ธ์ž๋กœ ๋„˜๊ธฐ๊ธฐ

String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);

Properties ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ’ก Properties
ํ‚ค, ๊ฐ’์œผ๋กœ ์ด๋ค„์ง„ ๊ฐ์ฒด

 

import java.util.*;

String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

Connection conn = DriverManager.getConnection(URL, info);

๐Ÿค JDBC ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ

JDBC ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚˜๋ฉด DB ์—ฐ๊ฒฐ์„ ๋ช…์‹œ์ ์œผ๋กœ

์ด๋ฅผ ๊นŒ๋จน์„ ๊ฒฝ์šฐ Java ์˜ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ DB ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ  ๋น„์šด๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ์— ์˜์กดํ•˜๋ฉด ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ˆ ๋ช…์‹œ์ ์œผ๋กœ ๊ผญ ์ข…๋ฃŒ์‹œ์ผœ์ฃผ์ž.

๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ์˜ ๊ฐœ๋…์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ .

DB ์—ฐ๊ฒฐ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด ๋‹ซ์•„์ค„ ์ˆ˜ ์žˆ๋‹ค.

conn.close();

์ด๋ ‡๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ๋‹ซ์œผ๋ฉด DBMS ์ž์›์„ ์•„๋‚„ ์ˆ˜ ์žˆ์–ด DB ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

๐Ÿค Statement

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋Š๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์œผ๋‹ˆ,

์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ๊ณผ์ •์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ์‚ดํŽด๋ณด์ž.

 

์•ž์„œ JDBC ๊ตฌ์„ฑ ๊ฐ์ฒด์—์„œ ์„ค๋ช…ํ•œ Statement ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

Statement ์ธํ„ฐํŽ˜์ด์Šค๋Š” SQL ๋ช…๋ น์„ DB๋กœ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.
๋˜ํ•œ, Java ์™€ ์„œ๋กœ ๋‹ค๋ฅธ SQL ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ž‡๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Statement ๋Š” ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์ฒ˜
Statement ๋Ÿฐํƒ€์ž„์— ์ •์  SQL ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. SQL ๋ช…๋ น์„ ๋ณด๋‚ผ ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๊ฑธ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
PreparedStatement SQL ๋ช…๋ น์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ณด๋‚ผ ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๋Ÿฐํƒ€์ž„ ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๊ฑธ ํ—ˆ์šฉํ•œ๋‹ค.
CallableStatement DB ๋‚ด ํ”„๋กœ์‹œ์ €์— ์ ‘๊ทผํ• ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๋Ÿฐํƒ€์ž„ ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๊ฑธ ํ—ˆ์šฉํ•œ๋‹ค.

๐Ÿคš Statement

Statement ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Statment ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—,
๋จผ์ € Connection ๊ฐ์ฒด์˜ createStatment() ๋ฉ”์†Œ๋“œ๋กœ Statement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Statement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด, ์•„๋ž˜ ์„ธ๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด SQL ๋ฌธ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • boolean execute(String SQL)
    • ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. DDL(create, drop...)์„ ์“ธ ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • int executeUpdate(String SQL)
    • ๊ฒฐ๊ณผ rows์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. insert, update, delete ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค.
  • ResultSet executeQuery(String SQL)
    • ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. select ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค.

Statement ๊ฐ์ฒด ๋‹ซ๊ธฐ

Connection ๊ฐ์ฒด๋ฅผ ๋‹ซ๋“ฏ์ด, DB ์ž์›์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ Statement ๊ฐ์ฒด๋„ ๋‹ซ์•„์ค˜์•ผํ•œ๋‹ค.
Statement ๊ฐ์ฒด๋Š” ํ•œ SQL ๋ฌธ ๋‹น ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
Statement ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜๋ คํ•˜์ง€ ๋ง๊ณ , ํ•œ SQL ๋ฌธ์„ ์‹คํ–‰์‹œ์ผฐ๋‹ค๋ฉด ๋ฐ”๋กœ ๋‹ซ์•„์ฃผ์ž.
๋‹จ์ˆœํžˆ close() ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

๐Ÿคš PreparedStatment

PreparedStatment ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

// PreparedStatement ์ƒ์„ฑ
String sql = "SELECT * FROM your_table WHERE column1 = ? AND column2 = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

// ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ •
String parameterValue1 = "value1";
String parameterValue2 = "value2";
preparedStatement.setString(1, parameterValue1);
preparedStatement.setString(2, parameterValue2);

// ์ฟผ๋ฆฌ ์‹คํ–‰
ResultSet resultSet = preparedStatement.executeQuery();

PreparedStatement ๋Š” SQL ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
JDBC ์˜ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋งˆ์ปค์ธ ๋ฌผ์Œํ‘œ๋กœ ํ‘œํ˜„๋œ๋‹ค.

๋ฌผ์Œํ‘œ(ํŒŒ๋ผ๋ฏธํ„ฐ)์˜ ๊ฐ’์€ ์‹คํ–‰ ์ „์— ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌ๋˜์–ด์•ผํ•œ๋‹ค.
๊ทธ๋ ‡์ œ ์•Š๋‹ค๋ฉด SQLException ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ฌผ์Œํ‘œ์— ๊ฐ’์„ ์ฃผ๊ธฐ ์œ„ํ•ด์„  setXXX() ๋ฉ”์†Œ๋“œ๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.
์—ฌ๊ธฐ์„œ XXX๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ’์˜ Java ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
๊ทธ ์˜ˆ๋กœ๋Š”, setString() ์ด ์žˆ๋‹ค.

 

๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ๋งˆ์ปค(๋ฌผ์Œํ‘œ)๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ฐธ์กฐ๋œ๋‹ค.
์ฒซ๋ฒˆ์งธ ๋งˆ์ปค(๋ฌผ์Œํ‘œ)์˜ ์œ„์น˜๋Š” 1, ๋‘๋ฒˆ์งธ ๋งˆ์ปค(๋ฌผ์Œํ‘œ)์˜ ์œ„์น˜๋Š” 2.

Statement ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ PreparedStatment ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

PreparedStatment ๊ฐ์ฒด ๋‹ซ๊ธฐ

Statement ๊ฐ์ฒด๋ฅผ ๋‹ซ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ PreparedStatement ๊ฐ์ฒด๋„ ๋‹ซ์•„์ค˜์•ผํ•œ๋‹ค.
์—ญ์‹œ, ๊ฐ„๋‹จํžˆ close() ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

์ฐธ๊ณ ๋กœ Statement ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ PreparedStatment ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ ์ข…๋ฃŒ ์‹œํ‚ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๊ณ  ๋‚œ ๋’ค์—์•ผ ๋‹ซ์•„์ค˜์•ผํ•œ๋‹ค.

๋ณดํ†ต close ๋Š” finally ์— ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

// Execute the statement
try (PreparedStatement pstmt = connection.prepareStatement("SELECT 1 FROM DUAL")) {

    // Fetch a first ResultSet
    try (ResultSet rs1 = pstmt.executeQuery()) { ... }

    // Without closing the statement, execute it again to fetch another ResultSet
    try (ResultSet rs2 = pstmt.executeQuery()) { ... }
} finally {
   pstmt.close();
}

๐Ÿคš CallableStatment

CallableStatment ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํ”„๋กœ์‹œ์ €๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.

ํ”„๋กœ์‹œ์ € ์ƒ์„ฑํ•˜๊ธฐ

CallableStatment ๋Š” PreparedStatment ์ฒ˜๋Ÿผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์‹œ์ €์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜ํ•œ ์ดํ•ดํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ํ”„๋กœ์‹œ์ € ์ƒ์„ฑ๋ฌธ ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

์œ„ ๋ช…๋ น์€ ์˜ค๋ผํด์—์„œ ์ž‘์„ฑ๋˜์—ˆ๊ณ  getEmpName์ด๋ผ๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.

์œ„ ํ”„๋กœ์‹œ์ €์—์„œ EMP_ID ์™€ EMP_FIRST ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช… ๋’ค์˜ IN, OUT ์€ ๋ฌด์Šจ ๋œป์ผ๊นŒ?

PreparedStatement๊ฐ€ IN(๋ฐ›๋Š”) ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์‚ฌ์šฉ๋๋˜ ๋ฐ˜๋ฉด,

CallableStatement๋Š” ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…
IN SQL statment๊ฐ€ ์ƒ์„ฑ๋  ๋• ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†๊ณ , setXXX() ๋”ฐ์œ„๋กœ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•ด์ค˜์•ผ ์•Œ ์ˆ˜ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ
OUT SQL statment๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ ์ œ๊ณต๋˜๋Š” ๊ฐ’. getXXX() ๋ฉ”์†Œ๋“œ๋กœ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
INOUT input๊ณผ output์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ. setXXX()๋กœ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  getXXX() ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

CallableStatment ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

try {
   // ์ €์žฅ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์„ ์œ„ํ•œ CallableStatement ์ƒ์„ฑ
   CallableStatement cstmt = null;
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall(SQL);

   // ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ • (์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜)
   int inputParameter = 123;
   callableStatement.setInt(1, inputParameter);

   // ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ๋ก (๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜)
   callableStatement.registerOutParameter(2, Types.VARCHAR);

   // ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰
   callableStatement.execute();

   // ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ
   int outputParameter = callableStatement.getInt(2);
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ž์„œ ์ƒ์„ฑํ•œ getEmpName์ด๋ผ๋Š” ํ”„๋กœ์‹œ์ €๊ฐ€ ์กด์žฌํ•  ๋•Œ,

์ด ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰์‹œํ‚ค ์œ„ํ•ด์„  ์œ„์™€๊ฐ™์ด ์ž…๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

CallableStatement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ”„๋กœ์‹œ์ €๋ฅผ call ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ

prepareCall๋ฉ”์†Œ๋“œ์— ๋‹ด์•„๋ณด๋‚ด๋ฉด ๋œ๋‹ค.

 

PreparedStatment ์ฒ˜๋Ÿผ ๋ฌผ์Œํ‘œ ๋งˆ์ปค๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ set ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

CallableStatment ๋งŒ์˜ ์ƒˆ๋กœ์šด ์š”์†Œ์ธ ์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„ ,

registerOutParameter ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ ์œ„์น˜(์ˆœ์„œ)์™€ ํƒ€์ž…์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์šฉ๋„์ด๋‹ค.

 

๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•ด์ค€ ๋’ค execute ๋ฉ”์†Œ๋“œ๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ ,

์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‹คํ–‰ ์ดํ›„์— getXXX()๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ XXX์—๋Š” ํƒ€์ž…์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

CallableStatment ๊ฐ์ฒด ๋‹ซ๊ธฐ

๋‹ค๋ฅธ Statment ๊ฐ์ฒด์™€ ๊ฐ™์€ ์ด์œ ๋กœ CallableStatement ๊ฐ์ฒด๋„

์‚ฌ์šฉ ๋’ค์—” ๊ผญ ๋‹ซ์•„์ค˜์•ผํ•œ๋‹ค.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

๐Ÿค ResultSet

Statment ๊ฐ์ฒด์˜ execute ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์ด์šฉํ•ด SQL ๋ฌธ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•˜๋‹ค.

์ด์ œ ์ด SQL์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

 

exeute ๋ฉ”์†Œ๋“œ ๋“ฑ์œผ๋กœ ์กฐํšŒํ•œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” ResultSet ์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋‹ด๊ฒจ ์˜จ๋‹ค.

ResultSet์€ ์ปค์„œ๋กœ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ํ•œ ํ–‰์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ์ถ”ํ›„์— ์„ค๋ช…ํ•œ next() ๋”ฐ์œ„์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

ResultSet ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋Š” ์ผ์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ์ปค์„œ ์ด๋™
  • ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ. ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ

์•ž์„œ ์„ค๋ช…ํ•œ Statement ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ , ResultSet์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ,

์ด Statement๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ResultSet์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

createStatement(int RSType, int RSConcurrency);
prepareStatment(string SQL, int RSType, int RSConcurrency);
prepareCall(String sql, int RSType, int RSConcurrency);

๐Ÿคš ResultSetType

์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ํŽธ์˜๋ฅผ ์œ„ํ•ด ResultSetType์˜ ์ค„์ž„๋ง๋กœ RSType ์ด๋ผ๊ณ  ๋ช…์นญํ–ˆ๋‹ค.
ResultSetType.

๋ง ๊ทธ๋Œ€๋กœ ResultSet์˜ ์œ ํ˜•์„ ์˜๋ฏธํ•œ๋‹ค.

ResultSetType ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์„ธ๊ฐ€์ง€ ํƒ€์ž…์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Type Description
ResultSet.TYPE_FORWARD_ONLY ResultSetType ์„ ์ฃผ์ง€ ์•Š๊ณ  Statement๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์„ค์ •๋˜๋Š” default ResultSetType์ด๋‹ค. ์ปค์„œ๋ฅผ ์•ž์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.
ResultSet.TYPE_SCROLL_INSENSITIVE ์ปค์„œ๋ฅผ ์•ž ๋’ค๋กœ ์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ResultSet์€ ResultSet์ด ์ƒ์„ฑ๋œ ํ›„ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ResultSet์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
ResultSet.TYPE_SCROLL_SENSITIVE. ์ปค์„œ๋ฅผ ์•ž๋’ค๋กœ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ResultSet์€ REsultSet์ด ์ƒ์„ฑ๋œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ResultSet๋„ ๋ณ€๊ฒฝ๋œ๋‹ค.

๐Ÿคš Concurrency of ResultSet

์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ํŽธ์˜๋ฅผ ์œ„ํ•ด ResultSet Concurrency์˜ ์ค„์ž„๋ง๋กœ RSConcurrency ์ด๋ผ๊ณ  ๋ช…์นญํ–ˆ๋‹ค.

Concurrency.

๋ฒˆ์—ญํ•˜๋ฉด '๋™์‹œ์„ฑ'์ด๋ž€ ๋œป์ด๋‹ค.
ResultSet์„ ํ†ตํ•œ DB ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด๋‹ค.
Concurrency ์˜ ๊ฐ’์œผ๋กœ๋Š” ์•„๋ž˜ ๋‘๊ฐ€์ง€๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Concurrency Description
ResultSet.CONCUR_READ_ONLY ์ฝ๊ธฐ ์ „์šฉ ResultSet์„ ๋งŒ๋“ ๋‹ค. Statment ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Concurrency๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์„ค์ •๋˜๋Š” default ๊ฐ’์ด๋‹ค.
ResultSet.CONCUR_UPDATABLE ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ResultSet์„ ๋งŒ๋“ ๋‹ค.

๐Ÿคš ResultSet ์ปค์„œ ์ด๋™

ResultSet์€ ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ์˜ ํ•œ row๋ฅผ ์ปค์„œ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
ํ•ด๋‹น ์ปค์„œ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • public void beforeFirst() throws SQLExceiption
    • ์ฒซ๋ฒˆ์งธ ํ–‰ ๋ฐ”๋กœ ์•ž์— ์„œ์ปค๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.
  • public void afterLast() throws SQLException
    • ๋งˆ์ง€๋ง‰ ํ–‰ ๋ฐ”๋กœ ๋’ค์— ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.
  • public boolean first() throws SQLException
    • ์ปค์„œ๋ฅผ ์ฒซ๋ฒˆ์งธ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  • public void last() throws SQLException
    • ์ปค์„œ๋ฅผ ๋งˆ์ง€๋ง‰ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  • public boolean absolute(int row) throws SQLException
    • ์ปค์„œ๋ฅผ ์ง€์ •๋œ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  • public boolean relative(int row) throws SQLException
    • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์—์„œ ์ฃผ์–ด์ง„ ํ–‰ ์ˆ˜์˜ ์ปค์„œ๋ฅผ ์•ž ๋’ค๋กœ ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.
  • public boolean previous() throws SQLException
    • ์ปค์„œ๋ฅผ ์ด์ „ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ด์ „ ํ–‰์ด ResultSet์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • public boolean next() throws SQLException
    • ์ปค์„œ๋ฅผ ๋‹ค์Œ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ ํ–‰์ด ResultSet์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • public int getRow() throws SQLException
    • ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • public void moveToInsertRow() throws SQLException
    • ์ปค์„œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ ํ–‰์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ResultSet์˜ ํŠน์ˆ˜ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ํ˜„์žฌ ์ปค์„œ ์œ„์น˜๊ฐ€ ๊ธฐ์–ต๋œ๋‹ค.
  • public void moveToCurrentRow() throws SQLException
    • ์ปค์„œ๊ฐ€ ํ˜„์žฌ ์‚ฝ์ž… ํ–‰์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ปค์„œ๋ฅผ ๋‹ค์‹œ ํ˜„์žฌ ํ–‰์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

๐Ÿคš ResultSet ๋ฐ์ดํ„ฐ ์กฐํšŒ

์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํ˜„์žฌ ํ–‰์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„ 
getXXX ํ˜•ํƒœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด๋œ๋‹ค.
XXX๋Š” ๊ฐ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„ ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด
ํ˜„์žฌ ์ปค์„œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํ–‰์˜ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

Name Age Salary
Alice 28 50000
Bob 35 60000
Carol 24 45000

์˜ˆ๋ฅผ ๋“ค์–ด,
ResultSet์˜ ๊ฒฐ๊ณผ๊ฐ€ ์œ„์™€ ๊ฐ™๊ณ  ํ˜„์žฌ ์ปค์„œ๊ฐ€ ์ฒซ๋ฒˆ์งธ row ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์„ ๋–„,
resultSet.getInt(2) ๋ฅผ ํ•˜๋ฉด 28์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
resultSet.getInt('Salary') ์„ ํ•˜๋ฉด 50000๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿคš ResultSet ์—…๋ฐ์ดํŠธ

์กฐํšŒ์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ResultSet์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
updateXXX ๋กœ ResultSet์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
XXX๋Š” ํƒ€์ž…์ด๋‹ค.


updateXXX ๋ฉ”์†Œ๋“œ์— ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋˜๋Š” ์ธ๋ฑ์Šค์™€ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋ฉด
ResultSet์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex) resultSet.updateString(1, 'test');

 

๋‹จ, updateXXX ๋Š” ์ผ์‹œ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ €์žฅ ๊ฐœ๋…์œผ๋กœ updateRow() ๋ฅผ ํ˜ธ์ถœํ•ด์ค˜์•ผํ•œ๋‹ค.

resultSet.updateInt("Age", 29); // 'Age' ์—ด์˜ ๊ฐ’์„ 29๋กœ ์—…๋ฐ์ดํŠธ
resultSet.updateRow(); // ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜

์ด ์™ธ์—๋„ ResultSet์„ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • public void deleteRow()
    • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” row๋ฅผ DB๋กœ๋ถ€ํ„ฐ ์‚ญ์ œ ์‹œํ‚จ๋‹ค.
  • public void refreshRow()
    • DB ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋ฉฐ ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” row๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•œ๋‹ค.
  • public void cancelRowUpdates()
    • ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” row ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ทจ์†Œํ•œ๋‹ค.
  • public void insertRow()
    • ์ปค์„œ๊ฐ€ insert row๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์„ ๋•Œ DB์— row๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  JDBC์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

๋Œ“๊ธ€, ํ•˜ํŠธ, ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค ๐Ÿ˜‡

'JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] ์ธํ„ฐํŽ˜์ด์Šค๋ž€? (๋‹คํ˜•์„ฑ, ์ถ”์ƒํด๋ž˜์Šค, implements)  (0) 2022.02.15

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | ์ž๊ธฐ๊ณ„๋ฐœ | ๋ฏธ๋ผํด ๋ชจ๋‹ | ์ผ์ƒ