Skip to content

Week2 ‐ 11월 04일

Ju YunGyeom edited this page Nov 4, 2024 · 4 revisions
  • 할 일
    • 백로그 이슈 내용 보충
    • Firebase 연동 #53
    • 네이버지도SDK 연동 #53
    • firestore/realtimeDB - 조사 및 결정
    • 데이터 스키마
    • 테마 색상 정리
      • 피그마 정리
      • 공통 컴포넌트 테마 색상 #1

1. 주간계획 작성

주간 계획

백로그 이슈 내용 보충

스프린트 일부 수정

2. 기술적 도전

  • 윤겸 - 캐싱
    • 지도에서 주변의 마커 정보 불러올때 캐싱 활용해 요청 최적화
  • 민주 - 캐싱 적용 전과 후를 비교하여 문서화

3. 함께 프로젝트 기반 설정

  • 만들어 온 프로젝트 세팅 설명 및 리뷰
    • DataSource 추가
  • API 연동
    • Firebase 설정
    • 네이버 지도
  • 테마 색상
image

4. Firestore vs RealtimeDB

https://firebase.google.com/docs/database/rtdb-vs-firestore?hl=en

Firebase에는 두 종류의 데이터베이스가 있다.

  • Cloud Firestore
  • Realtime Database

공식 문서에서 Firestore를 추천하고 있다.

RealtimeDB는 하나의 쿼리에 정렬 또는 필터링 하나만 가능하지만, Firestore는 하나의 쿼리에 정렬과 필터링이 모두 가능하다. → Firestore가 더 복합적인 쿼리를 지원한다.

추후 픽 정보를 장르 등으로 필터링하는 기능을 추가할 수 있으므로 좀 더 복합적인 쿼리를 지원하는 Firestore를 선택

image

5. DB 설계 - 담은 픽 정보를 pick과 user 중 어디서 관리해야할까?

pick에서 담은 픽 정보를 관리하면 어떤 유저가 이 픽을 담은지를 관리하게 된다. user에서 담은 픽 정보를 관리하게 되면 유저가 담은 픽 정보를 관리하게 된다.

  1. pick에만 있는 경우

    pick에서만 담은 픽 정보를 관리하게 되면 특정 유저가 담은 픽을 알기 위해서 모든 pick을 스캔해야 한다.

  2. user에만 있는 경우

    user에서만 담은 픽 정보를 관리하게 되면 특정 pick이 담긴 개수를 알기 위해서 모든 user를 스캔해야 한다.

희준님

  • MySQL의 경우 중간에 테이블을 둔다.
  • NoSQL의 경우에는 찾아봐야할 것 같다.
    • 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 실행

image

6. 데이터 필드

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에 컬렉션과 필드를 추가하며 더미 데이터를 생성했습니다.

image image image

📑 프로젝트 소개

✏️ 팀 규칙

💡 진행 과정

지도

음원 재생

영상 재생

공통

📚 기술 및 학습

📜 주차별 기록

💼 발표 자료

Clone this wiki locally