Coding History

JDBC 회원 기능 추가중

BlackBirdIT 2024. 7. 12. 22:40

일단 나도 수업에서 빠져나오기 전에 해결해서 코드를 올려보면,

        else if (cmd.equals("member join")) {
            //회원가입을 하기 위해서 입력 받기
            System.out.println("== 회원가입 ==");
            System.out.print("회원 이름 : ");
            String mName = sc.nextLine().trim();
            System.out.print("아이디 : ");
            String memberId = sc.nextLine().trim();
            System.out.print("비밀번호 : ");
            String memberPw = sc.nextLine().trim();

            // 혹시나 아이디가 같을 시 회원가입을 막기 위한 쿼리문 작성해서 먼저 날리기.
            SecSql sql2 = new SecSql();
            sql2.append("SELECT COUNT(*) FROM member WHERE memberId = ?;", memberId);

            int isExistId = DBUtil.selectRowIntValue(conn, sql2);

            // 날린 쿼리문으로 받아온 값을 대조. 0 받아온 값이 0이 아니면 이미 있는 회원
            if (isExistId != 0) { //if문으로 거르기.
                System.out.println("이미 가입된 회원");
                return 0;
            } else { // 그게 아니면 회원 가입할 수 있게 쿼리문을 날려주면,
                SecSql sql = new SecSql();
                sql.append("INSERT INTO member");
                sql.append("SET regDate = NOW(),");
                sql.append("mName = ?,", mName);
                sql.append("memberId = ?,", memberId);
                sql.append("memberPw = ?;", memberPw);


                int id = DBUtil.insert(conn, sql);
                // 가입 완료.
                System.out.println(id + "번 회원가입 완료");
            }


        }

이렇게 구현했다. 코드 설명은 각주로 달았다. 일단 나는 이런 식으로 구현 했는데 지금 검토해보니까 우연히 됐던 것 같다. 여러 케이스로 해보니까 잘 안된다. 일단 고쳐보고 강사님 강의를 봐야겠다.

아 거의 한시간 넘게 날렸다. 일단 문제의 원인이 도대체 뭔지 모르겠어서 계속 검색하고 코드 고쳐보고를 반복했는데 쿼리가 아예 넘어가지를 않았다. 나중에 보니까 강사님 코드로 따로 연습하려고 만든 프로젝트에 쿼리가 넘어가고 있어서 제대로 작동하지 않았던 것이다. 데이터 베이스 연결 자체가 다른 데이터베이스를 쓰고 있으니까 될리가 있나.

그래서 아예 프로젝트가 날라가는건 아닌가 겁먹고 강사님 코드도 다 옮겨서 해봤는데 당연 (연습 데이터 베이스와 프로젝트 또한) article 데이터 베이스는 손도 대지 않았으니 잘 작동하는데 member만 작동을 안하니 도대체 뭐가 문제인지 감을 잡는데 진짜 한참 걸렸다.. 데이터 베이스만 바꿔주니까 잘 되더라.. 의욕이 팍 식는다 진짜.

아무튼 벌써 답을 다 봐버려서 일단 내 코드에 적용을 시켜보면 있는 아이디 검증하는데 까지는 잘 왔는데 쿼리가 틀리긴 했더라.

SecSql sql2 = new SecSql();
sql2.append("SELECT COUNT(*) > 0 FROM member WHERE memberId = ?;", memberId);

이렇게 해야지 올바른 쿼리인데 이유가 내가 쓴 변수는 int 값을 받는 것이였고, 난 처음에 정수로 저걸 판별하려고 했었다. 혹시 다른건 없을까 메서드를 보다가 boolean을 발견하고 고쳤다. false만 계속 떠서 계속 고민하다가 데이터 베이스 문제가 터져서 그 이후 사고는 멈춰버렸고.. 일단 이유만 말을 해 보자면 > 비교 연산자 자체가 boolean 값만 받기 때문이다. 그래서 쿼리문에 > 가 들어가는 것. 아무튼 이렇게 하면 내 코드도 정상 작동 될텐데 너무 많이 만져놔서 다시 돌리지도 못하겠다. 일단 강사님 코드 전문은.

if (cmd.equals("member join")) {
            String loginId = null;
            String loginPw = null;
            String loginPwConfirm = null;
            String name = null;

            System.out.println("==회원가입==");
            while (true) {
                System.out.print("로그인 아이디 : ");
                loginId = sc.nextLine().trim();

                if (loginId.length() == 0 || loginId.contains(" ")) {
                    System.out.println("아이디 똑바로 써");
                    continue;
                }

                SecSql sql = new SecSql();

                sql.append("SELECT COUNT(*) > 0");
                sql.append("FROM `member`");
                sql.append("WHERE loginId = ?;", loginId);

                boolean isLoindIdDup = DBUtil.selectRowBooleanValue(conn, sql);

                if (isLoindIdDup) {
                    System.out.println(loginId + "는(은) 이미 사용중");
                    continue;
                }
                break;
            }
            while (true) {
                System.out.print("비밀번호 : ");
                loginPw = sc.nextLine().trim();

                if (loginPw.length() == 0 || loginPw.contains(" ")) {
                    System.out.println("비번 똑바로 입력해");
                    continue;
                }

                boolean loginPwCheck = true;

                while (true) {
                    System.out.print("비밀번호 확인 : ");
                    loginPwConfirm = sc.nextLine().trim();

                    if (loginPwConfirm.length() == 0 || loginPwConfirm.contains(" ")) {
                        System.out.println("비번 확인 똑바로 써");
                        continue;
                    }
                    if (loginPw.equals(loginPwConfirm) == false) {
                        System.out.println("일치하지 않아");
                        loginPwCheck = false;
                    }
                    break;
                }
                if (loginPwCheck) {
                    break;
                }
            }

            while (true) {
                System.out.print("이름 : ");
                name = sc.nextLine();

                if (name.length() == 0 || name.contains(" ")) {
                    System.out.println("이름 똑바로 써");
                    continue;
                }
                break;
            }


            SecSql sql = new SecSql();

            sql.append("INSERT INTO `member`");
            sql.append("SET regDate = NOW(),");
            sql.append("updateDate = NOW(),");
            sql.append("loginId = ?,", loginId);
            sql.append("loginPw= ?,", loginPw);
            sql.append("name = ?;", name);

            int id = DBUtil.insert(conn, sql);

            System.out.println(id + "번 회원이 생성되었습니다");

이런 모양이고 나도 천천히 했으면 완성할 수 있었을 것 같다.

일단 오늘 너무 피곤하니까. 내일 내 버전으로 해봐야겠다.

내가 놓친 것은 비밀번호 확인 하는 부분과 아이디, 비번, 이름을 공백으로 뒀을 때의 경우를 놓쳤다.

내일은 이걸 인지하고 연습해보고 service로 리팩토링 하는 것 까지 해봐야겠다.