코딩은 실력보다 시력이지

빅데이터교육과정/DB

DAY 3. DB를 활용한 로그인, 회원가입, 회원관리

Listeria 2021. 3. 17. 03:56

 

사용된 DB. 데이터 타입은 varchar2로 통일을 시켰으며 크기는 넉넉하게 주었다.

loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="from" action="loginProcess.jsp">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value ="login"> <a href="joinForm.jsp"><input type="button" value="join"></a>
</form>
</body>
</html>

간단하게 아이디,비밀번호를 입력하여 로그인하거나 회원가입을 할 수 있는 페이지이다.

loginProcess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	request.setCharacterEncoding("utf-8");
	String id=request.getParameter("id");
	String pw=request.getParameter("pw");

	Connection conn = null;
	String sql = "select id,pw from personal where id='"+id+"' and pw ='"+pw+"'";
 	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			session.setAttribute("id",id);
			response.sendRedirect("main.jsp");
		}
		rs.close();
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	} 
%>
<body>

</body>
</html>

loginForm 창에서 넘어온 id와 pw를 활용하여 로그인을 한다.

joinForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>회원가입 페이지</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script language="javascript">
      function goPopup(){
	// 호출된 페이지(jusopopup.jsp)에서 실제 주소검색URL(https://www.juso.go.kr/addrlink/addrLinkUrl.do)를 호출하게 됩니다.
    var pop = window.open("./jusoPopup.jsp","pop","width=570,height=420, scrollbars=yes, resizable=yes"); 
   
}
      function jusoCallBack(roadFullAddr,roadAddrPart1,addrDetail,roadAddrPart2, zipNo){
  		// 팝업페이지에서 주소입력한 정보를 받아서, 현 페이지에 정보를 등록합니다.
  		document.form.roadFullAddr.value = roadFullAddr;
  		document.form.roadAddrPart1.value = roadAddrPart1;
  		document.form.roadAddrPart2.value = roadAddrPart2;
  		document.form.addrDetail.value = addrDetail;
  		document.form.zipNo.value = zipNo;

  		
  }
      var forRestirct = /^[a-zA-Z0-9]{4,12}$/;
      var savePnum;
      function chkEvery(){
        if(!chkId()){
         return false;
        }
        if(!chkPw()){
          return false;
        }
        if(!chkEmail()){
          return false;
        }
        if(!chkPnum()){
          return false;
        }
        if(!chkHobby()){
          return false;
        }
         alert("welcome");
      }
      function chkId(){
        var saveId = document.getElementById("ID").value;
        if(saveId==""){
          alert("Must input ID");
          return false;
        }
        if(!forRestirct.test(saveId)){
          alert("4~12자의 영문 대문자와 숫자로만 입력");
          return false;
        }
        alert("You can use this ID");
        return true;
      }
      function chkPw(){
        var savePw = document.getElementById("pw").value;
        var savePwck = document.getElementById("pwck").value;
        if(savePw==""|| savePwck==""){
          alert("Must input password");
          return false;
        }
        if(savePw==savePwck){
          if(!forRestirct.test(savePw)){
            alert("4~12자의 영문 대문자와 숫자로만 입력");
           return false;
         }
        }else{
          alert("please check your pw & pwck");
          return false;
        }
        alert("You can use this PW");
        return true;
      }
      function chkEmail(){
        var saveEmail = document.getElementById("mail").value;
        var forRestirctE = /^[a-zA-Z0-9_]+[@]{1}[a-zA-Z0-9_]+[.]{1}[A-Za-z]{1,3}$/;
        if(saveEmail==""){
          alert("Must input Email");
          return false;
        }
        if(!forRestirctE.test(saveEmail)){
          alert("please check your e-mail");
          return false;
        }
        alert("You can use this E-mail");
        return true;
      }
      function chkPnum(){
        savePnum = document.getElementById("personalID").value;
        var year=savePnum.substring(6,7);
        var forRestirctPnum= /^(?:(?:[0-9]{2}(?:0[1-9]|1[0-2]))(?:0[1-9]|[1,2][0-9]|3[0,1])(?:[1-4][0-9]{6}))$/;
        if(savePnum==""){
          alert("Must input Personal number");
          return false;
        }
        if(!forRestirctPnum.test(savePnum)){
          alert("please check your personal number");
          return false;
        }
        if(year==1||year==2){
          document.getElementById("year").value = "19"+ savePnum.substring(0,2);
          document.getElementById("Month").value = savePnum.substring(2,4);
          document.getElementById("Day").value = savePnum.substring(4,6);
        }else if(year==3||year==4){
          document.getElementById("year").value = "00"+ savePnum.substring(0,2);
          document.getElementById("Month").value = savePnum.substring(2,4);
          document.getElementById("Day").value = savePnum.substring(4,6);
        }
        alert("Correct number");
        return true;
      }
      function chkHobby(){
        var saveHobby = document.getElementsByName("hobby");
        var chk=0;
        for(var i=0;i<saveHobby.length;i++){
          if(saveHobby[i].checked){
            chk++;
          }
        }
        if(chk==0){
          alert("please choose your interesting part at least one thing")
          return false;
        }
        return true;
      }
      
    </script>
