-
Notifications
You must be signed in to change notification settings - Fork 0
Week2 ‐ 11월 04일
- 할 일
- 백로그 이슈 내용 보충
- Firebase 연동 #53
- 네이버지도SDK 연동 #53
- firestore/realtimeDB - 조사 및 결정
- 데이터 스키마
- 테마 색상 정리
- 피그마 정리
- 공통 컴포넌트 테마 색상 #1
백로그 이슈 내용 보충
스프린트 일부 수정
- 윤겸 - 캐싱
- 지도에서 주변의 마커 정보 불러올때 캐싱 활용해 요청 최적화
- 민주 - 캐싱 적용 전과 후를 비교하여 문서화
- 만들어 온 프로젝트 세팅 설명 및 리뷰
- DataSource 추가
- API 연동
- Firebase 설정
- 네이버 지도
- 테마 색상
https://firebase.google.com/docs/database/rtdb-vs-firestore?hl=en
Firebase에는 두 종류의 데이터베이스가 있다.
- Cloud Firestore
- Realtime Database
공식 문서에서 Firestore를 추천하고 있다.
RealtimeDB는 하나의 쿼리에 정렬 또는 필터링 하나만 가능하지만, Firestore는 하나의 쿼리에 정렬과 필터링이 모두 가능하다. → Firestore가 더 복합적인 쿼리를 지원한다.
추후 픽 정보를 장르 등으로 필터링하는 기능을 추가할 수 있으므로 좀 더 복합적인 쿼리를 지원하는 Firestore를 선택
pick에서 담은 픽 정보를 관리하면 어떤 유저가 이 픽을 담은지를 관리하게 된다. user에서 담은 픽 정보를 관리하게 되면 유저가 담은 픽 정보를 관리하게 된다.
-
pick에만 있는 경우
pick에서만 담은 픽 정보를 관리하게 되면 특정 유저가 담은 픽을 알기 위해서 모든 pick을 스캔해야 한다.
-
user에만 있는 경우
user에서만 담은 픽 정보를 관리하게 되면 특정 pick이 담긴 개수를 알기 위해서 모든 user를 스캔해야 한다.
희준님
- MySQL의 경우 중간에 테이블을 둔다.
- NoSQL의 경우에는 찾아봐야할 것 같다.
- NoSQL 중 DocumentDB
- 양방향 참조, 중간 매개, 하이브리드 패턴이 있다
- NoSQL 중 DocumentDB
하이브리드 패턴
// 쿼리 1번
// picks 컬렉션
pick_id1: {
title: "Love wins all",
album_title: "The Winning",
artists: ["IU", "IU2"],
image_url: "https://i.scdn.co/image/ab67616d00001e02ff9ca10b55ce82ae553c8228",
comment: "한마디",
location: new GeoPoint(40, 50),
created_at: Timestamp.fromDate(new Date()),
created_by: "user1"
favorite_count: 100
}
// users 컬렉션
user1: {
name: "기린",
}
// favorites 컬렉션 (중간 컬렉션)
{
{
pick_id: "pick1",
user_id: "user1",
updated_at: Timestamp.fromDate(new Date())
},
{
pick_id: "pick1",
user_id: "user1",
updated_at: Timestamp.fromDate(new Date())
},
{
pick_id: "pick2",
user_id: "user1",
updated_at: Timestamp.fromDate(new Date())
}
}
양방향 참조
// 쿼리 2번
// picks 컬렉션
{
pick_id: "1234",
title: "Love wins all",
album_title: "The Winning",
artists: ["IU", "IU2"],
image_url: "https://i.scdn.co/image/ab67616d00001e02ff9ca10b55ce82ae553c8228",
location: new GeoPoint(40, 50),
created_at: Timestamp.fromDate(new Date()),
favorite_users: ["user1", "user2"], // 좋아요한 사용자 ID 배열 -> 데이터 일관성
}
// users 컬렉션
{
uid: "user1",
name: "기린",
favorite_tracks: ["1234", "5678"], // 좋아요한 트랙 ID 배열 -> 데이터 일관성
}
⇒ 결론 : 하이브리드 패턴을 사용하자!
쿼리: 모바일 → 서버
클라우드 func: 서버 내에서 (네트워크 통신 x) → 빠름
승규님: Firebase를 쓰면 이걸 꼭 써야합니다.
좋아요를 눌렀을 때,
favorites에 doc 추가 → picks 좋아요 수 증가 func 실행
favorites에 doc 삭제 → picks 좋아요 수 감소 func 실행
Firestore Database를 사용했습니다.
데이터 모델
- users 컬렉션: user 모음
- name: 유저 닉네임
- picks 컬렉션: pick 모음
- album_title: 앨범 이름
- artists: 아티스트
- 여러 명의 아티스트가 될 수 있어서 array 타입
- comment: 한마디
- image_url: 앨범 사진 url
- location: 픽의 위치(위도, 경도)
- created_at: 픽을 등록한 시간
- song_title: 노래 제목
- track_id: spotify api의 track id
- created_by: 픽을 등록한 유저 id
- favorites 컬렉션: 담기 모음
- pick_id : 담은 pick의 id
- user_id : 담기를 누른 유저 id
- updated_at : 픽을 담은 시간
사용 예시
Firestore Database에 컬렉션과 필드를 추가하며 더미 데이터를 생성했습니다.
- 음원 재생 - 기술 검토 및 기획
- ExoPlayer로 음원재생하기
- Visualizer + Compose 오디오 시각화
- 백그라운드 플레이어(1) - MediaSession
- 백그라운드 플레이어(2) - Notification
- 백그라운드 플레이어(3) - MediaService모듈
- 백그라운드 플레이어(4) - 구현
- 1. 영상 재생 - 기술 검토 및 기획
- 2. 뮤직비디오 정보 가져오기
- 3. Swipe 제스처로 자연스럽게 영상 재생하기
- 4. 뮤직비디오 오버레이와 컨트롤러 구현
- 5. 화면 회전 시 플레이어 상태 유지하기
- 6. 사용자의 눈에 잘 띄도록! 뮤직비디오 UX 개선
- 모든 버전에 대응하는 Splash 화면
- 동적으로 색상이 변경되는 그라데이션 배경화면
- 반응형으로 만드는 InfoWindow UI
- Paging을 사용해 검색 결과 무한 스크롤
- CloudFunction 사용하기
- Firestore vs RealtimeDB 비교
- Coil vs Glide 비교
- GeoFire와 GeoHash를 이용한 Firebase 위치 데이터 쿼리
- NavBackStackEntry와 컴포즈에서의 ViewModel 공유
- CompositionLocal
- viewModel()과 hiltViewModel()
- FocusRequester
- debounce와 sample