-
Notifications
You must be signed in to change notification settings - Fork 1
데이터 모델
맞선임 앱은 아래와 같이 Firebase의 다양한 기능을 이용하여 사용자 데이터나 채팅방 메시지 등의 앱 데이터를 관리합니다.
- Authentication: 이메일/비밀번호를 통한 사용자 회원가입 및 로그인 기능 탑재를 위해 사용하였습니다.
- Cloud Firestore: 사용자 정보, 맞선임 — 맞후임 간의 채팅방 메시지, 의뢰 요청과 리뷰 데이터 관리를 위해 사용하였습니다.
- Cloud Storage: 사용자의 프로필 사진을 저장하기 위해 사용하였습니다.
저희 팀은 앱을 개발하는 과정에서 사용자나 채팅방 등과 관련된 데이터를 체계적으로 관리하기 위해 총 4개의 핵심 클래스를 구현하였습니다.
MSIUser
클래스는 사용자의 고유 ID, 이름과 전화번호 등의 계정 정보를 관리하기 위해 만들어진 클래스입니다.
사용자가 회원가입을 할 경우에는 MSIUser.signUp()
메소드가 Firebase Authentication 기능을 통해 사용자가 입력한 이메일과 비밀번호로 새로운 계정을 생성하고, 나머지 계정 정보는 Cloud Firestore 데이터베이스에 저장합니다. 이렇게 저장된 계정 정보는 사용자가 MSIUser.login()
메소드를 통해 로그인을 하였을 때 사용자 정보를 불러오기 위해 사용됩니다.
MSIUser
클래스에는 로그인이나 회원가입 등의 계정 관련 작업 이외에도 다른 사용자에게 앱 내 알림을 보내거나 사용자가 받은 알림을 모두 불러오는 기능이 포함되어 있습니다. 채팅방에 메시지를 보내거나 맞선임 요청 수락, 사용자 프로필에 리뷰 남기기 등을 하게 되면 MSIUser.sendNotification()
메소드가 호출되는데, 이 메소드는 Cloud Firestore 데이터베이스에 있는 다른 사용자의 데이터에 새로운 알림을 추가하는 기능을 합니다. 이렇게 알림을 받은 사용자는 MSIUser.getNotifications()
메소드를 통해 모든 알림을 확인하거나 MSIUser.deleteNotification()
또는 MSIUser.deleteNotification()
메소드를 이용하여 사용자가 받은 알림을 삭제할 수 있습니다.
MSIRequests
클래스는 사용자의 의뢰 요청을 관리하는 클래스입니다.
이 클래스는 MSIUser
클래스와 마찬가지로 Cloud Firestore 데이터베이스를 이용하여 의뢰를 생성 또는 삭제하는 기능을 제공합니다. MSIRequests
클래스에는 서버에 등록된 모든 의뢰 중 주어진 조건과 일치하는 의뢰만을 찾아 반환하는 MSIRequests.getIncoming()
과 MSIRequests.getOutgoing()
이라는 메소드가 존재합니다. 이 두 메소드는 Cloud Firestore에서 제공하는 강력한 데이터베이스 쿼리 기능을 사용하여 특정 전문 분야와 연관된 의뢰와 특정 사용자 고유 ID가 작성한 의뢰를 불러오는 기능을 제공합니다.
MSIStorage
클래스는 사용자 파일의 업로드와 다운로드를 관리하는 클래스입니다.
이 클래스는 MSIStorage.pickAvatar()
라는 단 1개의 메소드를 가지고 있는데, 이 메소드는 크로스-플랫폼 사진 선택 플러그인 image_picker
과 Firebase의 Cloud Storage 기능을 사용하여 사용자의 기기에 저장된 사진을 Firebase 서버에 저장하는 작업을 수행하는 메소드입니다.
MSIReviews
클래스는 사용자가 작성한 리뷰 또는 사용자가 받은 리뷰를 관리하는 클래스입니다.
MSIReviews.add()
메소드는 평가하는 사람의 고유 ID, 평가받는 사람의 고유 ID, 리뷰의 평점과 리뷰 내용으로 이루어진 사용자 리뷰를 Cloud Firestore 데이터베이스에 저장합니다. 또한 MSIReviews.getFor()
와 MSIReviews.getFrom()
메소드를 사용하면 주어진 사용자를 대상으로 작성된 모든 리뷰 또는 주어진 사용자가 작성한 모든 리뷰를 불러올 수 있습니다.
MSIRoom
클래스는 맞선임 — 맞후임 간의 채팅방을 나타내는 클래스입니다.
저희 팀이 개발하기 가장 어려울 것 같다고 생각했던 기능이 바로 이 실시간 채팅 기능인데, 채팅방에 필요한 UI를 Chat
이라는 단 하나의 위젯으로 제공해주는 flutter_chat_ui
라는 패키지를 사용하여 실시간 채팅 기능을 구현하는 데에 걸리는 시간을 예상보다 크게 단축시킬 수 있었습니다. 또한 백엔드와 관련된 부분은 flutter_firebase_chat_core
라는 패키지를 참고하여 위 스크린샷과 같이 컬렉션과 필드를 구축하였습니다.
채팅방에 메시지를 보낼 때는 받는 사람 (MSIUser
)과 보낼 메시지 (PartialText
)를 지정하여 MSIRoom.sendMessage()
메소드를 호출합니다. 이 메소드는 사용자와 받는 사람이 포함된 채팅방이 존재하지 않을 경우에는 새로운 채팅방을 먼저 생성하고, 메시지의 내용, 메시지를 보낸 시간과 읽음 여부 등을 Cloud Firestore 데이터베이스에 저장합니다. MSIRoom.updateMessage()
또는 MSIUser.deleteMessage()
메소드를 이용하면 사용자가 보낸 메시지를 수정하거나 삭제할 수 있으며, Stream<List<types.TextMessage>>
를 반환하는 MSIRoom.getMessages()
를 통해 채팅방의 모든 메시지를 실시간으로 받아올 수도 있습니다.
Copyright (c) 2021 John Hwang (@jhhwang21c) and Jaedeok Kim (@jdeokkim)