나의 수업일지

숙제)아이디 중복 체크 저장용

GUPING 2023. 3. 12. 20:32
  • 아이디_중복 체크 _ 저장용
	>내가 만든 아이디 중복 체크
    
	public static void overlapCheck(List<UserDTO> list ,UserDTO userDTO) {
        for (UserDTO s : list) {
            while (true) {
                if (s.getEmail().equals(userDTO.getEmail())) {
                    System.out.print("중복된 아이디입니다\n다시입력 >");
                    userDTO.setEmail(sc.next());
                } else if (!userDTO.getEmail().equals(s.getEmail())) {
                    break;
                }
            }
        }
    }
    > 실행은 잘 되지만 선생님이 원하는 답은 아님
    > 가장 큰 문제는 뭐가 문제인지 모르겠음
    > 따로 알아본 결과 나는 저기에 사용된 userDTO가 한객체에서 수정되며 반복하는줄 알았으나
    > 반복하며 새로 입력받을때 마다 새로운 객체가 만들어진다는 답변을 받았음
    > 그럼 메모리의 사용량이 늘고 도메인을 넣지 않았기 때문에 같은 아이디에 다른 도매인을 사용하는 경우
    > 가입이 된다는데 하여튼 문제가 있다는 사실을 알았음 이는 더 배워가며 느껴야할 부분인듯하다
    > 메모리 문제는 Util을 싱글톤으로 만들어보라는 답변도 받음
    > 잘이해안됨
    
    > 선생님이 만든 아이디 중복 체크만들기

    public String overlapCheck(List<UserDTO> list, String str) {
        while(true) {
            System.out.print(str+"> ");
            String email = sc.next();
            boolean find = false;
            for(UserDTO u : list) {
                if(u.getEmail().equals(email+"@"+UserDTO.getDomain())) {
                    System.out.println("중복된 "+str);
                    find = true;
                    break;
                }
            }
            if(find) {
                continue;
            }
            return email;
        }
    }

    > 다른 분이 만든 아이디 중복체크
    > 매우 어려움 나중에 이해가 가능하면 풀이를 적자
    
        public String overlapCheck() {
            while(true) {
                List<UserDTO> list = repository.findAll();
                System.out.print("이메일> ");
                String id = sc.next();
                String domain = UserDTO.getDomain();
                boolean ok = false;            
                String idOk = null;

                if(list.size() == 0) {
                    return id;
                } else {
                    for(UserDTO u : list) {
                        // @를 기준으로 문자열을 추출할 것이다.
                        String selectEmail = u.getEmail();

                        // 먼저 @ 의 인덱스를 찾는다 - 인덱스 값: 5
                        int idx = selectEmail.indexOf("@"); 

                        // @ 앞부분을 추출
                        // substring은 첫번째 지정한 인덱스는 포함하지 않는다.
                        // 아래의 경우는 첫번째 문자열인 a 부터 추출된다.
                        String selectid = selectEmail.substring(0, idx);

                        if(selectid.equals(id)) {
                            idOk = id;
                            break;
                        } 

                    }
                    if(idOk != null) {
                        for(UserDTO u : list) {
                            // @를 기준으로 문자열을 추출할 것이다.
                            String selectEmail = u.getEmail();

                            // 먼저 @ 의 인덱스를 찾는다 - 인덱스 값: 5
                            int idx = selectEmail.indexOf("@");

                            // @ 앞부분을 추출
                            // substring은 첫번째 지정한 인덱스는 포함하지 않는다.
                            // 아래의 경우는 첫번째 문자열인 a 부터 추출된다.
                            String selectid = selectEmail.substring(0, idx);

                            // 뒷부분을 추출
                            // 아래 substring은 @ 바로 뒷부분인 n부터 추출된다.
                            String selectDomain = selectEmail.substring(idx+1);

                            if(selectid.equals(idOk) && selectDomain.equals(domain)) {
                                System.out.println("동일한 이메일이 있습니다. 다시입력");
                                ok = true;
                                break;
                            } else {
                                ok = false;
                            }
                        }
                    } else {
                        ok = false;
                    }
                }
                if(!ok) {
                    return id;
                }

            }
        }