안녕하세요? MelonPeach입니다.
오늘은 회원가입을 할때 보시면 아이디 중복 체크하는 기능을 본적 있으실겁니다.
아이디 중복 체크 기능을 만들어보겠습니다.
1. memberMapper.xml 작성
아이디 중복체크 쿼리를 짭니다. 아이디를 조건으로 카운트를 하는데 아이디가 있으면 COUNT가 1
없으면 0이 조회되겠지요. 조회 결과타입을 resultType="int"로 설정해줍니다.
<!-- 아이디 중복 체크 -->
<select id="idChk" resultType="int">
SELECT COUNT(*) FROM MP_MEMBER
WHERE USERID = #{userId}
</select>
2. MemberDAO 작성
Service에서 보내주는 파라미터들을 DAO에서 받아줍니다.
받은 파라미터는 memberMapper.xml에 id가 idChk인 곳으로 보내주고 쿼리를 조회한 결과는 result로 return해줍니다.
// 아이디 중복체크
public int idChk(MemberVO vo) throws Exception;
// 아이디 중복 체크
@Override
public int idChk(MemberVO vo) throws Exception {
int result = sql.selectOne("memberMapper.idChk", vo);
return result;
}
3. MemberService 작성
memberController에서 보낸 파라미터를 memberService로 받아주고 받은 파라미터는 DAO로 보내줍니다.
DAO에서 반환한 값 result를 return합니다.
public int idChk(MemberVO vo) throws Exception;
// 아이디 중복 체크
@Override
public int idChk(MemberVO vo) throws Exception {
int result = dao.idChk(vo);
return result;
}
4. MemberController 작성
MemberController에 idChk요청이 들어오면 파라미터를 MemberService로 보내주고 조회한 결과를 result에 넣어줍니다.
그리고 result를 반환해줍니다. 반환값은 결과가 없으면 0 있으면 1이 반환되겠지요.
그리고 아이디중복체크를 마치고 회원가입요청이 들어오면 결과가 1이면 아이디가 중복이된것이기에
다시 /member/register로 보냅니다. 그리고 결과가 0이면 중복된 아이디가 없기에 service.register(vo)를 실행시켜
줍니다. 실행이 완료됬다면 redirect:/ 로그인페이지로 가게됩니다.
// 아이디 중복 체크
@ResponseBody
@RequestMapping(value="/idChk", method = RequestMethod.POST)
public int idChk(MemberVO vo) throws Exception {
int result = service.idChk(vo);
return result;
}
// 회원가입 post
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String postRegister(MemberVO vo) throws Exception {
logger.info("post register");
int result = service.idChk(vo);
try {
if(result == 1) {
return "/member/register";
}else if(result == 0) {
service.register(vo);
}
// 요기에서~ 입력된 아이디가 존재한다면 -> 다시 회원가입 페이지로 돌아가기
// 존재하지 않는다면 -> register
} catch (Exception e) {
throw new RuntimeException();
}
return "redirect:/";
}
5. register 작성
아이디중복체크 요청을 ajax로 만들었는데요. url에 요청하는 url을 설정해주고 data는 userId 이름으로
id가 userId인 값을 가져오고 data : {}를 member/idChk로 보내주게 됩니다. 그리고나서 보낸것이 성공하면
Controller에서 요청받은 url(/member/idChk)의 반환값(return)의 값을 function()에 넣어주게 됩니다.
data가 1이면 "중복된 아이디가 있습니다." 알러트를 띄우고, 없으면 "사용가능한 아이디입니다." 라는 알러트를 띄어줍니다.
아이디 옆에 중복확인 버튼을 만들어줍니다.
onclick이벤트에 fn_idChk();를 타게 해줍니다. 그럼 중복확인 버튼을 눌렀을때 fn_idChk()가 실행되겠지요.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
<!-- 합쳐지고 최소화된 최신 CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<!-- 부가적인 테마 -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<title>회원가입</title>
</head>
<script type="text/javascript">
$(document).ready(function(){
// 취소
$(".cencle").on("click", function(){
location.href = "/";
})
$("#submit").on("click", function(){
if($("#userId").val()==""){
alert("아이디를 입력해주세요.");
$("#userId").focus();
return false;
}
if($("#userPass").val()==""){
alert("비밀번호를 입력해주세요.");
$("#userPass").focus();
return false;
}
if($("#userName").val()==""){
alert("성명을 입력해주세요.");
$("#userName").focus();
return false;
}
var idChkVal = $("#idChk").val();
if(idChkVal == "N"){
alert("중복확인 버튼을 눌러주세요.");
}else if(idChkVal == "Y"){
$("#regForm").submit();
}
});
})
function fn_idChk(){
$.ajax({
url : "/member/idChk",
type : "post",
dataType : "json",
data : {"userId" : $("#userId").val()},
success : function(data){
if(data == 1){
alert("중복된 아이디입니다.");
}else if(data == 0){
$("#idChk").attr("value", "Y");
alert("사용가능한 아이디입니다.");
}
}
})
}
</script>
<body>
<section id="container">
<form action="/member/register" method="post" id="regForm">
<div class="form-group has-feedback">
<label class="control-label" for="userId">아이디</label>
<input class="form-control" type="text" id="userId" name="userId" />
<button class="idChk" type="button" id="idChk" onclick="fn_idChk();" value="N">중복확인</button>
</div>
<div class="form-group has-feedback">
<label class="control-label" for="userPass">패스워드</label>
<input class="form-control" type="password" id="userPass" name="userPass" />
</div>
<div class="form-group has-feedback">
<label class="control-label" for="userName">성명</label>
<input class="form-control" type="text" id="userName" name="userName" />
</div>
</form>
<div class="form-group has-feedback">
<button class="btn btn-success" type="button" id="submit">회원가입</button>
<button class="cencle btn btn-danger" type="button">취소</button>
</div>
</section>
</body>
</html>
6. 실행테스트
이상으로 회원가입 아이디중복체크 기능을 마치겠습니다.