서버의 데이터 관리 클래스
DAO
Data Access Object
데이터 베이스에 접속해서 CRUD 등의 작업을 하는 클래스이다..
JSP 혹은 Servlet 패이지 내에 함께 기술할 수 있지만, 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용한다.
// MemberDAO.java
public class MemberDAO {
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String uid = "scott";
private String upw = "tiger";
public MemberDAO() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<MemberDTO> memberSelect() {
ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();
Connection con =null;
Statement stmt = null;
ResultSet rs = null;
try {
con = DriverManager.getConnection(url, uid, upw);
stmt = con.createStatement();
rs = stmt.executeQuery("select * from member");
while (rs.next()) {
String name = rs.getString("name");
String id = rs.getString("id");
String pw = rs.getString("pw");
String phone1 = rs.getString("phone1");
String phone2 = rs.getString("phone2");
String phone3 = rs.getString("phone3");
String gender = rs.getString("gender");
MemberDTO dto = new MemberDTO(name, id, pw, phone1, phone2, phone3, gender);
dtos.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return dtos;
}
}
DTO
Data Transfer Object
DAO 클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 해당 데이터의 클래스를 만들어 사용한다.
// MemberDTO.java
public class MemberDTO {
private String name;
private String id;
private String pw;
...
public MemberDTO(String name, String id, String pw, String phone1, String phone2, String phone3, String gender) {
this.name = name;
this.id = id;
this.pw = pw;
...
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
}
사용 예제
<%@page import="com.javalec.daotoex.MemberDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.javalec.daotoex.MemberDAO"%>
<%
MemberDAO memberDAO = new MemberDAO();
ArrayList<MemberDTO> dtos = memberDAO.memberSelect();
for(int i=0; i<dtos.size(); i++) {
MemberDTO dto = dtos.get(i);
String name = dto.getName();
String id = dto.getId();
String pw = dto.getPw();
String phone = dto.getPhone1() + " - "+ dto.getPhone2() + " - " + dto.getPhone3();
String gender = dto.getGender();
out.println("이름 : " + name + ", 아이디 : " + id + ", 비밀번호 : " + pw + ", 연락처 : " + phone + ", 성별 : " + gender + "<br />" );
}
%>
PreparedStatement
기존 Statement 객체는 다양한 데이터를 입력할 때마다 SQL 문을 새로 작성해야한다는 단점이 있었다. PreparedStatement 클래스는 디폴트 템플릿을 만들어 값만 입력할 수 있도록 한다.
<%!
PreparedStatement preparedStatement;
%>
<%
String query = "insert into memberforpre (id, pw, name, phone) values (?, ?, ?, ?)";
preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, "abc");
preparedStatement.setString(2, "123");
preparedStatement.setString(3, "홍길동");
preparedStatement.setString(4, "010-1234-5678");
n = preparedStatement.executeUpdate();
...
%>
n 이 1이면 성공했음을 뜻한다.
커넥션 풀(DBCP)
클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 생긴다. 따라서 커넥션 풀(Database Connection Pool)에서 미리 데이터베이스에 커넥트를 하고 사용한다.
DBCP 는 서버에 있으므로 tomcat 컨테이너가 데이터베이스 인증을 하도록 context.xml 을 수정해야한다.
- context.xml
<!-- context.xml -->
<Resource
auth = "Container"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:orcl"
username = "amy"
password = "tiger"
name = "jdbc/Oracle11g"
type = "javax.sql.DataSource"
maxActive = "50"
maxWait = "1000"
/>
maxActive 값은 몇 개의 데이터를 미리 가져올지 결정하는 것이고, maxWait 값은 만일 51 번째 데이터 요청이 들어왔을 때 기다리는 ms 단위의 시간 값이다.
- DAO 클래스
위의 MemberDAO.java 를 다음과 같이 수정한다.
public class MemberDAO {
private DataSource dataSource;
public MemberDAO() {
try {
Context context = new InitialContext();
dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<MemberDTO> memberSelect() {
try {
// con = DriverManager.getConnection(url, uid, upw);
con = dataSource.getConnection();
...
}
}
}
https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9
