Post

[Java] DB ์—ฐ๋™

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

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Oracle/MySQL๋กœ ์ž‘์—…ํ•˜๋˜ ๊ฒƒ์„ ์ž๋ฐ”์™€ ์—ฐ๋™(JDBC)ํ•ด, ์ž๋ฐ”์—์„œ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€(insert)ํ•˜๊ณ  ์กฐํšŒ(select)ํ•œ๋‹ค.

JDBC(Java Database Connectivity)๋ž€? ์ž๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ธฐ์ˆ . java.sql ํŒจํ‚ค์ง€์—์„œ ์ง€์›ํ•œ๋‹ค.

DB ์—ฐ๋™์€ ํ•ญ์ƒ 4๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

flowchart LR
    A["โ‘  ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ<br>Class.forName(...)"] --> B["โ‘ก ์ ‘์†<br>DriverManager.getConnection"]
    B --> C["โ‘ข ์ฟผ๋ฆฌ ์‹คํ–‰<br>PreparedStatement"]
    C --> D["โ‘ฃ DB ํ•ด์ œ<br>close()"]

    style B fill:#F80000,color:#fff
    style C fill:#326CE5,color:#fff

1. INSERT โ€” ์ž๋ฐ”์—์„œ DB์— ์ถ”๊ฐ€

GUI(Swing)๋กœ ์ฑ… ์ด๋ฆ„ยท๊ฐ€๊ฒฉ์„ ์ž…๋ ฅ๋ฐ›์•„ Oracle์˜ book ํ…Œ์ด๋ธ”์— ๋„ฃ๋Š”๋‹ค. (์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด ๋ณด์ด์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ Frame ๋””์ž์ธ์ด๊ณ , ํ•ต์‹ฌ์€ connect()์™€ insert()๋‹ค.)

โ‘  ์ ‘์† โ€” connect()

1
2
3
4
5
6
7
8
9
10
11
public void connect() {
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");   // โ‘  ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
        con = DriverManager.getConnection(                  // โ‘ก ์ ‘์†
            "jdbc:oracle:thin:@localhost:1521:XE", "batman", "1234");
    } catch (ClassNotFoundException e) {
        JOptionPane.showMessageDialog(this, "๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(this, "SQL์— ์ ‘์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
}

์ ‘์† URL์„ ๋œฏ์–ด๋ณด๋ฉด ์ด๋ ‡๋‹ค.

๋ถ€๋ถ„๊ฐ’์˜๋ฏธ
ํ”„๋กœํ† ์ฝœjdbc:oracle:thinOracle thin ๋“œ๋ผ์ด๋ฒ„
ํ˜ธ์ŠคํŠธ@localhost๋‚ด ์ปดํ“จํ„ฐ
ํฌํŠธ1521Oracle ๊ธฐ๋ณธ ํฌํŠธ
SIDXEOracle XE ๋ฒ„์ „
ย "batman", "1234"๊ณ„์ • / ๋น„๋ฐ€๋ฒˆํ˜ธ

๐Ÿ’ก Class.forName(...)์€ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•œ ๋“œ๋ผ์ด๋ฒ„(javaโ†”DB ๋‹ค๋ฆฌ)๋ฅผ ๋กœ๋“œํ•œ๋‹ค. DriverManager.getConnection์€ ์ ‘์† ํ›„ Connection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ๋ฉค๋ฒ„๋ณ€์ˆ˜ con์— ๋‹ด๋Š”๋‹ค. con์— ๊ฐ’์ด ์ž˜ ๋“ค์–ด๊ฐ”์œผ๋ฉด ์ ‘์† ์„ฑ๊ณต์ด๋‹ค.

โ‘ก ์‚ฝ์ž… โ€” insert()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void insert() {
    String name_value = book_name.getText();
    int price_value = Integer.parseInt(price.getText());   // String โ†’ int

    String sql = "insert into book(book_id, book_name, price) " +
                 "values(seq_book.nextval, '" + name_value + "', " + price_value + ")";
    PreparedStatement pstmt = null;
    try {
        if (con != null) {
            pstmt = con.prepareStatement(sql);       // ์ฟผ๋ฆฌ ์ค€๋น„
            int result = pstmt.executeUpdate();      // DML ์‹คํ–‰ (insert/update/delete)
            if (result > 0) JOptionPane.showMessageDialog(this, "๋“ฑ๋ก ์„ฑ๊ณต");
            else            JOptionPane.showMessageDialog(this, "๋“ฑ๋ก ์‹คํŒจ");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
    }
}
์š”์†Œ์—ญํ• 
PreparedStatement์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
executeUpdate()DML(insert/update/delete) ์‹คํ–‰, ์˜ํ–ฅ๋ฐ›์€ ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

๐Ÿ’ก executeUpdate()๋Š” ์ •์ƒ์ด๋ฉด ์ฒ˜๋ฆฌ๋œ ํ–‰ ์ˆ˜(>0), ์—๋Ÿฌ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ if(result > 0)์œผ๋กœ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

Desktop View Desktop View

์ข…๋ฃŒ ์‹œ ์ž์› ํ•ด์ œ

1
2
3
4
5
6
this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
        try { con.close(); } catch (SQLException e1) {}   // DB ์ž์› ํ•ด์ œ
        System.exit(0);
    }
});

โš ๏ธ ๋ณดํ†ต์€ setDefaultCloseOperation(EXIT_ON_CLOSE)์„ ์“ฐ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” WindowListener๋ฅผ ์ต๋ช… ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋ฟ ์•„๋‹ˆ๋ผ ์ ‘์†ํ•ด๋‘” DB ์ž์›์„ ์ง์ ‘ ํ•ด์ œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


