Firebase_Repository_명세서 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

Firebase Repository 명세서


개요

이 문서는 FireBaseRepository 및 구현체 FireBaseRepositoryImpl에서 제공하는 기능과 설계된 구조를 상세히 설명하고, 테스트용으로 남겨둔 코드 및 최적화가 필요한 부분에 대한 내용을 포함한다. 주요 기능은 사용자, 친구 요청, 친구 관계, 라벨, 사진 정보를 Firestore 및 Firebase Storage를 통해 관리하는 것이다.


인터페이스 정의

FireBaseRepository

CREATE

메서드 설명
createUserIfNotExists 주어진 사용자 ID(uid)로 사용자가 존재하지 않으면 Firestore에 사용자 정보를 생성한다.

구현 설명

1. 사용자 생성 및 조회

createUserIfNotExists

  • 설명: 주어진 사용자 ID(uid)로 Firestore에서 사용자를 조회하여, 존재하지 않으면 새로 생성한다.
  • 구현 상세:
    1. Firestore의 USER 컬렉션에서 사용자 문서를 조회한다.
    2. 문서가 존재하지 않으면 기본 사용자 정보를 생성하고 저장한다.
  • 에러 처리: 예외 발생 시 false 반환.

2. 라벨 관리

getLabel

  • 설명: 특정 사용자 ID와 라벨 이름을 기반으로 라벨 데이터를 Firestore에서 가져온다.

getLabels

  • 설명: 특정 사용자 ID에 속한 모든 라벨 데이터를 Firestore에서 가져온다.

insertLabel

  • 설명: 새로운 라벨 데이터를 Firestore의 USERLABEL 컬렉션에 저장한다.

3. 사진 정보 관리

saveImageFile

  • 설명: Firebase Storage에 이미지를 저장하고 다운로드 URL을 반환한다.
  • 구현 상세:
    1. uid, label, fileName, uri를 기반으로 저장 경로를 결정한다.
    2. Firebase Storage에 이미지를 업로드한 후 다운로드 URL을 반환한다.

insertPhotoInfo

  • 설명: Firestore에 사진 정보를 저장한다.

4. 친구 요청 및 관계 관리

sendFriendRequest

  • 설명: 특정 사용자에게 친구 요청을 보낸다.
  • 구현 상세:
    1. 요청자와 대상자의 정보를 Firestore에서 가져온다.
    2. 요청 데이터와 대상자 데이터로 각각 친구 요청 데이터를 생성한다.
    3. Firestore 트랜잭션을 통해 요청 데이터를 저장한다.
  • 예외 처리: 데이터가 없거나 저장 중 에러 발생 시 false 반환.

acceptFriendRequest

  • 설명: 받은 친구 요청을 수락하여 친구 관계를 형성한다.
  • 구현 상세:
    1. 요청자와 대상자의 사용자 정보를 Firestore에서 가져온다.
    2. 서로의 친구 리스트에 데이터를 추가한다.
    3. 요청 상태를 Firestore에서 제거한다.

rejectFriendRequest

  • 설명: 받은 친구 요청을 거절하고 요청 상태를 제거한다.
  • 구현 상세:
    1. 요청자와 대상자의 요청 상태를 Firestore에서 삭제한다.

5. 전체 데이터 조회

getAllUsers

  • 설명: Firestore에 저장된 모든 사용자 데이터를 가져온다.
  • 테스트 로그:
    • 모든 사용자 데이터를 FirestoreUser로 변환.
    • 필요 시 데이터 수량 및 가져온 데이터를 로그로 출력.

getAllUsersInfo

  • 설명: 모든 사용자 데이터를 가져오며 친구 상태를 함께 반환한다.
  • 친구 상태 판별 로직:
    1. 친구 요청 데이터(FRIEND_REQUESTS)에서 SENT 또는 RECEIVED 상태 확인.
    2. 친구 리스트 데이터(FRIENDS)에서 친구 관계 여부 확인.
  • 테스트 로그:
    • 에러 발생 시 로그 출력:

      Log.e("FireBaseRepository", "getAllUsersInfo Error: ${e.message}")
      

getReceivedFriendRequests

  • 설명: 받은 친구 요청 중 RECEIVED 상태만 필터링하여 반환한다.
  • 테스트 로그:
    • 요청 상태와 데이터를 디버깅하기 위해 로그 출력:

      Log.d("getReceivedFriendRequests", friendRequest.toString())
      

테스트용 코드 및 최적화 필요 사항

1. 테스트용 로그

  • 로그 메시지 확인 및 필요 시 제거:
    • getReceivedFriendRequestsgetFriendRequests의 디버깅 로그.
    • getAllUsersInfo 에러 로그.

2. 데이터 구조 및 쿼리 최적화

  • 현재 서버의 전체 데이터를 가져오는 구조는 비효율적일 수 있음.
  • 최적화 방안:
    1. 필터링 조건 추가:
      • 예: getAllUsers에서 whereEqualTo 조건 추가.
    2. 페이징 처리:
      • 대규모 데이터 로드 시 페이징 구현.
    3. 서버 쿼리 최적화:
      • Firestore에서 상태 필터링 처리 (whereEqualTo).

결론 및 권장사항

  1. 최적화 필요:
    • 모든 데이터를 가져오는 메서드(getAllUsers, getAllUsersInfo)는 조건 필터링 또는 페이징을 통해 최적화 필요.
    • 디버깅용 로그는 최종 배포 전에 제거.
  2. 테스트 후 코드 정리:
    • Log.d, Log.e와 같은 디버깅 로그를 완성 후 제거.
    • 상태 필터링 로직을 Firestore 쿼리로 이전하여 성능 개선.
  3. 개선된 데이터 구조 고려:
    • 친구 요청과 관계를 효율적으로 관리할 수 있도록 데이터 구조 조정 검토.

최종 업데이트: 2024년 11월 20일

비고: 친구 기능이 모두 완성되면 테스트 및 디버깅 로그는 삭제할 예정입니다.

⚠️ **GitHub.com Fallback** ⚠️