[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 - 6. 채팅방 생성

2025. 3. 19. 20:01·프로젝트/Wedle
728x90
반응형

🍒 채팅방 생성 기능

채팅방 생성은 여러 가지 조건을 체크하고, 해당 조건이 맞을 경우 새로운 채팅방을 생성합니다

  1. 사용자 확인: 요청을 보내는 사용자와 받는 사용자의 정보를 확인합니다.
  2. 이미 존재하는 채팅방 확인: 두 사용자의 대화가 이미 존재하는지 확인합니다.
  3. 새 채팅방 생성: 만약 채팅방이 존재하지 않는다면 새로 채팅방을 생성합니다.

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
'프로젝트/Wedle' 카테고리의 다른 글
  • [JPA 성능 최적화] 반복되는 save() 대신 saveAll()로 벌크 저장
  • [Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 7. 채팅 전송 및 조회
  • [Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 5. Redis와 Kafka를 활용한 실시간 채팅 시스템 구현: WebSocket 기반의 고성능 메시징
  • [Spring Boot/Kafka/Stomp] 실시간 채팅 구현 – 4. MongoDB 설정 및 연동
예롱메롱
예롱메롱
  • 예롱메롱
    예롱이의 개발 블로그
    예롱메롱
  • 전체
    오늘
    어제
    • 전체보기 (274)
      • 프로젝트 (35)
        • Wedle (12)
        • 인스타그램 클론 코딩 (13)
        • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (10)
      • 인프런 Spring 강의 정리 (79)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (7)
        • Spring 핵심 원리 - 기본편 (9)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (8)
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편 (11)
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리.. (6)
        • 실전! 스프링 부트와 JPA 활용2 - API 개.. (5)
        • 실전! 스프링 데이터 JPA (7)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (11)
        • 실전! Querydsl (8)
      • Cloud (3)
      • Spring (6)
        • spring boot (5)
        • 소셜로그인 (1)
      • Docker (2)
      • DevOps (0)
      • Coding Test (114)
        • Programmers (37)
        • Baekjoon (76)
      • KB It's Your Life 6기 (1)
      • CS (18)
        • 알고리즘 (13)
        • 컴퓨터 구조 (1)
        • Operating System (0)
        • Network (0)
        • Database (4)
      • git (1)
      • Language (15)
        • Java (5)
        • C++ (6)
        • Python (4)
    • GITHUB GITHUB
    • INSTAGRAM INSTAGRAM
  • hELLO· Designed By정상우.v4.10.3
예롱메롱
[Spring Boot/Kafka/Stomp] 실시간 채팅 구현 - 6. 채팅방 생성
상단으로

티스토리툴바