JSP - DB 연결하기(JDBC & DBCP)

서버에 데이터베이스를 연결할 때 JDBC나 DBCP를 사용합니다.

JDBC와 DBCP가 무엇인지, 둘의 차이점이 뭔지, 그리고 각각 어떻게 사용하는지를 포스팅하도록 하겠습니다.

JDBC

자바가 데이터베이스에 접근하는 프로그램을 제작할 때 DBMS의 종류가 다양하고 각각 구조와 특징이 다르다는 문제점이 있었습니다. 이를 해결하면서 DB 연결을 원활하게 이루기 위해 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성하는 JDBC를 개발하였습니다.

JDBC를 작성하는 순서는

  1. 드라이버 로드하기
  2. 커넥션 객체 생성하기
  3. 스테이트먼트 객체 생성하기 (Statement/PreparedStatement)
  4. SQL문에 결과물이 있다면 ResultSet 객체 생성하기
  5. 모든 객체 닫기
    입니다.

순서에 따라 실제로 구현한 코드는 다음과 같습니다.

public class JDBC {
	public JDBC() {
		//드라이버 로딩
		try {
			Class.forName("(사용할 드라이버 주소)");
		} catch(Exception e) {
			System.out.println("(로딩 실패 메시지)");
			e.printStackTrace();
		}		
	}
	
	//커넥션을 요구하면 꺼내서 반환해주는 함수
	public Connection getCon() {
		Connection con = null;
		String url = "(ip 주소)";
		String id = "(오라클 계정)";
		String pw = "(오라클 비번)";
		try {
			con = DriverManager.getConnection(url, id, pw);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	
	//Statement를 요구하면 꺼내서 반환해주는 함수
	public Statement getSTMT(Connection con) {
		Statement stmt = null;
		try {
			stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		} catch(Exception e) {
			e.printStackTrace();
		}
		return stmt;
	}
	
	//PreparedStatement를 요구하면 꺼내서 반환해주는 함수
	public PreparedStatement getPSTMT(Connection con, String sql) {
		PreparedStatement pstmt = null;
		try {
			pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		} catch(Exception e) {
			e.printStackTrace();
		}
		return pstmt;
	}
	
	//더이상 사용하지 않는 자원을 반환해주는 함수
	public void close(Object o) {
		//매개변수로 입력된 타입을 확인
		try {
			if(o instanceof Connection) {
				((Connection) o).close();
			} else if(o instanceof Statement) {
				((Statement) o).close();
			} else if(o instanceof PreparedStatement) {
				((PreparedStatement) o).close();
			} else if(o instanceof ResultSet) {
				((ResultSet) o).close();
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

그런데, JDBC는 DB에서 정보를 가져올 때마다 매번 DB연결을 열고 닫는 것을 반복합니다. 그렇게 되면 작업 효율이 떨어지게 되죠. 때문에 이와 대비되어 언급되는 게 풀(Pool)을 사용하는 DBCP입니다.

DBCP

DBCP는 어플리케이션을 시작할 때 원하는 만큼 커넥션 객체를 만들어 놓고 풀에 넣어놓은 채 필요할 때마다 가져다 사용하는 방식입니다.

학원에서 프로젝트를 할 땐 주로 이 DBCP를 사용하였습니다.

public class DBCP {
	//커넥션 풀을 관리할 변수 준비
	public DataSource ds;
	
    //커넥션 풀 찾기
	public DBCP() {
		try {
			//1. context.xml 파일에 등록된 자원을 알아낸다.
			InitialContext context = new InitialContext();
			//2. 이 중에 필요한 자원을 얻는다.
			ds = (DataSource) context.lookup("java:/comp/env/찾을이름");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
    //커넥션 풀에 기억된 커넥션 가져오기
	public Connection getCon() {
		Connection con = null;
		try {
			con = ds.getConnection();
		} catch(Exception e) {
			e.printStackTrace();
		}		
		return con;
	}
	
	//이후 JDBC와 동일
	public Statement getSTMT(Connection con) {	

    ...   
}

comments powered by Disqus