</head>
<body>
	<form name="form" action="joinProcess.jsp">
		<table align="center" width="600" cellpadding="5" cellspacing="2"	bgcolor="FFFFFF" border="2">
			<tr align="center">
				<td colspan="2" bgcolor="#f0f0f0">회원 기본 정보</td>
			</tr>
			<tr align="center">
				<td>이름 :</td>
				<td align="left"><input type="text" id="name" name="name" size="12">
			</tr>
			<tr align="center">
				<td>아이디 :</td>
				<td align="left"><input type="text" id="ID" name="id" size="12"><input
					type="button" onclick="chkId()" value="ID check"><br>
					4~12자의 영문 대문자와 숫자로만 입력</td>
			</tr>
			<tr align="center">
				<td>비밀번호 :</td>
				<td align="left"><input type="password" id="pw" name="pw" size="12">
					4~12자의 영문 대문자와 숫자로만 입력</td>
			</tr>
			<tr align="center">
				<td>비밀번호 확인 :</td>
				<td align="left"><input type="password" id="pwck" size="12">
					<input type="button" onclick="chkPw()" value="PW check"></td>
			</tr>
			<tr align="center">
		
					<th>도로명주소 전체(포맷)</th>
						<td><input type="text" id="roadFullAddr" name="roadFullAddr" ><input type="button" onClick="goPopup();" value="팝업" ></td></tr>
					<tr><th>도로명주소 </th>
						<td><input type="text" id="roadAddrPart1" name="roadAddrPart1" ></td></tr>
					<tr><th>고객입력 상세주소</th><td><input type="text" id="addrDetail" name="addrDetail" ></td></tr>
					<tr><th>참고주소</th><td><input type="text" id="roadAddrPart2" name="roadAddrPart2" ></td></tr>
					<tr><th>우편번호</th><td><input type="text" id="zipNo" name="zipNo" ></td></tr>

			
			<tr align="center">
				<td>메일주소 :</td>
				<td align="left"><input type="Text" id="mail" name="mail" size="20"><input	type="button" onclick="chkEmail()" value="E-mail check"><br>
					ex>id@domain.com</td>
			</tr>

			<tr align="center">
				<td colspan="2" bgcolor="#f0f0f0">회원 기본 정보</td>
			</tr>
			<tr align="center">
				<td>주민등록번호 :</td>
				<td align="left"><input type="password" id="personalID"
					size="13"><input type="button" onclick="chkPnum()"
					value="Personal Number check"><br> ex>1234561234567</td>
			</tr>
			<tr>
				<td align="center">생일 :</td>
				<td valign="center"><input type="text" id="year" name="year" size="4">년

					<select id="Month"name="Month">
						<option value="Month"></option>
						<option value="01">1</option>
						<option value="02">2</option>
						<option value="03">3</option>
						<option value="04">4</option>
						<option value="05">5</option>
						<option value="06">6</option>
						<option value="07">7</option>
						<option value="08">8</option>
						<option value="09">9</option>
						<option value="10">10</option>
						<option value="11">11</option>
						<option value="12">12</option>
				</select> 월 <select id="Day" name="Day">
						<option value="Day"></option>
						<option value="01">1</option>
						<option value="02">2</option>
						<option value="03">3</option>
						<option value="04">4</option>
						<option value="05">5</option>
						<option value="06">6</option>
						<option value="07">7</option>
						<option value="08">8</option>
						<option value="09">9</option>
						<option value="10">10</option>
						<option value="11">11</option>
						<option value="12">12</option>
						<option value="13">13</option>
						<option value="14">14</option>
						<option value="15">15</option>
						<option value="16">16</option>
						<option value="17">17</option>
						<option value="18">18</option>
						<option value="19">19</option>
						<option value="20">20</option>
						<option value="21">21</option>
						<option value="22">22</option>
						<option value="23">23</option>
						<option value="24">24</option>
						<option value="25">25</option>
						<option value="26">26</option>
						<option value="27">27</option>
						<option value="28">28</option>
						<option value="29">29</option>
						<option value="30">30</option>
						<option value="31">31</option>
				</select> 일</td>
			</tr>
			<tr align="center">
				<td>관심분야 :</td>
				<td align="left"><input type="checkbox" name="hobby"
					value="computer">computer <input type="checkbox"
					name="hobby" value="internet">internet <input
					type="checkbox" name="hobby" value="travel">travel <input
					type="checkbox" name="hobby" value="movie">movie <input
					type="checkbox" name="hobby" value="music listening">music
					listening</td>
			</tr>
			<tr align="center">
				<td>자기소개 :</td>
				<td align="left"><textarea name="intro" cols="50"
						rows="5"></textarea></td>
			</tr>
			<tr align="center">
				<td colspan="2" bgcolor="#ffffff">
				<input type="submit" value="회원가입" > 
				<input type="reset"	value="다시 입력">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

