๐Ÿ› ๏ธ Tool/BE

[DB] Embedded SQL๊ณผ Interactive SQL

seungineer = seungwoo + engineer 2025. 4. 13. 11:19

Embedded SQL์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— SQL ๋ฌธ์žฅ์„ ์ž„๋ฒ ๋”ฉํ•˜์—ฌ DB์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Interactive SQL์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ„ฐ๋ฏธ๋„์ด๋‚˜ ์ฝ˜์†”์—์„œ SQL ๋ฌธ์žฅ์„ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Embedded SQL์€ ํ˜ธ์ŠคํŠธ ์–ธ์–ด ์†Œ์Šค ์ฝ”๋“œ์— SQL์„ ์ง์ ‘ ์‚ฝ์ž…ํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, Java์˜ JDBC๋Š” Embedded SQL์ด ์•„๋‹ˆ๋ผ SQL์„ ๋Ÿฐํƒ€์ž„์— API๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

# ์ฃผ์š” ์ฐจ์ด์ 

## 1. ํ˜ธ์ŠคํŠธ ์–ธ์–ด ๋ณ€์ˆ˜ ์‚ฌ์šฉ

  • Embedded SQL์€ C, Java์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ SQL ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Interactive SQL์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ์ƒ์ˆ˜๊ฐ’๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ์–ธ์–ด ๋ณ€์ˆ˜ ๊ฐœ๋…์ด ์—†๋‹ค.
int empId = 1001;
String empName = "";

String query = "SELECT name FROM employee WHERE id = ?";

try (Connection conn = DriverManager.getConnection(url, username, password);
     PreparedStatement pstmt = conn.prepareStatement(query)) {

    pstmt.setInt(1, empId);  // ํ˜ธ์ŠคํŠธ ์–ธ์–ด ๋ณ€์ˆ˜
    ResultSet rs = pstmt.executeQuery();

    if (rs.next()) {
        empName = rs.getString("name");
    }

    System.out.println("์ง์› ์ด๋ฆ„: " + empName);

} catch (SQLException e) {
    e.printStackTrace();
}
  • ํ˜ธ์ŠคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ empId๋ฅผ SQL ์ฟผ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋Š” ํ˜•ํƒœ
SELECT id, name FROM employee;
  • ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์ง์ ‘ ๊ฐ’์„ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉ

## 2. ์—๋Ÿฌ์™€ ์ƒํƒœ ์ฒ˜๋ฆฌ

  • Embedded SQL์€ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์™€ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(SQLCA, SQL Communications Area)์— ์ €์žฅํ•˜์—ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Interactive SQL์€ ์—๋Ÿฌ ๋ฐ ์ƒํƒœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ‰๊ฐ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ๋‹ค.

### Java JDBC์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

try (Connection conn = DriverManager.getConnection(url, username, password);
     PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employee (id, name) VALUES (?, ?)")) {

    pstmt.setInt(1, empId);
    pstmt.setString(2, empName);
    pstmt.executeUpdate();

} catch (SQLException e) {
    System.err.println("SQL Error: " + e.getMessage()); // ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌ
}
  • SQLException์„ ํ†ตํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ

### C SQLCA์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

EXEC SQL INSERT INTO employee (id, name) VALUES (:emp_id, :emp_name);

if (SQLCA.SQLCODE != 0) {
    printf("Error occurred: %s\n", SQLCA.SQLERRM.sqlerrmc);
}
  • SQLCA๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ

### Interactive SQL์˜ ์—๋Ÿฌ ํ‘œ์‹œ

  • ์—๋Ÿฌ ๋ฐ ์ƒํƒœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ

## 3. ์ปค์„œ(Cursors)์˜ ์‚ฌ์šฉ

์ปค์„œ๋Š” ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ–‰์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ์—ญํ• ์ด๋‹ค.

  • Embedded SQL์€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ํ–‰(row)์”ฉ ์ˆœ์ฐจ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ปค์„œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Interactive SQL์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰์œผ๋กœ ์ „์ฒด ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค. ์ปค์„œ๋ฅผ ํ†ตํ•œ ํ•˜๋‚˜์˜ ํ–‰ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

### Java JDBC์˜ ์ปค์„œ ์‚ฌ์šฉ

String query = "SELECT id, name FROM employee";

try (Connection conn = DriverManager.getConnection(url, username, password);
     PreparedStatement pstmt = conn.prepareStatement(query);
     ResultSet rs = pstmt.executeQuery()) {

    while (rs.next()) {  // ResultSet์€ ์ปค์„œ์˜ ์—ญํ• ์„ ํ•จ
        int empId = rs.getInt("id");
        String empName = rs.getString("name");
        System.out.printf("Employee ID: %d, Name: %s%n", empId, empName);
    }

} catch (SQLException e) {
    e.printStackTrace();
}
  • ResultSet์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ปค์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ–‰์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

### Interactive SQL์˜ ์ปค์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

  • SQL ๊ฒฐ๊ณผ๊ฐ€ ์ฆ‰์‹œ ํ™”๋ฉด์— ๋ชจ๋‘ ์ถœ๋ ฅ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ–‰์„ ๊ฐœ๋ณ„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์„œ ๊ธฐ๋Šฅ์ด ์—†์Œ

