
JDBC๋ Java Database Connectivity์ ์ฝ์๋ก, ์๋ฐ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ฐ API์
๋๋ค. JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์์
์ฒด์์ ์ ๊ณตํ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค.
์ฐ๊ฒฐ ๊ด๋ฆฌ(Connection Management): JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. DriverManager ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ๋ฑ๋กํ๊ณ , Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํฉ๋๋ค.
SQL ์คํ(SQL Execution): JDBC๋ฅผ ์ฌ์ฉํ์ฌ SQL ๋ฌธ์ ์คํํ ์ ์์ต๋๋ค. Statement, PreparedStatement, CallableStatement ๋ฑ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ SQL ๋ฌธ์ ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
ํธ๋์ญ์
๊ด๋ฆฌ(Transaction Management): JDBC๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์
์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์
์ ์์ํ๊ณ ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
์์ธ ์ฒ๋ฆฌ(Exception Handling): JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค ์ค ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. SQLException ๋ฑ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค ์ค ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
JDBC๋ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์
๊ณผ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ํ์คํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํตํฉ์ด ๋จ์ํ๋๊ณ , ์ด์์ฑ์ด ํฅ์๋ฉ๋๋ค.
1. DB์ ์ฐ๊ฒฐํ๊ธฐ
String url = "jdbc:mariadb://localhost:3306/w3schools";
String user = "root";
String password = "********";
Connection connection = DriverManager.getConnection(url, user, password);
Connection์ DB์ ์ฐ๊ฒฐ์ ๋ํ๋ด๋ ๊ฐ์ฒด์ด๋ฉฐ DB์์ ํต์ ์ ๋ด๋นํฉ๋๋ค.
๐ข Datasource๋ฅผ ๋น์ผ๋ก DB ์ ๋ณด๋ฅผ ์ ์ฅํด๋์ผ๋ฉด Spring์ด ์์์ ๊ด๋ฆฌํด์ค๋๋ค. Datasource ๋น๋ง ์ฃผ์
ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
@Autowired
private DataSource dataSource;
~~~
Connection connection = dataSource.getConnection();
2. ์คํ ์ค๋น
Statement statement = connection.createStatement();
์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๊ณ ์คํํ๊ธฐ ์ํด Statement ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. Statement๋ SQL ๋ฌธ์ ์คํํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
3. ์ฟผ๋ฆฌ ์คํ
ResultSet resultSet = statement.executeQuery(sql);
์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ResultSet ๊ฐ์ฒด๋ก ๋ฐ์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
4. ๊ฒฐ๊ณผ ๊ฐ๊ณต ๋ฐ ์์ ๋ซ๊ธฐ
// 5. ์์ ๋ซ๊ธฐ
try (resultSet; statement; connection;){
// 4. ๊ฒฐ๊ณผ ๊ฐ๊ณต
while (resultSet.next()){ // resultSet์ ์ ์ฅ๋ ๊ฐ ํ์ ํ์
String name = resultSet.getString(1);//์ฒซ ๋ฒ์งธ ์ปฌ๋ผ(์ด)์ ๊ฐ ์ป๊ธฐ
list.add(name);
}
}
์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์์ด ๋ฆฌ์คํธ์ ์ ์ฅํ๋ฉฐ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋ค ๋๋๋ฉด try-with-resources ๊ตฌ๋ฌธ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋ฅผ ์ํด ๋ซ์์ค๋๋ค.
resultSet.next()์ ํ
์ด๋ธ์ ๊ฐ ํ์ ํ์ํฉ๋๋ค.getString(n)์ ํด๋น ํ
์ด๋ธ์ ์ปฌ๋ผ์ ์ธ๋ฑ์ค(n)๋ฅผ ๋ฃ์ด ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. ๋ง์ฝ 5๋ฒ์งธ ์ปฌ๋ผ์ ๊ฐ์ ๊ฐ์ง๊ณ ์ค๊ณ ์ถ์ผ๋ฉด getString(5)๋ฅผ ํด์ค์ผ ํฉ๋๋ค.5. ๋ชจ๋ธ ๊ฐ์ฒด์ ๊ฒฐ๊ณผ ์ถ๊ฐํ๊ธฐ
1) nameList ์์ฑ์ list ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
model.addAttribute("nameList", list);
2) ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. nameList ์์ฑ์ ์ฐพ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
@ModelAttribute("nameList") ArrayList<String> list
Model ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ @ModelAttribute ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
6. view๋ก ํฌ์๋(html)
jspํ์ผ๋ก ์์ฑํฉ๋๋ค.
๐ฆ ์๋ฐ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด Spring JDBC ์ ์ฉํ๊ธฐ
@Controller
@RequestMapping("main24")
public class Controller24 {
@Autowired
private DataSource dataSource;
@GetMapping("sub2")
public void method02(@ModelAttribute("customers")
ArrayList<MyBean242> list) throws Exception{
String sql = """
SELECT CustomerName, City, Country FROM Customers
""";
// DB ์ฐ๊ฒฐ
Connection connection = dataSource.getConnection();
// Select ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ก ResultSet์ ์ป๋๋ค
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
try (connection; statement; resultSet;){
// resultSet์ ์ ์ฅ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ํ
while (resultSet.next()){
MyBean242 bean242 = new MyBean242();
bean242.setCustomerName(resultSet.getString(1));
bean242.setCity(resultSet.getString(2));
bean242.setCountry(resultSet.getString(3));
list.add(bean242);
}
}
}
import lombok.Data;
@Data
public class MyBean242 {
private String customerName;
private String city;
private String country;
}
<h3>๊ณ ๊ฐ ๋ชฉ๋ก</h3>
<table>
<thead>
<tr>
<th>NO</th>
<th>CustomerName</th>
<th>City</th>
<th>Country</th>
</tr>
</thead>
<tbody>
<c:forEach items="${customers}" var="customer" varStatus="st">
<tr>
<td>${st.count}</td>
<td>${customer.customerName}</td>
<td>${customer.city}</td>
<td>${customer.country}</td>
</tr>
</c:forEach>
</tbody>
</table>