회원가입 양식이다.

jusoPopup.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<% 
	request.setCharacterEncoding("UTF-8");  //한글깨지면 주석제거
	//request.setCharacterEncoding("EUC-KR");  //해당시스템의 인코딩타입이 EUC-KR일경우에
	String inputYn = request.getParameter("inputYn"); 
	String roadFullAddr = request.getParameter("roadFullAddr"); 
	String roadAddrPart1 = request.getParameter("roadAddrPart1"); 
	String roadAddrPart2 = request.getParameter("roadAddrPart2"); 
	String engAddr = request.getParameter("engAddr"); 
	String jibunAddr = request.getParameter("jibunAddr"); 
	String zipNo = request.getParameter("zipNo"); 
	String addrDetail = request.getParameter("addrDetail"); 
	String admCd    = request.getParameter("admCd");
	String rnMgtSn = request.getParameter("rnMgtSn");
	String bdMgtSn  = request.getParameter("bdMgtSn");
	String detBdNmList  = request.getParameter("detBdNmList");	
	/** 2017년 2월 추가제공 **/
	String bdNm  = request.getParameter("bdNm");
	String bdKdcd  = request.getParameter("bdKdcd");
	String siNm  = request.getParameter("siNm");
	String sggNm  = request.getParameter("sggNm");
	String emdNm  = request.getParameter("emdNm");
	String liNm  = request.getParameter("liNm");
	String rn  = request.getParameter("rn");
	String udrtYn  = request.getParameter("udrtYn");
	String buldMnnm  = request.getParameter("buldMnnm");
	String buldSlno  = request.getParameter("buldSlno");
	String mtYn  = request.getParameter("mtYn");
	String lnbrMnnm  = request.getParameter("lnbrMnnm");
	String lnbrSlno  = request.getParameter("lnbrSlno");
	/** 2017년 3월 추가제공 **/
	String emdNo  = request.getParameter("emdNo");

%>
</head>
<script language="javascript">
// opener관련 오류가 발생하는 경우 아래 주석을 해지하고, 사용자의 도메인정보를 입력합니다. ("주소입력화면 소스"도 동일하게 적용시켜야 합니다.)
document.domain = ;


function init(){
	var url = location.href;
	var confmKey = "	devU01TX0FVVEgyMDIxMDMxNjExNTcyNjExMDkyMTQ=";
	var resultType = "4"; // 도로명주소 검색결과 화면 출력내용, 1 : 도로명, 2 : 도로명+지번+상세보기(관련지번, 관할주민센터), 3 : 도로명+상세보기(상세건물명), 4 : 도로명+지번+상세보기(관련지번, 관할주민센터, 상세건물명)
	var inputYn= "<%=inputYn%>";
	if(inputYn != "Y"){
		document.form.confmKey.value = confmKey;
		document.form.returnUrl.value = url;
		document.form.resultType.value = resultType;
		document.form.action="https://www.juso.go.kr/addrlink/addrLinkUrl.do"; //인터넷망
		document.form.submit();
	}else{
		opener.jusoCallBack("<%=roadFullAddr%>","<%=roadAddrPart1 %>","<%=addrDetail%>","<%=roadAddrPart2%>","<%=zipNo%>");
		window.close();
		}
}
</script>
<body onload="init();">
	<form id="form" name="form" method="post">
		<input type="hidden" id="confmKey" name="confmKey" value=""/>
		<input type="hidden" id="returnUrl" name="returnUrl" value=""/>
		<input type="hidden" id="resultType" name="resultType" value=""/>
		
	</form>
</body>
</html>

