728x90
회원 정보를 조회하기 위해 MemberDAO에서 Statement 인터페이스를 이용하여 데이터베이스와 연동할 경우 연동할 때마다 DBMS에서 다시 SQL문을 컴파일해야 하므로 속도가 느림
PreparedStatement 인터페이스를 사용하면 SQL문을 미리 컴파일해서 재사용하므로 Statement 인터페이스보다 훨씬 빠르게 데이터베이스 작업을 수행할 수 있음
따라서 데이터베이스와 연동할 때 또는 빠른 반복 처리가 필요할 때 PreparedStatement 인터페이스를 사용해야함
PreparedStatement 인터페이스의 특징
- Statement 인터페이스를 상속하므로 지금까지 사용한 메서드를 그대로 사용할 수 있음
- Statement 인터페이스가 DBMS에 전달하는 SQL문은 단순한 문자열이므로 DBMS는 이 문자열을 DBMS가 이해할 수 있도록 컴파일하여 실행함
- 반면에 PreparedStatement 인터페이스는 컴파일된 SQL문을 DBMS에 전달하여 성능을 향상 시킴
- PreparedStatement 인터페이스에서는 실행하려는 SQL문에 "?"를 넣어서 값만 바꾸어 쉽게 설정이 가능하여 Statement보다 SQL문작성이 편리함
// MemberServlet.java
package sec01.ex02;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@WebServlet("/member")
public class MemberServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
MemberDAO dao = new MemberDAO(); //SQL문으로 조회할 memberDAO 객체 생성
List<MemberVO> list = dao.listMembers(); // listMember() 메서드로 회원 정보 조회
out.print("<html><body>");
out.print("<table border=1><tr aligh='center' bgcolor='lightgreen'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");
for(int i=0; i<list.size(); i++) {
MemberVO memberVO = list.get(i);
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
Date joinDate = memberVO.getJoinDate();
out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email
+ "</td><td>" + joinDate + "</td></tr>");
}
out.print("</table></body></html>");
}
}
// MemberDAO.java
package sec01.ex02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.util.*;
import java.sql.Date;
public class MemberDAO {
private static final String driver = "oracle.jdbc.driver.OracleDriver";
private static final String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private static final String user = "scott";
private static final String pwd = "tiger";
private PreparedStatement pstmt;
private Connection con;
public List<MemberVO> listMembers() {
List<MemberVO> list = new ArrayList<MemberVO>();
try {
connDB();
String query = "select * from t_member";
System.out.println(query);
pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery(query);
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joinDate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
list.add(vo);
}
rs.close();
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
private void connDB() {
try {
Class.forName(driver);
System.out.println("Oracle 드라이버 로딩 성공");
con = DriverManager.getConnection(url, user, pwd);
System.out.println("Connection 생성 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
// MemberVO.java
package sec01.ex02;
import java.sql.Date;
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
public MemberVO() {
System.out.println("MemberVO 생성자 호출");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
결과물은 Statement를 사용했을때와 같지만, 데이터베이스와 연동할 경우 속도가 좀 더 빠르다는 장점이 있다.
728x90
'웹 개발 기초 > 자바 웹을 다루는 기술' 카테고리의 다른 글
JNDI (0) | 2023.02.17 |
---|---|
DataSource 이용해 데이터베이스 연동하기 (0) | 2023.02.17 |
SQL Developer 회원 정보 생성, 서블릿에서 요청하여 출력(Statement 인터페이스 이용, ojdbc11.jar 파일 첨부) (0) | 2023.02.16 |
서블릿으로 회원 정보 테이블의 회원 정보를 조회하는 과정 (0) | 2023.02.16 |
DAO와 VO 사용법 (0) | 2023.02.15 |