## 4. ํผ(Forms) ๋ฌธ์žฅ ํ™œ์šฉ

Form์˜ ๋‚ด์šฉ์ด SQL์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ form ๋ฌธ์ž๋ฅผ ํ™œ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  • Embedded SQL์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ๋ฐ˜์‘์„ SQL์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Interactive SQL์€ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ์„ ์œ„ํ•œ ํ™”๋ฉด ์ œ์–ด๊ฐ€ ์—†๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ํ„ฐ๋ฏธ๋„ ์ž…์ถœ๋ ฅ๋งŒ ์ง€์›ํ•œ๋‹ค.

### Java JDBC์—์„œ ํผ ๋ฌธ์žฅ ํ™œ์šฉ

    private void saveEmployee() {
        int empId = Integer.parseInt(idField.getText());
        String empName = nameField.getText();

        String query = "INSERT INTO employee (id, name) VALUES (?, ?)";

        try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "pass");
             PreparedStatement pstmt = conn.prepareStatement(query)) {

            pstmt.setInt(1, empId);
            pstmt.setString(2, empName);
            pstmt.executeUpdate();

            JOptionPane.showMessageDialog(this, "Employee saved successfully!");

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Error: " + ex.getMessage());
        }
    }

 

  • idField.getText(), nameField.getText() ์™€ ๊ฐ™์ด ํผ ํ•„๋“œ์˜ ๋‚ด์šฉ์„ SQL์— ๋ฐ˜์˜ ๊ฐ€๋Šฅ

### Interactive SQL์˜ ํผ ๋ฌธ์žฅ ํ™œ์šฉ ๋ถˆ๊ฐ€

  • ์ž…๋ ฅํ•œ ๊ณ ์ • SQL๋ฌธ๋งŒ ์‹คํ–‰๋จ

## 5. ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • Embedded SQL์€ ๋Ÿฐํƒ€์ž„ ์ค‘ ๋™์ ์œผ๋กœ SQL๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ , ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ ์—ฐํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • Interactive SQL์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ณ ์ • SQL๋ฌธ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

### Java JDBC์˜ ์˜ˆ์‹œ

import java.sql.*;

public class DynamicSQLExample {
    public static void main(String[] args) {
        String tableName = "employee";   // ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
        String columnName = "name";      // ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
        int id = 1001;

        // ๋™์ ์œผ๋กœ SQL ์ƒ์„ฑ
        String sql = String.format("SELECT %s FROM %s WHERE id = ?", columnName, tableName);

        try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "pass");
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, id);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                String result = rs.getString(columnName);
                System.out.println(columnName + ": " + result);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • ๋‹ค์–‘ํ•œ ํ…Œ์ด๋ธ”์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋™์  ์ฟผ๋ฆฌ ๊ตฌ์„ฑ

### Interactive SQL ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ถˆ๊ฐ€

  • ๊ณ ์ • SQL๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ

6. ๋‹ค์ค‘ ์„ธ์…˜(Multiple Sessions) ์ง€์›

  • Embedded SQL์€ ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ DB์— ๋™์‹œ ์ ‘์†ํ•˜๊ฑฐ๋‚˜ ๊ฐ™์€ DB์— ์—ฌ๋Ÿฌ ์„ธ์…˜์„ ์—ด ์ˆ˜ ์žˆ๋‹ค.
  • Interactive SQL์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์„ธ์…˜์—์„œ ํ•˜๋‚˜์˜ DB์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

### Java JDBC์—์„œ ๋‹ค์ค‘ ์„ธ์…˜ ์‚ฌ์šฉ

public static void main(String[] args) {
        String dbUrl1 = "jdbc:mysql://localhost:3306/db1";
        String dbUrl2 = "jdbc:mysql://localhost:3306/db2";

        try (Connection conn1 = DriverManager.getConnection(dbUrl1, "user1", "pass1");
             Connection conn2 = DriverManager.getConnection(dbUrl2, "user2", "pass2")) {

            // ์„ธ์…˜ 1 ์‚ฌ์šฉ
            PreparedStatement pstmt1 = conn1.prepareStatement(
                "INSERT INTO employee (id, name) VALUES (?, ?)");
            pstmt1.setInt(1, 1001);
            pstmt1.setString(2, "Alice");
            pstmt1.executeUpdate();
            System.out.println("Inserted into db1");

            // ์„ธ์…˜ 2 ์‚ฌ์šฉ
            PreparedStatement pstmt2 = conn2.prepareStatement(
                "INSERT INTO employee (id, name) VALUES (?, ?)");
            pstmt2.setInt(1, 2002);
            pstmt2.setString(2, "Bob");
            pstmt2.executeUpdate();
            System.out.println("Inserted into db2");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
  • ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ธ์…˜1๊ณผ ์„ธ์…˜2์— ๋™์‹œ ์ ‘์† ๊ฐ€๋Šฅ

### Interactive SQL์€ ๋‹จ์ผ ์„ธ์…”๋งŒ ๊ฐ€๋Šฅ

  • ํ•˜๋‚˜์˜ ์ฝ˜์†”, ํ•˜๋‚˜์˜ ์„ธ์…˜์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