회원가입 SQLiteDataBase로 구현하기!

2024. 2. 22. 17:18개인 프로젝트

최근 SQLiteDataBase를 새롭게 배우게 되어서 전부터 만들어보고 싶었던 회원가입과 로그인 서비스를 구현해봤습니다!

 

우선 사용자에게 아이디, 비밀번호, 휴대폰 번호, 이름을 입력 받고 idx라는 순서값도 Data Class에 정의를 했습니다!

Data Class

 

이후 SQLiteDataBase를 사용하기 위해 SQLiteOpenHelper를 상속 받은 DBHelper 클래스를 만들어 줬습니다!

DBHelper에선 테이블 생성을 해주었습니다!

DBHelper 클래스 생성

 

 

다음으로 이제 데이터를 insert, select, delete등을 할 수 있게 LoginDAO라는 클래스를 하나 만들어 companionObject안에 

각각 정의를 했습니다

 

class LoginDAO {

    companion object {
        //selectOne
        fun selectLoginOne(context: Context, userId: String): LoginClass? {
            // 쿼리 생성
            val sql = """select idx, userId, userPw, userName, userNumber
            |from LoginTable
            |where userId = ?
        """.trimMargin()

            // ?에 들어갈 값
            val args = arrayOf(userId)

            // 쿼리 실행
            val dbHelper = DBHelper(context)
            val cursor = dbHelper.writableDatabase.rawQuery(sql, args)

            // 접근
            if (cursor.moveToNext()) {
                // 순서값을 가져온다
                val idx1 = cursor.getColumnIndex("idx")
                val idx2 = cursor.getColumnIndex("userId")
                val idx3 = cursor.getColumnIndex("userPw")
                val idx4 = cursor.getColumnIndex("userName")
                val idx5 = cursor.getColumnIndex("userNumber")

                // 데이터를 가져온다
                val idx = cursor.getInt(idx1)
                val userId = cursor.getString(idx2)
                val userPw = cursor.getString(idx3)
                val userName = cursor.getString(idx4)
                val userNumber = cursor.getInt(idx5)

                // 객체에 데이터를 담는다
                val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)

                // 데이터베이스를 닫아준다
                cursor.close()
                dbHelper.close()

                return loginInfo
            } else {
                // 데이터가 없는 경우
                cursor.close()
                dbHelper.close()
                return null
            }
        }


        fun selectLoginOne1(context: Context, userNumber: Int): LoginClass? {
            // 쿼리 생성
            val sql = """select idx, userId, userPw, userName, userNumber
            |from LoginTable
            |where userNumber = ?
        """.trimMargin()

            // ?에 들어갈 값
            val args = arrayOf(userNumber.toString())

            // 쿼리 실행
            val dbHelper = DBHelper(context)
            val cursor = dbHelper.writableDatabase.rawQuery(sql, args)

            // 접근
            if (cursor.moveToNext()) {
                // 순서값을 가져온다
                val idx1 = cursor.getColumnIndex("idx")
                val idx2 = cursor.getColumnIndex("userId")
                val idx3 = cursor.getColumnIndex("userPw")
                val idx4 = cursor.getColumnIndex("userName")
                val idx5 = cursor.getColumnIndex("userNumber")

                // 데이터를 가져온다
                val idx = cursor.getInt(idx1)
                val userId = cursor.getString(idx2)
                val userPw = cursor.getString(idx3)
                val userName = cursor.getString(idx4)
                val userNumber = cursor.getInt(idx5)

                // 객체에 데이터를 담는다
                val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)

                // 데이터베이스를 닫아준다
                cursor.close()
                dbHelper.close()

                return loginInfo
            } else {
                // 데이터가 없는 경우
                cursor.close()
                dbHelper.close()
                return null
            }
        }



        //select All
        fun selectLoginAll(context: Context) : MutableList<LoginClass>{
            var sql = """select idx, userId, userPw, userName, UserNumber
            |from LoginTable
            |order by idx desc
        """.trimMargin()

            //쿼리 실행
            var dbHelper = DBHelper(context)
            var cursor = dbHelper.writableDatabase.rawQuery(sql, null)

            //담을 리스트
            var loginList = mutableListOf<LoginClass>()

            //접근
            while (cursor.moveToNext()){
                //순서값을 가져온다
                var idx1 = cursor.getColumnIndex("idx")
                var idx2 = cursor.getColumnIndex("userId")
                var idx3 = cursor.getColumnIndex("userPw")
                var idx4 = cursor.getColumnIndex("userName")
                var idx5 = cursor.getColumnIndex("userNumber")

                //데이터를 가져온다
                var idx = cursor.getInt(idx1)
                var userId = cursor.getString(idx2)
                var userPw = cursor.getString(idx3)
                var userName = cursor.getString(idx4)
                var userNumber = cursor.getInt(idx5)

                var loginModel = LoginClass(idx, userId, userPw, userName, userNumber)
                loginList.add(loginModel)
            }
            dbHelper.close()
            return loginList
        }


        //insert
        fun insertLogin(context: Context, loginClass: LoginClass){
            //쿼리 생성
            var sql = """insert into LoginTable
            |(userId, userPw, userName, userNumber)
            |values(?, ?, ?, ?)
        """.trimMargin()

            //?에 들어갈 값
            var args = arrayOf(loginClass.userId, loginClass.userPw, loginClass.userName, loginClass.userNumber)

            //쿼리 실행
            var dbHelper = DBHelper(context)
            dbHelper.writableDatabase.execSQL(sql, args)
            //닫아준다
            dbHelper.close()
        }

 

