JSP

[JSP] Ajax 이용하여 회원 가입 & 아이디 중복 체크 (mySQL)

에띠 2022. 5. 24. 15:35
728x90

회원가입 페이지 2_member.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원가입</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    <script src="./js/regist.js"></script>
    <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
    <script>
        function sample6_execDaumPostcode() {
            new daum.Postcode({
                oncomplete: function(data) {
                    // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                    // 각 주소의 노출 규칙에 따라 주소를 조합한다.
                    // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                    var addr = ''; // 주소 변수
                    var extraAddr = ''; // 참고항목 변수

                    //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
                    if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                        addr = data.roadAddress;
                    } else { // 사용자가 지번 주소를 선택했을 경우(J)
                        addr = data.jibunAddress;
                    }

                    // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
                    if(data.userSelectedType === 'R'){
                        // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                        // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                        if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                            extraAddr += data.bname;
                        }
                        // 건물명이 있고, 공동주택일 경우 추가한다.
                        if(data.buildingName !== '' && data.apartment === 'Y'){
                            extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                        }
                        // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                        if(extraAddr !== ''){
                            extraAddr = ' (' + extraAddr + ')';
                        }
                        // 조합된 참고항목을 해당 필드에 넣는다.
                        document.getElementById("sample6_extraAddress").value = extraAddr;
                    
                    } else {
                        document.getElementById("sample6_extraAddress").value = '';
                    }

                    // 우편번호와 주소 정보를 해당 필드에 넣는다.
                    document.getElementById('sample6_postcode').value = data.zonecode;
                    document.getElementById("sample6_address").value = addr;
                    // 커서를 상세주소 필드로 이동한다.
                    document.getElementById("sample6_detailAddress").focus();
                }
            }).open();
        }
    </script>
</head>
<body>
    <h2>회원가입</h2>
    <form action="./2_member_ok.jsp" method="post" name="regform" id="regform" onsubmit="return sendit()">
        <input type="hidden" name="isssn" id="isssn" value="n">
        <!-- 아이디 중복체크 후 사용할 수 있는 아이디이면 value를 y로 변경 -->
        <input type="hidden" name="isidcheck" id="isidcheck" value="n">
        <p>아이디 : <input type="text" name="userid" id="userid" maxlength="20"> 
        	<input type="button" id="btnIdCheck" value="아이디 중복체크"></p>
        <p id="idcheckmsg"></p>
        <p>비밀번호 : <input type="password" name="userpw" id="userpw" maxlength="20"></p>
        <p>비밀번호 확인 : <input type="password" name="userpw_re" id="userpw_re" maxlength="20"></p>
        <p>이름 : <input type="text" name="name" id="name"></p>
        <p>휴대폰 번호 : <input type="text" name="hp" id="hp"></p>
        <p>이메일 : <input type="text" name="email" id="email"></p>
        <p>취미 : 
            <label>드라이브<input type="checkbox" name="hobby" value="드라이브"></label>
            <label>영화감상<input type="checkbox" name="hobby" value="영화감상"></label>
            <label>쇼핑<input type="checkbox" name="hobby" value="쇼핑"></label>
            <label>게임<input type="checkbox" name="hobby" value="게임"></label>
            <label>운동<input type="checkbox" name="hobby" value="운동"></label>
        </p>                                               <!--onkeyup: 키보드를 눌렀다 땔 때 마다 실행-->
        <p>주민등록번호 : 
        	<input type="text" name="ssn1" id="ssn1" maxlength="6" onkeyup="moveFocus()" onkeydown="ssnChange()"> - 
            <input type="text" name="ssn2" id="ssn2" maxlength="7" onkeydown="ssnChange()"> 
            <input type="button" onclick="ssnCheck()"  value="주민등록번호 검증">
        </p>
        <p>우편번호 : <input type="text" name="zipcode" id="sample6_postcode"> 
        	<input type="button" value="우편번호 검색" onclick="sample6_execDaumPostcode()">
        </p>
        <p>주소 : <input type="text" name="address1" id="sample6_address"></p>
        <p>상세주소 : <input type="text" name="address2" id="sample6_detailAddress"></p>
        <p>참고항목 : <input type="text" name="address3" id="sample6_extraAddress"></p>
        <p>
        	<input type="submit" value="가입완료"> 
        	<input type="reset" value="다시 작성"> 
        	<input type="button" value="로그인" onclick="location.href='./2_login.jsp'">
        </p>
    </form>
</body>
</html>

 

회원가입 확인 페이지 2_member_ok.jsp

<%@page import="java.sql.*"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8"); // 한글로 입력 시 깨지지 않게 설정
	String userid = request.getParameter("userid");
	String userpw = request.getParameter("userpw");
	String name = request.getParameter("name");
	String hp = request.getParameter("hp");
	String email = request.getParameter("email");
	//String hobby = request.getParameter("hobby");
    // 취미는 여러개 선택 가능하기 때문에 배열로 받아옴
	String hobby[] = request.getParameterValues("hobby");  
	// 취미 문자열로 저장
	String hobbyStr = "";
	for (int i = 0; i < hobby.length; i++) {
		hobbyStr = hobbyStr + hobby[i] + " "; // 드라이브 등산 ..
	}
	String ssn1 = request.getParameter("ssn1");
	String ssn2 = request.getParameter("ssn2");
	String zipcode = request.getParameter("zipcode");
	String address1 = request.getParameter("address1");
	String address2 = request.getParameter("address2");
	String address3 = request.getParameter("address3");
	
	// db 연결
	Connection conn = null;
	PreparedStatement pstmt = null;
	
	String sql = "";
	String url = "jdbc:mysql://localhost:3306/aiclass";
	String id = "root";
	String pw = "1234";
	
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		conn = DriverManager.getConnection(url, id, pw);
		if (conn != null) {
			sql = "insert into tb_member(mem_userid, mem_userpw, mem_name, mem_hp, mem_email,
            mem_hobby, mem_ssn1, mem_ssn2, mem_zipcode, mem_address1, mem_address2, 
            mem_address3) values (?, ?, ?, ?, ?, ?, ?, ?, ? ,?, ?, ?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);
			pstmt.setString(2, userpw);
			pstmt.setString(3, name);
			pstmt.setString(4, hp);
			pstmt.setString(5, email);
			pstmt.setString(6, hobbyStr);
			pstmt.setString(7, ssn1);
			pstmt.setString(8, ssn2);
			pstmt.setString(9, zipcode);
			pstmt.setString(10, address1);
			pstmt.setString(11, address2);
			pstmt.setString(12, address3);
			pstmt.executeUpdate();
			
		}
		
	} catch(Exception e) {
		e.printStackTrace();
	}
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 완료!</title>
</head>
<body>
	<h2>회원가입 완료!</h2>
    <p>아이디 : <%=userid %></p>
    <p>이름 : <%=name %></p>
    <p>휴대폰 번호 : <%=hp %></p>
    <p>이메일 : <%=email %></p>
    <p>취미 : <%=hobbyStr %></p>                                             
    <p>주민등록번호 : <%=ssn1 %> - <%=ssn2 %></p>
    <p>우편번호 : <%=zipcode %></p>
    <p>주소 : <%=address1 %></p>
    <p>상세주소 : <%=address2 %></p>
    <p>참고항목 : <%=address3 %></p>
    <p><a href="./2_login.jsp">로그인하러 가기</p>
</body>
</html>

 

js

