ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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() ๋ฉ”์„œ๋“œ์™€ ์ปค์„œ์˜ ์ด๋™

     

    ** 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) ์†์— ์ €์žฅํ•ด ๋‘๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•„์š”ํ•  ๋•Œ์— ์ปค๋„ฅ์…˜์„ ํ’€์—์„œ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ  ๋‹ค์‹œ ํ’€์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ปค๋„ฅ์…˜ ์ƒ์„ฑ์— ๋”ฐ๋ฅธ ์—ฐ๊ฒฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ณ„์†ํ•ด์„œ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ๋˜๋Š” ์ปค๋„ฅ์…˜ ์ˆ˜๊ฐ€ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋ฉฐ, ํ•œ ๋ฒˆ์— ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ฅ์…˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์ ‘์†์ž ์ˆ˜๊ฐ€ ๋ชฐ๋ ค๋„ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‰ฝ๊ฒŒ ๋‹ค์šด๋˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

     

     

     

     

     

     

    ๋Œ“๊ธ€

Designed by Tistory.