JDBC

kailynยท2024๋…„ 9์›” 10์ผ

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
17/17

01. JDBC๋ž€

01. JDBC in java.sql package

01-01. JDBC (Java DataBase Connectivity)

๐Ÿ’ก Java์—์„œ DataBase์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” Programming API ์ด๋‹ค.

02. JDBC ์‚ฌ์šฉ Class

01. DriverManager

01-01. DriverManager Class

  • ๋ฐ์ดํ„ฐ ์›๋ณธ(= Database)์— JDBC driver๋ฅผ ํ†ตํ•˜์—ฌ Connection์„ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Driver๋ž€ ์ค‘๊ฐ„์—์„œ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ์˜๋ฏธํ•œ๋‹ค.
  • Class.forName() method๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค.
    • Class.forName()์—์„œ Class ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€ ์ •๋ณด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • forName() ๋ฉ”์†Œ๋“œ์— ํ’€ํด๋ž˜์Šค๋ช…์„ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ์‚ฌ์šฉํ•  ์ค€๋น„๋ฅผ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋™์  ๋กœ๋”ฉ์„ ์ด์šฉํ•˜์—ฌ DB driver๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค.

01-02. DriverManager Class ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  1. ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์ง์ ‘ instance ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€ํ•˜๊ณ , DriverManager ํด๋ž˜์Šค์˜ getConnection() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Connection instance๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

01-03. DriverManager Class ํ™œ์šฉ ์˜ˆ์‹œ

  1. Class.forName() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์‚ฌ์šฉํ•  Driver๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

    • ์•„๋ž˜ ์ฝ”๋“œ๋Š” MySQL JDBC Driver ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
    • ClassNotFoundException์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•ด์•ผ ํ•œ๋‹ค.
    Class.forName(Class.forName("com.mysql.cj.jdbc.Driver"););
  2. Drive/rManager๋ฅผ ์ด์šฉํ•ด Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • getConnection() ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
      • url : ์—ฐ๊ฒฐํ•  Database์˜ ์ฃผ์†Œ
      • user : Database์— ์ ‘์†ํ•  user ์ด๋ฆ„
      • password : Database ์ ‘์†์„ ์œ„ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ
    Connection con  = null;
    try { 
    	con = DriverManager.getConnection("jdbc:mysql://localhost/employee", "swcamp", "swcamp");
    }
  3. Properties ํŒŒ์ผ์„ ํ™œ์šฉํ•˜์—ฌ ์ˆ˜๊ธฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์†์„ฑ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ˆ˜๊ธฐ๋กœ ๋งค๋ฒˆ ์„ค์ • ์†์„ฑ์„ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์„ค์ • ์†์„ฑ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. 1) ์ˆ˜๊ธฐ๋กœ ์ž‘์„ฑํ•˜๋ฉด์„œ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค. 2) ์„ค์ • ์†์„ฑ์— ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํŒŒ์ผ๋งˆ๋‹ค ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. 3) Connection์„ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ๋งˆ๋‹ค ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
    • JDBD Configuration Properties ํŒŒ์ผ ์ž‘์„ฑ
      driver=com.mysql.cj.jdbc.Driver
      url=jdbc:mysql://localhost/employee
      user=swcamp
      password=swcamp
    • Properties ํŒŒ์ผ์„ ์ฝ์–ด์™€ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ
      • properties ํŒŒ์ผ์— key-value ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•œ ์„ค์ • ์ •๋ณด๋ฅผ ์ฝ์–ด์˜จ๋‹ค.

      • ์ธ์ž๋กœ url, user, password๋ฅผ ์ค˜๋„ ๋˜๊ณ , url, prop๋ฅผ ์ค˜๋„ ๋œ๋‹ค. (user์™€ password๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.)

        Properties prop = new Properties();
        Connection con = null;
        
        try {
            prop.load(new FileReader("jdbc-config.properties"));
        
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
        
            Class.forName(driver);
            con = DriverManager.getConnection(url, user, password);
        }

02. Connection

02-01. Connection Class

  • ํŠน์ • ๋ฐ์ดํ„ฐ ์›๋ณธ(= Database)๊ณผ ์—ฐ๊ฒฐ๋œ Connection์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Statement ํ˜น์€ PreparedStatement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
    • Connection instance๋ฅผ ์ƒ์„ฑํ•˜๊ณ  createStatement() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Statement instance๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ SQL๋ฌธ ์‹คํ–‰ ์ „ ์šฐ์„  Connection instance๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

