-
JDBC ํต์ฌ ๊ฐ๋ ์ ๋ฆฌ๊ฐ๋ฐ/JSP 2022. 5. 13. 01:43
JSP ์์ ๋ค๋ฃจ๋ JDBC ๊ด๋ จ ํต์ฌ ๊ฐ๋ ๋ค์ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด๋ณด์์ต๋๋ค :)
๋ฉด์ ๋ ํน์๋ ๋์ฌ๋งํ ์ฌํญ๋ค์ ์์ฃผ๋ก ๊ฐ๋ตํ ๋๋ตํ ์ ์๋๋ก ์ ๋ฆฌ ์์ฝํ ๊ฒ์ด๋, ์์ธํ ์ค๋ช ์ ๋ถ์กฑํ ์ ์์ต๋๋ค.
DBMS์ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ
- ๋ฐ์ดํฐ์ ์ถ๊ฐ/์กฐํ/๋ณ๊ฒฝ/์ญ์
- ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ(integrity) ์ ์ง
- ํธ๋์ญ์ ๊ด๋ฆฌ
- ๋ฐ์ดํฐ์ ๋ฐฑ์ ๋ฐ ๋ณต์
- ๋ฐ์ดํฐ ๋ณด์
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Relational DBMS)์ด๋ค. ์ฌ๊ธฐ์๋ ์ค๋ผํด, MySQL, MS SQL ๋ฑ์ด ์๋ค. ์ด๊ฒ์ ๊ธฐ์ค์ผ๋ก ๋ด์ฉ์ ์งํํ ๊ฒ์ด๋ค.
ํ ์ด๋ธ(table)
RDBMS์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ฅผ ๋งํ๋ค.
์คํค๋ง(schema)
ํ ์ด๋ธ์ ๊ตฌ์กฐ์ ๊ด๋ จ๋ ์ ๋ณด(์นผ๋ผ, ์นผ๋ผ ํ์ , ์นผ๋ผ์ ๊ธธ์ด)
๋ ์ฝ๋(record)
์นผ๋ผ ๋ฐ์ดํฐ ๋ชจ์, ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ ๊ฐ์ ๋ ์ฝ๋๋ก ๊ตฌ์ฑ๋๋ค.
์ฃผ์ํค(Primary key)
๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ํน์ ๊ฐ์ ์ด์ฉํด์ ์ ๋ ฌํด ๋์ ์ข ๋ ๋น ๋ฅด๊ฒ ๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์๋๋ก ํ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ์นผ๋ผ
ex) ํ์ ์์ด๋๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ๋ค๋ฉด, ํ์์์ด๋์ ํด๋นํ๋ MEMBERID ์นผ๋ผ์ ์ฃผ์ํค๋ก ์ฌ์ฉํ๋ค.
์ธ๋ฑ์ค(Index)
๋ฐ์ดํฐ์ ์์๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ ฌํด์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ฉฐ ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
ex) ํ์์ ์ด๋ฆ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ธฐ๋ฅ์ด ๋ง์ ๊ฒฝ์ฐ์๋ NAME ์นผ๋ผ์ ์ฌ์ฉํ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ํ์ ์ด๋ฆ์ผ๋ก๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๊ฒ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ก๊ทธ๋๋ฐ์ ํ์ ์์
- DBMS : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ์์คํ (ex. Oracle, MySql...)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค : ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ (๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ DBMS์ ๋ง๊ฒ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.)
- DBMS ํด๋ผ์ด์ธํธ : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ดํ๋ฆฌ์ผ์ด์ (ex. TOAD, DBeaver, MySQL Workbench...)
JDBC์ ๊ตฌ์กฐ
JSP๋ฅผ ํฌํจํ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ์ ์๊ด์์ด JDBC API๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ค. JDBC API๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํต์ ์ ํ๋ค.
JDBC ๋๋ผ์ด๋ฒ
DBMS์์ ํต์ ์ ๋ด๋นํ๋ ์๋ฐ ํด๋์ค. DBMS๋ง๋ค ๋ณ๋์ JDBC ๋๋ผ์ด๋ฒ๊ฐ ํ์ํ๋ค. ๊ฐ DBMS๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ jar ํ์ผ ํํ๋ก ์ ๊ณตํ๋ค. JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํด์ ์ํ๋ ์์ ์ ์ํํ ์ ์๋ค.
JDBC ๋๋ผ์ด๋ฒ๋ ํ ๋ฒ๋ง ๋ก๋ฉํ๋ฉด ์ดํ๋ก ๊ณ์ํด์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ JSP๋ฅผ ์คํํ ๋๋ง๋ค JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ ํ์๊ฐ ์๋ค. ๊ฐ์ฅ ์ข์ ์์ ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ํ ๋๋ค. ์ฆ, ํฐ์บฃ๊ณผ ๊ฐ์ ์น ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์๋์ผ๋ก JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ๋๋ก ์ง์ ํ๋ฉด JSP ํ์ด์ง์์ ๋งค๋ฒ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ ํ์๊ฐ ์๋ค.
์๋์ ๊ฐ์ด ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์์ฑํ๊ณ , ์ค์ ์ ํ๋ฉด JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์์์ ๋ก๋ฉํ๋ฏ๋ก, ๊ฐ๋ณ JSP๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ ํ์๊ฐ ์์ด์ง๋ค.
MySQLDriverLoader.java
package jdbc; import javax.servlet.http.HttpServlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; public class MySQLDriverLoader extends HttpServlet { public void init(ServletConfig config) throws ServletException { try{ Class.forName("com.mysql.jdbc.Driver"); } catch(Exception ex) { throw new ServletException(ex); } } }
web.xml
<servlet> <servlet-name>mysqlDriverLoader</servlet-name> <servlet-class>jdbc.MySQLDriverLoader</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
JDBC ์ฐ๊ฒฐ
1. JDBC ๋๋ผ์ด๋ฒ ๋ก๋ฉ
Class.forName("com.mysql.jdbc.Driver");
** Class.forName() ๋ฉ์๋๋ ์ง์ ํ ํด๋์ค ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ Class ์ธ์คํด์ค๋ฅผ ๊ตฌํด์ฃผ๋ ๊ธฐ๋ฅ๋ง์ ์ ๊ณตํ๋ค. JDBC ๋๋ผ์ด๋ฒ์ ํด๋นํ๋ ํด๋์ค๋ค์ Class.forName() ๋ฉ์๋๋ฅผ ํตํด์ ๋ก๋ฉ๋ ๋ ์๋์ผ๋ก JDBC ๋๋ผ์ด๋ฒ๋ก ๋ฑ๋กํ๋ค.
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์์ฑ
Connection conn = DriverManager.getConnection(jdbcURL);
Connection conn = DriverManager.getConnection(jdbcURL, dbUser, dbPass);** JDBC๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ์ ๊ตฌํด์ผ ํ๋ค. java.sql.Connection ํ์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๋ํ๋ด๋ฉฐ, java.sql.DriverManager ํด๋์ค๊ฐ ์ ๊ณตํ๋ getConnection()๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ปค๋ฅ์ ์ ๊ตฌํ ์ ์๋ค. DriverManager ํด๋์ค๋ ์์ ๋ getConnection() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ์ด ๋ฉ์๋๋ Connection ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋๋ฐ, ๋ฆฌํดํ์ง ๋ชปํ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋, ๋ฐ๋์ try -catch ๋ธ๋ก์ ์ฌ์ฉํด์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
3. Statement ์์ฑ
Statement stmt = conn.createStatement();
** Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋ Connection ๊ฐ์ฒด๋ก๋ถํฐ Statement๋ฅผ ์์ฑํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค. Statement๋ ์์ ๊ฐ์ด Connection์ createStatement() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
๐ก PreparedStatement๋ฅผ ์ฌ์ฉํ ์ฟผ๋ฆฌ ์คํ
java.sql.PreparedStatement๋ java.sql.Statement์ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ฐจ์ด์ ์ด ์๋ค๋ฉด PreparedStatement๋ SQL ์ฟผ๋ฆฌ์ ํ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ ๊ฐ์ ๋์ค์ ์ง์ ํ๋ค๋ ๊ฒ์ด๋ค. ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. Connection.preparedStatement() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ PreparedStatement ์์ฑ
2. PreparedStatement์ set๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๊ฐ ์ง์
3. PreparedStatement์ executeQuery() ๋๋ executeUpdate() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํ
4. finally ๋ธ๋ก์์ ์ฌ์ฉํ PreparedStatement๋ฅผ ๋ซ์(close() ๋ฉ์๋ ์คํ)PreparedStatement pstmt = null; ... //์คํํ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ ฅํ๋๋ฐ, //๊ฐ ๋ถ๋ถ์ ๋ฌผ์ํ๋ก ๋์นํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. pstmt = conn.preparedStatement( "insert into MEMBER (MEMBERID, NAME, EMAIL) values (?, ?, ?)"); //๊ทธ ๋ค์์ set*** ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ง์ ํด์ค๋ค. //์์ ์ซ์๋ ๋ฌผ์ํ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ธ๋ค. //์ธ๋ฑ์ค๋ 1๋ถํฐ ์์ํ๊ณ , ๋์ค๋ ์์๋๋ก 1์ฉ ์ฆ๊ฐํ๋ค. pstmt.setString(1, "madvirus"); pstmt.setString(2, "์ต๋ฒ๊ท "); //LONG VARCHAR ํ์ ์ ๊ฐ์ ์ง์ ํ๊ณ ์ถ์ ๋๋ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. //ํด์์ ํ์๋ฉด, //ํด๋น ์ธ๋ฑ์ค์ Reader๋ก๋ถํฐ length ๊ธ์ ์ ๋งํผ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. String value = "..."; //LONG VARCHAR์ ๋ฃ์ ๊ฐ java.io.StringReader reader = new java.io.StringReader(value); pstmt.setCharacterStream(1, reader, value.length()); //๋ง์ฝ, ํ ์คํธ ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค. FileReader reader = new java.io.FileReader(ํ์ผ๊ฒฝ๋ก); pstmt.setCharacterStream(1, reader);
๐ก PreparedStatement VS Statement
Statement ์ฟผ๋ฆฌ ๋์ PreparedStatement ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ ๋ณํ์ ์๋์ผ๋ก ํ๊ธฐ ์ํด
- ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ํด์์๋ก ๋ค์ด ์ค๋ช ํ์๋ฉด, Statement๋ฅผ ์ฌ์ฉํด์ "์ต'๋ฒ๊ท "๊ณผ ๊ฐ์ด ์ค๊ฐ์ ์์๋ฐ์ดํ๊ฐ ํฌํจ๋ ๊ฐ์ ์ง์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์๋ฐ์ดํ๋ฅผ ๋ ๋ฒ ์ฌ์ฉํ๋ ํํ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค. ํ์ง๋ง, PreparedStatement์ ๊ฒฝ์ฐ๋ setString() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์์์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๊ธฐ ๋๋ฌธ์ ์์๋ฐ์ดํ๋ฅผ ๋ณํํ ํ์๊ฐ ์๋ค.
pstmt.setString(1, "์ต'๋ฒ๊ท "); //์๋ง๊ฒ ๋ฐ์ดํ ์ฒ๋ฆฌ stmt.setString( "select * from member where name = ""' + "์ต'๋ฒ๊ท ".replaceAll(" ' ", " '' ") + "' ");
๋ํ TIMESTAMP๋ DATE, TIME ํ์ ์ ๊ฒฝ์ฐ๋ ๋์ฑ ๋ณต์กํด์ DBMS๋ง๋ค ๋ ์ง์ ์๊ฐ์ ํํํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Statement๋ฅผ ์ด์ฉํด์ ์ง์ ์ฟผ๋ฆฌ์ ๊ฐ์ ์ง์ ํ๋ฉด DBMS๋ง๋ค ์ฝ๋๊ฐ ๋ฌ๋ผ์ง๋ค. ๋ฐ๋ฉด์, PreparedStatement๋ฅผ ์ฌ์ฉํ๋ฉด DBMS์ ์๊ด ์์ด ๋ค์๊ณผ ๊ฐ์ ๋์ผํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
Timestamp time = new Timestamp(System.currentTimeMillis()); pstmt.setTimestamp(3, time);
๋ฟ๋ง ์๋๋ผ, ์ง์ ํ ๊ฐ์ด ๋ง์์ง ๊ฒฝ์ฐ ๋ฐ์ดํ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์ฝ๋ ์์ฑ์ ์ค๋ฅ ๋ฐ์ ์ํ์ด ๋ง์ Statement์ ๋ฌ๋ฆฌ, PreparedStatement๋ ๊น๋ํ ์ฝ๋๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
4. ์ฟผ๋ฆฌ ์คํ
Resultset rs = stmt.executeQuery(query); //SELECT ์ฟผ๋ฆฌ ์คํ
int result = stmt.executeUpdate(String query) //INSERT, UPDATE, DELETE ์ฟผ๋ฆฌ ์คํ, ๋ณ๊ฒฝ ๋ ๋ ์ฝ๋์ ๊ฐ์ ๋ฆฌํด** Statement ์ executeQuery() ๋ฉ์๋๋ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฌ์ฉ๋๋ฉฐ, SELECT ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ java.sql.ResultSet ๊ฐ์ฒด์ ๋ด์์ ๋ฆฌํดํ๋ค. ๋ฐ๋ผ์, ResultSet์ด ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฒฐ๊ณผ๊ฐ์ ์ฝ์ด์ฌ ์ ์๋ค.
** PreparedStatement๋ก ์์ฑํ ๊ฒฝ์ฐ, ์ด๋ฏธ ์์ฑํ ๋์ ์คํํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์ธ์๋ก ์ ๋ ฅ๋ฐ์ง ์๋๋ค.
5. ์ฟผ๋ฆฌ ์คํ๊ฒฐ๊ณผ ์ถ๋ ฅ
while(rs.next()) { String name = rs.getString("NAME"); }
** ResultSet ํด๋์ค๋ next() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋๋ฐ, next() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ SELECT ๊ฒฐ๊ณผ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค. ์ต์ด์ ์ปค์๋ 1ํ ์ด์ ์ ์กด์ฌํ๋ค. ์์ ๊ทธ๋ฆผ ์ฒ๋ผ ์ปค์๋ฅผ ํตํด ๊ฐ ํ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. ๋ค์ ํ์ด ์กด์ฌํ ๊ฒฝ์ฐ true๋ฅผ ๋ฆฌํดํ๊ณ , ์ปค์๋ฅผ ๊ทธ ํ์ผ๋ก ์ด๋ ์ํจ๋ค. ๋ง์ง๋ง ํ์ ์ปค์๊ฐ ๋๋ฌํ๋ฉด next() ๋ฉ์๋๋ false๋ฅผ ๋ฆฌํดํ๋ค.
** ๊ฐ ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ค๊ธฐ ์ํด, get***() ํํ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
** SQL์์ ๋๋์ ํ ์คํธ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ ํ์ ์ธ LONG VARCHAR ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ค๋ฉด getCharacterStream() ๋ฉ์๋๋ฅผ ์ด์ฉํ ์๋ ์๋ค. ( ๋ค์์ JDBC ๋๋ผ์ด๋ฒ๋ getString() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฝ์ด์ฌ ์ ์๋๋ก ํ๊ณ ์๋ค. ์คํธ๋ฆผ์ ์ฌ์ฉํด์ผํ ์ด์ ๊ฐ ์๋ค๋ฉด getString() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.) ์ด ๋ฉ์๋๋ ๋ฆฌํดํ์ ์ด java.io.Reader์ด๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
String data = null; java.io.Reader reader = null; try { //1. ResultSet์ getCharacterStream()์ผ๋ก Reader ๊ตฌํ๋ค. reader = rs.getChracterStream("FIELD"); if(reader != null) { //2. ์คํธ๋ฆผ์์ ์ฝ์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ๋ฅผ ์์ฑํ๋ค. StringBuilder buff = new StringBuilder(); char[] ch = new char[512]; int len = -1; //3. ์คํธ๋ฆผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ฒํผ์ ์ ์ฅํ๋ค. while((len = reader.read(ch)) != -1) { buff.append(ch, 0,len); } //4. ๋ฒํผ์ ์ ์ฅํ ๋ด์ฉ์ String์ผ๋ก ๋ณํํ๋ค. data = buff.toString(); } } catch (IOExeception ex) { //5. IO ๊ด๋ จ ์ฒ๋ฆฌ ๋์ค ๋ฌธ์ ๊ฐ ์์ผ๋ฉด IOException์ด ๋ฐ์ํ๋ค. //์ต์ ์ ๋ฐ์ } finally { //6. Reader๋ฅผ ์ข ๋ฃํ๋ค. if (reader != null) try { reader.close(); } catch(IOException ex) {} } // ... data๋ฅผ ์ฌ์ฉ
6. ์ฌ์ฉํ ์์ ์ข ๋ฃ ( rs -> stmt -> conn)
ํด๋น ๊ฐ์ฒด๋ค์ ๋ค ์ฌ์ฉํ ๋ค์๋ close() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๊ฐ์ฒด๋ค์ด ์ฌ์ฉํ ์์์ ๋ฐํํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์คํ ์์์ด ๋ถํ์ํ๊ฒ ์๋ชจ๋์ด ํด๋น ์์์ ์ฌ์ฉํ ์ ์๋ ์ํฉ์ด ๋ฐ์ํ ์๋ ์๋ค.
JDBC ํธ๋์ญ์ ์ฒ๋ฆฌ
ํธ๋์ญ์ ์ ์์๊ณผ ์ข ๋ฃ๋ฅผ ๊ฐ๊ณ ์๋ค. ํธ๋์ญ์ ์ด ์์๋๋ฉด ์ดํ๋ก ์คํ๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ DBMS์ ๊ณง๋ฐ๋ก ๋ฐ์๋์ง ์๊ณ ์์๋ก ๋ณด๊ด๋๋ค. ์ดํ ํธ๋์ญ์ ์ ์ปค๋ฐ(commit) ํ๋ฉด ์์ ๋ณด๊ดํ ๋ชจ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ฐ์ดํฐ์ ๋ฐ์ํ๋ค. ๋ง์ฝ ์ปค๋ฐํ๊ธฐ ์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์์๋ก ๋ณด๊ดํ ๋ชจ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ฐ์ดํฐ์ ๋ฐ์ํ์ง ์๊ณ ์ทจ์ํ๋ค. ์ด๊ฒ์ ๋กค๋ฐฑ(rollback)์ด๋ผ๊ณ ํ๋ค.
๊ตฌํ๋ฐฉ์์ ๋ค์์ ๋๊ฐ์ง๊ฐ ์๋ค.
- JDBC์ ์คํ ์ปค๋ฐ ๋ชจ๋๋ฅผ false๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ : ๋จ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌ ์์์ ์ Connection.setAutoCommit() ๋ฉ์๋์ false๋ฅผ ๊ฐ์ผ๋ก ์ ๋ฌํด์ ์์ํ๋ฉด๋๋ค.
//ํธ๋์ญ์ ์์ conn.setAutoCommit(false); ... //์ฟผ๋ฆฌ์คํ //ํธ๋์ญ์ ์ปค๋ฐ conn.commit(); //catch๋ฌธ ๋ด์์ ์์ธ์ฒ๋ฆฌ์ //ํธ๋์ญ์ ๋กค๋ฐฑ //conn.rollback();
- JTA(Java Transaction API)๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ : ๋๊ฐ ์ด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ
์ปค๋ฅ์ ํ
์ง๊ธ๊น์ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ด ํ์ํ ๋ ์ปค๋ฅ์ ์ ์์ฑํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ดํด๋ณด์๋๋ฐ, ์ฌ์ค ๋์ ์ ์์๊ฐ ๋ง์ ์น ์ฌ์ดํธ์์๋ ์ด๋ฐ ๊ฒฝ์ฐ ๋งค๋ฒ ์ปค๋ฅ์ ์ ์์ฑํ๊ณ ๋ซ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ง์ด ์๋ชจ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์ปค๋ฅ์ ํ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ํ(pool) ์์ ์ ์ฅํด ๋๊ณ ์๋ค๊ฐ, ํ์ํ ๋์ ์ปค๋ฅ์ ์ ํ์์ ๊ฐ์ ธ๋ค ์ฐ๊ณ ๋ค์ ํ์ ๋ฐํํ๋ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค. ์ปค๋ฅ์ ์์ฑ์ ๋ฐ๋ฅธ ์ฐ๊ฒฐ ์๊ฐ์ ์ค์ผ ์ ์์ผ๋ฉฐ, ๊ณ์ํด์ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ฑ๋๋ ์ปค๋ฅ์ ์๊ฐ ์ผ์ ํ๊ฒ ์ ์ง๋๋ค. ๋ฐ๋ผ์ ์คํ ์๋๊ฐ ๋นจ๋ผ์ง๋ฉฐ, ํ ๋ฒ์ ์์ฑ๋ ์ ์๋ ์ปค๋ฅ์ ์๋ฅผ ์ ์ดํ๊ธฐ ๋๋ฌธ์ ๋์ ์ ์์ ์๊ฐ ๋ชฐ๋ ค๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ฝ๊ฒ ๋ค์ด๋์ง ์๋ ์ฅ์ ์ด ์๋ค.
'๊ฐ๋ฐ > JSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ธ๋ฆฟ(Servlet)์ด๋, ์๋ธ๋ฆฟ(Servlet)์ ์๋ช ์ฃผ๊ธฐ (1) 2022.05.10