[JSP/Servlet] JDBC로 DB에 접근하기

DANI·2023년 11월 13일

JSP/Servlet

목록 보기
8/9

📕 JDBC(Java DataBase Connectivity)

Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API(드라이버) 이다.

자바로 작성된 프로그램으로 DB와 관련된 작업을 처리할 수 있도록 제공되는 기능(코드)들을 모아놓은 것

JDBC는 Java 애플리케이션에서 데이터베이스에 접근하기 위해 JDBC API를 사용하여 데이터베이스에 연동할 수 있으며, 데이터베이스에서 자료를 쿼리(Query)하거나 업데이트하는 방법을 제공한다.


📝 JDBC API 클래스

여러 connection객체를 생성할 수 있으며 context.xml 설정파일에서 확인할 수 있다.



📝 JDBC를 이용한 데이터베이스 연동과정

  1. package import
  2. JDBC 드라이버 Load
  3. Connection 객체 생성
  4. Statement, PreparedStatement 객체 생성
  5. Query 수행
  6. ResultSet 객체로부터 데이터 추출
  7. ResultSet 객체 close
  8. Statement, PreparedStatement 객체 close
  9. Connection 객체 close


💾 DBConncetion 클래스 생성

package com.board;

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

/*
 * OJDBC를 이용해서 DB 커넥션을 얻어온다.
 */
public class DBConnection {
	
	// 라이브러리가 사용가능한 상태인지 확인
	public static void main(String[] args) {

		// DB 접속 정보
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String id = "dani";
		String pw = "dani";
		
		
		try {
			// 경로를 확인해볼수있다.
			// 1. 드라이버 로딩 - ojdbc6
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로딩 완료!");
			
			// 2. 커넥션 생성
			// DB에 접근 후 인증과정을 거쳐 커넥션을 얻어옵니다.
			// db도 서버라서 ip & port가 필요함 
			Connection con = DriverManager.getConnection(url, id, pw);
			
			// 3. 쿼리를 질의하기 위해 필요한 객체를 생성
			Statement stm = con.createStatement();
			
			
			// 4. 쿼리 실행
			// select - resultSet
			// insert, delete, update - int
			ResultSet rs = stm.executeQuery("select sysdate from dual");
			// 5.결과 저장 다음 값이 존재하는가?확인
            // 첫번째는 타이틀칼럼을 가르키기때문에 다음행이 있는 지 확인해야 한다.
			rs.next();
			System.out.println("현재 시간 "+rs.getString(1));
			
            // 6. 자원을 반납한다.
			rs.close();
			stm.close();
			con.close();
			
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버를 로딩할 수 없습니다.");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("드라이버를 연결할 수 없습니다.");
			e.printStackTrace();
		}
	}
}


💻 ojdbc6 라이브러리 추가하기

oracle 에서 제공하는 오라클 DB를 관리할 수 있도록 도와주는 JDBC(oracle 전용의 jdbc 라이브러리)

1. 메이븐 레파지토리 접속

https://mvnrepository.com/search?q=ojdbc6

2. 버전 선택 후 jar 파일 다운로드

3. webapp > lib 폴더 내부에 파일 옮기기

4. properties > Java Build Path > Livraries 에서 추가된 것을 확인할 수 있다.



💻 커넥션풀 설정하기

  1. 톰캣 홈페이지 접속
    https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html

  2. 사용하는 DB선택(오라클)

  1. 설정 코드 추가

💾 Context.xml

<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:orcl"
              username="dani" password="dani" maxTotal="20" maxIdle="10"
              maxWaitMillis="-1"/>

url과 username, password를 내가 설정한 대로 변경!


💾 web.xml

<resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>


💻 Context Parameter(컨텍스트 매개변수)로 web.xml에 DB 연결 정보 관리하기

💾 web.xml 파일에 DB접속 정보 추가

<!-- 데이터 베이스 접속 정보 -->
  <context-param>
  	<param-name>driver</param-name>
  	<param-value>oracle.jdbc.OracleDriver</param-value>
  </context-param>
  
 <context-param>
  	<param-name>url</param-name>
  	<param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value>
 </context-param>
  
 <context-param>
  	<param-name>id</param-name>
  	<param-value>dani</param-value>
 </context-param>
  
 <context-param>
  	<param-name>pw</param-name>
  	<param-value>dani</param-value>
 </context-param>


📝 커넥션 풀이란?

JDBC API를 사용하여 데이터베이스와 연결하기 위해 Connection 객체를 생성하는 작업은 비용이 많이 드는 작업 이며 비효율적이다.

이러한 문제를 해결하기 위해 애플리케이션 로딩 시점에 Connection 객체를 미리 생성하고, 애플리케이션에서 데이터베이스에 연결이 필요할 경우 미리 준비된 Connection 객체를 사용하여 애플리케이션의 성능을 향상하는 커넥션 풀(Connection Pool)이 등장하게 된다.

Connection 객체를 미리 생성하여 보관하고 애플리케이션이 필요할 때 꺼내서 사용할 수 있도록 관리해 주는 것이 커넥션 풀이다.
서버를 이용하여 서버가 객체를 생성해주는 것.



💾 ConnectionPool 클래스

package com.board;

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

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.spi.DirStateFactory.Result;
import javax.sql.DataSource;


/*
 * 톰캣으로부터 제공받는 기능이므로 서버를 실행 후 테스트 할 수 있다.
 * -> main 메소드를 이용한 실행이 불가능하다.
 * 
 */
public class DBConnectionPool {
	// DB에 접근하기 위해 필요한 객체 선언
	// -> 리소스에 context.xml에 저장되어 있음
	Connection con;
	Statement stmt;
	PreparedStatement pstmt;
	ResultSet rs;
	
	// 생성자로 해놓으면 객체 생성 시 자동으로 호출됨
	public DBConnectionPool() {
		
		try {
			Context initcontext = new InitialContext();
			Context envContext = (Context) initcontext.lookup("java:/comp/env");
			DataSource ds = (DataSource) envContext.lookup("jdbc/myoracle");
			con = ds.getConnection();
		} catch (NamingException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
		} 
	}
	
	// 자원의 반납
	public void close() {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(stmt!=null) stmt.close();
			if(con!=null) con.close();
		} catch (Exception e) {
			System.out.println("자원 반납 실패");
			e.printStackTrace();
		}
	}
}

0개의 댓글