Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

KSI일기장

0427spring 회원가입 (+닉네임 유효성 중복검사) 본문

Spring

0427spring 회원가입 (+닉네임 유효성 중복검사)

MyDiaryYo 2023. 4. 27. 18:34

//닉네임 유효성 검사 js

// 닉네임 유효성 검사
const memberNickname = document.getElementById("memberNickname");
const nicknameMessage = document.getElementById("nicknameMessage");

memberNickname.addEventListener("input", function(){

    // 입력되지 않은 경우
    if(memberNickname.value.length == 0){
        nicknameMessage.innerText = "영어/숫자/한글 2~10글자 사이로 작성해주세요.";
        nicknameMessage.classList.remove("confirm", "error");

        checkObj.memberNickname = false; // 유효 X 기록
        return;
    }

    const regExp = /^[a-zA-Z0-9가-힣]{2,10}$/;

    if( regExp.test(memberNickname.value) ){ // 유효한 경우
        

        // ****** 닉네임 중복 검사(ajax) 진행 예정 ******

        //     /community/member/nicknameDupCheck
        $.ajax({
            url : "nicknameDupCheck",  // 필수 작성 속성
            data : { "memberNickname" : memberNickname.value }, // 서버로 전달할 값(파라미터)
            type : "GET", // 데이터 전달 방식(기본값 GET)

            success : function(res){ // 비동기 통신 성공 시(에러 발생 X)

                // 매개변수 res : Servlet에서 응답으로 출력된 데이터가 저장

                if(res == 0){ // 닉네임 중복 X
                    nicknameMessage.innerText = "사용 가능한 닉네임 입니다.";
                    nicknameMessage.classList.add("confirm");
                    nicknameMessage.classList.remove("error");
                    checkObj.memberNickname = true; // 유효 O 기록

                } else { // 닉네임 중복 O
                    nicknameMessage.innerText = "이미 사용중인 닉네임 입니다.";
                    nicknameMessage.classList.add("error");
                    nicknameMessage.classList.remove("confirm");
                    checkObj.memberNickname = false; // 유효 O 기록
                }
            },

            error : function(){ // 비동기 통신 중 에러가 발생한 경우
                console.log("에러 발생");
            }
        });



    }else{
        nicknameMessage.innerText = "닉네임 형식이 유효하지 않습니다.";
        nicknameMessage.classList.add("error");
        nicknameMessage.classList.remove("confirm");

        checkObj.memberNickname = false; // 유효 X 기록
    }

});

//MemberController

	//회원가입(sqlSession.insert())	->	<insert></insert>
	
	//*****방법1*****
//	@PostMapping("/signUp")
//	//= Post방식 (<form action="signUp">)
//	public String signUp(@ModelAttribute Member member) {
//		//-> VO Member를 가져오기 위해 @ModelAttribute 사용
//		//-> 단, VO Member 필드 변수명과 signUp.jsp의 주소 name값 memberAddress이 같아야
//		//@ModelAttribute 사용 가능
//		
//		
//		int result = service.signUp(member);
//		return "redirect:/";
//		
//	}
	
	//*****방법2*****
	@PostMapping("/signUp")
	//= Post방식 (<form action="signUp">)
	public String signUp(Member inputMember, String[] memberAddress,
						RedirectAttributes ra) {
		//-> VO Member를 가져오기 위해 @ModelAttribute 사용
		//-> 단, VO Member 필드 변수명과 signUp.jsp의 주소 name값 memberAddress이 같아야
		//@ModelAttribute 사용 가능
		
		//같은 name을 가진 주소가 하나의 문자열로 합쳐져 들어오게 된다
		//->도로명 주소에 ","기호가 포함되는 경우가 있어 ","를 구분자로 사용할 수 없다
		//String[] memberAddress 안에는
		//name이 memberAddress인 파라미터 값이 모두 배열에 담아서 반환
		
		inputMember.setMemberAddress(String.join(",,", memberAddress));
		//String.join("구분자", 배열)
		//배열을 하나의 문자열로 합치는 메서드
		//중간에 구분자가 포함되 문자열이 생성된다
		//-> ex) [a,b,c] -join진행 "a,,b,,c"
		
		//null값일 때 ,, ,,
		if(inputMember.getMemberAddress().equals(",,,,")) {	//주소가 입력되지 않은 경우
			inputMember.setMemberAddress(null);	//null로 반환
		}
		
		//회원가입 서비스 호출
		int result = service.signUp(inputMember);
		
		String message = null;
		String path = null;
		if(result>0) {	//회원가입 성공시
			message = "회원가입성공";
			path = "redirect:/";
			
		}else {	//회원가입 실패시
			message = "회원가입실패";
			path = "redirect:/member/signUp";
		}
		
		ra.addFlashAttribute("message", message);
		
		return path;
		
	}
    
    
    //닉네임 중복 검사

	@ResponseBody
	@GetMapping("/nicknameDupCheck")
	//@GetMapping("url")
	public int nickDupCheck(String memberNickname) {

		int result = service.nickDupCheck(memberNickname);

		return result;

	}

//MemberServiceImpl

	//회원가입
	
	//*****방법1*****
//	@Override
//	public int signUp(Member member) {
//
//		 member.setMemberPw( bcrypt.encode(member.getMemberPw()) );
//		 //-> 회원가입시 Pw값이 DB에 암호화 되어 저장되기 위한 것 
//		 
//		return dao.signUp(member);
//	}
	
	//*****방법2*****
	@Override
	public int signUp(Member inputMember) {
		//비밀번호 암호화(bycrypt)
		String encPw = bcrypt.encode(inputMember.getMemberPw());
		
		//암호화된 비밀번호로 다시 세팅
		inputMember.setMemberPw(encPw);
		
		return dao.signUp(inputMember);
	}
    
    
    //닉네임 중복검사
	@Override
	public int nickDupCheck(String memberNickname) {

		return dao.nickDupCheck(memberNickname);
	}

//MemberService

public interface MemberService {
	//모든 메서드가 추상 메서드(public abstract)
	//모든 필드는 상수 (public static final)

	//회원가입
	//*****방법1*****
	//public int signUp(Member member);
	//*****방법2*****
	public int signUp(Member inputMember);
    
    }
    
    
    //닉네임 중복검사
	public int nickDupCheck(String memberNickname);

//MemberDAO

/**회원가입
	 * @param memberEmail
	 * @param memberPw
	 * @param memberNickname
	 * @param memberTel
	 * @return
	 */
	public int signUp(Member member) {
		return sqlSession.insert("memberMapper.signUp", member);
		//sqlSession.insert(" mapper에서 <insert id="signUp">의 id값")
	}
    
    
    /**닉네임 중복검사
	 * @param memberNickname
	 * @return
	 */
	public int nickDupCheck(String memberNickname) {
		return sqlSession.selectOne("memberMapper.nickDupCheck", memberNickname);
	}

//member-mapper

<!-- 회원가입 -->
  <insert id="signUp" parameterType="member">
  	INSERT INTO MEMBER_S
  	VALUES (SEQ_MEMBER_NO_S.NEXTVAL, #{memberEmail}, #{memberPw},#{memberNickname}, #{memberTel}, #{memberAddress}, DEFAULT, DEFAULT, DEFAULT)
  </insert>
  
   <!-- 닉네임 중복검사 -->
  <select id="nickDupCheck" parameterType="string" resultType="_int">
  	SELECT COUNT(*) FROM MEMBER_S
  	WHERE MEMBER_NICK = #{memberNickname}
  	AND SECESSION_FL = 'N'
  </select>