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를 활용하였다.
다른 데이터베이스를 쓸 때는 이런 문제는 발생하지 않았어서 더 어렵게 느껴졌었다. 그래도 성공하여서 다행이다.