728x90
반응형
🍒 채팅방 생성 기능
채팅방 생성은 여러 가지 조건을 체크하고, 해당 조건이 맞을 경우 새로운 채팅방을 생성합니다
- 사용자 확인: 요청을 보내는 사용자와 받는 사용자의 정보를 확인합니다.
- 이미 존재하는 채팅방 확인: 두 사용자의 대화가 이미 존재하는지 확인합니다.
- 새 채팅방 생성: 만약 채팅방이 존재하지 않는다면 새로 채팅방을 생성합니다.
1. 사용자 정보 및 요청 처리
@Override
@Transactional
public CreateNewChatRoomResponse createOrGetChatRoom(CreateNewChatRoomRequest requestDto) {
String socialId = getCurrentUserId(); // 현재 로그인된 사용자의 socialId 가져오기
Member member = memberRepository.findBySocialId(socialId).orElseThrow(MemberNotFoundException::new);
Long senderId = member.getMemberId();
String recipientNick = requestDto.getRecipientNick();
// 이미 존재하는 채팅방이 있는지 확인
Optional<ChatRoom> findChatRoomOpt
= chatRoomRepository.findByMemberIdAndOtherMemberNickname(senderId, recipientNick);
if (findChatRoomOpt.isPresent()) {
// 채팅방이 이미 존재하면, 해당 채팅방의 ID 반환
return new CreateNewChatRoomResponse(false, findChatRoomOpt.get().getId());
}
// 존재하지 않는다면, 새로운 채팅방 생성 진행
List<Member> members = memberRepository.findByMemberIdOrNickname(senderId, recipientNick);
validateMembers(members); // 유효한 사용자 확인
Member sender = getSender(members, senderId);
Member recipient = getRecipient(members, senderId);
return createNewChatRoom(sender, recipient); // 새로운 채팅방 생성
}
2. 사용자 유효성 검사
채팅방을 생성하려기 위해 두 사용자가 모두 유효한지 체크해야 합니다.
validateMembers() 메서드를 사용하여 두 사용자가 존재하는지 확인하고, getSender()와 getRecipient() 메서드로 각 사용자의 정보를 구분합니다.
private void validateMembers(List<Member> members) {
if (members.size() != 2) {
throw new MemberNotFoundException(); // 두 사용자가 아닌 경우 예외 처리
}
}
private Member getSender(List<Member> members, Long senderId) {
for (Member m : members) {
if (m.getMemberId().equals(senderId)) {
return m;
}
}
throw new MemberNotFoundException(); // 발신자 정보가 없을 경우 예외 처리
}
private Member getRecipient(List<Member> members, Long senderId) {
for (Member m : members) {
if (!m.getMemberId().equals(senderId)) {
return m;
}
}
throw new MemberNotFoundException(); // 수신자 정보가 없을 경우 예외 처리
}
3. 새로운 채팅방 생성
발신자와 수신자를 기반으로 새로운 ChatRoom 객체를 생성하고, 이를 데이터베이스에 저장합니다.
private CreateNewChatRoomResponse createNewChatRoom(Member sender, Member recipient) {
ChatRoom chatRoom = ChatRoom.createNewChatRoom(sender, recipient);
ChatRoom createdChatRoom = chatRoomRepository.save(chatRoom); // 데이터베이스에 저장
return new CreateNewChatRoomResponse(true, createdChatRoom.getId());
}
4. 채팅방 존재 여부 확인 및 응답 처리
만약 두 사용자가 이미 대화한 채팅방이 존재한다면, 새로 채팅방을 생성하는 것이 아니라, 기존 채팅방의 ID를 반환합니다.
if (findChatRoomOpt.isPresent()) {
return new CreateNewChatRoomResponse(false, findChatRoomOpt.get().getId());
}
이번 글에서는 채팅방 생성 기능의 핵심적인 로직을 설명했습니다. 중요한 부분은 기존 채팅방이 존재할 때 새로 생성하지 않고 재사용하며, 회원 검증과 채팅방 생성 후 저장이 잘 이루어진다는 점입니다. 이를 통해 채팅방 생성 기능이 더욱 효율적이고 안정적으로 동작할 수 있습니다.
다음 게시글에서는 채팅 전송 및 조회 부분에 대해 다룰 예정입니다 !

728x90
반응형
'프로젝트 > Wedle' 카테고리의 다른 글
[JPA 성능 최적화] 반복되는 save() 대신 saveAll()로 벌크 저장 (0) | 2025.04.08 |
---|---|
[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 7. 채팅 전송 및 조회 (0) | 2025.03.19 |
[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 5. Redis와 Kafka를 활용한 실시간 채팅 시스템 구현: WebSocket 기반의 고성능 메시징 (1) | 2025.03.19 |
[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 4. MongoDB 설정 및 연동 (0) | 2025.03.19 |
[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 3. WebSocket 연결 및 핸들러 구현 (0) | 2025.03.19 |