2022년 6월 20일 월요일

JSP 5강 - 데이터베이스

 1. JDBC 란?

자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API.

JDBC로 오라클을 이용하려면 JDBC 드라이버가 필요함.

드라이버를 설치하는 방법

1) WAS가 설치된 경로 하위의 lib폴더에 추가하기

2) 프로젝트의 WEB-INF 하위의 lib 폴더에 추가하기(배포시에 자동으로 추가되어 추천 방법)


2. 연결 관리 클래스 (기본 방법)

public class JDBConnect {

    public Connection con; // 데이터베이스와 연결을 담당

    public Statement stmt;  //인파라미터가 없는 정적 쿼리문을 실행할 때 사용

    public PreparedStatement psmt;  //인파라미터가 있는 동적 쿼리문 실행할 때 사용

    public ResultSet rs; //SELECT 쿼리문 결과를 저장할 때 사용


    // 기본 생성자

    public JDBConnect() {

        try {

            // JDBC 드라이버 로드

            Class.forName("oracle.jdbc.OracleDriver");


            //오라클 프로토콜@호스트명:포트번호:sid

            String url = "jdbc:oracle:thin:@localhost:1521:xe";  

            String id = "DB 접속 ID";

            String pwd = "DB접속 PW"; 

            con = DriverManager.getConnection(url, id, pwd); 


            System.out.println("DB 연결 성공(기본 생성자)");

        }

        catch (Exception e) {            

            e.printStackTrace();

        }

    }

    // 연결 해제(자원 반납 - 공통 방법)

    public void close() { 

        try {            

            if (rs != null) rs.close(); 

            if (stmt != null) stmt.close();

            if (psmt != null) psmt.close();

            if (con != null) con.close(); 


            System.out.println("JDBC 자원 해제");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

3. 연결 관리 클래스 (2번의 개선 방법)

2번의 방법은 접속 정보가 코드에 입력되어 있어서 변경될 때마다 매번 컴파일을 해야 한다.

서버 환경은 web.xml에 입력하고 필요할 때마다 application 내장 객체를 통해 얻어와야 한다.

--------------------------WebContent/WEB-INF/web.xml -------------------------------

<!-- 오라클 데이터베이스 접속 정보 -->

  <context-param>

    <param-name>OracleDriver</param-name>

    <param-value>oracle.jdbc.OracleDriver</param-value>

  </context-param>

  <context-param>

    <param-name>OracleURL</param-name>

    <param-value>jdbc:oracle:thin:@localhost:1521:xe</param-value>

  </context-param>

  <context-param>

    <param-name>OracleId</param-name> 

    <param-value>오라클 ID</param-value>

  </context-param>

  <context-param>

    <param-name>OraclePwd</param-name>

    <param-value>오라클 암호</param-value>

  </context-param>

--------------------------WebContent/WEB-INF/web.xml -------------------------------

//위와 같이 입력 후 새로운 생성자로 구현

----------import 표시생략---------

import java.sql.DriverManager;


public class JDBConnect {

    public Connection con;

    public Statement stmt;  

    public PreparedStatement psmt;  

    public ResultSet rs;


    // web.xml에서 정보를 읽어와 이 생성자를 호출

    public JDBConnect(String driver, String url, String id, String pwd) {

        try {

            // JDBC 드라이버 로드

            Class.forName(driver);  


            // DB에 연결

            con = DriverManager.getConnection(url, id, pwd);


            System.out.println("DB 연결 성공(인수 생성자 1)");

        }

        catch (Exception e) {            

            e.printStackTrace();

        }

    }

}

4. 연결 관리 클래스 (3번의 개선 방법)

위의 방법은 web.xml에 입력한 후 내장 객체를 통해 가져왔으나, DB 접속 때마다 동일한 코드를 JSP에 반복해서 입력해야 한다. 컨텍스트 초기화 매개변수를 생성자에서 직접 가져올 수 있도록 정의 한다.

---- 생략-----

import java.sql.DriverManager;

public class JDBConnect {

    public Connection con;

    public Statement stmt;  

    public PreparedStatement psmt;  

    public ResultSet rs;

    // 세 번째 생성자

    public JDBConnect(ServletContext application) {

        try {

            // JDBC 드라이버 로드

            String driver = application.getInitParameter("OracleDriver"); 

            Class.forName(driver); 


            // DB에 연결

            String url = application.getInitParameter("OracleURL"); 

            String id = application.getInitParameter("OracleId");

            String pwd = application.getInitParameter("OraclePwd");

            con = DriverManager.getConnection(url, id, pwd);


            System.out.println("DB 연결 성공(인수 생성자 2)"); 

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

5. 연결 관리 클래스 (4번 방법을 커넥션 풀로 성능 개선)


4번의 방법은 요청이 있을 때마다 DB와 새로 연결 했다가 해제를 반복해야 한다.

빈번한 연결/해제는 시스템 성능에 영향을 미친다.

커넥션 풀이란 Connection 객체를 미리 생성해 pool에 넣어 놓고, 요청이 있을 때 이미 생성된 Connection 객체를 가져다 사용하고, 사용 완료된 객체는 pool에 반납하여 재사용하는 기법.

-------WAS의 JNDI를 통해 커넥션 풀을 사용하는 절차----

1) WAS(톰캣)이 시작할 때 server.xml 과 context.xml에 설정한 대로 커넥션 풀을 생성한다.

2) JSP 코드에서 JNDI 서버(WAS가 제공)로부터 데이터소스 객체를 얻어온다.

3) 데이터소스로부터 커넥션 객체를 가져온다.

4) DB 작업을 수행한다.

5) 모든 작업이 끝나면 커넥션 객체를 풀로 반환한다.

-------WAS의 JNDI를 통해 커넥션 풀을 사용하는 절차----

6. 커넥션 풀 설정

-- server.xml 변경 사항 --

