[Firebase] 실시간 채팅방 만들기 - Realtime Database - 3 (채팅 구현)

원준·2023년 10월 12일

Firebase

목록 보기
7/11

레이아웃 코드는 제외한다.

바로 만들어 볼까???

  • 이전 단계에서 모든게 만들어졌다는 기준으로 만들어졌다!!! 꼭 보고 와라!!

1. 선언 및 초기화

  • 인증된 사용자, 데이터베이스 경로, 상대방 uid, 채팅방 uid를 담을 변수를 매게 변수를 선언하자!
private FirebaseAuth mAuth;
DatabaseReference myRef;

String opponent;
String chatKey;
  • 보낸 값과 경로를 설정하자!
@Override
protected void onCreate(Bundle savedInstanceState) {
	//...
  opponent = getIntent().getStringExtra("opponent");
  chatKey = getIntent().getStringExtra("chatKey");

  mAuth = FirebaseAuth.getInstance();
  myRef = FirebaseDatabase.getInstance().getReference("ChatRoom").child("chatRooms");    
}

2. 채팅방 ID 가져오기

  • 사용자를 검색해서 채팅방을 만들었기때문에 채팅방의 ID가 존재하지 않는다!!
    • 이미 있는 채팅방의 경우 ID가 존재하지만 없는 경우를 먼저 생각해 처리하자!!
void chatReset(){
    myRef.orderByChild("users/" + opponent).equalTo(true) // ChatRoom/chatRooms 경로 중 Intent로 받은 상대방 uid와 일치하는 모든 채팅방을 찾는다. 
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for (DataSnapshot child : snapshot.getChildren()) {
                        ChatRoom chatRoom1 = child.getValue(ChatRoom.class);
                        if(chatRoom1.users.get(mAuth.getCurrentUser().getUid()) != null){ // 모든 채팅방 중 접속한 자신의 uid와 일치하는 채팅방을 찾음 
                            chatKey = child.getKey(); //  찾은 채팅방의 고유 키 값을 넣는다. 
                            chatRoom(); //  고유 키 값을 넣은 후 채팅을 시작할 수 있다. 
                            break;
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
  • 채팅방의 ID 값이 존재하면 찾기 함수를 적용하지 말고 바로 채팅을 불러오자!!
if(chatKey.isEmpty()){
	chatReset(); // 유저 검색 후 채팅방의 고유 키 값이 없으니, 키값을 먼저 찾자. 
}else{
	chatRoom(); // 채팅방 리스크에서는 고유 키값이 있으니 바로 채팅을 시작하자. 
}

3. 채팅 내용 업데이트

  • 이제 채팅방 ID를 얻었으니, 이전 채팅 기록 및 새롭게 추가되는 채팅 메시지에 대해 실시간으로 업데이트 가능하도록 함수를 만들자!!
private void chatRoom(){
   // 채팅방의 고유 키 값의 경로 안에서 messages의 경로에 채팅이 추가 될 경우 
   // 이미 추가된 메시지의 경우도 불러온다!!
    myRef.child(chatKey).child("messages").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
            // 메시지를 만든다. 
            Message message = snapshot.getValue(Message.class);

            messageArrayList.add(message);
            adapter.notifyDataSetChanged();

           // RecyclerView 화면을 가장 하단으로 이동
           recyclerView.scrollToPosition(messageArrayList.size() - 1);

        }
        //...
    });
}

4. 채팅 보내기!!

  • 이제 내용을 입력하고 버튼을 누르면 채팅을 보내도록 해볼까?!!!??

    // TODO: 채팅 보내기 
      private void sendMessage(String content){
      		//메시지에 인증된 사용자의 id와 작성된 메시지, 작성된 날짜를 넣자!!
           Message message = new Message(mAuth.getCurrentUser().getUid(), content,getDateTimeString(), false);
    
          myRef.child(chatKey).child("messages")
                  .push().setValue(message);
      }

    Adapter에서는 내가 보낸 메시지는 우측 정렬을 하고,
    상대방이 보낸 메시지는 좌측 정렬을 하도록 설정하자!!!

완성된 모습

1. 안드로이드 화면

2. Firebase 화면

profile
공부해보자

0개의 댓글