[JSP] 개념정리 - 3

leesoyeong·2024년 1월 20일

JSP

목록 보기
3/3
post-thumbnail

Must Have 성낙현의 JSP 자바 웹 프로그래밍을 정리한 내용이다.

5. 데이터베이스

5.1 JDBC 설정 및 데이터베이스 연결

JDBC(Java Database Connectivity)란 자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API이다. JDBC API를 사용하기 위해서는 JDBC 드라이버가 있어야한다. 각 DBMS에 맞는 JDBC 드라이버를 다운로드한 후 설정하면 DBMS 종류에 상관없이 동일한 방식으로 프로그래밍 할 수 있게된다.

API란?
API(Application Programing Interface)는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체라고 할 수 있다.

JDBC 드라이버를 설치하려면 ojdbc숫자.jar가 필요하다.

드라이버 파일을 프로젝트와 연결하는 방법

  1. WAS(톰캣)가 설치된 경로 하위의 lib폴더에 추가하는 것이다.
  2. 개별 프로젝트의 WEB-INF 하위의 lib 폴더에 추가하는 방법이다.

첫번째 방법은 한 번 설정하면 해당 컴퓨터에서 실행되는 모든 웹 애플리케이션에 적용된다. 그러나 웹 어플리케이션 배포 파일에 드라이버가 포함되지 않으므로 별도의 설정에 더 해줘야한다. 두번째 방법은 프로젝트마다 동일한 설정을 반복해야한다. 처음에는 번거롭지만 작업 공간을 변경하거나 배포 시에도 드라이버가 함께 따라간다.

5.2 연결 관리 클래스

JDBC 드라이버를 이용하여 DB와 연결을 관리하는 클래스

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.ServletContext;

public class JDBConnect {
    public Connection con;
    public Statement stmt;  
    public PreparedStatement psmt;  
    public ResultSet rs;

    // 기본 생성자
    public JDBConnect() {
        try {
            // JDBC 드라이버 로드
            Class.forName("oracle.jdbc.OracleDriver");

            // DB에 연결
            String url = "jdbc:oracle:thin:@localhost:1521:xe";  
            String id = "유저명";
            String pwd = "유저 비밀번호"; 
            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();
        }
  • Connection : 데이터베이스와 연결을 담당한다.
  • Statement : 인파라미터가 없는 정적 쿼리문을 실행할 때 사용된다.
  • PreparedStatement : 인파라미터가 있는 동적 쿼리문을 실행 할 때 사용된다. 인파라미터는 쿼리문 작성 시 매개변수로 전달된 값을 설정할 때 사용한다. ?(물음표)로 표현한다.
  • ResultSet : Select 쿼리문의 결과를 저장할 때 사용된다.
    URL은 "오라클 프로토콜@호스트명(혹은 IP 주소):포트번호:sid" 형식으로 구성된다.

5.3 연결설정 개선

주로 web.xml에 입력해놓고 필요할 때마다 application 내장 객체를 통해 얻어온다.

 <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>유저명</param-value>
  </context-param>
  <context-param>
    <param-name>OraclePwd</param-name>
    <param-value>유저비밀번호</param-value>
  </context-param>
 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();
        }
    }

5.4 연결설정 개선 2

 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.5 커넥션 풀로 성능 개선

커넥션 풀이란 Connection 객체를 미리 생성해 풀에 넣어놓고, 요청이 있을 때 이미 생성된 Connection 객체를 가져다 사용하는 기법이다. 사용이 완료되 ㄴ객체는 연결을 해제하는 것이 아니라 풀에 반납하여 필요할 때 재사용할 수 있도록 한다.

커넥션 풀과 JNDI

JSP 프로그래밍 시 커넥션 풀은 직접 만들어 사용하지 않고 WAS가 제공하는 것을 이용하는 게 좋다.
대부분의 WAS는 커넥션 풀을 비롯한 여러 자원을 JNDI 서비스로 제공한다. JNDI 서비스는 자바 소프트웨어에서 객체나 데이터를 전체 경로를 몰라도 '이름'만으로 찾아 쓸 수 있는 디렉터리 서비스이다. 이름과 실제 객체와의 연결은 외부의 설정 파일에서 관리하므로 다른 객체로 교체하거나 세부 설정을 바꿀 때도 소스코드를 수정하고 다시 컴파일할 필요가 없다.

  1. WAS(톰캣)가 시작할 때 server.xml과 context.xml에 설정하는 대로 커넥션 풀을 생성한다.
  2. JSP 코드에서 JNDI 서버(WAS가 제공)로부터 데이터소스 객체를 얻어온다.
  3. 데이터소스로부터 커넥션 객체를 가져온다.
  4. DB 작업을 수행한다.
  5. 모든 작업이 끝나면 커넥션 객체를 풀로 반환한다.

server.xml 수정

<Resource auth="Container"
              driverClassName="oracle.jdbc.OracleDriver"
              type="javax.sql.DataSource" 
              initialSize="0"
              minIdle="5"
              maxTotal="20"
              maxIdle="20"
              maxWaitMillis="5000"
              url="jdbc:oracle:thin:@localhost:1521:xe"
              name="dbcp_myoracle"
              username="유저명"
              password="비밀번호" />
  • driverClassName : JDBC 드라이버의 클래스명
  • type : 데이터소스로 사용할 클래스명
  • initialSize : 풀의 최초 초기화 과정에서 미리 만들어놓을 연결의 개수(기본값은 0)
  • minldle : 최소한으로 유지할 연결 개수(기본값은 0)
  • maxTotal : 동시에 사용할 수 있는 최대 연결 개수(기본값은 8)
  • maxldle : 풀에 반납할 때 최대로 유지될 수 있는 연결 개수(기본값은 8)
  • maxWaitMillis : 새로운 요청이 들어왔을 때 얼마나 대기할지를 밀리초 단위로 기술
  • url : 오라클 연결을 위한 URL
  • name : 생성할 자원(여기서는 풀)의 이름
  • username : 계정 아이디
  • password : 계정 패스워드

context.xml 수정

 <ResourceLink global="dbcp_myoracle" name="dbcp_myoracle" 
                  type="javax.sql.DataSource"/>
profile
초보 개발자

0개의 댓글