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

Android Studio, JAVA] 랜덤함수를 이용해 유저 고유 코드를 만들고 저장하기

by 김마리님 2020. 11. 9.

결과 : 

 

4번째 줄에 보면 7자리수로 유저코드가 생성된 것이 보입니다. 이것을 만들고, 파이어베이스에 저장하는거까지 해봅시다.

 

저는 이것의 코드가 길어지고, 구글 로그인 / 일반 로그인 이렇게 두 군데로 제작했기 때문에 유틸로 제작, static 함수로 관리하지만, 앱 상황에 따라 유동적으로 조절하셔도 됩니다. 

 

예시로 Firebase 구글 로그인부터 봅니다.

저는 이것을 액티비티에서 buttonListener 로 매서드를 호출합니다. 이걸 보러 올 정도면 이 정도는 할 수 있다 생각합니다!

 

- LoginActivity.java

    private FirebaseAuth firebaseAuth;
    
        private void initGoogleLogin() {
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        googleSignInClient = GoogleSignIn.getClient(this, gso);
        firebaseAuth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();

    }
    
        private void setListener() {

        googleSignInButton.setOnClickListener(v -> {
            DlogUtil.d(TAG, "googleSignInButton 클릭");
            signIn();
        });

    }
    
        private void signIn() {

        Intent signInIntent = googleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    
        private void firebaseAuthGoogle(String idToken) {
        showProgressBar();
        AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
        firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, task -> {
            if (task.isSuccessful()) {
                DlogUtil.d(TAG, "로그인 성공");
                //로그인 이력을 확인합니다.
                LoginUtil.checkLogin();
                LoginActivity.this.finish();

            } else {
                DlogUtil.d(TAG, "로그인 실패");
                Toast.makeText(LoginActivity.this, "로그인 실패", Toast.LENGTH_SHORT).show();

            }

            hideProgressBar();
        });

    }
    
    
    
    

 

처음 액티비티를 통해 로그인을 하고, checkLogin을 이용해 이전에 로그인을 한 적이 있는 메일인지 확인합니다.

이제 만들어둔 LoginUtil을 사용합니다.

 

    private static FirebaseFirestore db;
    private static FirebaseAuth firebaseAuth;

    private static void initGoogleLogin() {

        firebaseAuth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();

    }

 

먼저 다음과 같은 전역변수와, 파이어베이스 변수에 값을 초기화 해줍니다.

 

그리고, 처음 로그인 이력을 확인합니다.

    public static void checkLogin() {

        DlogUtil.d(TAG, "checkLogin");
        initGoogleLogin();
        HashMap<Object, Object> hashMap = new HashMap<>();
        db.collection("user")
                .whereEqualTo("email", firebaseAuth.getCurrentUser().getEmail())
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        DlogUtil.d(TAG, "성공 : 여기로 오나?");
                        for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                            hashMap.put("code", documentSnapshot.getData().containsKey("code"));
                        }

                        if (hashMap.isEmpty()) {
                            //코드를 생성하고, 코드가 있는지 재확인한다.
                            makeUserCode();
                        }

                    } else {
                        DlogUtil.d(TAG, "실패 : 여기로 오나?");
                    }
                })
                .addOnFailureListener(e -> {
                    DlogUtil.d(TAG, "여기니..?");
                    e.printStackTrace();
                });

    }

 

실제로 로그인한 이력을 확인하고, 로그인 이력이 있다면 HashMap 내부에 결과값을 삽입합니다.

만약 HashMap이 비었다면 이전에 로그인 한 적이 없다는 뜻이겠죠? 그러니 코드를 발급합니다.

 

    private static void makeUserCode() {
        DlogUtil.d(TAG, "makeUserCode");

        HashMap<String, Object> hashMap = new HashMap<>();
        int code = (int) (Math.random() * 10000000);
        db.collection("user")
                .whereEqualTo("code", code)
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                            DlogUtil.d(TAG, documentSnapshot.getData());
                            hashMap.put("code", documentSnapshot.getData().containsValue("code"));
                        }

                        if (hashMap.isEmpty()) {
                            giveUserCode(code);
                        } else {
                            makeUserCode();
                        }

                    } else {
                        DlogUtil.d(TAG, "실패");
                        makeUserCode();
                    }
                })
                .addOnFailureListener(e -> {
                    e.printStackTrace();
                    DlogUtil.d(TAG, "실패");
                    makeUserCode();
                });

    }

이번에는 난수로 코드를 선으로 만들고, 코드는 겹치면 안되는 고유의 값이기 때문에(파이어베이스가 기반하는 NoSQL은 고유키나 후보키 등이 존재하지 않습니다.), 먼저 결과값을 돌려보고, 결과를 다시 해시맵에 넣어봅니다. 해시맵이 비었다면, 이전에 이 코드가 만들어진 적이 없다는 뜻이므로, 유저코드를 삽입하는 함수를 실행하고, 그런 적이 없다면 makeUserCode 함수를 재호출 합니다.

 

이제 고유값 코드를 파이어베이스에 집어넣습니다.

    private static void giveUserCode(int code) {
        DlogUtil.d(TAG, "giveUserCode");
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("email", firebaseAuth.getCurrentUser().getEmail());
        hashMap.put("username", firebaseAuth.getCurrentUser().getDisplayName());
        hashMap.put("code", code);
        db.collection("user").document(firebaseAuth.getCurrentUser().getEmail())
                .set(hashMap)
                .addOnSuccessListener(aVoid -> DlogUtil.d(TAG, "성공 : " + hashMap.get("code")))
                .addOnFailureListener(e -> {
                    e.printStackTrace();
                    DlogUtil.d(TAG, "실패");
                });
    }

 

만들어진 코드를 해시맵에 넣고, 그 해시맵을 set해서 값을 부여합니다. 그러면 파이어베이스에 짜쟌, 값이 저장됩니다.

 

 

 

 

반응형