Side Project - Tinder
회원 가입한 유저들을 매칭해주는 기존 틴더 앱의 간단한 기능을 구현한 프로젝트
- GitHub -> https://github.com/hwayeon351/Tinder
GitHub - hwayeon351/Tinder
Contribute to hwayeon351/Tinder development by creating an account on GitHub.
github.com
학습 회고
오늘은 Firebase Realtime Database를 활용해서 틴더 앱에 로그한 한 유저의 정보를 저장하는 로직을 구현하였다.
그리고 깃헙에 올라와 있는 라이브러리를 사용해서 틴더 앱 유저들을 보여주는 CardStackView를 구성하고 어뎁터를 구현하였다.
오늘 공부한 내용
- Firebase Realtime Database
Firebase Realtime Database를 활용해서 NoSQL 클라우드 데이터베이스로 데이터를 저장하고 동기화 할 수 있다.
실시간 데이터베이스를 사용하면 모든 클라이언트에 실시간으로 데이터가 동기화되고 앱이 오프라인일 때에도 데이터를 사용할 수 있다.
데이터는 JSON으로 저장된다.
Firebase Realtime Database의 특징은 다음과 같다.
1. 실시간
Firebase Realtime Database는 일반적인 HTTP 요청이 아닌 동기화를 사용하기 때문에 데이터가 변경될 때 마다 연결된 모든 기기가 수 밀리초 내에 업데이트를 수신한다. 따라서 네트워크 코드를 작성할 필요가 없다.
2. 오프라인
Firebase Realtime Database SDK는 데이터를 디스크에 유지하기 때문에 앱이 오프라인일 때도 원활하게 작동된다. 네트워크에 다시 연결되면 클라이언트 기기가 놓쳤던 변경이 모두 수신되고 현재 서버 상태와 동기화된다.
3. 클라이언트 기기에서 액세스 가능
Firebase Realtime Database를 휴대기기나 웹브라우저에서 직접 액세스할 수 있기 때문에 서버가 불필요하다. Realtime Database가 제공하는 보안 규칙을 통해 데이터의 구조나 데이터를 읽거나 쓰는 조건을 정의할 수 있다.
Realtime Database API는 작업 실행 속도를 위주로 설계되었기 때문에 수백만 사용자가 실시간으로 원활하게 이용할 수 있는 실시간 환경을 구축할 수 있다.
- Module Gradle에 dependency 추가하기
dependencies {
implementation platform('com.google.firebase:firebase-bom:29.0.4')
implementation 'com.google.firebase:firebase-database-ktx'
}
- 데이터베이스 인스턴스를 가져와서 데이터 쓰기
Firebase.database로 데이터베이스 인스턴스를 가져오고 child를 생성해서 객체를 추가할 수 있다.
틴더 앱에서는 앱 사용자 정보를 Realtime Database에 저장할 것이기 때문에 Users 객체를 생성하고 그 하위에 유저 아이디들을 담도록 하였다.
val currentUserDB = Firebase.database.reference.child("Users").child(userId)
val user = mutableMapOf<String, Any>()
user["userId"] = userId
currentUserDB.updateChildren(user)
private fun saveUserName(name: String) {
val userId = getCurrentUserId()
val currentUserDB = userDB.child(userId)
val user = mutableMapOf<String, Any>()
user["userId"] = userId
user["name"] = name
currentUserDB.updateChildren(user)
}
- 데이터베이스에서 읽기
실시간으로 앱에 데이터를 업데이트하기 위해서는 child에 명시한 참조를 불러와 ValueEventListener를 추가해야 한다.
ValuEventListener의 onDataChange() 메서드는 리스너가 연결될 때 한 번 트리거 되고, 이후 하위 항목을 포함하여 데이터가 업데이트 될 때 마다 다시 트리거 된다.
틴더 앱에 최초 로그인이 된 후, 사용자가 이름을 등록해야하기 때문에 기존에 이름을 등록한 적이 없으면 AlertDialog를 띄워 이름을 등록하도록 하였다.
userDB = Firebase.database.reference.child("Users")
val currentUserDB = userDB.child(getCurrentUserId())
currentUserDB.addListenerForSingleValueEvent(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.child("name").value == null) {
showNameInputPopup()
return
}
}
override fun onCancelled(error: DatabaseError) {
}
})
private fun showNameInputPopup() {
val editText = EditText(this)
AlertDialog.Builder(this)
.setTitle("이름을 입력해주세요.")
.setView(editText)
.setPositiveButton("저장", { _, _ ->
if (editText.text.isEmpty()) {
showNameInputPopup()
} else {
saveUserName(editText.text.toString())
}
})
.setCancelable(false)
.show()
}
https://firebase.google.com/docs/database/android/start
Android에서 설치 및 설정 | Firebase Documentation
의견 보내기 Android에서 설치 및 설정 Firebase에 앱 연결 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다. 데이터베이스 만들기 Firebase Console의 실시간 데이터베이스 섹션으로 이동
firebase.google.com
'Android > Side Projects' 카테고리의 다른 글
Tinder 앱 개발하기 (0) | 2022.02.18 |
---|---|
Tinder 앱 개발하기 (0) | 2022.02.17 |
Tinder 앱 개발하기 (0) | 2022.02.15 |
도서 리뷰 앱 개발하기 (0) | 2022.02.14 |
도서 리뷰 앱 개발하기 (0) | 2022.02.13 |