function sendit() {

    const userid = document.getElementById('userid');
    const userpw = document.getElementById('userpw');
    const userpw_re = document.getElementById('userpw_re');
    const name = document.getElementById('name');
    const hp = document.getElementById('hp');
    const email = document.getElementById('email');
    const hobby = document.getElementsByName('hobby');
    const isidcheck = document.getElementById('isidcheck'); // 아이디 중복체크

    // 정규식
    const exNameText = /[가-힣]+$/; // 가 ~ 힣 글자수 제한 x $ : 끝.
    const exHpText = /^\d{3}-\d{3,4}-\d{4}$/;
    // d{3} : 10진수 3자리 - d{3,4} : 10진수 3자리 또는 4자리 - d{4} 10진수 4자리  d : decimal
    const exEmailText = /^[A-Za-z0-9\-\.]+@[A-Za-z0-9\-\.]+\.[A-Za-z0-9]+$/; 
    // ^ : 이 범위의 형태로 시작  A-Z, a-z, -, . 글자수 제한 x @포함 
    // @제외하고 특수문자 넣어야 할 경우 \+특수문자

    // 아이디
    if (userid.value == '') {
        alert('아이디를 입력하세요')
        userid.focus();
        return false;
    }

    if (userid.value.length < 4 || userid.value.length > 20) {
        alert('아이디는 4자 이상 20자 이하로 입력하세요');
        userid.focus();
        return false;
    }
    
    // 아이디 중복체크
    if (isidcheck.value == 'n') {
    	alert('아이디 중복체크를 확인하세요');
    	isidcheck.focus();
    	return false;
    }

    // 비밀번호
    if (userpw.value == '') {
        alert('비밀번호 입력하세요')
        userpw.focus();
        return false;
    }

    if (userpw.value.length < 4 || userpw.value.length > 20) {
        alert('비밀번호 4자 이상 20자 이하로 입력하세요');
        userpw.focus();
        return false;
    }

    // 비밀번호 확인
    if (userpw.value != userpw_re.value) {
        alert('비밀번호를 다시 확인해주세요')
        userpw_re.focus();
        return false;
    }

    // 이름
    if (!exNameText.test(name.value)) { //test() : 정규표현식에 대입한 문자열이 부합하면 true, 아니면 false
        alert('이름 형식을 확인하세요. \n한글만 입력 가능합니다.');
        name.focus();
        return false;
    }

    // 휴대폰번호
    if (!exHpText.test(hp.value)) {
        alert('휴대폰번호 형식을 확인하세요\n하이픈(-)을 포함해야 합니다.');
        hp.focus(); 
        return false;
    }

    // 이메일
    if (!exEmailText.test(email.value)) {
        alert('이메일 형식을 확인하세요.');
        email.focus(); 
        return false;
    }

    // 취미
    let count = 0;
    for (let i in hobby) {
        if (hobby[i].checked) {
            count++;
        }
    }

    if (count == 0) {
        alert('취미는 적어도 하나이상 선택하세요');
        return false;
    }


    return true;
}


function moveFocus() {
    const ssn1 = document.getElementById('ssn1');
    if (ssn1.value.length >= 6) { // 주민등록번호 앞자리 6자리를 모두 입력하였을 경우
        document.getElementById('ssn2').focus(); // 주민등록번호 뒷자리 입력칸으로 포커스 이동
    }
}

function ssnCheck() {
    const ssn1 = document.getElementById('ssn1');
    const ssn2 = document.getElementById('ssn2');

    if (ssn1.value == '' || ssn2.value == '') {
        alert('주민등록번호를 입력하세요');
        return false;
    }

    const ssn = ssn1.value + ssn2.value;
    let idLast = Number(ssn.substr(-1));

    let check = [2,3,4,5,6,7,8,9,2,3,4,5];
    let sum = 0;

    for (let i = 0; i < check.length; i++) {
        sum += Number(ssn.substring(i, i+1)) * Number(check[i]);
    }
    console.log(sum);
    
    let num = 11 - sum % 11;

    if (num >= 10) {
        num %= 10;
    }

    if (!(idLast == num)) {
        alert('유효하지 않은 주민등록번호입니다.');
    } else {
        alert('유효한 주민등록번호입니다.');
        isssn.value = 'y';
    }
}

function ssnChange(){ // 키보드가 눌릴때 히든 값 'n'으로 변경
    const isssn = document.getElementById('isssn');
    isssn.value = 'n';
}


$(function() { // 아이디 중복 체크
	$('#btnIdCheck').on('click', function() {
		if($('#userid').val() == '') {
			alert('아이디를 입력하세요');
			$('#userid').focus();
			return false;
		}
		
		const xhr = new XMLHttpRequest();
		const userid = $('#userid').val();
		xhr.open('GET', '2_idcheck.jsp?userid='+userid, true);
		xhr.send();
		
		xhr.onreadystatechange = function() {
			if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
				const result = xhr.responseText;
				
				if (result.trim() == "ok") {
					$("#idcheckmsg").html("<b style='color:blue'>사용 가능한 아이디입니다.</b>");
					$('#isidcheck').val('y');
				} else {
					$("#idcheckmsg").html("<b style='color:red'>중복된 아이디입니다.</b>");
					$('#isidcheck').val('n');
				}
			}
		}
	});
	
	$('#userid').on('keyup', function() { // 아이디 변경 시 value 값 변경
		$("#isidcheck").val('n');
		$("#idcheckmsg").html('');
	});
});

중복된 아이디 입력 시

 

 

728x90