본문 바로가기
Project/안드로이드 프로젝트(ShareHouse)

Android Studio, JAVA] 구글 firebase를 이용하여 아이디의 중복 여부 테스트 하기

by 김마리님 2020. 8. 15.

결과물 :

 

 

(제 정보력으로는) Authentication에 등록된 메일 전체를 스캔하는 메서드가 없어보였어요.

그래서 생각했어요.

 

1. 로그인 할때 데이터베이스에 등록하기

2. 포커스가 빠질때 데이터베이스를 스캔하기.

3. 유무에 따라 다른 UI 도출하기

 

예시코드

package com.mary.sharehouseproject.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import com.mary.sharehouseproject.R;
import com.mary.sharehouseproject.model.User;
import com.mary.sharehouseproject.util.ToolbarNavigationHelper;

public class LoginActivity extends AppCompatActivity {
    private static final String TAG = "LoginActivity";

    private Button btnJoin, btnLogin;
    private EditText etEmail, etPassword;
    private String email, password = null;
    private FirebaseFirestore db;
    private User user;
    private TextView alertText;


    //툴바용 전역변수 설정
    private TextView logoText;
    private ImageView ivHamburgerButton, ivToolbarSearchButton;
    private DrawerLayout mainDrawerLayout;
    private NavigationView mainNavigationView;
    private Toolbar toolbar;
    private Context mContext = LoginActivity.this;
    private FirebaseUser firebaseUser;

    //구글 파이어베이스 인증용 전역변수 설정
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        init();
        initToolbar();
        Listener();
        setSupportActionBar(toolbar);
        setupToolbarNavigationView();
        mAuth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();

    }

    @Override
    protected void onStart() {
        super.onStart();
        firebaseUser = mAuth.getCurrentUser();
        Log.d(TAG, "onStart: " + firebaseUser);
    }

    private void createEmail(final String email, String password) {
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Log.d(TAG, "onComplete: 가입됨");
                            firebaseUser = mAuth.getCurrentUser();
                            RegistUser();
                        } else {
                            Log.d(TAG, "onComplete: 가입 안됨.." + task.getException());
                            Toast.makeText(mContext, "가입에 실패하셨습니다.", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

    }


    //툴바용 전역변수에 값 부여
    private void initToolbar() {
        logoText = findViewById(R.id.tv_logoText);
        ivHamburgerButton = findViewById(R.id.iv_hamburgerButton);
        ivToolbarSearchButton = findViewById(R.id.iv_toolbarSearchButton);
        mainDrawerLayout = findViewById(R.id.layout_login_drawer);
        toolbar = findViewById(R.id.toolbar_main);
        mainNavigationView = findViewById(R.id.navigation);
    }

    //툴바 리스너
    private void setupToolbarNavigationView() {
        ToolbarNavigationHelper.enableNavigationHelper(mContext, mainNavigationView, mainDrawerLayout, logoText, ivHamburgerButton, ivToolbarSearchButton);
    }

    private void init() {
        alertText = findViewById(R.id.tv_alert_email);
        btnJoin = findViewById(R.id.btn_join);
        btnLogin = findViewById(R.id.btn_login);
        etEmail = findViewById(R.id.et_login_id);
        etPassword = findViewById(R.id.et_login_pw);
    }

    private void Listener() {
        email = etEmail.getText().toString().trim();
        password = etPassword.getText().toString();

        etEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b == false) {
                    SelectUser();
                }
            }
        });

        btnJoin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: 회원가입 버튼 눌리나?");
                createEmail(etEmail.getText().toString().trim(), etPassword.getText().toString());
            }
        });

    }

    private void RegistUser() {
        user = User.builder()
                .email(etEmail.getText().toString().trim())
                .role("임차인")
                .build();
        db.collection("user")
                .add(user)
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        Log.d(TAG, "onSuccess: user 성공");
                        Intent mainIntent = new Intent(mContext, MainActivity.class);
                        startActivity(mainIntent);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, "onFailure: " + e.getMessage());
                    }
                });
    }

    private void SelectUser() {
        Log.d(TAG, "onFocusChange: 포커스 사라짐");
        db.collection("user").whereEqualTo("email", etEmail.getText().toString().trim())
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, "onComplete: " + document.getData());
                                UpdateUiHasEmail();
                                return;
                            }
                        } else {
                            Log.d(TAG, "onComplete: 비어서 안되는건가?");
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, "onFailure: SelectUser" + e.getMessage());
                    }
                });
        UpdateUiNoEmail();
    }

    private void UpdateUiHasEmail() {
        alertText.setVisibility(View.VISIBLE);
        alertText.setText("이메일이 있습니다.  로그인을 진행합니다.");
        btnJoin.setVisibility(View.GONE);
        btnLogin.setVisibility(View.VISIBLE);
    }

    private void UpdateUiNoEmail() {
        alertText.setVisibility(View.VISIBLE);
        if (etEmail.getText().toString() == null || etEmail.getText().toString().equals("")) {
            alertText.setText("이메일을 입력해주세요,");
        } else {
            alertText.setText("이메일이 없습니다. 회원가입을 진행합니다.");
        }
    }

}

 

 

밑에 Listener 함수에 이벤트 리스너 함수가 등록되어 있어요.

 

1. createEmailAndPassword에 RegistUser 함수로 데이터베이스에 접근해 등록을 합니다.

모델은 이미 만들어둔 상태에서 Bulider(Lombok Libraray)로 객체를 만든 후, 객체를 등록합니다.

 

포커스 리스너는 boolean이 true이면 포커싱, false면 포커싱이 되지 않음을 의미합니다. 아이디 입력 후 -> 비밀번호 등을 입력할 때 함수가 실행되야 하므로 false가 될 때 데이터베이스를 스캔하는 함수, SelectUser를 호출합니다.

 

파이어베이스 쿼리는 여타 관계형 SQL과 다른 독특한 형태를 지니는데, 이것은 문서 참조.

https://firebase.google.com/docs/firestore/query-data/queries?authuser=2

 

Cloud Firestore에서 단순 쿼리 및 복합 쿼리 실행  |  Firebase

Cloud Firestore는 컬렉션 또는 컬렉션 그룹에서 검색할 문서를 지정하는 강력한 쿼리 기능을 제공합니다. 데이터 가져오기 및 실시간 업데이트 가져오기에 설명된 대로 이러한 쿼리를 get() 또는 addS

firebase.google.com

이 때 주의할 점은, get으로 받아오는 값이 하나도 없다면, Complete도, Failuer도 거치지 않은 채, 바로 함수가 종료되어 버린다는 점이다. 따라서, 찾았을 때 바뀌는 UIupdate 함수를 하나 설정하고, return을 통해 함수를 즉시 종료시킨다. 만일 종료되지 않고 아래로 계속해서 내려갈 경우 마지막에 아무것도 찾지 못했을 때의 UIupdate 함수를 따로 만들어 소출한다. 

 

 

※문제점 :

구글 파이어베이스의 매서드들이 죄다 비동기라서.. 이게 좀 늦는 감이 있는데.. 비동기 콜백처리 하던가 해야할 것 같다...... 아니면 답 없을것 같은데 8-8

반응형