Firebase 활용하기

저번까지는 reference와 file을 이용하여 회원관리를 하였는데, 이번부터는 firebase를 활용할 것이다.

firebase는 NoSQL로 되어있으며, 안드로이드 스튜디오에서도 간편하게 설정할 수 있는 DB이다.

firebase 홈페이지에 들어가 프로젝트를 생성한 뒤, google-services 파일을 app폴더 안에 넣었다. 그리고 build.gradle에 firebase관련 플러그인들을 넣었다.

넣을 때 위치를 잘못 넣어서 Sync now를 할 때 계속 오류가 발생하였다

영어를 잘 읽어야겠다..

firebase에는 Authentication과 RealtimeDatabase를 기본적으로 지원한다. Authentication은 파이어베이스가 로그인, 회원가입 기능을 구현할 수 있도록 하였고 RealtimeDatabase는 테이블 형태로 데이터를 저장할 수 있도록 되어있다. NoSQL이라 key-value형태가 살짝 달라서 이해를 하는데 시간이 걸렸다.

@Override
public void onClick(View view) {
                    //DB 저장, mbti list로 변환
                    if (pw1.equals(pw2)) {
                        checkedMbti();
                        createUserAuth(email, pw1, name, mbti);

                        //firebase 서버 통신 시간동안 대기
                        try {
                            Toast.makeText(RegisterActivity.this, "잠시 기다려 주세요.", Toast.LENGTH_SHORT).show();
                            Log.d("잠시 대기", pw1);
                            //여기에 대기창 같은거 띄울 수 있나? 창 띄운 다음 sleep 바로 뒤에 finish 넣어서 사라지도록 하고 싶음
                            Thread.sleep(5000); //10초 대기
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
                        startActivity(intent);
                    } else {
                        Toast.makeText(RegisterActivity.this, "비밀번호가 같지 않습니다.", Toast.LENGTH_LONG).show();
                    }
                }
//계정 생성
    private void createUserAuth(String email, String pwd, String name, String mbti) {
        //Authentic 입력
        firebaseAuth.createUserWithEmailAndPassword(email, pwd)
                .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            createUserRealtime(email, name, mbti);
                            Toast.makeText(RegisterActivity.this, "회원가입 성공", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(RegisterActivity.this, "회원가입 실패", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
//Realtime DB 입력
    private void createUserRealtime(String email, String name, String mbti) {
        Log.d("createuser", pw1);
        userUid = firebaseAuth.getUid();
        UserAccount user = new UserAccount(email, name, mbti);
        userReference.child("user").child(userUid).setValue(user);
        userReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String str = "";
                Log.d("realtime DB입력", str);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                String str = "";
                Log.d("realtime DB거절", str);
            }
        });
    }

Authentication을 통해 회원을 가입한 다음 firebase에서 제공하는 유정 고유 식별 키인 uid를 받는다. 그리고 uid를 테이블 이름으로 하여 realtimeDatabase에 저장하도록 함수를 구현하였다.

이때 또 어려웠던 부분이 서버와의 통신 시간이었다.

firebase서버가 미국에 있는데, 그러다보니 회원가입을 하고 uid를 받는데까지 시간이 1~2초 걸린다는 것이었다. 계속 realtime에 값이 안써지길래 로그를 여러군데 찍으며 알게 되었다.

처음에는 시간 지연 문제를 해결하기 위해 thread를 사용하고 싶었는데, java문법이 익숙하지도 않고 thread를 어떻게 사용하는지 방법도 잘 모르겠어서 sleep를 활용하였다.

다른 데이터베이스를 쓸 때는 이런 문제는 발생하지 않았어서 더 어렵게 느껴졌었다. 그래도 성공하여서 다행이다.