JSP - DB 연결하기(JDBC & DBCP)
서버에 데이터베이스를 연결할 때 JDBC나 DBCP를 사용합니다.
JDBC와 DBCP가 무엇인지, 둘의 차이점이 뭔지, 그리고 각각 어떻게 사용하는지를 포스팅하도록 하겠습니다.
JDBC
자바가 데이터베이스에 접근하는 프로그램을 제작할 때 DBMS의 종류가 다양하고 각각 구조와 특징이 다르다는 문제점이 있었습니다. 이를 해결하면서 DB 연결을 원활하게 이루기 위해 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성하는 JDBC를 개발하였습니다.
JDBC를 작성하는 순서는
- 드라이버 로드하기
- 커넥션 객체 생성하기
- 스테이트먼트 객체 생성하기 (Statement/PreparedStatement)
- SQL문에 결과물이 있다면 ResultSet 객체 생성하기
- 모든 객체 닫기
입니다.
순서에 따라 실제로 구현한 코드는 다음과 같습니다.
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) {
...
}