1. JDBC
JDBC(Java Database Connectivity)๋?
์๋ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ฐ API(์์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ ์ ์ํํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ณผ์ ์ํธ ์์ฉ์ ๋จ์ํํ๋ค.
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๊ณ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์ถ๊ฐ, ์์ , ์ญ์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (DBMS)๊ณผ ํต์ ํ๋ ๋ฐ ํ์ํ ๋๋ผ์ด๋ฒ์ API๋ฅผ ์ ๊ณตํ๋ค.
JDBC Architecture Model
๐ JDBC API
- Java ์ธ์ด๋ก ์์ฑ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- java.sql ํจํค์ง์ ์ ์๋์ด ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ ์ ์ํํ๊ธฐ ์ํ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ค.
๐ JDBC ๋๋ผ์ด๋ฒ ๋งค๋์
- ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ค.
- JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ , ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์์
์ ์ํ ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๐ JDBC ๋๋ผ์ด๋ฒ
- ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ
(DBMS)๊ณผ ํต์ ํ๊ธฐ ์ํ ๋๋ผ์ด๋ฒ ํด๋์ค๋ค์ ์งํฉ
- ๊ฐ๊ฐ์ DBMS์ ๋ํด ํน์ ๋๋ผ์ด๋ฒ๊ฐ ํ์ํ๋ฉฐ, ์ด ๋๋ผ์ด๋ฒ๋ ํด๋น DBMS์์ ํต์ ์ ๋ด๋นํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ์ ๋ฐ ์ฟผ๋ฆฌ ์คํ, ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ ๊ทผํ๊ณ ์กฐ์ํ๋ ๋ฐ์ดํฐ์ ์งํฉ
- JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํ, ์์ , ์ญ์ ๋ฑ์ ์์
์ ์ํํ๋ค.
JDBC Flow
1. JDBC ๋๋ผ์ด๋ฒ ๋ก๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ธ์
์ฒด๊ฐ ์ ๊ณตํ๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋๋ผ์ด๋ฒ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํด์ผ ํ๋ค.
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: DriverManager.getConnection() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ค. ์ด ๋ฉ์๋๋ JDBC URL, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ ๋ฑ์ ์ธ์๋ก ๋ฐ์ ์ฐ๊ฒฐ์ ์์ฑํ๋ค.
3. SQL ์ฟผ๋ฆฌ ์คํ: Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ Statement ๋๋ PreparedStatement ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์คํํ๋ค. Statement ๊ฐ์ฒด๋ ์ ์ ์ธ SQL ๋ฌธ์ ์คํํ๊ณ , PreparedStatement ๊ฐ์ฒด๋ ๋์ ์ธ SQL ๋ฌธ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
4. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ: SQL ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๋ก ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฑฐ๋(SELECT), ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
์ ์คํํ๋ค(UPDATE, INSERT, DELETE). ResultSet ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ์งํฉ์ ์ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์๋ค.
5. ์ฐ๊ฒฐ ํด์ : ์์
์ด ์๋ฃ๋๋ฉด ResultSet, Statement, Connection ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ๋ช
์์ ์ผ๋ก ํด์ ํด์ผ ํ๋ค. close() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ค.
๐ try-with-resources
๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ๋ธ๋ก์ ์ ์ํ๊ณ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ํด์ ํด ์ฃผ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
๋ฆฌ์์ค๋ AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ค๋ก์, ํ์ผ, ๋คํธ์ํฌ ์ฐ๊ฒฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ด ๋ ์ ์๋ค.
try (๋ฆฌ์์ค ์ด๊ธฐํ) { // ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ } catch (Exception e) { // ์์ธ ์ฒ๋ฆฌ }
try ๋ธ๋ก ์์์ ๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํํ๊ณ , try ๋ธ๋ก์ด ๋๋ ๋ ์๋์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ค.
๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํํ ๋ () ์์ ๋ฆฌ์์ค๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
2. JDBC CRUD
Statement
- ์ ์ ์ธ SQL ๋ฌธ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ฆ, ์คํํ SQL ๋ฌธ์ ๋ฌธ์์ด๋ก ์ง์ ์์ฑํ์ฌ ์ ๋ฌํ๋ค.
- ๊ฐ์ฒด๋ Connection ๊ฐ์ฒด์ createStatement() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฑํ๋ค.
- ๋งค๋ฒ SQL ๋ฌธ์ด ์คํ๋ ๋๋ง๋ค ํด๋น SQL ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์กํ๊ณ ์คํํ๋ค. ์ฆ, SQL ๋ฌธ์ด ์คํ๋ ๋๋ง๋ค ์ปดํ์ผ์ด ๋ฐ์ํ๋ค.
- ์ฌ์ฉํ ๋๋ ๋ฌธ์์ด๋ก ์ง์ SQL ๋ฌธ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ์ฟผ๋ฆฌ ๋๋ ํ๋ผ๋ฏธํฐํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๊ณ , ๊ฐ๋
์ฑ์ด ์ข์ง ์์ ์ ์๋ค.
- SQL Injection ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์
๋ ฅ์ ์ฟผ๋ฆฌ์ ์ง์ ์ฝ์
ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
- ์ฃผ๋ก ๋จ์ํ SELECT ๋ฌธ์ด๋ DDL(Data Definition Language) ๋ฌธ์ฅ ๋ฑ์ ์ฌ์ฉ๋๋ค.
๐ก ์ฌ์ฉ ๋ฐฉ๋ฒ
1. Statement ๊ฐ์ฒด ์์ฑ
Statement statement = connection.createStatement();
Statement ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด Connection ๊ฐ์ฒด์ createStatement() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
2. SQL ๋ฌธ ์คํ
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql);
// ๋๋
int rowCount = statement.executeUpdate(sql);
์์ฑํ Statement ๊ฐ์ฒด์ executeQuery() ๋๋ executeUpdate() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ SQL ๋ฌธ์ ์คํํ๋ค.
executeQuery()๋ SELECT ๋ฌธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉฐ, executeUpdate()๋ INSERT, UPDATE, DELETE ๋ฑ์ ๋ฌธ์ ์คํํ๊ณ ์ํฅ์ ๋ฐ์ ํ์ ์๋ฅผ ๋ฐํํ๋ค.
3. ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
while (resultSet.next()) {
String username = resultSet.getString("username");
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
executeQuery()๋ฅผ ํตํด ๋ฐํ๋ ResultSet ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๋ฐํ๋ ํ๋ค์ ๋ฐ๋ณตํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
4. ์์ ํด์
statement.close();
resultSet.close();
Statement์ ResultSet ๋ฑ์ ์์์ ์ฌ์ฉ์ด ๋๋ ํ์๋ ๋ฐ๋์ ํด์ ํด์ผ ํ๋ค.
close() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์์ ํด์ ํ๋ค.
PreparedStatement
- ๋์ ์ธ SQL ๋ฌธ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. SQL ๋ฌธ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ ๋ ์ ์ฉํ๋ค.
- Connection ๊ฐ์ฒด์ prepareStatement() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฑํ๋ค. ์ด๋ SQL ๋ฌธ์ ์ธ์๋ก ์ ๋ฌํ๋ค.
- SQL ๋ฌธ์ ๋ฏธ๋ฆฌ ์ปดํ์ผํ์ฌ ์ปดํ์ผ๋ ์ํ๋ก ์บ์์ ์ ์ฅํฉ๋๋ค. ์คํ ์์๋ ์ปดํ์ผ๋ ๋ฒ์ ์ ์ฌ์ฉํ๋ฏ๋ก ์ฑ๋ฅ์ด ํฅ์๋๋ค.
- SQL ๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ด๋ SQL Injection ๊ณต๊ฒฉ์ ์๋ฐฉํ ์ ์๋ค.
- ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ๋๋ set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ์ ์์น(์ธ๋ฑ์ค)์ ๊ฐ ๋ฑ์ ์ง์ ํ๋ค.
- ๋์ผํ SQL ๋ฌธ์ ๋ฐ๋ณตํด์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋ ์ ์ฉํ๋ค.
- ์ฌ์ฉํ๋ฉด SQL ๋ฌธ๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
๐ก ์ฌ์ฉ ๋ฐฉ๋ฒ
1. PreparedStatement ๊ฐ์ฒด ์์ฑ
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement statement = connection.prepareStatement(sql);
PreparedStatement ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด Connection ๊ฐ์ฒด์ prepareStatement() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ด๋ SQL ๋ฌธ์ ์ธ์๋ก ์ ๋ฌํ๋ค.
2. ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
statement.setString(1, "john");
SQL ๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
set ๋ฉ์๋๋ ํ๋ผ๋ฏธํฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ ๋ค์ํ ํํ๋ก ์ ๊ณต๋๋ค.
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ํ๋ผ๋ฏธํฐ ์์น(์ธ๋ฑ์ค)๋ฅผ ๋ํ๋ด๊ณ , ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์ค์ ๊ฐ์ด๋ค.
3. SQL ๋ฌธ ์คํ
ResultSet resultSet = statement.executeQuery();
// ๋๋
int rowCount = statement.executeUpdate();
PreparedStatement ๊ฐ์ฒด์ executeQuery() ๋๋ executeUpdate() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ SQL ๋ฌธ์ ์คํํ๋ค.
executeQuery()๋ SELECT ๋ฌธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉฐ, executeUpdate()๋ INSERT, UPDATE, DELETE ๋ฑ์ ๋ฌธ์ ์คํํ๊ณ ์ํฅ์ ๋ฐ์ ํ์ ์๋ฅผ ๋ฐํํ๋ค.
4. ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
while (resultSet.next()) {
String username = resultSet.getString("username");
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
}
executeQuery()๋ฅผ ํตํด ๋ฐํ๋ ResultSet ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ๋ฐํ๋ ํ๋ค์ ๋ฐ๋ณตํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ ์ ์๋ค.
5. ์์ ํด์
statement.close();
resultSet.close();
PreparedStatement, ResultSet ๋ฑ์ ์์์ ์ฌ์ฉ์ด ๋๋ ํ์๋ ๋ฐ๋์ ํด์ ํด์ผ ํ๋ค.
close() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์์ ํด์ ํ๋ค.
'๐๏ธ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SpringBoot Part 3-1 (0) | 2023.07.06 |
---|---|
SpringBoot Part2-1 (0) | 2023.06.27 |
SpringBoot Part1-5 (0) | 2023.06.26 |
SpringBoot Part1-4 (0) | 2023.06.23 |
SpringBoot Part1-3 (0) | 2023.06.22 |
๋๊ธ