멋사 부트캠프

[Project - Howru] (2) ChatRoom Domain 구현

sagecode 2025. 8. 11. 00:16

ChatRoom 도메인 구현


채팅이 일어날 수 있는 공간(=채팅방)이 필요하다.
그래서 이번 포스트에서는 채팅방 생성 및 관리 도메인인 "ChatRoom" 을 먼저 설계하고 구현해보자.

 

1. ChatRoom 도메인 요구사항

채팅방 생성

  • 유저 A가 유저 B에게 채팅 요청을 보낼 수 있다. 요청을 보낸경우 채팅방이 DB에 생성된다.
  • 채팅방은 항상 "1:1" 구조다 (추후 그룹채팅방으로 확장 가능하도록 Enum으로 구분)
  • B가 수락해야 채팅방이 활성화된다
  • WebSocket 연결용으로 "UUID 기반 방 식별자"가 필요하다
  • 사용자가 방과 연결 해제하면 해당 사용자의 ChatRoomMember 레코드를 삭제한다

채팅메시지 저장

  • 영속/캐시 이중화 전략을 사용하여, 채팅 메시지를 Redis에 최대 30개 저장(추후에 TTL 설정으로 시간 전략 사용 가능)
  • Redis에 사용자가 웹소켓에 접속할 때마다 접속중 상태를 확인하는 상태를 저장한다.
  • 웹소켓에 접속하지 않은 경우 sse알림과 안읽은 메시지로 카운트한다.
  • 비동기로 mongoDB에 메시지를 영구 보관한다.

2. Entity 설계

ChatRoom은 채팅방의 상태와 고유id를 가진 엔티티이다.

- `sender`: 요청을 보낸 사용자
- `receiver`: 요청을 받은 사용자
- `status`: 채팅방 상태 (PENDING, ACCEPTED, REJECTED)
- `uuid`: 외부에서 방을 식별하기 위한 고유 문자열
- `BaseTime`: 생성일자, 수정일자 자동 추적

 

ChatRoomMember는 특정 채팅방에 속한 개별 사용자의 상태와 참여 시각을 관리하는 엔티티다.

  • chatRoom : 소속 채팅방 (ChatRoom 엔티티와 다대일 관계)
  • member : 채팅방에 참여하는 사용자 (Member 엔티티와 다대일 관계)
  • status : 채팅방 내 사용자의 상태 (PENDING, JOINED, REJECTED)
  • joinedAt : 사용자가 채팅방에 참여한 시각 (수락 시 기록)
  • id : 고유 식별자(PK)

 

ChatMessageDocument는 MongoDB에 저장되는 개별 채팅 메시지 문서이다.

  • id : MongoDB ObjectId (문자열 형태)
  • chatRoomUuid : 메시지가 속한 채팅방의 UUID
  • sender : 메시지를 보낸 사용자 ID (문자열)
  • content : 메시지 내용
  • messageTime : 메시지 전송 시각 (Instant, UTC)
  • chatMessageStatus : 메시지 상태 (UNREAD, READ)