본문 바로가기
Project Development/Java_programming

회원가입 - DB 연결

by SeleniumBindingProtein 2021. 12. 14.
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

댓글