19.05.03 JDBC로 데이터베이스 연동

Back-End/JSP 2019. 5. 3. 12:03
728x90
반응형

-JDBC-


JDBC는 데이터베이스를 다루기 위한 자바 API(Application Programming Interface).

자바를 기반으로 하는 프로그램을 작성할 때 프로그래머에게 데이터베이스를 쉽게 다룰 수 있도록 해주는 것

JDBC를 통해서 어떠한 DBMS일지라도 질의문을 던져서 데이터를 가져올 수 있는 것입니다.


- 구성 : JDBC 인터페이스 + JDBC 드라이버

- 목적 : 데이터베이스 연동 자바 프로그램시 인터페이스의 사용만으로 데이터베이스를 다루기 위함


JDBC 인터페이스 : 프로그래머에게 쉬운 데이터베이스와 연동되는 프로그램을 작성할 수 있게 하는 도구


JDBC 드라이버 : JDBC 인터페이스를 구현하여 실제로 DBMS를 작동시켜서 질의를 던지고 결과를 받습니다.





 JDBC Driver Type 타입의 종류


 JDBC-ODBC 브릿지+ODBC 드라이버

 

네이티브-API 부분적인 자바드라이버


 JDBC-Net 순수 자바 드라이버

 네이티브-프로토콜 

순수 자바 드라이버


JDK에서 제공하는 드라이버로서 

JDBC 뿐만 아니라 ODBC를 같이 이용하여 데이터베이스에 접근하는 방법

 

로컬에 설치된 원시 라이브러리를 

이용해 데이터베이스와 연결되는 방식

어플리케이션이 데이터베이스에 JDBC로 

요청을 하면 이 요청을 

원시 라이브러리의 메소드 호출로 

변환하여 요청을 하는 것입니다.


 타입 2와 비슷하지만 이 방식은 원시 라이브러리의 호출이 

원격 서버에서 이루어지므로 

인터넷에 연결되어져 있다면 

원시 라이브러리를 이용하여 연결되어질 수 있는 이점이 있다.

 순수 자바로 만들어졌음.

ODBC나 원시 라이브러리를 이용하지 

않고 곧바로 데이터베이스에 연결되어진다는 이점이 있음.




-예제 및 출력 결과-


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package ch11;
 
import java.sql.*;
 
public class DriverTest {
    public static void main(String[] args) {
        Connection con;
 
        try {
            Class.forName("org.gjt.mm.mysql.Driver").newInstance(); // org.git.mm.mysql.Driver는 드라이버 이름.
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql""root""1234"); // 데이터베이스 연결
            System.out.println("Success"); // mysql에서 mydb라는 데이터베이스가 없었기 때문에 mysql 데이터베이스를 대신 연결하였다.
        } catch (SQLException ex) {
            System.out.println("SQLException" + ex );
        } catch (Exception ex) {
            System.out.println("Exception:" + ex );
        }
    }
}
 
cs





-JDBC API-


데이터베이스 연결, 질의 전송, 결과 처리 등의 과정들이 데이터베이스 연동 프로그램시 많이 사용되는 과정들입니다.

이때 쓰이는 인터페이스들은 JDBC API에 존재합니다.


 

  Driver : 모든 드라이버 클래스들이 구현해야 하는 인터페이스 입니다.


  DriverManager : 드라이버를 로드하고 데이터베이스에 연결할 수 있게 됩니다.


  Connection : 특정 데이터베이스와의 연결을 말합니다.


  Statement : SQL문을 실행해 작성된 결과를 돌려줍니다.


  PreparedStatement : 사전에 컴파일 된 SQL문을 실행합니다.


  ResultSet : SQL문에 대한 결과를 얻어냅니다.





-JDBC에서의 한글 처리-


 

  jdbc:mysql://[hostname][:port]/dbname[?param1=value1][&param2=value2]...



위의 구조에서 뒤에 들어갈 파라미터의 종류는 다음과 같습니다.



파라미터 이름


사용 용도

기본 설정값 


user


데이터베이스 사용 user 지정 

none 


password


user의 패스워드 지정 

