Skip to content

기술 스택

YuGyeong98 edited this page Jan 9, 2024 · 2 revisions

1. JSON 라이브러리

1. Gson

  • Gson
  • Java 객체를 JSON으로 직렬화하거나 JSON을 Java 객체로 역직렬화하는 라이브러리
  • 현재 버그 수정만 되고 새로운 기능은 추가되지 않는 상태

2. Moshi

  • Moshi
  • Java, Kotlin에서 JSON 데이터를 직렬화/역직렬화하는데 사용되는 라이브러리

3. Kotlinx.Serialization

  • Kotlinx.Serialization
  • 코틀린에서는 클래스 생성자 파라미터에 default value를 설정할 수 있다.
  • Gson이나 Moshi에서는 코틀린의 default value 문법을 무시하기 때문에 설정한 기본값이 아닌 null값이 들어온다.
  • 따라서 null값이 들어올 수 있는 파라미터를 nullable로 설정해주어야 하고, null 처리를 해줘야 한다는 번거로움이 있다.
  • Kotlinx.Serialization에서는 default value 값을 활용하여 null 값이 없는 객체를 만들 수 있다.
  • Gson이나 Moshi는 자바 기반이고, 코틀린의 default value 문법을 무시하기 때문에 설정한 기본값이 아닌 null값이 들어온다.
  • Serialization은 코틀린 기반이고, default value 값을 활용하여 null 값이 없는 객체를 만들 수 있다.
  • 따라서 Kotlinx.Serialization을 사용하기로 결정하였다.

2. 파이어베이스 데이터베이스

  • Cloud Firestore vs Realtime Database
  • 사용자의 깃허브 정보를 저장해야 한다.
  • 채팅방, 채팅 메시지 등 그룹 채팅 관련 데이터를 저장해야 한다.
  • 사용자가 참여한 스터디 정보를 저장해야 한다.
  • 스터디 나가기 및 내보내기 할 때 데이터베이스에서 삭제되어야 한다.
  • 검색할 때마다 키워드에 해당하는 스터디 리스트를 불러와야 한다.

1. Data model

  • NoSQL 데이터베이스
Cloud Firestore Realtime Database
데이터를 Document 컬렉션으로 저장 데이터를 한 개의 큰 JSON 트리로 저장
간단한 데이터를 저장하기 쉬움 간단한 데이터를 저장하기 쉬움
복잡하고 계층적인 데이터를 구성하기 쉬움 복잡하고 계층적인 데이터를 구성하기 어려움
데이터 구조화가 덜 필요

2. Querying

Cloud Firestore Realtime Database
단일 쿼리에서 필터링/정렬 모두 가능 단일 쿼리에서 필터링/정렬 둘 중 하나만 가능
특정 컬렉션 또는 컬렉션 그룹의 Document만 반환하고, 하위 컬렉션 데이터는 반환하지 않음
→ 쿼리 조건문을 잘 작성한다면 불필요한 하위 데이터까지 반환하는 성능 문제는 발생하지 않음
쿼리는 항상 전체 서브트리를 반환
→ 불필요한 하위 데이터까지 매번 반환하므로 성능 저하 발생 가능
데이터셋이 커질수록 쿼리 성능 저하

3. Pricing

Cloud Firestore Realtime Database
주로 데이터 읽기, 쓰기, 삭제 작업에 대해 요금 청구 대역폭과 저장용량에 대해서만 요금 청구

4. 현재 Cloud Firestore에서는 전체 텍스트 검색을 지원하고 있지 않다.

  • Full-text search
  • 타사 검색 서비스를 사용해야 한다.
  • 쿼리문을 사용해서 구현할 수는 있지만, 중간에 끼어있는 문자열이나 뒤에 오는 문자열 대상으로 검색이 불가능하다.
  • 현재 앱에서는 데이터 구조가 복잡하지 않고, 채팅을 구현한다면 주로 데이터 읽기, 쓰기, 삭제 작업이 많아질 것으로 예상된다.
  • 또한 Cloud Firestore에서는 전체 텍스트 검색을 지원하고 있지 않기 때문에 최종적으로 Realtime Database로 결정하였다.
  • REST API or SDK? REST API를 사용하면 기존 REST API 사용하던 방식을 적용할 수 있다.
  • 따라서 Realtime Database의 REST API 방식을 사용하기로 결정하였다.

Clone this wiki locally