실시간 AI 게임 채팅 플랫폼을 구축하며 마주한 아키텍처 설계 고민들
DungeonTalk은 AI와 함께하는 실시간 던전 게임 채팅 플랫폼입니다. 사용자들이 AI GM과 함께 텍스트 기반 RPG를 즐길 수 있는 멀티플레이어 환경을 제공합니다.
초기에는 단일 데이터베이스로 시작하려 했지만, 각 도메인의 데이터 특성을 분석하며 다른 결론에 도달했습니다.
사용자/인증 데이터 (PostgreSQL)
└─ 강한 일관성, 트랜잭션 보장, 정규화
채팅 메시지 (MongoDB)
└─ 대량 읽기/쓰기, 스키마 유연성, 로그 성격
세션/캐시 (Redis)
└─ 실시간 상태 관리, Pub/Sub, 휘발성
Spring Boot 3.4 + Java 21을 선택한 이유:
@Entity
public class Member extends BaseEntity {
@Id private String id;
@Column(unique = true) private String username;
}
선택 이유: 사용자, 인증 데이터는 ACID 트랜잭션이 중요
@Document(collection = "ai_game_messages")
public class AiGameMessage {
@Id private String id;
private String roomId;
private String content;
@Indexed private Integer messageOrder;
}
선택 이유: 채팅 메시지는 스키마 유연성과 대량 처리가 우선
이중 Redis 구성을 통한 역할 분리:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig {
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/sub");
registry.setApplicationDestinationPrefixes("/pub");
}
}
핵심 설계 원칙:
Client → WebSocket STOMP → Spring Boot → MongoDB (저장)
↓
Redis Pub/Sub → All Connected Clients
이중 인증 구조:
1. REST API: JWT Filter Chain
2. WebSocket: Handshake Interceptor
src/main/java/org/com/dungeontalk/domain/
├── aichat/ - AI 채팅 게임 (내가 담당)
├── matching/ - 게임 매칭 시스템 (내가 담당)
├── room/ - 통합 룸 관리 (내가 담당)
├── chat/ - 일반 채팅
├── auth/ - 인증/인가
└── member/ - 사용자 관리
설계 패턴 적용:
RoomServiceFactory, MatchingRoomFactoryAiGameRoomServiceAdapter, ChatRoomServiceAdapter.env 파일로 민감 정보 분리다음 편에서는 AI 채팅 시스템의 구체적인 구현을 다룰 예정입니다:
시리즈 목차
1. 멀티 데이터베이스 아키텍처 설계 ← 현재
2. AI 채팅 시스템 구현 (aichat)
3. 실시간 매칭 시스템 구현 (matching)
4. 통합 룸 시스템 구현 (room)
5. 개발 회고 & 성능 최적화