서블릿의 데이터베이스 연동하기
- 서블릿에서 데이터베이스와 연동하여 조회한 데이터를 얻은 후
클라이언트의 웹 브라우저로 응답하는 과정 실습
- 클라이언트로부터 요청을 받으면,
서블릿은 SQL문을 사용해 데이터베이스에 접근하여 작업.
이 과정에서 DAO와 VO클래스가 사용됨.
서블릿으로 회원 정보 테이블의 회원 정보 조회
<회원 정보 조회 과정>
1. 웹 브라우저(클라이언트)가 서블릿에게 회원 정보를 요청
2. MemberServlet은 요청을 받은 후 MemberDAO 객체를 생성하여 listMembers() 메서드를 호출
3. listMembers()에서 다시 connDB() 메서드를 호출하여 데이터베이스와 연결한 후 SQL문을 실행해 회원 정보 조회
4. 조회된 회원 정보를 MemberVO 속성에 설정한 후 다시 ArrayList에 저장
5. ArrayList를 다시 메서드를 호출한 MemberServlet으로 반환 후 ArrayList의 MemberVO를 차례대로 가져와
회원 정보를 HTML 태그의 문자열로 만든다
6. 만들어진 HTML 태그를 웹 브라우저로 전송해 회원 정보를 출력합니다.
1. 회원 정보 테이블 생성하기
2. 브라우저의 요청을 받는 MemberServlet 클래스 작성
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.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 {
private static final long serialVersionUID = 1L;
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(); //listMembers() 메서드로 회원 정보를 조회합니다.
out.print("<html><body>");
out.print("<table border=1><tr align='center'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");
//조회한 회원 정보를 for문과 <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 class의 listMembers() 메서드를 통해
회원 정보를 MemberVO타입의 List에 담는다.
담긴 List의 값들을 for문을 통해 하나씩 화면에 출력해준다.
2. MemberDAO 클래스
- DAO(Data Access Object)는
DB를 사용해 데이터를 조회하거나
조작하는 기능을 전담하도록 만든 오브젝트를 말한다.
회원 정보 조회 SQL문을 실행하여 조회한 레코드들의 컬럼 값을
다시 MemberVO 객체의 속성에 설정하고
ArrayList에 저장하여 호출한 곳 (MemberServlet)으로 반환한다.
package sec01.ex01;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MemberDAO {
private Statement stmt;
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);
ResultSet rs = stmt.executeQuery(query); //SQL문으로 회원정보를 조회합니다.
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 객체의 속성에 설정합니다.
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
//설정된 MemberVO 객체를 다시 ArrayList에 저장합니다.
list.add(vo);
}
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환합니다.
return list;
}
private void connDB() {
try {
Class.forName("oracle.jdbc.OracleDriver");
System.out.println("Oracle 드라이버 로딩 성공");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","사용자명","암호");
System.out.println("Connection 생성 성공");
stmt = con.createStatement();
System.out.println("Statement 생성 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. MemberVO 클래스
값을 전달하는 데 사용되는 VO(Values Object) 클래스.
테이블에서 조회한 레코드의 컬럼 값을 속성에 저장해야 하므로
컬럼 이름과 동일한 자료형과 이름으로 속성을 선언하고
getter/setter 를 각각 생성.
package sec01.ex01;
import java.util.Date;
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
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;
}
}
MemberVO (컬럼 값을 저장하는 클래스)
MemberDAO (DB에서 컬럼의 값을 가져오고 VO 객체의 속성에 설정하고 list 반환하는 클래스)
MemberServlet (브라우저의 요청을 받고 조회된 데이터를 HTML 태그의 문자열로 만드는 클래스)