728x90
반응형
DBeaver를 이용하여, DB를 생성함
VO(Value Object)는 간단한 독립체(Entity)를 의미하는 작은 객체를 의미함
프로그램의 사용자가 화면에서 어떤 데이터를 입력하거나 조회 요청이 왔을 때 입력된 데이터나 조회하는 조건을 VO에 담아서 DAO에 요청하면 DAO는 저장소(일반적으로 Database )로부터 데이터를 입력하거나 조회한 후 그 결과를 돌려주게 됨
생성한 DB를 토대로 MemberVO를 생성
package miniProjectPrivateBMK_memberFrm;
/*
* id varchar2(10) NOT NULL
, pw varchar2(15) NOT NULL
, name varchar2(30) NOT NULL
, age number(3) NOT NULL
, gender varchar2(3) NOT NULL
, phone varchar2(20) NOT NULL
, email varchar2(100) NOT NULL
, address varchar2(1000) NOT NULL
, regidate DATE DEFAULT sysdate NOT NULL
, PRIMARY KEY(id)
*/
import java.sql.Date;
public class MemberVO {
private String id;
private String pw;
private String name;
private int age;
private String gender;
private String phone;
private String email;
private String address;
private Date regidate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getRegidate() {
return regidate;
}
public void setRegidate(Date regidate) {
this.regidate = regidate;
}
}
회원가입 페이지 폼(CSS는 회원가입 페이지 작성 목록에 있으므로, 이 주제에서는 제외시킴)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../css/memberForm.css">
<script type="text/javascript">
function fn_sendMember(){
var frmMember = document.frmMember;
var id = frmMember.id.value;
var pw = frmMember.pw.value;
var name = frmMember.name.value;
var age = parseInt(frmMember.age.value);
var gender = frmMember.gender.value;
var phone = parseInt(frmMember.phone.value);
var email = frmMember.email.value;
var address = frmMember.address.value;
//입력한 값들을 얻음
if(id.length==0 || id==""){
alert("아이디는 필수입니다.");
}
else if (pw.length==0 || pw==""){
alert("비밀번호는 필수입니다.");
}
else if (name.length==0 || name==""){
alert("이름은 필수입니다.");
}
else if (age.length==0 || age==""){
alert("나이는 필수입니다.");
}
else if (gender.length==0 || gender==""){
alert("성별은 필수입니다.");
}
else if (phone.length==0 || phone==""){
alert("핸드폰은 필수입니다.");
}
else if (email.length==0 || email==""){
alert("이메일은 필수입니다.");
}
else if (address.length==0 || address==""){
alert("주소는 필수입니다.");
}
else {
frmMember.method = "post"; //전송 방법을 post로 지정함
frmMember.action = "memberFrm"; //서블릿 매핑 이름 지정함
frmMember.submit(); //서블릿으로 전송함
}
}
function addHypen(obj) {
var number = obj.value.replace(/[^0-9]/g, "");
var phone = "";
if(number.length < 4) {
return number;
} else if(number.length < 7) {
phone += number.substr(0, 3);
phone += "-";
phone += number.substr(3);
} else if(number.length < 11) {
phone += number.substr(0, 3);
phone += "-";
phone += number.substr(3, 3);
phone += "-";
phone += number.substr(6);
} else {
phone += number.substr(0, 3);
phone += "-";
phone += number.substr(3, 4);
phone += "-";
phone += number.substr(7);
}
obj.value = phone;
}
</script>
</head>
<body>
<div class="wrap">
<div class="joinFrm">
<h1>회원가입</h1>
<form name="frmMember">
<table>
<tr>
<td class="td1">아이디</td>
<td class="td2"><input type="text" name="id"></td>
</tr>
<tr>
<td class="td1">비밀번호</td>
<td class="td2"><input type="password" name="pw"></td>
</tr>
<tr>
<td class="td1">이름</td>
<td class="td2"><input type="text" name="name"></td>
</tr>
<tr>
<td class="td1">나이</td>
<td class="td2"><input type="text" name="age"></td>
</tr>
<tr>
<td class="td1">성별</td>
<td class="sex" >
<input type="radio" name="gender" value="남" checked >남
<input type="radio" name="gender" value="여" >여
</td>
</tr>
<tr>
<td class="td1">핸드폰</td>
<td class="td2"><input type="tel" name="phone" onKeyup = "addHypen(this);" class="memberPhone" ></td>
</tr>
<tr>
<td class="td1">이메일</td>
<td class="td2"><input type="text" name="email"></td>
</tr>
<tr>
<td class="td1">주소</td>
<td class="td2"><input type="text" name="address"></td>
</tr>
</table>
<input class="btn" type="button" value="가입하기" onclick="fn_sendMember()">
<input class="btn" type="reset" value="다시입력" onClick="history.back()">
<input type="hidden" name="command" value="addMember">
</form>
</div>
</div>
</body>
</html>
회원가입란을 작성 후 클릭하면, 서블릿으로 이동함
package miniProjectPrivateBMK_memberFrm;
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("/miniProject/html/memberFrm") //서블릿 매핑 이름
public class MemberServletMemberFrm extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
MemberDAO dao = new MemberDAO(); // SQL문으로 조회할 MemberDAO 객체를 생성함
String command = request.getParameter("command"); //command값을 받아옴
if(command != null && command.equals("addMember")) { //회원 가입창에서 전송된 command가 addMember이면, 전송된 값들을 받아옴
String id = request.getParameter("id"); // 회원 가입창에서 전송된 값들을 얻어 와서
String pw = request.getParameter("pw");
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
String phone = request.getParameter("phone");
String email = request.getParameter("email");
String address = request.getParameter("address");
MemberVO vo = new MemberVO(); // MemberVO 객체에 저장한 후
vo.setId(id);
vo.setPw(pw);
vo.setName(name);
vo.setAge(age);
vo.setGender(gender);
vo.setPhone(phone);
vo.setEmail(email);
vo.setAddress(address);
dao.addMember(vo); // SQL문을 실행할 메서드에 전달함
}
// command 값이 delMember인 경우, ID를 가져와 SQL문 전달
else if(command != null && command.equals("delMember")){
String id = request.getParameter("id");
dao.delMember(id);
}
List<MemberVO> list =dao.listMembers();
out.print("<html><body>");
out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>나이</td><td>성별</td><td>전화번호</td><td>이메일</td><td>주소</td><td>가입일</td><td>삭제</td></tr>");
for(int i=0;i<list.size();i++) {
MemberVO memberVO = list.get(i); //조회한 회원 정보를 for문 <tr> 태그 이용해 출력함
String id = memberVO.getId();
String pw = memberVO.getPw();
String name = memberVO.getName();
int age = memberVO.getAge();
String gender = memberVO.getGender();
String phone = memberVO.getPhone();
String email = memberVO.getEmail();
String address = memberVO.getAddress();
Date regidate = memberVO.getRegidate();
out.print("<tr><td>" +id+"</td><td>"
+pw+"</td><td>"
+name+"</td><td>"
+age+"</td><td>"
+gender+"</td><td>"
+phone+"</td><td>"
+email+"</td><td>"
+address+"</td><td>"
+regidate+"</td><td>" // 삭제 클릭하면 command 값과 회원 ID를 서블릿으로 전송함
+"<a href='memberFrm?command=delMember&id="+id+"'>삭제</a></td></tr>");
}
out.print("</table>");
out.print("<a href='memberForm.html'>새 회원 등록하기</a>");
out.print("</body></html>");
}
}
DAO(Data Access Object)는 데이터베이스의 데이터에 접근하기 위해 생성하는 객체이고,
데이터베이스에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용함
간략하게 설명하자면, DAO는 DB를 사용하여 데이터의 조회 및 조작하는 기능을 전담하는 오브젝트임
public class MemberDAO {
private Connection conn;
private PreparedStatement pstmt;
private DataSource dataFactory;
private ResultSet rs;
public MemberDAO() {
try {
Context ctx = new InitialContext();
Context envContext = (Context)ctx.lookup("java:/comp/env"); //JDNI에 접근하기 위해 기본경로를 지정함
dataFactory = (DataSource)envContext.lookup("jdbc/oracle"); // 톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
} catch (NamingException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public List<MemberVO> listMembers(){
List<MemberVO> list = new ArrayList<>();
//connDB(); //아홉가지 정보로 DB를 연결함
try {
conn = dataFactory.getConnection(); //DataSource를 이용해 DB에 연결함
String query = "SELECT*FROM MEMBERFORM";
System.out.println(query);
pstmt = conn.prepareStatement(query); //prepareStatement() 메서드에 SQL문을 전달해 객체 생성함
ResultSet rs= pstmt.executeQuery(); //미리 설정한 SQL문을 실행함
while(rs.next()) {
// 조회한 레코드의 각 컬럼 값을 받아옴
String id = rs.getString("id");
String pw = rs.getString("pw");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
String phone = rs.getString("phone");
String email = rs.getString("email");
String address = rs.getString("address");
Date regidate = rs.getDate("regidate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPw(pw);
vo.setName(name);
vo.setAge(age);
vo.setGender(gender);
vo.setPhone(phone);
vo.setEmail(email);
vo.setAddress(address);
vo.setRegidate(regidate); //각 컬럼 값들을 다시 MemberVo 객체의 속성에 설정함
list.add(vo); //설정된 MemberVO 객체를 다시 ArrayList에 저장함
}
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return list; //조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
}
public void addMember(MemberVO memberVO) {
try {
conn = dataFactory.getConnection(); //DataSource를 이용해 DB 연결
//테이블에 저장할 회원 정보 받아옴
String id = memberVO.getId();
String pw = memberVO.getPw();
String name = memberVO.getName();
int age = memberVO.getAge();
String gender = memberVO.getGender();
String phone = memberVO.getPhone();
String email = memberVO.getEmail();
String address = memberVO.getAddress();
String query = "insert into memberform (id,pw,name,age,gender,phone,email,address) values (?,?,?,?,?,?,?,?)";
System.out.println("prepareStatement: " + query);
pstmt = conn.prepareStatement(query);
pstmt.setString(1, id); //insert문의 ?에 순서대로 회원정보 셋팅
pstmt.setString(2, pw);
pstmt.setString(3, name);
pstmt.setInt(4, age);
pstmt.setString(5, gender);
pstmt.setString(6, phone);
pstmt.setString(7, email);
pstmt.setString(8, address);
pstmt.executeUpdate(); //회원 정보 테이블에 추가함
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public void delMember(String id) {
try {
conn = dataFactory.getConnection();
String query = "DELETE FROM memberform WHERE ID = ?"; //delete문을 문자열로 만듦
System.out.println("prepareStatement : "+query);
pstmt=conn.prepareStatement(query);
pstmt.setString(1, id); // 첫번째 '?'에 전달된 ID를 인자로 넣음
pstmt.executeUpdate(); // delete문 실행 => 테이블에서 해당 ID 회원 정보 삭제
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public String searchId(MemberVO memberVO) {
// id값을 null
String result = null;
// 조회한 레코드의 각 컬럼 값을 받아옴
String name = memberVO.getName();
String email = memberVO.getEmail();
// 조회한 값이 제대로 넘어왔는지 확인
System.out.println("이름:"+name);
System.out.println("이메일"+email);
try {
conn = dataFactory.getConnection(); //DataSource를 이용해 DB 연결
String query = "SELECT id FROM MEMBERFORM";
query += " WHERE name=? AND email=?";
//메서드로 전달된 이름과 이메일을 이용해 SQL문을 작성한 후 DB에 조회함
pstmt = conn.prepareStatement(query); //prepareStatement() 메서드에 SQL문을 전달해 객체 생성함
pstmt.setString(1, name); // 첫번째 '?'에 전달된 name을 인자로 넣음
pstmt.setString(2, email); // 두번째 '?'에 전달된 email을 인자로 넣음
//미리 설정한 SQL문을 실행함
ResultSet rs = pstmt.executeQuery();
rs.next();
result = rs.getString("id");
System.out.println("id = " + result);
} catch (SQLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return result;
}
728x90
반응형
'Project Development > Java_programming' 카테고리의 다른 글
비밀번호 찾기 - 메일 인증 (0) | 2021.12.15 |
---|---|
아이디 찾기 - DB 연결 (0) | 2021.12.15 |
쇼핑몰 홈페이지 (0) | 2021.12.14 |
회원가입 페이지 (0) | 2021.12.14 |
로그인 페이지 (0) | 2021.12.14 |
댓글