2013년 3월 13일 수요일

[JSP] JDBC

지금까지는 쿠키와 세션을 이용하여 사용자의 데이터를 저장하고 접속상태를 확인해 보았다. 그러나 많은 데이터나 지속적으로 보관되어야 할 데이터는 궁극적으로 데이터베이스에 저장 되어야 할 것이다.

JSP를 이용하여 데이터베이스와의 연동을 하기 위한 과정을 살펴 보도록하자.

1. JDBC 드라이버 준비
JDBC 드라이버(ojdbc14.jar)를 톰캣에 lib폴더에 복사하자. 오라클이 설치되어 있는 폴더 안에 ojdbc14.jar파일이 있다. jar이란 확장명을 보면 알 수 있듯이 자바와의 연동을 위한 드라이버이다.

2. 드라이버 로드
JSP에서 Class.forName("oracle.jdbc.driver.OracleDriver") 으로 오라클 데이터베이스의 가상드라이버를 로드한다. 그래야 오라클 데이터베이스와 연동할 API를 사용할 수 있다. MySql과 MS SQL 서버는 다음과 같다.

MySql - com.mysql.jdbc.Driver
MS SQL 서버 - com.microsoft.sqlserver.jdbc.SQLServerDriver

3. 데이터베이스 연결
데이터베이스와의 연결을 위해서 Connection이라는 객체가 필요하다. 이 객체를 구하기 위해 3가지 준비물이 필요하다.
- url
- 사용자 계정
- 패스워드

url은 데이터베이스를 구분하기 위해 사용한다. 오라클에서는 다음과 같은 url을 가진다.
jdbc:oracle:thin:@HOST:PORT:SID

위에서 thin이 의미하는 바는 자바언어로 구현되어 있다는 의미이고 OCI일 경우도 있는데 이는 네이티브 모듈을 사용한다.
사용자 계정과 패스워드는 자신이 사용하고 있는 DBMS의 계정와 패스워드를 의미한다.

4. Connection객체 얻기
위에 세 가지의 정보로 Connection 객체를 얻을 수 있는데 DriverManager클래스가 제공하는 getConnection()메서드를 사용한다.
DriverManager.getConnection(String url, Stirng uesr, String password)

5. Statement를 사용한 쿼리 실행
Connection 객체로 Statement 객체를 생성하고 쿼리 질의를 할 수 있다. 그러나 여기서는  PrepareStatment를 사용한다. 그 이유는 둘다 성능의 차이는 없으나 PrepareStatment는 sql문의 틀을 미리 생성해 놓고 값은 나중에 지정한다는 것이다.또한 sql문에 ?부분을 setString(index, 원하는값)으로 치환할 수 있는 장점이 있다.
PrepareStatement pstmt = connection.createStatement();

Preparestatement를 사용하여 쿼리를 실행 할 수 있는데 select 질의를 할 경우 리턴값은 테이블의 로우들이기 때문에 ResultSet 객체로 받아야한다.
ResultSet result = pstmt.executeQuery(String sql);

또는 insert와 update, delete와 같은 테이블 구조변경 질의를 실행하면 그 결과로 -1, 0 ,1을 전달하는데 -1일 경우는 쿼리문 실패, 0일 경우는 쿼리문에 오류는 없으나 DB의 변경이 없음, 1은 성공을 의미한다. 코드는 다음과 같다.
int result = pstmt.executeUpdate(String sql);


6. ResultSet 객체 사용
쿼리문 질의를 통해 얻은 결과로 ResultSet 객체를 얻을 경우. 하나의 row(튜플)을 검색하기 위해 next()메서드를 사용하면 된다. 하나의 로우만을 출력하기 위해서 if(rs.next())로 처리하고 많은 양의 로우를 처리하기 위해서 while(rs.next())로 처리해주어야 한다.

간단한 예로 데이터베이스에 id와 password를 입력하는 메서드를 살펴보자.

public int insertMember(Register register){

Connection con = null;
PreparedStatement pstmt = null;
String sql = "insert into Member values(?,?)";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "hr";
String password = "1234";
int check = -1;

try{
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, password);
pstmt = con.prepareStatement(sql);
pstmt.setString(1, register.getId());
pstmt.setString(2, register.getPass());
check = pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
if(pstmt != null){
try{
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(con != null){
try{
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
return check;
}

이 방법이 가장 기본적인 DB와의 연결이다. 그러나 매번 데이터베이스와의 연동을 위해 해야하는 코딩이 제법 많은 편이다.

댓글 없음:

댓글 쓰기