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

원준·2023년 10월 12일

Firebase

목록 보기
6/11

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

클래스 생성

  • 필요한 클래스가 무엇인 있는지 생각해보자...
  • 생각해보니 채팅 내용이 저장되어야하고, 채팅방에 대해서 저장이 되어야한다!!

1. 채팅 내용 클래스 생성

  • 특정 사용자가 메시지를 보낼때를 생각해서 클래스를 만들자!

    	// 메시지 저장 클래스 
       public class Message implements Serializable {
         private String uid; // 사용자 고유 id
         private String content; // 사용자가 보낸 메시지
         private String date; // 사용자가 보낸 메시지의 시간
         private Boolean confirmed = false; // 문자열인지 사진인지 확인 여부
    
         public Message() {
         }
    
         public Message(String uid, String content, String date, Boolean confirmed) {
             this.uid = uid;
             this.content = content;
             this.date = date;
             this.confirmed = confirmed;
         }
    
         //....
    }

2. 구분을 지을 채팅방 클래스 생성

  • 사용자간의 메시지를 주고 받을때 방이 필요하니 사용자와 메시지를 담을 클래스를 만들자!!
// 채팅 방 사용자들과, 메시지 저장 클래스
public class ChatRoom implements Serializable {
	// 사용자가 참여했는지 여부를 알려줌 
    public Map<String, Boolean> users = new HashMap<>();
    // 해당 채팅방의 메시지
    public Map<String, Message> messages = new HashMap<>();

    public ChatRoom() {
    }
}

자 만들어 볼까???

  • 사용자 검색에서 RecyclerView에서 생성된 Adapter를 이용해 만들것이다.
  • 사용자의 CardView가 클릭된 순간!!! 작동하도록 설정했다!!

1. 채팅방 경로 설정

  • 대화방을 Chatroom/chatrooms 경로로 설정하자!
    // 대화방을 Chatroom/chatrooms 경로로 설정한다.
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("ChatRoom").child("chatRooms");

2. 로그인 사용자와 상대 사용자의 uid 저장

  • 로그인이 되어있는 사용자와 채팅하고 싶은 사용자의 uid를 가져와서 ChatRoom 클래스에 저장하자!

    // 상대 사용자 uid
    User user = userArrayList.get(index);
    
    // 로그인 되어있는 사용자 uid
    FirebaseAuth mAuth = FirebaseAuth.getInstance();
    String myUid = mAuth.getCurrentUser().getUid();
    
    // chatroom객체 안에 로그인한 유저와 선택된 유저가 대화 중이라는 값을 넣는다.
    chatRoom = new ChatRoom();
    HashMap<String, Boolean> hashUser = new HashMap<>();
    hashUser.put(myUid, true);
    hashUser.put(user.getUid(), true);
    chatRoom.users = hashUser;

3. 채팅방 생성 및 이동

  • 채팅방 생성을 먼저 하자!!
// ChatRoom/chatRooms경로안의 users라는 경로가 존재 할시, 상대방의 uid의 정보가 포함된 정보들을 가져온다. 
myRef.orderByChild("users/" + user.getUid()).equalTo(true)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
            	// 대화를 한번이라도 했거나, 로그인한 사용자가 아무나 대화를 시도 했다면 대화한 유저들을 검색한다.
                if (snapshot.getValue() != null) {
                    for (DataSnapshot data : snapshot.getChildren()){
                        ChatRoom chatRoom1 = data.getValue(ChatRoom.class);

                        if (chatRoom1.users.get(myUid) != null) {
                            // 접속한 자신과 선택된 유저가 대화한 데이터가 있다면, 채팅방 생성하지 않고 이동만 한다. 
                            goToChatRoom(user.getUid());

                            return;
                        }
                    }
                }
                // 만약 한번도 대화한적이 없는 유저이거나, 접속한 유저와 대화한적이 없다면 채팅방을 생성하고 이동한다. 
                myRef.push().setValue(chatRoom);
                goToChatRoom(user.getUid());
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) { }
        });
  • 이제 채팅을 진행하기 위해 Activity로 이동해야하는데, 필요한 정보들이 있다!!!! 상대방의 uid의 정보와 채팅방의 고유 ID를 넘거야한다!!
    • (하지만, 사용자 검색에서는 채팅방의 고유 ID를 알 수 없으니 넘기지 못한다....)
// 상대방의 uid를 담은 opponent, 채팅방의 고유 키값 chatKey를 담아 보낸다. 
// 유저 검색에서는 채팅방 고유 키값을 찾을 수 없기에 값은 없다.
private void goToChatRoom(ChatRoom chatRoom, String opponent){
    Intent intent = new Intent(context, MainActivity.class);
    intent.putExtra("opponent", opponent);
    intent.putExtra("chatKey", "");

    context.startActivity(intent);

    ((UserSearchActivity)context).finish();
}

4. 완성된 모습

  • Firebase에 정상적으로 만들어진것을 볼수 있다!!
profile
공부해보자

0개의 댓글