Firebase 을 통한 Android 회원가입 을 구현해보자

Assist·2023년 7월 20일
0

Android

목록 보기
6/21

일단 이전에 MVP 로 프로젝트를 구현했습니다 .

근데 이게 마지막 일거 같습니다....

Assist : MVP 로 구현했습니다!!! 짜잔
멘토님 : 오...전 MVVM 으로 할려 했는데. 엇! 혹시 MVP 로 하시고 싶으세요? 그럴까요? 
Assist : 어...음....
멘토님 : 한번 해볼까요!>!>!! 가봅시다1!!
Assist : 자신없으니 MVVM 으로 할께요.
멘토님: 아....아쉽네요...

이러한 이유로 다음 부터 MVVM 으로 구현할려고 합니다....

그럼 마지막 MVP 패턴으로 해봅시다!

Firebase RealTime Database

일단 구현전 Firebase 은 아주 많은 SNS 연동 회원가입을 구현해줍니다.
그러나 전 Firebase Realtime Database 을 통해 따로 회원 정보를 저장하고 싶어
모든 작업은 Real Time Data base 을 사용했습니다.

그럼 저의 작업방식은

  • Real Time Database 을 통해 회원 정보 저장
  • 회원정보는 유니크한 키값이 필요하기 때문에 중복되기 힘든 값인 핸드폰 번호로 지정
  • 언어는 Kotlin

이정도 입니다. 그럼 가봅시다

Firebase Manger class 을 만들자

class FirebaseDataManger {
    private var database = Firebase.database(BuildConfig.FIREBASE_DATABASE_URL)
    private var ref : DatabaseReference = database.getReference("/"+BuildConfig.userInfo)

    fun readUserInfo(phoneNumber : String , listener : FirebaseDataListener){
        val url = BuildConfig.userInfo+"/"+phoneNumber
        database.getReference(url).addListenerForSingleValueEvent(object: ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                val value = snapshot.getValue<UserInfo>()
                if(value == null){
                    listener.onMessageIsFail(Define.MESSAGE_NO_USER)
                    return
                }
                listener.onMessageIsCome(Define.MESSAGE_ALREADY_SIGN_UP)
                Timber.d("Success to get Firebase Database $value")
            }

            override fun onCancelled(error: DatabaseError) {
                Timber.d("Fail to get Firebase Database")
                listener.onMessageIsFail(error.message)
            }
        })
    }

    fun requestSignUp(data: UserInfo , listener : FirebaseDataListener) {
        ref.child(data.phoneNumber).setValue(
            data,
            DatabaseReference.CompletionListener { databaseError, databaseReference ->
                if (databaseError != null) {
                    Timber.e("Data could not be saved ${databaseError.message}")
                    listener.onMessageIsFail(databaseError.message)
                    return@CompletionListener
                }
                Timber.d("Data saved successfully.")
                listener.onMessageIsCome(Define.MESSAGE_SUCCESS_SIGN_UP)
            })
    }
}

위에서 천천히 설명드리겠습니다.

private var database = Firebase.database(BuildConfig.FIREBASE_DATABASE_URL)
private var ref : DatabaseReference = database.getReference("/"+BuildConfig.userInfo)

database은 기본 database 에 기본 접근하기 위해 선언했습니다.
그후 ref 은 유저 정보에 접근하기 위해 선언했습니다.


    fun readUserInfo(phoneNumber : String , listener : FirebaseDataListener){
        val url = BuildConfig.userInfo+"/"+phoneNumber
        database.getReference(url).addListenerForSingleValueEvent(object: ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                val value = snapshot.getValue<UserInfo>()
                if(value == null){
                    listener.onMessageIsFail(Define.MESSAGE_NO_USER)
                    return
                }
                listener.onMessageIsCome(Define.MESSAGE_ALREADY_SIGN_UP)
                Timber.d("Success to get Firebase Database $value")
            }

            override fun onCancelled(error: DatabaseError) {
                Timber.d("Fail to get Firebase Database")
                listener.onMessageIsFail(error.message)
            }
        })
    }

해당 firebase realtime database 에 접근해 유니크 한 키값인 phoneNumber에 Value가 있는지 체크를 햇습니다.

그후 데이터가 없으면 Listener 에 제가 미리 정의해준 string값을 Listener 을 통해 Presenter 을 호출했습니다.

그후 data가 있으면 Listener 가 호출됩니다.

그후 호출에 실패했을시 Listener 에 실패 했을시 호출합니다.

Presnter

    override fun onMessageIsCome(message: String) {
       Timber.d("Success to get UserInfo $message")
       view.showSignUpResult(message)
   }

   override fun onMessageIsFail(message: String) {
       Timber.d("Success to get UserInfo $message")
       when(message){
           Define.MESSAGE_NO_USER ->{
               requestSignUp()
           }
           else ->{
               view.showSignUpResult(Define.MESSAGE_ERROR_FIREBASE)
           }
       }
   }

Listener 을 통해 호출된 코드 입니다. Fail 했을시 분기 처리를 해줍니다.

  • 처음 실패한경우 -> 회원정보가 없는경우라고 판단해 회원가입 가능
  • 그외는 호출 실패 혹은 다른 이유로 실패했다 판단하여 view에 결과 값을 전달해줍니다.

Listener 같은 경우는 제 이전 포스트에 어떻게 구현했는지 나와있습니다.

그럼 오늘도 읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다-

profile
안드로이드만 좋아하는 특이한 개발자

0개의 댓글