회원가입시 주소를 검색할 수 있는 api 이다. 주소로api를 통해서 자세한 사용법을 확인할 수 있으며 정부에서 제공하는 api이다. confmkey의 경우에는 개발용 키는 만료기간이 짧기 때문에 필요할때 발급을 받아서 사용해야한다.

 

joinProcess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%
	request.setCharacterEncoding("utf-8");

	String name= request.getParameter("name");
	String mail = request.getParameter("mail");
	String pw = request.getParameter("pw");
	String id = request.getParameter("id");
	String roadFullAddr = request.getParameter("roadFullAddr");
	String roadAddrPart1 = request.getParameter("roadAddrPart1");
	String roadAddrPart2 = request.getParameter("roadAddrPart2");
	String addrDetail = request.getParameter("addrDetail");
	String zipNo = request.getParameter("zipNo");
	String birth = request.getParameter("year")+'.'+request.getParameter("Month")+'.'+request.getParameter("Day");
	String intro = request.getParameter("intro");
	String hobby = request.getParameter("hobby");
	
	
	String sql = "INSERT INTO personal (name,id,pw,roadfulladdr, roadaddrpart1,addrdetail, roadaddrpart2,zipno,birth,intro,hobby, mail) Values (?,?,?,?,?,?,?,?,?,?,?,?)";
	
	Connection conn = null;
	
	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);

		stmt.setString(1,(String)name);
		stmt.setString(2,(String)id);
		stmt.setString(3,(String)pw);
		stmt.setString(4,(String)roadFullAddr);
		stmt.setString(5,(String)roadAddrPart1);
		stmt.setString(6,(String)addrDetail);
		stmt.setString(7,(String)roadAddrPart2);
		stmt.setString(8,(String)zipNo);
		stmt.setString(9,(String)birth);
		stmt.setString(10,(String)intro);
		stmt.setString(11,(String)hobby);
		stmt.setString(12,(String)mail);
		

		stmt.executeUpdate();
		stmt.close();
		conn.close();
		response.sendRedirect("loginForm.jsp");
		//response.sendRedirect("main.jsp");
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	}
%>
</head>

<body>
</body>
</html>

앞서 회원가입 양식에서 넘어온 값들을 오라클 db에 저장한다.

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	request.setCharacterEncoding("utf-8");
	String id=session.getAttribute("id").toString();


	Connection conn = null;
	String sql = "select id,pw from personal where id='"+id+"'";
 	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			out.println(rs.getString(1)+"이 로그인하였습니다.<br>");
			if(id.equals("admin")){
				out.print("<a href='Member_list.jsp'>회원정보 확인</a>");
			}
		}
		rs.close();
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	} 
%>
<body>
</body>
</html>

로그인이 되었을때 화면. 관리자라면 관리모드를 들어갈 수 있다.

Member_list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	request.setCharacterEncoding("utf-8");

	Connection conn = null;
	String sql = "select id from personal";
 	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
			
			out.println("<table align='center' width='600' cellpadding='5' cellspacing='2'	bgcolor='FFFFFF' border='2'>");
			out.println("<tr align='center'><td colspan='2' bgcolor='#f0f0f0'>회원 기본 정보</td></tr>");
		while(rs.next()){
			out.println("<tr><td><a href='Member_into.jsp?id="+rs.getString(1)+"'>" + rs.getString(1)+"</a></td>");
			out.println("<td><a href='Member_delete.jsp?id="+rs.getString(1)+"'>delete</a></td></tr>");

		}
		rs.close();
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	} 
%>
<body>

</body>
</html>

저장된 회원 목록을 불러오고 정보를 자세히 보거나 혹은 삭제할 수 있도록 해준다.

 

Member_into.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	request.setCharacterEncoding("utf-8");

	String id=request.getParameter("id").toString();

	Connection conn = null;
	String sql = "select * from personal where id='"+id+"'";
 	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			for(int i=1;i<13;i++){
			out.println(rs.getString(i)+"<br>");
				
			}
		}
		rs.close();
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	} 
%>
<body>

</body>
</html>

회원을 클릭하였을때 자세한 정보를 보여준다.

Member_delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	request.setCharacterEncoding("utf-8");
	String id=request.getParameter("id");

	Connection conn = null;
	String sql = "delete from personal where id='"+id+"'";
 	try {
		Context init = new InitialContext();
		DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
		conn = ds.getConnection(); //풀방식

		PreparedStatement stmt = conn.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		rs.next();
		rs.close();
		response.sendRedirect("Member_list.jsp");
	} catch (Exception e) {
		out.println("fail");
		e.printStackTrace();
	} 
%>
<body>

</body>
</html>

삭제를 눌렀을때 해당 회원의 정보가 삭제되도록 한다.