Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • ODBC๋Š” ์–ธ์–ด ๋ฌด๊ด€ DB ์—ฐ๊ฒฐ API, JDBC๋Š” Java ์ „์šฉ DB ์—ฐ๊ฒฐ API
  • ๋‘˜ ๋‹ค โ€œDB์— ๋ถ™๋Š” ๋ฐฉ๋ฒ•โ€์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด์ง€ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•โ€์ด ์•„๋‹˜
  • ODBC๋Š” Driver Manager + DB๋ณ„ ๋“œ๋ผ์ด๋ฒ„ ๊ตฌ์กฐ, JDBC๋Š” Java API + JDBC Driver ๊ตฌ์กฐ
  • Windows/๋ ˆ๊ฑฐ์‹œ ํ™˜๊ฒฝ์€ ODBC, JVM ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ JDBC๊ฐ€ ์ผ๋ฐ˜์ 

1. ODBC

ODBC(Open Database Connectivity)๋Š” ํŠน์ • DBMS์— ์ข…์†๋˜์ง€ ์•Š๋Š” DB ์—ฐ๊ฒฐ API ๊ทœ๊ฒฉ์ด๋‹ค. Microsoft๊ฐ€ ์„ค๊ณ„ํ–ˆ๊ณ , ์–ธ์–ด์— ์ƒ๊ด€์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์กฐ
Application โ†’ ODBC Driver Manager โ†’ DB๋ณ„ ODBC Driver โ†’ DBMS
  • Application: DB์— ์ ‘๊ทผํ•˜๋ ค๋Š” ํ”„๋กœ๊ทธ๋žจ (ETL ๋„๊ตฌ, Python ์Šคํฌ๋ฆฝํŠธ ๋“ฑ)
  • Driver Manager: ODBC ํ˜ธ์ถœ์„ ์ ์ ˆํ•œ ๋“œ๋ผ์ด๋ฒ„๋กœ ๋ผ์šฐํŒ…
  • ODBC Driver: DBMS๋ณ„๋กœ ์ œ๊ณต๋˜๋Š” ๋“œ๋ผ์ด๋ฒ„. ์‹ค์ œ DB ํ†ต์‹  ๋‹ด๋‹น
ํ•ต์‹ฌ
  • ODBC๋Š” DB๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ๊ฒฉ์ด๋‹ค
  • ์‹ค์ œ ์—ฐ๊ฒฐ์€ DBMS๋ณ„ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค
  • DSN(Data Source Name)์œผ๋กœ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋“ฑ๋ก/๊ด€๋ฆฌํ•œ๋‹ค
  • C, C++, Python, Go ๋“ฑ ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์šด์˜์—์„œ ์ž์ฃผ ๋ถ€๋”ชํžˆ๋Š” ๊ฒƒ
  • ๋“œ๋ผ์ด๋ฒ„ ์„ค์น˜/๋ฒ„์ „ ๊ด€๋ฆฌ
  • ์‹œ์Šคํ…œ DSN vs ์‚ฌ์šฉ์ž DSN ๊ตฌ๋ถ„
  • 32bit/64bit ๋“œ๋ผ์ด๋ฒ„ ๋ถˆ์ผ์น˜ โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋“œ๋ผ์ด๋ฒ„์˜ ๋น„ํŠธ ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์—ฐ๊ฒฐ ์‹คํŒจ
  • connection string ํŒŒ๋ผ๋ฏธํ„ฐ (charset, timeout, fetch size ๋“ฑ)

2. JDBC

JDBC(Java Database Connectivity)๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด DB์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ API๋‹ค. java.sql ํŒจํ‚ค์ง€์— ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ , ๊ฐ DBMS ๋ฒค๋”๊ฐ€ ๊ตฌํ˜„์ฒด(๋“œ๋ผ์ด๋ฒ„)๋ฅผ JAR๋กœ ์ œ๊ณตํ•œ๋‹ค.

๊ตฌ์กฐ
Java Application โ†’ JDBC API (java.sql) โ†’ JDBC Driver โ†’ DBMS
๋“œ๋ผ์ด๋ฒ„ ํƒ€์ž…

JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” 4๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ์‹ค๋ฌด์—์„œ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ Type IV๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํƒ€์ž…์ด๋ฆ„ํŠน์ง•
Type IJDBC-ODBC BridgeODBC๋ฅผ ๊ฑฐ์ณ ์—ฐ๊ฒฐ. ํ˜„์žฌ ํ๊ธฐ
Type IINative APIDB ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š” (์˜ˆ: Oracle OCI)
Type IIINetwork Protocol๋ฏธ๋“ค์›จ์–ด ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ์—ฐ๊ฒฐ
Type IVThin / Pure JavaDB์™€ ์ง์ ‘ ํ†ต์‹ . ์ถ”๊ฐ€ ์„ค์น˜ ๋ถˆํ•„์š”. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ

Oracle์„ ์˜ˆ๋กœ ๋“ค๋ฉด:

๋“œ๋ผ์ด๋ฒ„ํƒ€์ž…ํŠน์ง•
Thin DriverType IVPure Java. Oracle ํด๋ผ์ด์–ธํŠธ ์„ค์น˜ ๋ถˆํ•„์š”
OCI DriverType IIOracle ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”. ํŠน์ˆ˜ ๊ธฐ๋Šฅ(RAC ๋“ฑ) ํ™œ์šฉ ์‹œ
์—ฐ๊ฒฐ ์˜ˆ์‹œ
// JDBC ๊ธฐ๋ณธ ์—ฐ๊ฒฐ
String url = "jdbc:postgresql://localhost:5432/mydb";
Connection conn = DriverManager.getConnection(url, "user", "password");
 
// PreparedStatement๋กœ ์ฟผ๋ฆฌ
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE age > ?");
stmt.setInt(1, 20);
ResultSet rs = stmt.executeQuery();
# Python์—์„œ JDBC ์‚ฌ์šฉ (jaydebeapi)
import jaydebeapi
 
conn = jaydebeapi.connect(
    "org.postgresql.Driver",
    "jdbc:postgresql://localhost:5432/mydb",
    ["user", "password"],
    "/path/to/postgresql.jar"
)

3. ODBC vs JDBC ๋น„๊ต

ํ•ญ๋ชฉODBCJDBC
์–ธ์–ด์–ธ์–ด ๋ฌด๊ด€ (C API ๊ธฐ๋ฐ˜)Java ์ „์šฉ
๋“œ๋ผ์ด๋ฒ„ ๋ฐฐํฌOS๋ณ„ ๋„ค์ดํ‹ฐ๋ธŒ ์„ค์น˜JAR ํŒŒ์ผ
์„ค์ •DSN ๊ธฐ๋ฐ˜connection string / properties
ํฌ๋กœ์Šคํ”Œ๋žซํผํ”Œ๋žซํผ๋ณ„ ๋“œ๋ผ์ด๋ฒ„ ํ•„์š”JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ด์‹์„ฑ ์ข‹์Œ
์ฃผ์š” ์‚ฌ์šฉ์ฒ˜Windows ํ™˜๊ฒฝ, ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ, ๋‹ค์–‘ํ•œ ์–ธ์–ดJava/JVM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, Spark, ETL ๋„๊ตฌ
Python ์—ฐ๋™pyodbcjaydebeapi, jpype
์„ ํƒ ๊ธฐ์ค€
  • Java/JVM ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ†’ JDBC
  • Python, C++ ๋“ฑ ๋น„JVM ์–ธ์–ด โ†’ ODBC ๋˜๋Š” DB ๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„
  • Spark, Flink ๋“ฑ JVM ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—”์ง„ โ†’ JDBC
  • Windows ํ™˜๊ฒฝ์˜ ๋ ˆ๊ฑฐ์‹œ ETL ๋„๊ตฌ โ†’ ODBC

์—ฐ๊ฒฐ๊ณผ ์ ์žฌ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ

ODBC๋“  JDBC๋“  DB์— ๋ถ™๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์žฌํ•˜๋Š” ๊ฒƒ์€ bulk load, ์™ธ๋ถ€ ํ…Œ์ด๋ธ” ๋“ฑ ์ ์žฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์˜์—ญ์ด๋‹ค. ์ด ๋ถ€๋ถ„์€ ETL ๋ฐ์ดํ„ฐ ์ด๋™๊ณผ ์ ์žฌ์—์„œ ๋‹ค๋ฃฌ๋‹ค.