그룹웨어 - 채팅 구현(5)

김채영·2024년 10월 13일

채팅

목록 보기
5/8

그룹 채팅과 개인 채팅

  • 그룹 채팅과 개인 채팅을 생성할 경우, 인원수에 따라 제한
  • 예를 들어, 조직도에 선택된 사원이 2명 이상일 경우, 그룹방 명을 입력받아 디비에 타입을 구분하여 저장

구성

  • 조직도에서 선택된 값을 확인하여 채팅 타입을 정함
  • 0은 개인, 1은 그룹으로 정함
  • 목록 실시간 반영을 위해 웹소켓 핸들러에서 디비 저장과 반영을 진행
  • 개인 채팅방은 상대방의 이름이 채팅방 이름이 되게 설정하고, 그룹 채팅방은 일괄 저장되기 때문에 같은 이름으로 설정함

개인 채팅방 생성

//웹소켓에서 진행하는 채팅방 디비 저장
dto.setChat_room_type(0);//1:1 채팅방 타입
Long chatRoomNo = chatRoomService.createRoomOne(dto);
String position = chatRoomService.searchPosition(currentMemberNo);

//채팅방 이름을 위한 이름+부서명
String namePosition = currentMemberName + " " + position;

ChatMemberDto memberDto = new ChatMemberDto();
memberDto.setMember_no(Long.valueOf(members.get(0)));
memberDto.setChat_room_no(chatRoomNo);
memberDto.setChat_member_room_name(namePosition);
if(chatMemberService.createMemberRoomOne(memberDto)>0){
    ChatMemberDto memberDto2 = new ChatMemberDto();
    memberDto2.setMember_no(currentMemberNo);
    memberDto2.setChat_room_no(chatRoomNo);
    memberDto2.setChat_member_room_name(names.get(0));
	if(chatMemberService.createMemberRoomOne(memberDto2)>0){
    	// 채팅방 번호로 해당 채팅방에 속한 멤버들 정보 조회
    	List<ChatMemberDto> chatMembers = chatMemberService.getMembersByChatRoomNo(chatRoomNo);
        List<Map<String, Object>> memberInfoList = new ArrayList<>();
		for(ChatMemberDto member : chatMembers){
            Map<String, Object> memberInfo = new HashMap<>();
            memberInfo.put("memberNo", member.getMember_no());
            memberInfo.put("roomName", member.getChat_member_room_name());
            memberInfoList.add(memberInfo);
	 }
     // 클라이언트로 보낼 데이터를 준비
     Map<String, Object> responseMap = new HashMap<>();
     responseMap.put("chatRoomNo", chatRoomNo);
     responseMap.put("currentMemberNo", currentMemberNo);
     responseMap.put("type", type);
     responseMap.put("memberInfoList", memberInfoList);
     // JSON으로 변환
     ObjectMapper objectMapper = new ObjectMapper();
     String responseJson = objectMapper.writeValueAsString(responseMap);
     for (WebSocketSession s : sessions.values()) {
         if (s.isOpen()) {
             s.sendMessage(new TextMessage(responseJson));
         }
    }
}

그룹 채팅방 생성

//그룹 채팅방 생성하기
dto.setChat_room_type(1);//단체 채팅방 타입
String groupChatName =(String) jsonMap.get("groupChatName");// 그룹 채팅명
dto.setChat_room_name(groupChatName);
Long chatRoomNo = chatRoomService.createRoomMany(dto);
for(int i = 0; i < members.size(); i++){
    ChatMemberDto memberDto = new ChatMemberDto();
    memberDto.setChat_room_no(chatRoomNo);
    memberDto.setChat_member_room_name(groupChatName);
    memberDto.setMember_no(Long.valueOf(members.get(i)));
    // 멤버 추가
    chatMemberService.createMemberRoomMany(memberDto);

}
ChatMemberDto currentMemberDto = new ChatMemberDto();
currentMemberDto.setMember_no(currentMemberNo);
currentMemberDto.setChat_room_no(chatRoomNo);
currentMemberDto.setChat_member_room_name(groupChatName);
chatMemberService.createMemberRoomOne(currentMemberDto);

if (!members.contains(currentMemberNo)) {
    members.add(String.valueOf(currentMemberNo));
}

Map<String, Object> responseMap = new HashMap<>();
responseMap.put("chatRoomNo", chatRoomNo);
responseMap.put("members", members);
responseMap.put("type", "groupChatCreate");
responseMap.put("names", groupChatName);

ObjectMapper objectMapper = new ObjectMapper();
String responseJson = objectMapper.writeValueAsString(responseMap);

for (WebSocketSession s : sessions.values()) {
    if (s.isOpen()) {
        s.sendMessage(new TextMessage(responseJson));
    }
}

구현하면서 들었던 생각

  • 채팅방 구분을 디비에서 타입 별로 구성하긴 했지만, 이 방법이 맞는건지 궁금
  • 실시간 목록 반영을 위해 먼저 핸들러에서 디비 값을 저장하고 저장 완료될 경우, 값을 다시 화면에 실시간 출력되게 구성했음
  • 이로 인해 너무 긴 코드와 같은 쿼리문을 가져다 쓰는 반복적인 행위가 계속 된다고 생각
  • 어떻게 해야 조금 더 간략하고 가독성 좋은 코드로 만들지 고민 중
profile
백엔드 개발⭐

0개의 댓글