자바 애플리케이션이 데이터베이스에 표준화된 방식으로 접근할 수 있도록 지원하는 API이다.
자바에서 JDBC를 이용하여 SQL(Structured Query Language)를 오라클과 주고 받을 수 있다.
• Connection: 데이터베이스와 연결; DriverManager.getConnection()으로 얻음
• Statement: 질의, 갱신 실행; connection.createStatement()로 얻음
• ResultSet: 결과물; statement.executeQuery()로 얻음
| 메소드 | 설명 |
|---|---|
| executeQuery | select 문과 같이 결과값이 여러 개의 레코드로 구해지는 경우에 사용한다. |
| executeUpdate | insert, update, delete 문과 같은 내부적으로 테이블의 내용이 변경만 되고 결과 값이 없는 경우에 사용한다. |
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String uid = "scott";
String pass = "tiger";
String sql = "select * from member";
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, uid, pass);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
out.println("<tr>");
out.println("<td>" + rs.getString("name") + "</td>");
out.println("<td>" + rs.getString("userid") + "</td>");
out.println("<td>" + rs.getString("pwd") + "</td>");
out.println("<td>" + rs.getString("email") + "</td>");
out.println("<td>" + rs.getString("phone") + "</td>");
out.println("<td>" + rs.getInt("admin") + "</td>");
out.println("</tr>");
} // while의 끝
SQL 변수에 저장된 내용 중 여러 정보가 있을 경우 홑따옴표를 앞뒤에 붙여야 하고 컬럼 값과 값 사이에 쉼표(,)를 추가해야한다. 이런 복잡한 쿼리문을 작성하지 않고 간단하게 쿼리문을 작성할 수 있는 인터페이스가 PreparedStatement이다.
PreparedStatment pstmt = con.prepareStatement(sql);
String sql = "insert into member values(?,?, ?, ?, ?, ?)";
pstmt.setString(1, name);
pstst.setString(2, userid);
각 칼럼에 추가할 값을 지정하지 않고 ?로 표시한다.
오라클을 사용하기 위해서는 접속 요청을 하여 연결된 상태가 되어야 한다. 이를 커넥션이라고 한다.
웹 페이지에 접속자의 수가 많게 되면 커넥션을 그만틈 걸어주어야 하기 때문에 서버에 부하가 발생한다.
DBCP(DataBase Connection Pool)는 DBCP 매니저가 어느 정도의 연결을 확보해 놓고 있다가 클라이언트의 요청이 들어오면 연결해 주고, 작업이 다 끝나면 연결을 다시 반환하게 만드는 것이다.
DBCP가 5개의 데이터베이스 연결을 확보해둔 상태면 클라이언트 5명이 동시에 접속해서 사용할 수 있다. 6명이 연결시도를 했다면 5명만 접속하게 한 후 1명은 접속이 허용될 때까지 기다리게 한다.
반대로 2명이 접속해도 항상 5개의 DB POOL이 열려있다.
<%
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
out.println("DBCP 연동 성공");
%>
VO과 DTO는 데이터베이스의 정보를 자바에서 가져오기 전에, 해당 데이터를 담아둘 객체를 미리 정의해 두는 클래스이다.
주로 테이블의 구조에 맞춰 필드(멤버 변수) 를 만들고, 데이터를 저장하거나 전달하는 데 사용된다.
| 구분 | 설명 |
|---|---|
| JavaBean | 자바에서 속성을 가지는 표준 객체 규약. ✔ 기본 생성자 + getter/setter + 직렬화 가능 ✔ 기술적인 약속(컨벤션)에 가까움 ✔ JSP/서블릿에서 주로 사용됨 |
| VO | 값 자체를 표현하는 객체. ✔ 주로 불변 객체(immutable)로 사용됨 ✔ 이름처럼 “값” 그 자체가 중요함 ✔ equals(), hashCode() 재정의해서 값 비교에 중점 |
| DTO | 계층 간 데이터 전송을 위한 객체. ✔ 보통 getter/setter만 있는 순수 데이터 운반용 객체 ✔ 로직 없이 오직 데이터 전달이 목적 |
인스턴스가 오로지 단 하나만 존재할 수 있도록 클래스를 설계하는 디자인 패턴
객체를 메모리에 단 한 번만 올려놓고 시스템 전반에 걸쳐서 특정한 저원(Object, Module, Component)를 공유할 때 사용한다.
public class MemberDAO {
private MemberDAO() {
}
private static MemberDAO instance = new MemberDAO();
public static MemberDAO getInstance() {
return instance;
}
public Connection getConnection() throws Exception {
Connection conn = null;
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/myoracle");
conn = ds.getConnection();
return conn;
}
}
MemberDAO memDao = MemberDAO.getInstance();
Connection conn = memDao.getConnection();
커넥션 풀을 이용해서 데이터베이스와 연결하는 방법을 학습해 보았다.
객체 단위로 데이터베이스의 정보를 얻어와 저장하기 위한 VO를 살펴보았고 JSP 페이지에서 직접 데이터베이스에 접근하지 않고 데이터 처리를 위한 DAO 클래스를 설계하여 코드를 분리해 보았다.
또한 데이터베이스와의 처리를 위한 코드는 서블릿에서 기술하고 JSP 페이지는 사용자와의 인터페이스를 위한 코드를 기술하였다.
역할에 맞게 여러 클래스로 코드를 분리해 놓은 것이 코드를 수정하고, 보완하기에도 쉽다.