๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ฆฌ์ œ

Web Server 1: JDBC ๊ธฐ์ดˆ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ณธ๋ฌธ

๊ฐœ๋ฐœ์ž ํ˜ธ์†Œ์ธ/Server

Web Server 1: JDBC ๊ธฐ์ดˆ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™

๋ฆฌ์ œ๐Ÿซง 2026. 7. 7. 14:32

JDBC(Java Database Connectivity)

  • ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘์†ํ•ด SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์ค€ API
  • ์ž๋ฐ” ์ง„์˜์—์„œ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ์ด๋ฉฐ, ์‹ค์ œ ๋™์ž‘์€ ๊ฐ DBMS ๋ฒค๋”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„(๊ตฌํ˜„์ฒด)๊ฐ€ ๋‹ด๋‹น
  • ์ฆ‰ ๊ฐœ๋ฐœ์ž๋Š” MySQL์ด๋“  Oracle์ด๋“  ๋™์ผํ•œ JDBC ์ธํ„ฐํŽ˜์ด์Šค(Connection, Statement, ResultSet ๋“ฑ)๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , DB ์ข…๋ฅ˜๋งŒ ๋ฐ”๋€Œ๋ฉด ๋“œ๋ผ์ด๋ฒ„๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋จ → DB ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ

JDBC์˜ ํ•ต์‹ฌ ํ๋ฆ„

  1. ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
  2. Connection(์—ฐ๊ฒฐ) ํš๋“
  3. Statement(SQL ์‹คํ–‰ ๊ฐ์ฒด) ์ƒ์„ฑ
  4. SQL ์‹คํ–‰
  5. ๊ฒฐ๊ณผ(ResultSet) ์ฒ˜๋ฆฌ
  6. ์ž์› ๋ฐ˜๋‚ฉ(close)

ํ•ต์‹ฌ ๊ตฌ์กฐ [Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜] โ”‚ (JDBC API ํ˜ธ์ถœ) โ–ผ [JDBC Driver (๋ฒค๋”๋ณ„ ๊ตฌํ˜„์ฒด)] โ”‚ โ–ผ [Database (MySQL, Oracle ๋“ฑ)] โœ”๏ธ ์ •๋ฆฌ Java๋Š” DB๋ฅผ ์ง์ ‘ ๋ชจ๋ฆ„ → JDBC๋ฅผ ํ†ตํ•ด ์š”์ฒญ JDBC Driver๊ฐ€ DB ์–ธ์–ด๋กœ “๋ฒˆ์—ญ” DB๊ฐ€ ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

 

 

 

 

๐Ÿ”ด Statement (์œ„ํ—˜ + ๋‹จ์ˆœ)

String sql = "SELECT * FROM user WHERE id = '" + input + "'";
 
  • ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์‹คํ–‰
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด SQL ๋ฌธ๋ฒ•์œผ๋กœ ์„ž์ž„
  • โŒ SQL Injection ์ทจ์•ฝ

๐ŸŸข PreparedStatement (์•ˆ์ „ + ํšจ์œจ)

String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, input);
 
  • ? = ์ž๋ฆฌํ‘œ์‹œ์ž
  • ๊ฐ’์€ “๋ฐ์ดํ„ฐ”๋กœ๋งŒ ์ฒ˜๋ฆฌ๋จ
  • โœ” SQL Injection ๋ฐฉ์ง€
  • โœ” SQL ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ → ๋ฐ˜๋ณต ์‹คํ–‰ ๋น ๋ฆ„

 

๐Ÿ“Œ ํ•ต์‹ฌ ๊ฐœ๋…: “์ปค์„œ(cursor)”

์ดˆ๊ธฐ ์ƒํƒœ:

[ before first ]
     ↓
[ row1 ]
[ row2 ]
[ row3 ]
 

๐Ÿ‘‰ ์ฒ˜์Œ์—” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ “์ด์ „ ์œ„์น˜”์— ์žˆ์Œ


๐Ÿ“Œ rs.next() ๋™์ž‘

rs.next() ํ˜ธ์ถœ → row1๋กœ ์ด๋™ → true
rs.next() ํ˜ธ์ถœ → row2๋กœ ์ด๋™ → true
rs.next() ํ˜ธ์ถœ → row3๋กœ ์ด๋™ → true
rs.next() ํ˜ธ์ถœ → ์—†์Œ → false
 

๐Ÿ“Œ ์‹ค์ œ ์ฝ”๋“œ ํ๋ฆ„

ResultSet rs = ps.executeQuery();

while(rs.next()) {
    System.out.println(rs.getString("name"));
}
 

โœ”๏ธ ์˜๋ฏธ

  • next() = “๋‹ค์Œ ์ค„๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€ ์ฒดํฌ”
  • true → ๋ฐ์ดํ„ฐ ์žˆ์Œ
  • false → ๋