none


autoReconnect


연결이 해제되었을 때 자동 재연결 설정 여부 

false 


maxReconnects


autoReconnect가 true로 설정되었을 때 재연결까지에 대한 설정 (몇 번의 연결시도를 할 것인지) 


initialTimeout


auto0Reconnect가 true로 설정되었을 때 재연결까지 대기시간 설정(초) 


maxRows

 

반환받는 최대 행 개수 지정(0이면 모든 행을 반환) 


useUnicodde


유니코드 문자 인코딩 사용 여부 지정 

should the driver use Unicode character encodings when handing strings? (true / false) 

false


characterEncoding


useUnicode가 true로 설정되었을 때, 인코딩 종류 지정 

none



MySQL과  Tomcat 연동에 있어서 한글이 깨어지는 것 방지 코드 (JDBC URL에 파라미터를 부여해서 사용)


  ....

  Connection C = DriverManager.getConnection(

                       "jdbc : mysql://localhost/test?useUnicod=true&characterEncoding=EUC-KR");

  ....




-JSP와 데이터베이스 연동-



  JSP에서 JDBC를 통해서 데이터베이스와 연동을 하는 방법 : 데이터베이스에 관련된 프로그램 코드들이 jsp 페이지에 포함되어 있음


  JDBC를 사용해서 데이터베이스에 연결하는 부분을 분리시킨 방법 : jsp 페이지가 아닌 자바빈에 분리시킨 것.

 



-

1. JDBC 드라이버의 인스턴스 생성


 

  Class.forName("Driver_Name");




2. JDBC 드라이버 인스턴스를 통해 DBMS에 대한 연결 설정



  Connection con = DriverManager.getConnection("DBURL", "Account ID", "Account PW");

 



3. Statement 생성



  Statement stmt = conn.createStatement( );

 



4. 질의문 실행/ResultSet으로 결과 받음



  ResultSet rs = stmt.executeQuery("select * from ...");

 



5. ResultSet 해지



  rs.close( );

 



6. Statement 해지



  stmt.close( );

 



7. 데이터베이스와 연결 해지


  

  conn.close( );

 



-예제 및 출력 결과-


데이터베이스 테이블 생성 및 자료 삽입


