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)
'멋사 부트캠프' 카테고리의 다른 글
[Project - Howru] (1) 프로젝트 기획 (2) | 2025.08.03 |
---|---|
[멋사 부트캠프] 프로젝트 시작 (1) | 2025.07.09 |
[멋사 부트캠프] Day10 - ThreadLocal (0) | 2025.06.30 |
[멋사 부트캠프] Day09 - 예외처리 및 로그분석(ELK) (0) | 2025.06.28 |
[멋사 부트캠프] Day08 - OAuth2 소셜 로그인 (0) | 2025.06.27 |