2. SELECT โ€” DB์—์„œ ์ž๋ฐ”๋กœ ์กฐํšŒ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, pass);

String sql = "select * from book";
PreparedStatement pstmt = con.prepareStatement(
    sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet rs = pstmt.executeQuery();   // select ์‹คํ–‰ โ†’ ๊ฒฐ๊ณผ ํ‘œ๋ฅผ ์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ๋กœ

rs.next(); rs.next();                  // ์ปค์„œ๋ฅผ 2๋ฒˆ์งธ ํ–‰์œผ๋กœ
System.out.println(rs.getInt("book_id"));
System.out.println(rs.getString("book_name"));

rs.previous();                         // ์ด์ „ ํ–‰์œผ๋กœ
rs.beforeFirst();                      // ์ปค์„œ ์›์ƒ๋ณต๊ท€ (0๋ฒˆ์งธ)
while (rs.next()) {                    // ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœํšŒ
    System.out.println(rs.getInt("book_id"));
}

INSERT์™€ ๋‹ฌ๋ผ์ง€๋Š” ์ ์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

ํ•ญ๋ชฉINSERTSELECT
์‹คํ–‰ ๋ฉ”์†Œ๋“œexecuteUpdate()executeQuery()
๋ฐ˜ํ™˜ํ˜•int(ํ–‰ ์ˆ˜)ResultSet(๊ฒฐ๊ณผ ํ‘œ)
์˜ต์…˜์—†์ŒTYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY

๐Ÿ’ก prepareStatement์˜ ๋‘ ์˜ต์…˜: TYPE_SCROLL_INSENSITIVE๋Š” ์ปค์„œ๋ฅผ ์œ„์•„๋ž˜๋กœ ์ž์œ ๋กญ๊ฒŒ ์›€์ง์ด๊ฒŒ ํ•˜๊ณ , CONCUR_READ_ONLY๋Š” ์ž๋ฐ”์˜ ์กฐํšŒ๊ฐ€ ์‹ค์ œ ์„œ๋ฒ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ ์ „๋ฐฉํ–ฅ ์ „์šฉ์ด๋ผ previous()๊ฐ€ ์—๋Ÿฌ๋‚œ๋‹ค.)

ResultSet์˜ ์ปค์„œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

๋ฉ”์†Œ๋“œ๋™์ž‘
next()์ปค์„œ๋ฅผ ํ•œ ์นธ ์•ž์œผ๋กœ (๋ ˆ์ฝ”๋“œ ์žˆ์œผ๋ฉด true)
previous()ํ•œ ์นธ ๋’ค๋กœ
beforeFirst()0๋ฒˆ์งธ ํ–‰(๋งจ ์•ž)์œผ๋กœ ๋ณต๊ท€
getInt/getString("์ปฌ๋Ÿผ")ํ˜„์žฌ ํ–‰์˜ ์ปฌ๋Ÿผ ๊ฐ’

๐Ÿ’ก ResultSet์˜ ์ดˆ๊ธฐ ์ปค์„œ ์œ„์น˜๋Š” 0๋ฒˆ์งธ ํ–‰(์ฒซ ํ–‰์ด ์•„๋‹˜)์ด๋‹ค. ๊ทธ๋ž˜์„œ next()๋ฅผ ํ•œ ๋ฒˆ ํ•ด์•ผ ์ฒซ ํ–‰์„ ๋งŒ๋‚œ๋‹ค. while(rs.next())๋Š” ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€(false) ์ˆœํšŒํ•˜๋ฏ€๋กœ ์ „์ฒด ์กฐํšŒ์— ๋”ฑ ๋งž๋Š”๋‹ค.

Desktop View Desktop View


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
JDBC DB ์—ฐ๋™ (java.sql)
โ”œโ”€ 4๋‹จ๊ณ„    ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ โ†’ ์ ‘์† โ†’ ์ฟผ๋ฆฌ ์‹คํ–‰ โ†’ ํ•ด์ œ
โ”œโ”€ INSERT   PreparedStatement + executeUpdate() (ํ–‰ ์ˆ˜ ๋ฐ˜ํ™˜)
โ”œโ”€ SELECT   executeQuery() โ†’ ResultSet (์ปค์„œ๋กœ ์ˆœํšŒ)
โ”œโ”€ ์ปค์„œ     ์ดˆ๊ธฐ 0๋ฒˆ์งธ, next()/previous()/beforeFirst()
โ””โ”€ ์ž์›      finally / windowClosing์—์„œ close() ํ•„์ˆ˜
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
JDBC์ž๋ฐ”๋กœ DB๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ธฐ์ˆ 
ConnectionDB์™€์˜ ์—ฐ๊ฒฐ ๊ฐ์ฒด
executeUpdate / executeQueryDML ์‹คํ–‰ / SELECT ์‹คํ–‰
ResultSet์กฐํšŒ ๊ฒฐ๊ณผ ํ‘œ(์ปค์„œ๋กœ ์ ‘๊ทผ)

์ž๋ฐ”์—์„œ DB๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ โ€œ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ โ†’ ์ ‘์† โ†’ ์ฟผ๋ฆฌ โ†’ ํ•ด์ œโ€ 4๋‹จ๊ณ„๋‹ค. INSERT๋Š” executeUpdate(ํ–‰ ์ˆ˜), SELECT๋Š” executeQuery(ResultSet)๋ผ๋Š” ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ  ResultSet ์ปค์„œ๊ฐ€ 0๋ฒˆ์งธ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ ๋งŒ ์žก์œผ๋ฉด ์ดํ›„ ํ‘œ ๊ตฌํ˜„๋„ ์–ด๋ ต์ง€ ์•Š๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.