일단 이전에 MVP 로 프로젝트를 구현했습니다 .
근데 이게 마지막 일거 같습니다....
Assist : MVP 로 구현했습니다!!! 짜잔
멘토님 : 오...전 MVVM 으로 할려 했는데. 엇! 혹시 MVP 로 하시고 싶으세요? 그럴까요?
Assist : 어...음....
멘토님 : 한번 해볼까요!>!>!! 가봅시다1!!
Assist : 자신없으니 MVVM 으로 할께요.
멘토님: 아....아쉽네요...
이러한 이유로 다음 부터 MVVM 으로 구현할려고 합니다....
그럼 마지막 MVP 패턴으로 해봅시다!
일단 구현전 Firebase 은 아주 많은 SNS 연동 회원가입을 구현해줍니다.
그러나 전 Firebase Realtime Database 을 통해 따로 회원 정보를 저장하고 싶어
모든 작업은 Real Time Data base 을 사용했습니다.
그럼 저의 작업방식은
이정도 입니다. 그럼 가봅시다
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 에 실패 했을시 호출합니다.
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 했을시 분기 처리를 해줍니다.
Listener 같은 경우는 제 이전 포스트에 어떻게 구현했는지 나와있습니다.
그럼 오늘도 읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다-