๐Ÿ”ฅ ํ•œ ์ค„ ์ •๋ฆฌ

  • JDBC = “Java ↔ DB ํ†ต์—ญ์‚ฌ”
  • PreparedStatement = “๋ณด์•ˆ + ์„ฑ๋Šฅ ๋‘˜ ๋‹ค ์žก์€ ๋ฐฉ์‹”
  • ResultSet = “์ปค์„œ๋ฅผ ์›€์ง์ด๋ฉฐ ํ•œ ์ค„์”ฉ ์ฝ๋Š” ๊ตฌ์กฐ”

 

 


2๏ธโƒฃ close()๋ฅผ ํ•˜๋ฉด?

5
Connection ์ƒ์„ฑ

↓

Statement ์ƒ์„ฑ

↓

ResultSet ์ƒ์„ฑ

↓

์‚ฌ์šฉ ์™„๋ฃŒ

↓

close()
 

๊ทธ๋Ÿฌ๋ฉด

ResultSet ๋ฐ˜๋‚ฉ

↓

Statement ๋ฐ˜๋‚ฉ

↓

Connection ๋ฐ˜๋‚ฉ

↓

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
 

๋งˆ์น˜

๋„์„œ๊ด€ ์ฑ…

๋นŒ๋ฆผ ๐Ÿ“–

↓

์ฝ์Œ

↓

๋ฐ˜๋‚ฉ

↓

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉ
 

์™€ ๋˜‘๊ฐ™๋‹ค.


3๏ธโƒฃ try-with-resources์˜ ์›๋ฆฌ

๊ธฐ์กด ๋ฐฉ์‹

 
Connection conn = DriverManager.getConnection(...);

try {

    // ์ž‘์—…

} finally {

    conn.close();
}
 

ํ•ญ์ƒ

finally์—์„œ
์ง์ ‘ close()
 

๋ฅผ ์จ์•ผ ํ–ˆ๋‹ค.


ํ•˜์ง€๋งŒ Java7๋ถ€ํ„ฐ๋Š”

 
try (
    Connection conn = DriverManager.getConnection(...);
    PreparedStatement pstmt = conn.prepareStatement(sql);
    ResultSet rs = pstmt.executeQuery();
) {

    // ์ž‘์—…

}
 

์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด

try ๋ธ”๋ก ์ข…๋ฃŒ

↓

์ž๋™ close()
 

๋œ๋‹ค.


4๏ธโƒฃ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋Š” ์ˆœ์„œ

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

์ƒ์„ฑ ์ˆœ์„œ

Connection
      โ”‚
      โ–ผ
PreparedStatement
      โ”‚
      โ–ผ
ResultSet
 

์ž‘์—…์ด ๋๋‚˜๋ฉด

๋ฐ˜๋Œ€๋กœ ๋‹ซํžŒ๋‹ค.

close()

ResultSet
      โ–ฒ
      โ”‚
PreparedStatement
      โ–ฒ
      โ”‚
Connection
 

์ฆ‰

์ƒ์„ฑ

Connection
    ↓
Statement
    ↓
ResultSet

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

์ž๋™ close

ResultSet
    ↑
Statement
    ↑
Connection
 

"๋‚˜์ค‘์— ๋งŒ๋“  ๊ฒƒ๋ถ€ํ„ฐ ๋จผ์ € ๋‹ซ๋Š”๋‹ค(LIFO, Last In First Out)"๋ผ๊ณ  ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.


5๏ธโƒฃ ์™œ ๋ฐ˜๋Œ€๋กœ ๋‹ซ์„๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด

Connection
 โ””โ”€โ”€ Statement
       โ””โ”€โ”€ ResultSet
 

์ฒ˜๋Ÿผ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

๋งŒ์•ฝ

Connection๋ถ€ํ„ฐ ๋‹ซ์•„๋ฒ„๋ฆฌ๋ฉด

↓

Statement๊ฐ€ ์‚ฌ์šฉํ•  ๋Œ€์ƒ์ด ์—†์–ด์ง

↓

ResultSet๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
 

๊ทธ๋ž˜์„œ

ResultSet ์‚ฌ์šฉ ์ข…๋ฃŒ

↓

Statement ์ข…๋ฃŒ

↓

๋งˆ์ง€๋ง‰์œผ๋กœ Connection ์ข…๋ฃŒ
 

์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค.


โญ ์‹œํ—˜์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ํ•ต์‹ฌ

๊ฐ์ฒด์—ญํ• ๋ฐ˜๋“œ์‹œ close()?
Connection DB ์—ฐ๊ฒฐ โœ…
Statement / PreparedStatement SQL ์‹คํ–‰ โœ…
ResultSet ์กฐํšŒ ๊ฒฐ๊ณผ ์ €์žฅ โœ…

try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

 
try (
    Connection conn = ...
    PreparedStatement pstmt = ...
    ResultSet rs = ...
) {
    // ์ž‘์—…
}
 

โœ” finally์—์„œ close()๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

โœ” ์ž๋™์œผ๋กœ ResultSet → PreparedStatement → Connection ์ˆœ์œผ๋กœ close()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์ด ํ๋ฆ„๋งŒ ์ดํ•ดํ•˜๋ฉด JDBC์˜ ์ž์› ๊ด€๋ฆฌ ๊ฐœ๋…์€ ๊ฑฐ์˜ ๋‹ค ์žก์•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.