    <Resource auth="Container"

              driverClassName="oracle.jdbc.OracleDriver" //JDBC 드라이버의 클래스명

              type="javax.sql.DataSource"  //데이터소스로 사용할 클래스명

              initialSize="0"  //풀의 최초 초기화 과정에서 미리 만들어 놓을 연결 개수

              minIdle="5" //최소한으로 유지할 연결 개수

              maxTotal="20" //동시에 사용할 수 있는 최대 연결 개수

              maxIdle="20" //풀에 반납할 때 최대로 유지될 수 있는 연결 개수

              maxWaitMillis="5000" //새로운 요청이 들어왔을 때 대기할 시간

              url="jdbc:oracle:thin:@localhost:1521:xe" //오라클 연결을 위한 URL

              name="dbcp_myoracle" //생성할 자원의 이름

              username=" 유저아이디"

              password="유저암호" />


--content.xml 변경 사항--

    <ResourceLink global="dbcp_myoracle" name="dbcp_myoracle" 

                  type="javax.sql.DataSource"/>

7. 커넥션 풀 동작

--import 생략--

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class DBConnPool {

    public Connection con;

    public Statement stmt;

    public PreparedStatement psmt;

    public ResultSet rs;


    // 기본 생성자

    public DBConnPool() {

        try {

            // 커넥션 풀(DataSource) 얻기

            Context initCtx = new InitialContext();

            Context ctx = (Context)initCtx.lookup("java:comp/env");

            DataSource source = (DataSource)ctx.lookup("dbcp_myoracle");


            // 커넥션 풀을 통해 연결 얻기

            con = source.getConnection();


            System.out.println("DB 커넥션 풀 연결 성공");

        }

        catch (Exception e) {

            System.out.println("DB 커넥션 풀 연결 실패");

            e.printStackTrace();

        }

    }


    // 연결 해제(자원 반납)

    public void close() {

        try {            

            if (rs != null) rs.close();

            if (stmt != null) stmt.close();

            if (psmt != null) psmt.close();

            if (con != null) con.close();  // 자동으로 커넥션 풀로 반납됨


            System.out.println("DB 커넥션 풀 자원 반납");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

8. 위의  DB 연결 방법들 테스트 코드

<%@ page import="common.JDBConnect"%> 

<%@ page import="common.DBConnPool"%> 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<html>

<head><title>JDBC</title></head>

<body>

    <h2>JDBC 테스트 1</h2>

    <%

    JDBConnect jdbc1 = new JDBConnect(); 

    jdbc1.close(); 

    %>

    

    <h2>JDBC 테스트 2</h2>

    <%

    String driver = application.getInitParameter("OracleDriver"); 

    String url = application.getInitParameter("OracleURL");

    String id = application.getInitParameter("OracleId");

    String pwd = application.getInitParameter("OraclePwd");


    JDBConnect jdbc2 = new JDBConnect(driver, url, id, pwd); 

    jdbc2.close();

    %>

    

  <h2>JDBC 테스트 3</h2>

    <%

    JDBConnect jdbc3 = new JDBConnect(application); 

    jdbc3.close();

    %>

    

    <h2>커넥션 풀 테스트</h2>

    <%

    DBConnPool pool = new DBConnPool();

    pool.close();

    %>

</body>

</html>

댓글 없음:

댓글 쓰기