1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE tblRegister(
id VARCHAR(20NOT NULL,
pwd VARCHAR(20NOT NULL,
name CHAR(6NULL,
num1 CHAR(6NULL,
num2 CHAR(7NULL,
email VARCHAR(30NULL,
phone VARCHAR(30NULL,
zipcode CHAR(5NULL,
address VARCHAR(60NULL,
job VARCHAR(30NULL
);
cs



-JSP 파일-


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    import="java.sql.*"%>
<%@ page import="java.util.*,ch11.*"%>
<%
    Class.forName("org.gjt.mm.mysql.Driver"); //JDBC 드라이버 인스턴스 생성
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
 
    String id = "", pwd = "", name = "", num1 = "", num2 = "", email = "", phone = "", zipcode = "",
            address = "", job = "";
    int counter = 0;
    try {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb""root""1234"); //Connection 생성
        stmt = conn.createStatement(); //statement 생성
        rs = stmt.executeQuery("SELECT * FROM tblRegister"); //질의 실행 결과를 ResultSet에 담는다.
%>
<html>
<head>
<title>JSP에서 데이터베이스 연동</title>
<link href="style.css" rel="stylesheet" type="text/css">
<!-- 디자인 관련 (style.css)파일을 링크시킨다. -->
</head>
<body bgcolor="#FFFFCC">
    <h2>JSP 스크립트릿에서 데이터베이스 연동 예제</h2>
    <br />
    <h3>회원정보</h3>
    <table bordercolor="#0000ff" border="1">
        <tr>
            <td><strong>ID</strong></td>
            <td><strong>PWD</strong></td>
            <td><strong>NAME</strong></td>
            <td><strong>NUM1</strong></td>
            <td><strong>NUM2</strong></td>
            <td><strong>EMALL</strong></td>
            <td><strong>PHONE</strong></td>
            <td><strong>ZIPCODE/ADDRESS</strong></td>
            <td><strong>JOB</strong>
        </tr>
        <%
            if (rs != null//질의에 실행 결과가 null값이 아닐때 다음 질의를 실행(slect결과값을 불러옴)
            {
 
                    while (rs.next()) //id등 각종 값을 받아와서 변수에 넣는다.
                    {
                        id = rs.getString("id");
                        pwd = rs.getString("pwd");
                        name = rs.getString("name");
                        num1 = rs.getString("num1");
                        num2 = rs.getString("num2");
                        email = rs.getString("email");
                        phone = rs.getString("phone");
                        zipcode = rs.getString("zipcode");
                        address = rs.getString("address");
                        job = rs.getString("job");
        %>
        <tr>
            <td><%=id%></td>
            <td><%=pwd%></td>
            <td><%=num1%></td>
            <td><%=num2%></td>
            <td><%=email%></td>
            <td><%=phone%></td>
            <td><%=zipcode%></td>
            <td><%=address%></td>
            <td><%=job%></td>
            <%
                counter++//1회전 할때 마다 1씩 증가 전체 출력할 개수를 확인하는 용도
                    } //end while
 
            } //end if
            %>
        </tr>
    </table>
    <br /> total records :
    <%=counter%>
    <%
        } catch (SQLException sqlException) {
            System.out.println("sql exception");
        } catch (Exception exception) {
            System.out.println("exception");
        } finally {
            if (rs != null)
                try {
                    rs.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
 
            if (stmt != null)
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
 
            if (conn != null)
                try {
                    conn.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
 
        }
    %>
</body>
</html>
cs




-Connection Pool을 사용한 데이터베이스 연결-


사용자가 한꺼번에 많이 몰릴 경우 (트래픽이 많이 걸릴 경우) 요청이 많을 때 서버측은 요청에 맞는 파일 생성을 하고, 필요하면

데이터베이스에 연결해서 자료를 찾고 필요한 자료를 찾은 뒤 데이터베이스 연결을 해제하고, 다시 필요하면 연결하고 끊었다, 

닫았다를 수 없이 되풀이 하게 됩니다.

게다가 데이터베이스에 연결하는 부분은 서버에 많은 부하를 줍니다.

이러한 부하를 줄이기 위해서 데이터베이스에 연결하는 커넥션을 관리하기 위해 커넥션풀을 사용합니다.



  ConnectionPool을 통한 데이터베이스 연결방법



  DBConnectionMgr pool = DBConnectionMgr.getInstance( );   //데이터베이스 연결 풀 객체를 얻습니다.


  conn = pool.getConnection( );  //얻어진 풀로 Connection을 얻는다. 주어진 Connection을 통해서 질의를 던지고 받는 등 업무 처리.


  pool.freeConnection(conn);   //마지막으로 사용된 Connection을 반환합니다. 얻어진 풀 객체를 재사용하기 위해서 닫지 않고 풀에 반환.

 




-데이터베이스 연동 프로그램시 단계-


드라이버 로딩, 커넥션 연결, 질의 전송, 결과 처리의 단계가 있습니다.

하지만 커넥션 풀을 사용하면, 커넥션 풀에서 드라이버 로딩과 커넥션에 대한 관리를 맡아서 해주기 때문에

커넥션 풀을 통해 커넥션을 얻어오기만 합니다.

그리고 나중에 얻어진 커넥션을 다시 풀에 반환합니다.

우선, 풀로부터 커넥션을 얻고 나서 질의를 전송하고, 결과를 받아서 처리를 하는 작업이 행해져야 합니다.

 

 

 

-ConnectionPool과 Bean을 이용한 데이터베이스 연결-

 

데이터베이스 연동관련 코드를 사용하는 프로그램에서 jsp 페이지에 데이터베이스 관련 코드가 있는 것보다 데이터베이스 관련

코드들은 자바빈즈 등의 자바 파일로 분리해서 프로그램을 구현하는 것이 좋습니다.

그리하여 JSP에서는 자바빈을 사용만 하는식의 구성이 좋습니다.

728x90
반응형
: