DirectTalk9은 Firebase 학습을 위한 응용 예제로,

이전에 정리한 Node.js기반의 Firebase 게시판 만들기를 Android 버전으로 응용한 것으로,

Firebase의 실시간 데이터 베이스(Realtime Database)기능을 이용하여,

사용자들이 실시간으로 대화 할 수 있도록 만든 커뮤니케이션 도구이다.

(사실 메신저도 게시판이라는...)


2018년 8월에 실시간 데이터 베이스(Realtime Database)을 Cloud Firestore로 변환하였고,

기존의 실시간 데이터 베이스는 realtime이라는 브랜치로 저장해 두었다.


현재는 텍스트로 1:1 채팅과 그룹 채팅이 가능하다.

아직 개인별 친구 리스트 기능을 구현하지 않아서, 전체 사용자 리스트가 출력되기 때문에

카카오톡처럼 일반 사용자가 사용하기 보다는

조직 구성원 전체가 나오는 기업용 메신저에 적합할 것 같다.


DirectTalk9을 안드로이드에 설치하는 것은 해킹 시도 등의 오해를 일으킬 수 있기 때문에 데모나 별도의 apk 파일은 제공되지 않고,

github에서 소스를 다운로드 받아서 직접 실행해야 한다.

설치 방법은 github에서 DirectTalk9 소스를 다운로드 받고, Firebase에 프로젝트를 설정하고 이 둘을 연동하면 된다.

github에서 DirectTalk9 소스를 다운로드 받고, Firebase와 연동하는 것은 여기에 정리하였고,

Firebase 콘솔에서 Firebase의 여러 기능을 설정하는 것은 따로 정리하였다.

사용법이라 내용이 많지 않지만, 이미지가 많아서 별도로 작성하였다.

설치를 완료하고 실행하면 다음 그림과 같이 로그인 화면이 나타난다.

별도의 회원 가입창이 없고

로그인 페이지에서 아이디(이메일)와 비번을 입력하고,

하단의 가입(SingUp) 버튼을 누르면 회원 가입이 되고 로그인 상태가 되어 앱을 사용할 수 있다.


상단에 사용자 리스트, 채팅방 리스트, 개인 정보 설정을 할 수 있는 세개의 아이콘이 나타난다.

사용자 리스트, 채팅방 리스트는 첫 그림을 참고하고,

개인 정보 설정 화면은 다음과 같다.

대화에 사용할 이름(name, displayname), 상태 메시지를 수정할 수 있다.

이미지를 터치하면 개인 사진을 등록할 수 있다.

저장(save) 버튼을 선택해서 수정한 내용을 저장한다.

비밀 번호를 변경할 경우 Change Password 버튼을 눌러 별도의 창에서 수정할 수 있다.


채팅 예제를 실행해 보려면 다수의 사용자가 필요하다.

상단의 툴바()를 눌러서 로그아웃(logout) 메뉴을 실행한다.



다시 로그인 창에서 다른 사용자로 가입해서 채팅을 진행하면 된다.


DirectTalk9는 Firebase의 Realtime Database를 사용하는 버전과 Cloud Firestore(beta)를 사용하는 버전으로 개발되었다.


Realtime Database 버전에서 데이터를 저장하는 기본 구조는 다음과 같다.

크게 사용자 정보를 저장하는 users와 채팅(방) 정보를 저장하는 rooms로 구성하였다.

users는 사이트 회원 정보로 사용자 고유번호(uid), 아이디, 이름 등으로 구성한 일종의 회원 테이블이다.

로그인과 회원에 대한 기본 정보는 Firebase 인증(Authentication)으로 처리하지만

Firebase 인증으로 처리되지 않는 정보들을 users 스키마에서 저장하고 관리한다.


rooms는 채팅 정보를 관리하는 스키마로,

메시지(messsge), 마지막 메시지(lastmessage), 채팅방 참여자(users), 메시지를 읽은 사용자(readusers)로 구성된다.

메시지(messsge)는 사용자가 작성한 메시지로

메시지 문장(msg), 메시지 종류(텍스트, 이미지, 파일), 작성시간(timestamp), 작성자(uid)로 구성했다.

메시지를 읽은 사용자(readusers)는 메시지별 안 읽은(unread) 사용자 수(참여자수-읽은 사용자수)를 보여주는데 사용한다.

마지막 메시지(lastmessage)는 메시지(messsge)와 동일한 구조를 가지고,

채팅방 리스트를 출력할 때 마지막 메시지 내용과 시간을 보여주기 위해 사용했다.

rooms의 users는 채팅방 참여자로 사용자의 uid 값을 키(필드)로 사용한다.

unread는 채팅방 사용자들이 읽지 않은 메시지의 합계를 의미하고,

unread도 users처럼 사용자 uid를 키 값으로 구성하였다.


마지막으로 이미지와 파일을 전송할 경우, 파일명(filename)과 파일크기(filesize)를 채팅방별로 files에 저장한다.


Cloud Firestore 버전에서 데이터를 저장하는 기본 구조는

Realtime Database과 비슷한 것 같지만 다음과 같이 차이가 있다.

Realtime Database에서는 채팅방별 마지막 메시지(lastmessage), 읽지 않은 메시지(unread), 채팅방 참가자(users), 이미지나 파일(files)을 별도의 Json 자식으로 구현하였다.

Cloud Firestore에서는 컬렉션(collection)으로 구현해야 하지만

컬력션 기능이 제한적이고, 단순 데이터는 배열이나 Object(Map)가 효율적이라 다르게 구현했다.

채팅방별 마지막 메시지(lastmessage)와 이미지나 파일(files)은 합쳐서 채팅방(rooms)의 필드로,

읽지 않은 메시지(unread)는 채팅방 참가자(users)들과 합쳐서 배열로 구현하였다.

메시지(messages)에서도 별도로 저장하던 파일을 같이 저장하도록 구성하였다.

그리고 메시지(messages)는 채팅방(rooms)의 컬렉션으로 구성하였다.

Realtime database와 Cloud Firestore의 구성에 대한 또 다른 설명은 여기에서 얻을 수 있다.

이상으로 DirectTalk9의 설치와 사용법 등을 정리하였다.

DirectTalk9은 Firebase 학습을 위한 응용 예제로 시작했지만

안드로이드 개발을 쉽게 하기 위한 템플릿 프로젝트(필요한 기능을 미리 구현해 둔 뒤에, 실제 프로젝트에서 복사/붙여넣기하는 용도)로

필요한 기능들을 계속 추가할 예정이다.



+ Recent posts