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 I | JDBC-ODBC Bridge | ODBC๋ฅผ ๊ฑฐ์ณ ์ฐ๊ฒฐ. ํ์ฌ ํ๊ธฐ |
| Type II | Native API | DB ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ (์: Oracle OCI) |
| Type III | Network Protocol | ๋ฏธ๋ค์จ์ด ์๋ฒ๋ฅผ ๊ฑฐ์ณ ์ฐ๊ฒฐ |
| Type IV | Thin / Pure Java | DB์ ์ง์ ํต์ . ์ถ๊ฐ ์ค์น ๋ถํ์. ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ |
Oracle์ ์๋ก ๋ค๋ฉด:
| ๋๋ผ์ด๋ฒ | ํ์ | ํน์ง |
|---|---|---|
| Thin Driver | Type IV | Pure Java. Oracle ํด๋ผ์ด์ธํธ ์ค์น ๋ถํ์ |
| OCI Driver | Type II | Oracle ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์. ํน์ ๊ธฐ๋ฅ(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 ๋น๊ต
| ํญ๋ชฉ | ODBC | JDBC |
|---|---|---|
| ์ธ์ด | ์ธ์ด ๋ฌด๊ด (C API ๊ธฐ๋ฐ) | Java ์ ์ฉ |
| ๋๋ผ์ด๋ฒ ๋ฐฐํฌ | OS๋ณ ๋ค์ดํฐ๋ธ ์ค์น | JAR ํ์ผ |
| ์ค์ | DSN ๊ธฐ๋ฐ | connection string / properties |
| ํฌ๋ก์คํ๋ซํผ | ํ๋ซํผ๋ณ ๋๋ผ์ด๋ฒ ํ์ | JVM ์์์ ๋์ํ๋ฏ๋ก ์ด์์ฑ ์ข์ |
| ์ฃผ์ ์ฌ์ฉ์ฒ | Windows ํ๊ฒฝ, ๋ ๊ฑฐ์ ์์คํ , ๋ค์ํ ์ธ์ด | Java/JVM ์ ํ๋ฆฌ์ผ์ด์ , Spark, ETL ๋๊ตฌ |
| Python ์ฐ๋ | pyodbc | jaydebeapi, jpype |
์ ํ ๊ธฐ์ค
- Java/JVM ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ โ JDBC
- Python, C++ ๋ฑ ๋นJVM ์ธ์ด โ ODBC ๋๋ DB ๋ค์ดํฐ๋ธ ๋๋ผ์ด๋ฒ
- Spark, Flink ๋ฑ JVM ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ง โ JDBC
- Windows ํ๊ฒฝ์ ๋ ๊ฑฐ์ ETL ๋๊ตฌ โ ODBC
์ฐ๊ฒฐ๊ณผ ์ ์ฌ๋ ๋ค๋ฅธ ๋ฌธ์
ODBC๋ JDBC๋ DB์ ๋ถ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ๋ ๊ฒ์ด๋ค. ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์ฌํ๋ ๊ฒ์ bulk load, ์ธ๋ถ ํ ์ด๋ธ ๋ฑ ์ ์ฌ ๋ฉ์ปค๋์ฆ์ ์์ญ์ด๋ค. ์ด ๋ถ๋ถ์ ETL ๋ฐ์ดํฐ ์ด๋๊ณผ ์ ์ฌ์์ ๋ค๋ฃฌ๋ค.