๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/Boost Course Web

1.5 JDBC

1) JDBC๋ž€? 

 

JDBC ๊ฐœ์š”

  • JDBC(Java Database Connectivity)์˜ ์ •์˜
    - ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†๊ณผ SQL ๋ฌธ์žฅ์˜ ์‹คํ–‰, ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์–ป์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ํ•ธ๋“ค๋ง์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ ˆ์ฐจ์— ๊ด€ํ•œ ๊ทœ์•ฝ
    - ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ SQL๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ” API
    - SQL๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ†ตํ•ฉ ์ ‘๊ทผ ์ค‘ ํ•œ ํ˜•ํƒœ

  • JAVA๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์ธ JDBC API๋ฅผ ์ œ๊ณต

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”, ๋˜๋Š” ๊ธฐํƒ€ ์จ๋“œํŒŒํ‹ฐ์—์„œ๋Š” JDBC ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋“œ๋ผ์ด๋ฒ„(driver)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

JDBC ํ™˜๊ฒฝ ๊ตฌ์„ฑ

  • JDK ์„ค์น˜

  • JDBC ๋“œ๋ผ์ด๋ฒ„ ์„ค์น˜
    - Maven์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. MySQL์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.

<dependency>  
 <groupId>mysql</groupId>  
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
</dependency>

 mysql ๋ฒ„์ „์€ cmd์ฐฝ์ด๋‚˜ terminal์ฐฝ์—์„œ mysql -V ์น˜๋ฉด ๋‚˜์˜ค๋Š” ๊ฒƒ์œผ๋กœ pom.xml์˜ dependency ์ˆ˜์ •.

 

 

JDBC๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•

  1. import java.sql.*;

  2. ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œ ํ•œ๋‹ค.

  3. Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  4. Statement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ์งˆ์˜ ์ˆ˜ํ–‰

  5. SQL๋ฌธ์— ๊ฒฐ๊ณผ๋ฌผ์ด ์žˆ๋‹ค๋ฉด ResultSet ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  6. ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋‹ซ๋Š”๋‹ค.

// 1. IMPORT
import java.sql.*;

// 2. ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
Class.forName( "com.mysql.jdbc.Driver" );
com.mysql.cj.jdbc.Driver

// 3. Connection ์–ป๊ธฐ
String dburl  = "jdbc:mysql://localhost/dbName";
"jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
Connection con =  DriverManager.getConnection ( dburl, ID, PWD );

// ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ
public static Connection getConnection() throws Exception{
  String url = "jdbc:oracle:thin:@117.16.46.111:1521:xe";
  String user = "smu";
  String password = "smu";
  Connection conn = null;
  Class.forName("oracle.jdbc.driver.OracleDriver");
  conn = DriverManager.getConnection(url, user, password);
  return conn;
}

// 4. Statement ์ƒ์„ฑ
Statement stmt = con.createStatement();

// 5. ์งˆ์˜ ์ˆ˜ํ–‰
ResultSet rs = stmt.executeQuery("select no from user" );


// ์ฐธ๊ณ 
stmt.execute(“query”);             //any SQL
stmt.executeQuery(“query”);     //SELECT
stmt.executeUpdate(“query”);   //INSERT, UPDATE, DELETE

// 6. ResultSet์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ›๊ธฐ
ResultSet rs =  stmt.executeQuery( "select no from user" );
while ( rs.next() )
     System.out.println( rs.getInt( "no") );

// 7. Close
rs.close();
stmt.close();
con.close();

 

JDBC ํด๋ž˜์Šค์˜ ์ƒ์„ฑ ๊ด€๊ณ„

JDBCํด๋ž˜์Šค์˜ ์ƒ์„ฑ๋‹จ๊ณ„

// ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ
public List<GuestBookVO> getGuestBookList(){
    List<GuestBookVO> list = new ArrayList<>();
    GuestBookVO vo = null;
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try{
      conn = DBUtil.getConnection();
      String sql = "select * from guestbook";
      ps = conn.prepareStatement(sql);
      rs = ps.executeQuery();
      while(rs.next()){
        vo = new GuestBookVO();
        vo.setNo(rs.getInt(1));
        vo.setId(rs.getString(2));
        vo.setTitle(rs.getString(3));
        vo.setConetnt(rs.getString(4));
        vo.setRegDate(rs.getString(5));
        list.add(vo);
      }
    }catch(Exception e){
      e.printStackTrace();
    }finally {
      DBUtil.close(conn, ps, rs);
    }   
    return list;    
  }


 // ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ
 public int addGuestBook(GuestBookVO vo){
    int result = 0;
    Connection conn = null;
    PreparedStatement ps = null;
    try{
      conn = DBUtil.getConnection();
      String sql = "insert into guestbook values(guestbook_seq.nextval,?,?,?,sysdate)";
      ps = conn.prepareStatement(sql);
      ps.setString(1, vo.getId());
      ps.setString(2, vo.getTitle());
      ps.setString(3, vo.getConetnt());
      result = ps.executeUpdate();
    }catch(Exception e){
      e.printStackTrace();
    }finally {
      DBUtil.close(conn, ps);
    }
    return result;
  }


 // ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ
 public static void close(Connection conn, PreparedStatement ps){
    if (ps != null) {
      try {
        ps.close();
      } catch (SQLException e) {e.printStackTrace(); }
    }

    if (conn != null) {
      try {
        conn.close();
      } catch (SQLException e) {e.printStackTrace();}
    }
  }

 

 

์˜ค๋ฅ˜ ์žก๊ธฐ

1. ์˜ค๋ฅ˜์ฐฝ(๊ฒฝ๊ณ ์ฐฝ): Establishing SSL connection without server's identity verification is not recommended.

ํ•ด๊ฒฐ๋ฒ•: dburl ์„ ๊ณ ์นจ

/*

* ๊ฒฝ๊ณ ๋‹ค. ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ ์‹คํ–‰๋งˆ๋‹ค ๊ฒฝ๊ณ ๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

* 

* ์šฐ์„  ์œ„ ๋‚ด์šฉ์€ ์ตœ์‹  mysql๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋ช…์‹œ์ ์ธ SSL ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด 

* ๊ธฐ๋ณธ์ ์œผ๋กœ SSL์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ์—๋Ÿฌ์ด๋‹ค. ์˜ˆ์ „์—๋Š” ๊ทธ๋ƒฅ 

* jdbc:mysql://localhost:3306/test์ด๋Ÿฐ ์‹์œผ๋กœ ์ ‘์† uri๋ฅผ ์„ค์ •ํ–ˆ์—ˆ๋‹ค. 

* ์—ฌ๊ธฐ์—๋Š” ๋ช…์‹œ์ ์ธ SSL์—ฐ๊ฒฐ์„ค์ •์ด ์—†๋‹ค.

* ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ SSL์ ‘์† ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์„ค์ •ํ•˜๊ฑฐ๋‚˜ (useSSL=false) useSSL=true๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ๋Š” 

* ์„œ๋ฒ„์ธ์ฆ๊ฒ€์ฆ์„ ์œ„ํ•œ truststore๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋œ๋‹ค. ๊ฐœ๋ฐœ์‹œ์—๋Š” ๊ทธ๋ƒฅ false๋กœ ํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋œ๋‹ค.

* 

* private static String dburl = "jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false";
* ์—ฌ๊ธฐ์—์„œ connectdb๋Š” ๊ฐ์ž ์„ค์ •ํ•ด๋‘” db์ด๋ฆ„์„ ์ ๋Š”๋‹ค
*/

 

 

2. ์˜ค๋ฅ˜์ฐฝ: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

ํ•ด๊ฒฐ๋ฒ•:

ALTER USER 'connectuser'@'%' IDENTIFIED WITH mysql_native_password BY 'connect123!@#';

flush privileges;

 

3. ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ํ•ญ์ƒ ์ €์žฅํ•˜๊ณ  maven → update project

 

4. XML๋ฌธ์„œ์˜ ํ‘œ์ค€์€ w3c์—์„œ ์ •ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

'Spring > Boost Course Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2.3 Servlet  (0) 2020.11.19
2.2 ์›น ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •  (0) 2020.11.19
2.1 Web๊ฐœ๋ฐœ์˜ ์ดํ•ด  (0) 2020.11.19
1.4 Maven  (0) 2020.11.19
1.3 ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •  (0) 2020.11.09
1.2 SQL  (0) 2020.11.09