공부/그룹 스터디

[4회차 과제 03] 중복아이디 처리

junani0v0 2024. 4. 26. 19:20

숙제

과제 03

중복아이디 알림

이제 회원가입 시 중복 아이디면 회원가입 실패 메시지가 나오게 해보겠습니다

MemberDao

먼저 memberId값을 조회하는 쿼리를 작성합니다

public String getMemberId(String memberId) {    
    //아이디값 찾기
    String sql = "SELECT member_id FROM forum.member WHERE member_id ='" + memberId + "'";
    return queryForObject(sql, String.class);
}

이제 이걸 JoinService에서 실행시킵니다

JoinService

public int join(HashMap<String, String> params) {
        String passwd = params.get("passwd");
        String encPasswd = BCrypt.withDefaults().hashToString(12, passwd.toCharArray());
        System.out.println("encPasswd >>>>>>>>> " + encPasswd);
        BCrypt.Result result = BCrypt.verifyer().verify(passwd.toCharArray(), encPasswd);
        System.out.println("result.verified >>>>>>> " + result.verified);

        params.put("passwd", encPasswd);
        int cnt;
        String inputId = params.get("memberId");
        //memberId 조회하여 중복 확인
        try {
            memberDao.getMemberId(inputId);
            cnt = 0;

        }catch(EmptyResultDataAccessException em) {

            cnt = memberDao.join(params);    
            //MemberDao에서 join해 넣어주는데 넣은 친구의 seq가 필요하지만 반환값 int라 여러개의 쿼리중 뭔지 못찾는다
            //그래서 MemberDao에 memeber_id로 찾는 메서드getMemberSeq 만듦
            int memberSeq = memberDao.getMemberSeq(params.get("memberId"));
            if(cnt ==1){
            //인증메일 구조 만들기
                //기대값 1일때 메일 발송
                MemberAuthDto memberAuthDto = new MemberAuthDto();
                memberAuthDto.setMemberSeq(memberSeq);
                //UUID로 난수 만들기 & "-"뺴기
                String uri = UUID.randomUUID().toString().replaceAll("-", "");
                memberAuthDto.setAuthUri(uri);    //만든 UUID 삽입

                //인증만료 시간 비교용 추가 코드
                    Calendar cal = Calendar.getInstance();    
                    cal.add(Calendar.MINUTE, 30);    //30분 더하고
                    memberAuthDto.setExpireDtm(cal.getTimeInMillis());

                memberAuthDao.addAuthInfo(memberAuthDto);

            //인증 메일 발송
                EmailDto emailDto = new EmailDto();
                emailDto.setFrom("junani0v0@naver.com"); 
                //보내는 사람
                emailDto.setReceiver(params.get("email")); 
                //받는 사람(logind.jsp에 입력한 email 값 )
                emailDto.setSubject("인증 메일");    
                //메일 제목
    //            emailDto.setText("https://localhost:8080/04" + memberAuthDto.getAuthUri());    //본문 내용
                String html = "<a href='http://localhost:8080/04/emailAuth.do?uri="+ memberAuthDto.getAuthUri() +"'>인증하기</a>";
    //            String html = "<a href='http://localhost:8080/04/"+ memberAuthDto.getAuthUri() +"'>인증하기</a>";
                emailDto.setText(html);//본문 내용

                emailUtil.sendMail(emailDto, true);    //EmailUtil에 값 넘겨주기
            }
        }
        return cnt;
    }

이렇게 작성하였습니다
처음에 작성하니 memberId로 조회해 값이 안나오면 NullPointException이 나올 줄 알았는데 EmptyResultDataAccessException이 나오더라고요 기대값은 1인데 0이 나와서 에러가 발생했습니다

try-catch를 사용하여 처음에 try를 넣고 아이디가 중복이면 cnt를 0으로 해서 LoinController에서 회원가입 실패 메시지가 나오게 하였고, 중복이 아니여서 EmptyResultDataAccessException이 발생하면 기존 코드가 실행되게 작성해 보았습니다.

이렇게 작성하는게 맞는지 아직 확실하지는 않지만 테스트 작동을 몇번 해봤는데 잘 작동 되어 중복 아이디일 경우 아래처럼 알림 메시지가 잘 나왔습니다.