토이 프로젝트 진행 중 회원가입 페이지에서 ID 중복 확인을 빼놓을 수 없기 때문에 구현했다... 다음과 같은 방식으로 동작한다.
1. id를 입력하면 Ajax 방식으로 사용자가 입력한 id가 DB에 있는지 없는지를 체크하여 label 태그로 알려준다.
2. 사용 가능한 id를 입력하면 '사용 가능한 id 입니다.'라고 표시.
3. 이미 존재하는 id를 입력한 경우 input 태그에 입력한 내용을 지워버리고 '사용 불가능한 id입니다.'라고 표시.
4. 아무것도 입력하지 않았을 경우, 공백을 입력한 경우에도 마찬가지로 input 태그의 내용을 지워버리고 '공백은 입력할 수 없습니다.', '사용 불가능한 id입니다.'라고 표시.
- 부트스트랩을 사용.
- html 코드는 ID 중복 확인 구현에 관련된 부분만 작성했다...
<div class="form-group">
<input class="form-control" placeholder="ID를 입력해주세요" name="id" id="id" type="text" autofocus>
<label id="label1"></label>
</div>
- 사용자가 버튼을 누르지 않고 입력 칸에 id를 입력한 후 영역을 벗어나기만 해도 중복 확인을 할 수 있도록 한다.
- Jquery를 작성하기 전에 Jquery cdn을 추가했는지 확인한다...
<script type="text/javascript">
$(document).ready(function() {
//ID 중복 확인
//id를 입력할 수 있는 input text 영역을 벗어나면 동작한다.
$("#id").on("focusout", function() {
var id = $("#id").val();
if(id == '' || id.length == 0) {
$("#label1").css("color", "red").text("공백은 ID로 사용할 수 없습니다.");
return false;
}
//Ajax로 전송
$.ajax({
url : './ConfirmId',
data : {
id : id
},
type : 'POST',
dataType : 'json',
success : function(result) {
if (result == true) {
$("#label1").css("color", "black").text("사용 가능한 ID 입니다.");
} else{
$("#label1").css("color", "red").text("사용 불가능한 ID 입니다.");
$("#id").val('');
}
}
}); //End Ajax
});
})
</script>
- .attr() 함수는 요소의 속성값을 가져오거나 변경할 수 있다.
- Ajax 전송이 성공했을 시 result의 값이 true면 사용 가능한 ID라고 표시.
- Ajax 전송이 성공했을 시 result의 값이 false면 사용 불가능한 ID라고 표시한 후 id 입력 input 태그의 내용을 지워준다.
- 저는 MemberMapper.java, MemberService.java, MemberServiceImpl.java 라는 이름을 사용하고 있다.
- Controller에서 호출할 메소드(selectId)의 return 타입은 boolean.
public interface MemberMapper {
public boolean selectId(String id); //중복 Id 검색
}
public interface MemberService {
public boolean selectId(String id); //중복 Id 검색
}
@Log4j
@Service
@AllArgsConstructor
public class MemberServiceImpl implements MemberService {
@Autowired
// @Setter(onMethod = @Autowired)
MemberMapper memberMapper;
@Override
public boolean selectId(String id) {
log.info("Service :: selectId...................");
return memberMapper.selectId(id);
}
}
- resultType은 boolean.
- 모든 레코드 수를 세는 함수 COUNT(*)로 데이터가 있으면 1, 없으면 0을 받는다.
- 1은 true 0은 false가 되는 것.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.todocalendar.mapper.MemberMapper">
<select id="selectId" resultType="boolean">
SELECT COUNT(*)
FROM MEMBER
WHERE ID = #{id}
</select>
</mapper>
- 위에서 작성한 Ajax url 경로가 Controller와 매핑된다.
- return 타입은 Boolean.
- selectId 메소드를 호출한 결과를 boolean형 변수 result에 담아 반환한다.
- trim() 함수는 문자열의 왼쪽, 오른쪽 공백을 제거해준다.
- 물론 애초에 입력 받을 때 공백은 입력하지 못하게 함.
//Id 중복 확인
@PostMapping("/ConfirmId")
@ResponseBody
public ResponseEntity<Boolean> confirmId(String id) {
log.info("ConfirmId.........");
log.info("id : " + id);
boolean result = true;
if(id.trim().isEmpty()) {
log.info("id : " + id);
result = false;
} else {
if (memberService.selectId(id)) {
result = false;
} else {
result = true;
}
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
- 전달 받은 id의 값이 비어있으면 result를 false로 초기화 하여 반환한다.
- 전달 받은 id의 값이 데이터베이스에 이미 존재하면 result를 false로 초기화 하여 반환한다.
- 전달 받은 id의 값이 데이터베이스에 존재하지 않으면 result를 true로 초기화 하여 반환한다.
- 윗줄 왼쪽부터 순서대로 아무것도 입력하지 않았을 때, 공백을 입력했을 때, 이미 존재하는 id를 입력했을때 이다.
- 아랫줄은 사용 가능한 id를 입력했을 때.