위의 코드를 보면 selectOne 즉 1개의 데이터를 가져오는 함수가 2개인 걸 볼 수 있습니다.

제가 저렇게 구현을 한 이유는 

처음에는 userId를 입력 받는 함수만 만들었는데

아이디 찾기를 할 때에 휴대폰 번호를 입력받게 했었어서 하나를 더 만들었습니다

 

// 접근
            if (cursor.moveToNext()) {
                // 순서값을 가져온다
                val idx1 = cursor.getColumnIndex("idx")
                val idx2 = cursor.getColumnIndex("userId")
                val idx3 = cursor.getColumnIndex("userPw")
                val idx4 = cursor.getColumnIndex("userName")
                val idx5 = cursor.getColumnIndex("userNumber")

                // 데이터를 가져온다
                val idx = cursor.getInt(idx1)
                val userId = cursor.getString(idx2)
                val userPw = cursor.getString(idx3)
                val userName = cursor.getString(idx4)
                val userNumber = cursor.getInt(idx5)

                // 객체에 데이터를 담는다
                val loginInfo = LoginClass(idx, userId, userPw, userName, userNumber)

                // 데이터베이스를 닫아준다
                cursor.close()
                dbHelper.close()

                return loginInfo
            } else {
                // 데이터가 없는 경우
                cursor.close()
                dbHelper.close()
                return null
            }
        }

 

이렇게 cursor.moveToNext를 if문으로 구현함으로써 null값이 나오더라도 에러가 나지 않게끔 했습니다!

아 물론 데이터를 저장하는데 null값이 들어올 수도 있지 않을까라는 생각을 했었지만

애초에 데이터를 입력받는 회원가입 화면에서 한 개의 항목이라도 입력을 하지 않으면 

데이터를 저장할 수 없게끔 조치를 해두었습니다!

 

이렇게 데이터 베이스를 만들어 두고 회원가입을 진행하였습니다!

입력받기!

이렇게 이름과 전화번호, 아이디, 비밀번호를 입력받고 값을 모두 데이터 베이스에 저장시켰습니다!

여기서 checkPW는 비밀번호를 잘 입력했는지 확인하기 위해 만들었습니다!

 

아이디 유효성 검사

 

이건 아이디 유효성 검사인데 첫 번째로 아이디를 입력받는 칸이 비어있을 경우 DiaLog를 띄워주고 커서를 옮겨주게끔 했습니다!

이후 만약 사용자가 입력한 아이디가 이미 데이터 베이스에 저장이 되어있을 경우 다른 아이디를 입력하게끔 만들었습니다!

이로써 중복되는 아이디를 방지할 수 있었습니다!

 

비밀번호 유효성 검사

이건 비밀번호 입력 유효성 검사인데 아이디와 마찬가지로 비밀번호를 입력받는 칸이 비어있을 경우 DiaLog를 보여주었고

두 번째는 특수문자를 입력하지 않으면 DiaLog를 보이게 하였습니다!

 

유효성 검사를 마침

이후 유효성 검사를 모두 마치면 데이터 베이스에 정보를 저장하고 회원가입 Fragment를 제거 해주었습니다!

 

회원가입.mp4
10.93MB

회원가입 구현

 

이후 로그인 화면으로 돌아가서 이렇게 코드를 작성했습니다!

 

데이터 베이스에 있는 아이디를 입력 했는가?

 

여기서 selectOne을 사용하여 사용자가 입력한 아이디와 비밀번호가 데이터 베이스에 존재하는지를 찾아보고 

존재하지 않을 경우 DiaLog를 띄웠습니다!

 

아이디와 비밀번호를 입력했는가?

 

여기선 사용자가 아이디와 비밀번호를 입력하지 않고 로그인 버튼을 누르게 된다면 DIaLog를 띄워주고 커서를 

입력하지 않은 칸으로 옮겨줬습니다!

 

로그인.mp4
8.65MB

로그인 구현