02-02. Connection Class ํ™œ์šฉ

  • Connection ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ ์ „์— ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์†Œ๋กœ ping์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์ด ์ •์ƒ์ผ ๊ฒฝ์šฐ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • Connection ๊ฐ์ฒด ์ž์›์€ ์‚ฌ์šฉ ํ›„ ๋ฐ˜๋“œ์‹œ ๋ฐ˜๋‚ฉํ•ด์•ผ ํ•œ๋‹ค.
  • Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ์œ„์—์„œ DriverManager ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™•์ธํ•˜์˜€์œผ๋ฏ€๋กœ ์ƒ๋žตํ•œ๋‹ค.
  • Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ๋˜ํ•œ ์ค‘๋ณต ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, Template ํด๋ž˜์Šค์˜ static ๋ฉ”์†Œ๋“œ๋กœ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋‚ฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
    • ์ž์› ๋ฐ˜๋‚ฉ ์‹œ์—๋Š” null ์ฒดํฌ์™€ ์ด๋ฏธ ๋ฐ˜๋‚ฉ๋œ ์ž์›์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    • Template ์ฝ”๋“œ ์ž‘์„ฑ ์˜ˆ์‹œ
      public class JDBCTemplate {
      
          public static Connection getConnection() {
              Connection con = null;
      				//DriverManager๋ฅผ ํ™œ์šฉํ•œ Connnection ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ ์ƒ๋žต
              return con;
          }
      
      	public static void close(Connection con) {
              try {
                  if(con != null & !con.isClosed()) {
                      con.close();
                  }
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }

03. Statement

03-01. Statement Class ํŠน์ง•

  • SQL๋ฌธ์„ ์ €์žฅํ•˜๊ณ  ์‹คํ–‰ํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋“ค์ด ๋ฌถ์—ฌ ์žˆ๋Š” ํƒ€์ž…์˜ ํด๋ž˜์Šค์ด๋‹ค.

03-02. Statement ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ

  1. Connection class์˜ createStatement() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Statement instance๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. ์ƒ์„ฑํ•œ instance์˜ executeQuery() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ SQL๋ฌธ ์ˆ˜ํ–‰ํ•œ๋‹ค. (SQL๋ฌธ์„ String ํ˜•ํƒœ๋กœ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.)
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    try {
    	String query = "SELECT ID, LAST_NAME FROM EMP";
    	stmt = conn.createStatement(); // conn = Connection ๊ฐ์ฒด์ด๋‹ค.
    	rset = stmt.executeQuery(query);
    } catch (SQLException e) {
    	e.printStackTrace();
    }

04. PreparedStatement

04-01. PreparedStatement Class ํŠน์ง•

  • PreparedStatement๋„ Statement์ด๋‹ค. ๋”ฐ๋ผ์„œ Template ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ Statement๋ฅผ close() ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™„์„ฑ๋œ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ๋ฏธ์™„์„ฑ๋œ ์ฟผ๋ฆฌ๋ฌธ(= ์œ„์น˜ํ™€๋”๋ฅผ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๋ฌธ)์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • PreparedStatement๋Š” ์œ„์น˜ํ™€๋”(placeholder) ๊ฐœ๋…์— ํ•ด๋‹น๋˜๋Š” ์ธ์ˆ˜๊ฐ€ ๋งŽ์•„ ํŠน์ • ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ์ƒํ™ฉ์— ์œ ์šฉํ•˜๋‹ค.

04-02. PreparedStatement ์žฅ์ 

  1. ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

    • Java ์ฟผ๋ฆฌ๋ฌธ์€ ํŒŒ์‹ฑ์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์—ฐ์‚ฐ์‹ ๋“ฑ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ฑฐ์นœ ๋’ค์— ์ปดํŒŒ์ผ๋˜์–ด Database์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ตฌ์กฐ์ด๋‹ค.
    • Statement๋Š” SQL๋ฌธ ์‹คํ–‰ ์‹œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ „๋‹ฌํ•˜๋ฏ€๋กœ, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด๊ฐ’์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ์„ ์ƒˆ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ PreparedStatement๋Š” ์กฐ๊ฑด๊ฐ’์„ ?๋กœ ๋‘๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ค€๋น„์‹œํ‚จ ๋’ค, ์ฟผ๋ฆฌ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๋ณ€์ˆ˜๋งŒ ๋ฐ”๊ฟ” ์กฐํšŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ๋ฒˆ ์ปดํŒŒ์ผํ•œ ๋’ค ์บ์‹œ์— ๋‹ด์•„๋‘๊ณ  ์ˆ˜ํ–‰ํ•œ๋‹ค.

    โ‡’ PreparedStatement๊ฐ€ Statement๋ณด๋‹ค ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

  2. SQL injection ๊ณต๊ฒฉ์— ๋Œ€ํ•˜์—ฌ ์•ˆ์ „ํ•˜๋‹ค.

    • Statement ์‚ฌ์šฉ ์‹œ ์ „๋‹ฌํ•˜๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜์— OR 1=1 ์กฐ๊ฑด์„ ์ž‘์„ฑํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์ฒ˜๋Ÿผ ์กฐ๊ฑด์„ ์ฃผ๊ฒŒ ๋˜๋ฉด, empName์ด ํ™๊ธธ๋™์ธ ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ empID๊ฐ€ 200์ธ ์‚ฌ๋žŒ์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.
    empName = "ํ™๊ธธ๋™' OR 1=1 AND EMP_ID = '200";
    • ํ•˜์ง€๋งŒ PreparedStatement์™€ ์œ„์น˜ํ™€๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์กฐ๊ฑด์œผ๋กœ ์„ธํŒ…๋˜๋Š” ๊ฐ’์„ ๋ฉ”์†Œ๋“œ์˜ ์ง€์ • ํ˜•์‹์— ๋”ฐ๋ผ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ๋Š” ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์•Œ์•„์„œ ํ•œ๋‹ค.

    • ๋”ฐ๋ผ์„œ OR 1=1 ์กฐ๊ฑด์ด ์•…์˜์ ์ธ ์˜๋„๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ Sql Injection ๊ณต๊ฒฉ์— ์•ˆ์ „ํ•˜๋‹ค.

    • (์ฐธ๊ณ ) SQL Injection

      โ— SQL Injection์ด๋ž€

      • ์•…์˜์ ์œผ๋กœ SQL๋ฌธ์„ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์—ฌ Database๋ฅผ ๋น„์ •์ƒ์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ์ฝ”๋“œ ์ฃผ์ž… ๊ณต๊ฒฉ์ด๋‹ค.
      • ํŠนํžˆ ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ์ ‘๊ทผํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ•ดํ‚นํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ์žˆ์—ˆ๋‹ค.
      • ๋งค์šฐ ์ดˆ๋ณด์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ ์œ ์šฉํ•œ ํ•ดํ‚น ๊ธฐ๋ฒ• ์•„๋‹ˆ๋ฉฐ, ํ˜„์žฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ์ดํŠธ์—์„œ ๋ฐฉ์–ดํ•˜๊ณ  ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐPreparedStatement๊ฐ€ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๋ฏ€๋กœ, ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด PreparedStatement ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

04-03. PreparedStatement ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ

  1. Connection class์˜ preparedStatement() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ instance ์ƒ์„ฑํ•œ๋‹ค.
  2. SQL๋ฌธ์„ ์œ„์น˜ํ™€๋”(placeholder) ใ€Œ?ใ€๋กœ ํ‘œํ˜„ํ•˜๋Š” String์œผ๋กœ ์ •์˜ํ•œ๋‹ค.
  3. PreparedStatement์˜ setString() ๋ฉ”์†Œ๋“œ๋กœ ์œ„์น˜ํ™€๋”์˜ ์ˆœ์„œ์™€ ๋„ฃ์–ด ์ค„ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค.
  4. ์ƒ์„ฑํ•˜๊ณ  ์œ„์น˜ํ™€๋” ๊ฐ’์„ ์„ธํŒ…ํ•œ instance์˜ executeQuery() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ SQL๋ฌธ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ
    try {
    	String query = "INSERT INTO MEMBER VALUES(?, ?)";
    	pstmt = conn.preparedStatement(query);
    	pstmt.setString(1, id);
    	pstmt.setString(2, password);
    	rset = pstmt.executeQuery();
    } catch (SQLException e) {
    	e.printStackTrace();
    }

04-04. SQL๋ฌธ ๊ด€๋ฆฌ

  • SQL๋ฌธ์„ XMlํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฟผ๋ฆฌ XMl ํŒŒ์ผ ์ž‘์„ฑ ์˜ˆ์‹œ
      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
      <properties>
          <comment/>
          <entry key="selectEmpByFamilyName">
              SELECT
              E.*
              FROM EMPLOYEE E
              WHERE E.EMP_NAME LIKE CONCAT(?, '%')
          </entry>
      </properties>
    • XML ํŒŒ์ผ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ฝ์–ด์™€ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ ์˜ˆ์‹œ
      try {
          prop.loadFromXML(new FileInputStream("employee-query.xml"));
          String query = prop.getProperty("selectEmpByFamilyName");
      
          pstmt = con.prepareStatement(query);
          pstmt.setString(1, empName);
      
          rset = pstmt.executeQuery();
      } 

05. ResultSet

05-01. ResultSet Class

  • SELECT๋ฌธ ์ˆ˜ํ–‰ ์„ฑ๊ณต ์‹œ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • SQL๋ฌธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
  • ์ปค์„œ(cursor)๋กœ ํŠน์ • ํ–‰์— ๋Œ€ํ•œ ์ฐธ์กฐ ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Connection๊ณผ Statement๋„ close()๋กœ ์ž์› ๋ฐ˜๋‚ฉํ•˜๋“ฏ, ResultSet๋„ close()๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ฐ˜๋‚ฉํ•ด์•ผ ํ•œ๋‹ค.

05-02. ResultSet method

  • getString()
    • ResultSet์˜ ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๋กœ์šฐ์—์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ์ปฌ๋Ÿผ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ get์ž๋ฃŒํ˜•(โ€์ปฌ๋Ÿผ๋ช…โ€) ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • next()
    • ResultSet์˜ ์ปค์„œ ์œ„์น˜๋ฅผ ํ•˜๋‚˜ ๋‚ด๋ฆฌ๋ฉด์„œ ๋‹ค์Œ ํ–‰์ด ์กด์žฌํ•˜๋ฉด true ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • while๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ์˜ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ํ–‰์”ฉ ๊ฐ€์ง€๊ณ  ์˜ฌ ๋•Œ ํ™œ์šฉํ•œ๋‹ค.
    • ๋‹จ, ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๋  ์ปฌ๋Ÿผ์ด 1๊ฑด์ž„์ด ํ™•์‹คํ•˜๋ฉด while ๋ธ”๋Ÿญ ๋Œ€์‹  if๋ฌธ์— ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ ์šฉ ์ฝ”๋“œ ์˜ˆ์‹œ
    while(rset.next()) {
        System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
    }

03. JDBC ์ฝ”๋“œ ์ž‘์„ฑ

01. JDBC ์ฝ”๋“œ ์ž‘์„ฑ ์ ˆ์ฐจ

01-01. JDBC ์ฝ”๋“œ ์ž‘์„ฑ ์ ˆ์ฐจ ์‹ค์Šต

  1. DriverManager์— ํ•ด๋‹น DBMS Driver๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

    • ๋ฐ˜๋“œ์‹œ ClassNotFoundException ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    • ์•„๋ž˜ ์ฝ”๋“œ๋Š” MySql Driver๋ฅผ ๋“ฑ๋กํ•œ ๊ฒƒ์ด๋‹ค.
    Class.forName("com.mysql.cj.jdbc.Driver");
  2. Driver๋กœ๋ถ€ํ„ฐ Connection instance๋ฅผ ํš๋“ํ•˜์—ฌ DBMS์— ์—ฐ๊ฒฐํ•œ๋‹ค.

    • ๋ฐ˜๋“œ์‹œ SQLException ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    public static Connection getConnection(String url, String user, String password) throws SQLException {
    	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/employee", "shamyook", "shamyook");
    }
  3. Connection ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Statement ๋˜๋Š” PreparedStatement instance๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    • PreparedStatement ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์—๋Š” ์ค€๋น„์‹œํ‚ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•˜์—ฌ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
    Statement stmt = conn.createStatement();
    PreparedStatement pstmt = conn.preparedStatement(query);
  4. Statement์—์„œ ์ œ๊ณตํ•˜๋Š” method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.

    • SELECT๋ฌธ์€ ์กฐํšŒ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ResultSet์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , INSERT/UPDATE/DELETE๋ฌธ์€ ์ •์ƒ์ ์œผ๋กœ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ ํ–‰์ˆ˜(๋กœ์šฐ์ˆ˜)๋ฅผ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • SELECT๋ฌธ ์ˆ˜ํ–‰ ์˜ˆ์‹œ
    String query = "SELECT ID, LAST_NAME FROM EMP";
    ResultSet rset = stmt.executeQuery(query);
    
    while(rset.next()){
    	System.out.println(rset.getString("ID") + "\t" + rset.getString(2));
    }
    • UPDATE๋ฌธ ์ˆ˜ํ–‰ ์˜ˆ์‹œ
    String query = "UPDATE EMP SET LAST_NAME = โ€˜KIMโ€™" + " WHERE ID = โ€˜10000โ€™";
    int result = stmt.executeUpdate(query);
  5. ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ๋‹ด์•„ ํ™”๋ฉด์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์‚ฝ์ž…/์ˆ˜์ •/์‚ญ์ œ ์ž‘์—…์˜ ์ •์ƒ ์—ฌ๋ถ€์— ๋”ฐ๋ผ commit ๋˜๋Š” rollback์„ ๊ฒฐ์ •ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  6. Connection close ๋ฐ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    rset.close(); //ResultSet ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ๋ฐ˜๋‚ฉ ์ฒ˜๋ฆฌ
    stmt.close(); //Statement ๋ฐ˜๋‚ฉ ์ฒ˜๋ฆฌ
    conn.close(); //Connection ๋ฐ˜๋‚ฉ ์ฒ˜๋ฆฌ
profile
๋‚˜๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค...!

0๊ฐœ์˜ ๋Œ“๊ธ€