๐ JDBC(Java Database Connectivity)๋?
Java
๋ DBMS
๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ API
- ์ฆ ์๋ฐ๋ DB๋ฅผ ์ฐ๊ฒฐ์์ผ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ด ๋ชจ์ฌ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
, ์์ , ์ญ์ ํ ๋
SQL
ํ๋กฌํํธ์์ SQL
๋ฌธ์ ์ฌ์ฉํ์ง ์์๋ ์๋ฐ ํ๋ก๊ทธ๋จ์์ SQL
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ญ์ ํ๋ ์์
์ ํ ์ ์๊ฒ ํ๋ API
์ด๋ค.
JDBC
๋ DBMS
์ข
๋ฅ์ ์๊ด์์ด ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ์ฌ๋ฌ ์ธ์ด์์ ์๋ํ๋ ๋ฐฉ๋ฒ์ด ์ ๋ฐ์ ์ผ๋ก ๊ฐ๋ค๊ณ ํ ์ ์๋ค.
JDBC ๋๋ผ์ด๋ฒ ์ค์น
mysql
ํํ์ด์ง์์ Connect J
๋ฅผ ๋ค์ด๋ฐ๋๋ค.(ํ์ฌ ์ต์ ๋ฒ์ ์ธ 8.0.28)
- ์๋์ฐ๋ผ๋ฉด
.zip
ํ์ผ์ ๋ฐ์ผ๋ฉด ๋๊ณ ๋งฅ์ด๋ผ๋ฉด .tar
ํ์ผ์ ๋ฐ๋๋ค.
- ์์ถ์ ํ๋ฉด
mysql-connector-java-8.0.28.jar
๋ ํ์ผ์ด ์๋ค.
- ์ ๊ฑธ
JDBC
๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ (์ดํด๋ฆฝ์ค)ํ๋ก์ ํธ์ WEB-INF/lib
ํด๋์ ๋ฃ๋๋ค.(๊ฒฝ๋ก ๋ค๋ฅด๋ฉด ์ ๋จ!! ๋ฌด์กฐ๊ฑด ์ ๊ธฐ์ ๋ฃ์ด์ผ ํจ)
- ๊ทธ๋ฌ๋ฉด ์ค์น ๋!
JDBC ์ฐ๋
1. ๋๋ผ์ด๋ฒ ๋ก๋(ํ๋๋์คํฌ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ค๊ธฐ)
- ์๊น ์ค์นํ
JDBC
๋๋ผ์ด๋ฒ๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒ์ด๋ค.
Class.forName("com.mysql.cj.jdbc.Driver"); // static method๋ผ์ ๊ฐ์ฒด ์์ฑ ์์ด ๋ฐ๋ก ํธ์ถํ ์ ์์
- ์ด๋ ๊ฒ ์
๋ ฅํ๋ฉด ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํ ์ ์๋ค.
- MySQL ํํ์ด์ง ๊ฐ์ Documentation ํ์ด์ง - Connector/J 8.0 Developer Guide - 6. ConnectJ reference - 6.1 Driver/Datasource Class Name ๊ฐ๋ฉด ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํ ๋ ๋ฌด์จ ํด๋์ค๋ช
์ ์
๋ ฅํด์ผ ํ๋์ง ์ฐพ์ ์ ์๋ค.
- ๊ทธ ์ธ์๋ ๋ ํผ๋ฐ์ค๊ฐ ํ์ํ๋ฉด ์ฐธ๊ณ ํ์.
- ๋ง์ฝ ์ค์น๋ฅผ ์ ํ๋ค๋ฉด ์คํ์ ์ฐธ๊ณ ํ ๋๋ผ์ด๋ฒ๊ฐ ์์ด์
HTTP500
์๋ฌ๊ฐ ๋ฌ๋ค.
2. DB ์ฐ๊ฒฐ
DriverManager.getConnection("๋๋น์ฃผ์", "๋๋น์์ด๋", "๋๋น๋น๋ฐ๋ฒํธ");
DriverManager
๊ฐ์ฒด๋ฅผ ์ด์ฉํด DB
์ ๋๋ผ์ด๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ค.
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb", "root", "1234");
- ์ด๋ฐ ์์ผ๋ก
DB
์ ์ฃผ์์ ์์ด๋, ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ ๋ค ์ฐ๊ฒฐ ๊ฐ์ฒด ์ ๋ณด๋ฅผ Connection
์ ์ ์ฅํ๋ค.
- ์ด๋ฌ๋ฉด
mysql
๊ณผ ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ค. ์ด์ jsp
ํ์ผ์์ SQL
๋ฌธ์ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
JDBC ์ฌ์ฉ ์์ 1) ์ฌ์ฉ์๊ฐ ํํ์ด์ง์ ํ์๊ฐ์
ํ๋ ์ํฉ
<form action="insertPro.jsp" method="post">
์์ด๋ : <input type="text" name="id"><br>
๋น๋ฐ๋ฒํธ : <input type="password" name="pass"><br>
์ด๋ฆ : <input type="text" name="name"><br>
<input type="submit" value="์ ์กํ๊ธฐ">
</form>
- ์ฌ๊ธฐ์ ์ฌ์ฉ์๊ฐ ์ ๋ณด๋ฅผ ์
๋ ฅํ๊ณ
submit
๋ฒํผ์ ํด๋ฆญํ๋ฉด insertPro.jsp
ํ์ด์ง๋ก ์ ๋ฌ๋๋ค.
2. insertPro.jsp
๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์๊ฐ์
์ ๋ณด๋ฅผ ๋ฐ์์ DB
์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.
<% // ์คํฌ๋ฆฝํ๋ฆฟ ์ฌ์ฉ
// 0๋จ๊ณ : ๋๋ผ์ด๋ฒ ์ค์น - ์๋ฃ๋์ผ๋ ๋ก๋ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
// 1๋จ๊ณ : ๋๋ผ์ด๋ฒ ๋ก๋
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("๋๋ผ์ด๋ฒ ๋ก๋ ์ฑ๊ณต!");
// 2๋จ๊ณ : ๋๋น ์ฐ๊ฒฐ (๋๋น ๋ฐ๊พธ๋ ค๋ฉด jdbc:mysql://localhost:3306/๋ค์ ๋๋น ์ด๋ฆ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ)
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb", "root", "1234");
System.out.println("๋๋น ์ฐ๊ฒฐ ์ฑ๊ณต!");
System.out.println("์ฐ๊ฒฐ์ ๋ณด : " + con);
// 3๋จ๊ณ : SQL ๊ตฌ๋ฌธ ์์ฑ & stmt(statement) ๊ฐ์ฒด ์์ฑ
// String sql = "insert into itwill_member (id, pass, name) values('id', 'pw', 'name')";
// secure ์ฝ๋ฉ ์์) values์ ๋ด์ ๋ฐ์ดํฐ์ ๊ฐ์๋งํผ ?๋ฅผ ๋ฃ๋๋ค.
String sql = "insert into itwill_member (id, pass, name) values(?, ?, ?)";
// stmt ๊ฐ์ฒด ๋ง๋ค๊ธฐ : sql ๊ตฌ๋ฌธ์ ์คํํ๋ ๊ฐ์ฒด
// Statement stmt = con.createStatement(); // ํ์ง๋ง ์ด๋ ๊ฒ ์ฐ๋ ค๋ฉด valuse ๊ดํธ ์์ ๋ฐ์ดํ๋ฅผ ๋ ๋ง์ด ์จ์ผํด์ ์ ์ธ ์์
// ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํ ์์ ์ ๋ณด๋ฅผ ๋
ธ์ถํด์ ์จ์ผํด์ ๋ณด์์ ์ผ๋ก ์ข์ง ์๋ค.
// Statement๋ PreparedStatement ๊ฐ์ฒด ๋ ์ค ํ๋๋ง ์ธ ์ ์์
// pstmt ๊ฐ์ฒด : sql ๊ตฌ๋ฌธ์ ์คํํ๋ ๊ฐ์ฒด
PreparedStatement pstmt = con.prepareStatement(sql); // ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ฟผ๋ฆฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ์ ์ฌ์ ์ค๋นํจ
// ??? ๊ฐ sql ๊ตฌ๋ฌธ์ ์ฑ์๋ฃ๊ธฐ
// pstmt.setXXXXXX(๋ฌผ์ํ์ ์์น, ์ค์ ๋ค์ด๊ฐ ๊ฐ);
// => XXXXX : ์ปฌ๋ผ์ ๋ฐ์ดํฐํ์
(int, double, string, ...)์ ๋ฐ๋ผ ๋ณ๊ฒฝ
// * ? ๊ฐ์์ ๋์ผํ ๊ตฌ๋ฌธ์ ์ํํด์ผ ํจ - ?๊ฐ 3๊ฐ๋ฉด ์ฑ์ฐ๋ ๊ตฌ๋ฌธ 3๊ฐ ์์ด์ผ ํจ
// null ๋ฃ๊ณ ์ถ์ผ๋ฉด ์ฟผ๋ฆฌ๋ฌธ(String sql) ์์ ์ง์ ๋ฃ์ผ๋ฉด ๋จ
pstmt.setString(1, id); // ๋ป : 1๋ฒ ๋ฌผ์ํ์ id์ ํด๋นํ๋ ๊ฐ์ ๋ฃ๋๋ค.
pstmt.setString(2, pass);
pstmt.setString(3, name);
// 4๋จ๊ณ : SQL ๊ตฌ๋ฌธ ์คํ
// stmt.executeUpdate(sql); // ์๋ ๋ฏธ๋ฆฌ ์ค๋น ์ํด์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ค
pstmt.executeUpdate(); // ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ์คํ
System.out.println("insert ๋์ ์๋ฃ!");
%>
- ์ ๊ณผ์ ์ ์๋ฃํ๋ฉด ํฐ๋ฏธ๋์ด๋ ์ํฌ๋ฒค์น์์ ์ง์
SQL
๋ฌธ์ ์์ฑํ์ง ์์๋๋ฐ๋ DB
์ ๋ฐ์ดํฐ๊ฐ ์ฝ์
๋๋ค!
- ์ฌ์ฉ์๊ฐ ๋ณด๋ ํ์ด์ง๋
Form
ํ์ด์ง์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ Pro
ํ์ด์ง๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๊ณ ๊ทธ๋ด ํ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Pro
ํ์ด์ง๋ ๊ฐ๋ฐ๊ณผ์ ์์ ๊ฐ๋ฐ์๋ง ๋ณด๋ ํ์ด์ง์ด๋ค.
JDBC ์ฌ์ฉ ์์ 2) ํ์ ์ ๋ณด๋ฅผ ์์ ํ๋ ์ํฉ
<form action="updatePro.jsp" method="post">
์์ด๋ : <input type="text" name="id"><br>
๋น๋ฐ๋ฒํธ : <input type="password" name="pass"><br>
์์ ํ ์ด๋ฆ : <input type="text" name="update_name"><br>
<input type="submit" value="์ ์กํ๊ธฐ">
</form>
2. updatePro.jsp
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ก๋ฐ์ ์ ๋ณด๋ฅผ DB
์ ์ฝ์
ํ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.
<%
// ๊ทธ๋ฅ ๋ฐ์ผ๋ฉด ํ๊ธ์ด ๊นจ์ง๊ธฐ ๋๋ฌธ์ ๊ผญ ํ๊ธ์ฒ๋ฆฌ ํ ๋ฐ์ดํฐ ๋ฐ๊ธฐ๋ฅผ ์์ํ๋ค.
request.setCharacterEncoding("UTF-8");
// ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ ์ ์ฅ
String id = request.getParameter("id");
String pass = request.getParameter("pass");
String uName = request.getParameter("update_name");
%>
์์ด๋ : <%=id %><br>
๋น๋ฐ๋ฒํธ : <%=pass %><br>
์์ ํ ์ด๋ฆ : <%=uName %><br>
<hr>
<%
final String DRIVER = "com.mysql.cj.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPASS = "1234";
%>
<h2> 1. ๋๋ผ์ด๋ฒ ๋ก๋ </h2>
<%
Class.forName(DRIVER); // Class๋ java.lang ํจํค์ง์ ๋ค์ด์ ์ํฌํธ ์์ด ์ธ ์ ์์.
System.out.println("๋๋ผ์ด๋ฒ ๋ก๋ ์ฑ๊ณต!");
%>
<h2> 2. ๋๋น ์ฐ๊ฒฐ </h2>
<%
Connection con = DriverManager.getConnection(DBURL, DBID, DBPASS);
System.out.println("๋๋น์ฐ๊ฒฐ ์ฑ๊ณต!");
%>
<h2> 3. sql ์์ฑ & pstmt ์์ฑ </h2>
<%
String sql = "update itwill_member set name=? where id=? and pass=?"; // ?๋ mysql ๋ฌธ๋ฒ์ด ์๋๊ณ jsp ์ฝ๋์์๋ง ์ธ ์ ์๋ ๋ฌธ๋ฒ
PreparedStatement pstmt = con.prepareStatement(sql); // ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ง๋ค์ด์ง ์ ๋ณด๋ฅผ ์ ๋ฌ
// ? ์ฑ์ฐ๊ธฐ
pstmt.setString(1, uName);
pstmt.setString(2, id);
pstmt.setString(3, pass);
%>
<h2> 4. sql ์คํ </h2>
<%
pstmt.executeUpdate();
System.out.println("ํ์์ ๋ณด ์์ ์๋ฃ!");
%>
JDBC ์ฌ์ฉ ์์ 3) ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ ์ํฉ
<form action="deletePro.jsp" method="post">
์์ด๋ : <input type="text" name="id"><br>
๋น๋ฐ๋ฒํธ : <input type="password" name="pass"><br>
<input type="submit" value="์ ์กํ๊ธฐ">
</form>
2. deletePro.jsp
๋ผ๋ ์ด๋ฆ์ผ๋ก DB
์์ ์ ๋ฌ๋ฐ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ ์์
์ ํ๋ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pass = request.getParameter("pass");
%>
<%
final String DRIVER = "com.mysql.cj.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPASS = "1234";
%>
<h2> 1. ๋๋ผ์ด๋ฒ ๋ก๋ </h2>
<%
Class.forName(DRIVER);
%>
<h2> 2. ๋๋น ์ฐ๊ฒฐ </h2>
<%
Connection con = DriverManager.getConnection(DBURL, DBID, DBPASS);
%>
<h2> 3. sql ์์ฑ & pstmt ์์ฑ </h2>
<%
String sql = "delete from itwill_member where id=? and pass=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pass);
%>
<h2> 4. sql ์คํ </h2>
<%
pstmt.executeUpdate();
System.out.println("ํ์์ ๋ณด ์ญ์ ์๋ฃ!");
%>