โ 1. JDBC(Java Database Connectivity) ๋?
- ์๋ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๊ณ SQL์ ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Java API ์ด๋ค.
- ์ฝ๊ฒ๋งํด, ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ์ฐ๊ฒฐ ํต๋ก ์ญํ ์ ํด์ค๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
- JDBC ๋ Java API ๋ก์จ, JRE์ ํฌํจ์ด ๋์ด์์ผ๋ฉฐ, ํด๋น ์ธํฐํ์ด์ค ์งํฉ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, Oracle, PostgreSQL ๋ฑ) ์ด ํด๋น ์๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ๋ณธ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ํ ์ ์๋๋ก ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ๋๋ค. ํด๋น ํด๋์ค๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ์์ ์ด์ฉ์ ํ๊ฒ ๋๋ฉด, ํด๋น ํด๋์ค์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ ํ ์ ์๊ฒ ๋๋ค.
- ์ฐธ๊ณ ๋ก ํด๋น API ๋ java.sql ๋๋ javax.sql ๋ฑ์ ํจํค์ง๋ก ์ ๊ณต์ด ๋๋ค.
- ๋ํ, ํด๋น ํจํค์ง์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ "JDBC ๋๋ผ์ด๋ฒ" ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
(1) JDBC ๊ตฌํ ๋ฐ ๋์
// 1. ๋๋ผ์ด๋ฒ ๋ก๋ฉ (MySQL์ธ ๊ฒฝ์ฐ)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. DB ์ฐ๊ฒฐ
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb", "username", "password");
// 3. ์ฟผ๋ฆฌ ์คํ
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 4. ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
while (rs.next()) {
System.out.println(rs.getString("name"));
}
- ์์ ์ฝ๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉ ํ ๋ค DB๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
(2) ๋๋ผ์ด๋ฒ ๋ก๋ฉ ์ด์
- Class.forName ์ ํตํด ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ๊ฒ ๋๋ฉด, ์ ์ ๋ธ๋ก์ ๋ด๋ถ ์ฝ๋๊ฐ ์คํ์ด ๋๋ค.
Class.forName("com.mysql.cj.jdbc.Driver");
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException e) {
throw new RuntimeException("Failed to register driver");
}
}
- JDBC ๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ API ์ด๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก ๋์ํ๋ ค๋ฉด ๋ฒค๋๊ฐ ์ ๊ณตํ๋ ๊ตฌํ์ฒด์ธ ๋๋ผ์ด๋ฒ ํด๋์ค๊ฐ ํ์ํจ.
- ํด๋น ๋๋ผ์ด๋ฒ๋ ์ฐ๋ฆฌ๊ฐ JVM์ ๋ก๋ฉ์์ผ์ค์ผ DriverManager ๊ฐ ์ด๋ฅผ ์ธ์ํ๊ณ ๊ด๋ฆฌํ ์ ์์.
- ์ฆ, ๋๋ผ์ด๋ฒ ํด๋์ค ๋ก๋ฉ์ DriverManager ์ ๋ฒค๋์ ๋๋ผ์ด๋ฒ๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํจ์.
- ์ฝ๊ฒ๋งํด, DriverManager ๋ ์ปค๋ฅ์ ์ ๋ง๋ค ์๋ ์์ง๋ง, ์ด๋ค ๋๋ผ์ด๋ฒ๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๋๊น ๋ฏธ๋ฆฌ ์ ์๋ ์๊ณ , ์๋์ผ๋ก ๋ก๋ฉ์ ๋ชปํจ.
- ๊ทธ๋์ ์ง์ Class.forName() ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ผ์ด๋ฒ ํด๋์ค๋ฅผ ๋จผ์ ๋ก๋ฉํด์, ๊ทธ ์์์ DriverManager ์ ๋ฑ๋ก๊น์ง ํด์ฃผ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๋ ์๋ฏธ์.
- ํ์ง๋ง, ์์ฆ์๋ ํ์ผ์ ์๋ ๋ก๋ฉ ์ ๋ณด๋ฅผ ์ ์ด๋์ด ์๋น์ค ๋ก๋๋ก ๋ถ๋ฌ์์ ๋ฑ๋ก์ ํด์ค.
- ๊ทธ์น๋ง ์ด์ฐจํผ ๋ด๋ถ์์ ํด๋์ค ๋ก๋ฉํด์ค์ผ ๋ฑ๋ก์ด ๋๋ค๋ ํต์ฌ์.
(2) DriverManager
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb",
"user",
"password"
);
- JDBC API ๋ด๋ถ์๋ ์ธํฐํ์ด์ค ๋ฟ ์๋๋ผ ํด๋น DriverManager ์ ๊ฐ์ด ์ค์ ํด๋์ค๋ ํฌํจ์ด ๋์ด์์.
- ํด๋น DriverManager ๋ JDBC ์์ DB ์ฐ๊ฒฐ์ ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ค์ ๊ด๋ฆฌ์ ํด๋์ค์.
- ์ฝ๊ฒ ๋งํด, ๋ฑ๋ก๋ ๋๋ผ์ด๋ฒ๋ค ์ค ์ด๋ค ๊ฑธ ์จ์ผ ํ ์ง ๊ณจ๋ผ์ฃผ๊ณ , ์ฐ๊ฒฐ์ ์์ํด์ฃผ๋ ์ญํ ์ ํจ.
- java.sql.DriverManager ํจํค์ง์ ์์ผ๋ฉฐ, ์ ์ ํด๋์ค์.
[1] DriverManager ๋ด๋ถ ๋์
- DriverManager.getConnection() ๋ฉ์๋๊ฐ ํธ์ถ์ด ๋๋ฉด, ๋๋ผ์ด๋ฒ ๋งค๋์ ๋ด๋ถ์์ ๋ฑ๋ก๋ ๋๋ผ์ด๋ฒ ๋ชฉ๋ก์ ์ํํ๋ค.
- ๋ฑ๋ก๋ ๋๋ผ์ด๋ฒ ๋ชฉ๋ก์ ๋ณดํต ์์ ๋๋ผ์ด๋ฒ ๋ก๋ฉ ๊ณผ์ ์ static ๋ธ๋ก์์ ์๋์ผ๋ก ๋ฑ๋ก์ด ๋จ.
- ๋ช๊ฐ๊ฐ ์์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ฐ ๋๋ผ์ด๋ฒ์๊ฒ URL์ ๋๊ฒจ acceptsURL(String url) ๋ฉ์๋๋ก ๊ฒ์ฌ๋ฅผ ํจ.
- ์์๋ก๋ "jdbc:mysql://..." url ๋ก ๋ฑ๋ก์ด ๋์ด์๋ค๋ฉด, ํด๋น MySQL ๋๋ผ์ด๋ฒ๊ฐ ์ ํ์ด ๋จ.
- ์ ํ๋ ๋๋ผ์ด๋ฒ ๊ตฌํ์ฒด์ connect() ๋ฉ์๋ ํธ์ถ
- ์ด connect() ๋ฉ์๋ ํธ์ถ ์์ ์ ๋ฒค๋ ๊ตฌํ์ฒด๊ฐ ์ง์ ๋์์ ํ๋ฉฐ, ๋ด๋ถ์ ๋คํธ์ํฌ ๋ฐ ๋ค์ํ ๋ก์ง์ด ์ํ ๋จ.
- ๋ฒค๋ ๋ด๋ถ์์ TCP ์์ผ ์ด๊ธฐ, DB ์ฃผ์ ํฌํธ๋ก ์ ์ ์๋, ๋ก๊ทธ์ธ ์ธ์ฆ, ํ๋กํ ์ฝ ํธ๋์ ฐ์ดํฌ, ์ปค๋ฅ์ ๊ฐ์ฒด ์์ฑ ๋ฑ ์์ ์ ํจ.
โ 2. JDBC & DB ํต์ ์๋ฆฌ
(1) JDBC๋ ๋คํธ์ํฌ ์์ผ ๊ธฐ๋ฐ ํต์ ์ ์ฌ์ฉํจ
- JDBC ๋๋ผ์ด๋ฒ๋ TCP/IP ๊ธฐ๋ฐ์ ์์ผ ํต์ ์ ์ด์ฉํด DB์ ์ฐ๊ฒฐ์ ํจ.
- ์ฆ, ๊ฒฐ๊ตญ JDBC <-> DB ์๋ฒ๋ ๋คํธ์ํฌ ์์ผ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค๋ ์๋ฏธ์.
- JDBC Driver ์ฆ, ๋ฒค๋ ๋ก์ง ๋ด๋ถ ๋ก์ง์๋ DB ํต์ ๋ก์ง์ด ๋ค์ด๊ฐ ์์ด, ํต์ ์ด ๋๋ฉฐ SQL ์ ํจํท ํํ๋ก ์ฃผ๊ณ ๋ฐ์
(2) ์์ธ ๋์ ์๋ฆฌ
Java ์ ํ๋ฆฌ์ผ์ด์
↓
[JDBC API ํธ์ถ]
↓
JDBC Driver (DB ํ์ฌ๊ฐ ์ ๊ณตํ ๊ตฌํ์ฒด)
↓
[TCP/IP ์์ผ ์ด๊ธฐ → DB ์๋ฒ์ ์ฐ๊ฒฐ ์๋]
↓
DB ์๋ฒ (์: MySQL, Oracle ๋ฑ)
↓
[SQL ์ฒ๋ฆฌ → ์๋ต ์์ฑ]
↑
[์๋ต ๊ฒฐ๊ณผ ์์ผ์ผ๋ก ์ ์ก]
↑
JDBC Driver๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํ
↑
Java ์ ํ๋ฆฌ์ผ์ด์
์์ ResultSet ๋ฑ์ผ๋ก ๊ฒฐ๊ณผ ํ์ธ
- DriverManager.getConnection() ์ ํธ์ถํ๋ฉด connect() ๋ฒค๋ ๊ตฌํ์ฒด์ ๋ฉ์๋ connect() ๋ฉ์๋๊ฐ ๊ฐ ํธ์ถ์ด ๋จ.
- ์ดํ์, JDBC ๋๋ผ์ด๋ฒ๊ฐ ๋ด๋ถ์ ์ผ๋ก Socket ์ ์ด๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฌํธ์ ๋ง๊ฒ ํจํท์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํต์ ์ ์งํํจ.
- ์ดํ์, SQL์ ์คํํ๋ฉด ๋๋ผ์ด๋ฒ๊ฐ SQL ๋ฌธ์ฅ์ MySQL ํ๋กํ ์ฝ ํ์์ ๋ฐ์ด๋๋ฆฌ ํจํท์ผ๋ก ๋ฐ๊ฟ ์ ์ก์ ํจ.
- ์ดํ์, MySQL ์๋ฒ๊ฐ ์ด๊ฑธ ์ฝ์ด SQL ์คํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํจํท์ผ๋ก ์๋ต์ ํ๊ฒ ๋๋ค.
(3) ๋ก์ปฌ DB์ธ ๊ฒฝ์ฐ
- ๋ก์ปฌ์ ๊ฒฝ์ฐ์๋ Driver ํด๋์ค์ connect() ๋ฉ์๋ ํธ์ถ ์๊ฐ ๋ด๋ถ์์ ์์ผ์ ๋ง๋ค์ด์ DB ์๋ฒ์ TCP ํต์ ์ ์์ํจ.
- DB๊ฐ ๊ฐ์ ์ปดํจํฐ์ธ Localhost ์ ์์ด๋, ๊ฒฐ๊ตญ์๋ ๋คํธ์ํฌ ์คํ์ ํตํด์ TCP/IP ํต์ ์ ํจ.
- ํ์ง๋ง ๊ฐ์ OS ๋ด์์ ํต์ ์ด๋ฏ๋ก ๋งค์ฐ ๋น ๋ฆ.
โ 3. ์ปค๋ฅ์ ํ (Connection Pool)
- Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ด ์ ์ฅํ๋ ํ์ ์๋ฏธํ๋ฉฐ, ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ๊ณต์ด ๋๋ค.
- ์ฝ๊ฒ๋งํด, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ์ปค๋ฅ์ ์ ํ์์ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ๊ฒ ๋๋ ์๋ฆฌ์ด๋ค.
- ์ฆ, DB์ ์ฐ๊ฒฐ๋ ์์ผ์ด ์์ฑ๋์ด ์๋ ์ํ์ Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ์ ๋ง๋ค์ด๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
- JDBC Driver ๋ ๋จ์ํ Java ์ฝ๋์ DB๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ผ ์ปค๋ฅ์ ํ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ์ด ๋์ด์์ง ์์.
- ์ฐธ๊ณ : SpringBoot ์๋ HikariCP ๋ผ๋ ์ปค๋ฅ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ด์ฅ์ด ๋์ด์์.
(1) ์ปค๋ฅ์ ํ ๋์ ์๋ฆฌ
- ์ด ์ปค๋ฅ์ ํ์ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๊ฐ์ธ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ง ์ถ๊ฐ ๊ณ์ธต์ด๋ค.
- JDBC ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ ค๋ฉด Connection ๊ฐ์ฒด๊ฐ ํ์ํจ
- ์ด Connection ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก DB ์๋ฒ์ TCP ์์ผ์ ์ด๊ณ , ๋ก๊ทธ์ธ(์ธ์ฆ) ์ ์ฐจ๋ฅผ ๊ฑฐ์ณ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ์งํจ.
- Heap ์์ญ์ ์ฌ๋ฌ ๊ฐ์ Connection ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด DB์ ์ฐ๊ฒฐ์ ํด๋ .
(2) ์ปค๋ฅ์ ํ ์ฌ์ฉ ์ด์
- DB ์ ๊ทผ ๋ฐ SQL ์คํ์ ์ํ Connection ๊ฐ์ฒด๋ ์ฐ๊ฒฐ ๊ณผ์ ์์ TCP ์์ผ, ๋ก๊ทธ์ธ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋๋ฐ ๊ณผ์ ์ด ๋งค์ฐ ๋ฌด๊ฒ๊ณ ๋๋ฆผ
- ์ด๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค๋ฅ์ ํ์ ํ์ฉํ์ฌ, Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ์ฌํ์ฉํ๋ ๋ฐฉ์์ ์ด์ฉํ๋ ๊ฒ์.
- ๊ทธ๋ฌ๋ฉด ์๋๊ฐ ์ฆ๊ฐํ๋ฉฐ, ๋ฆฌ์์ค ๋ญ๋น๋ ์ ๊ณ , ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ์ข์์ง๋ค๋ ์ฅ์ ์ด ์์.