오늘은 분산 서버 환경에서 게임 업적을 저장하고 관리하는 시스템을 구축했다.
기존 게임 결과 저장 방식과 달리, 업적 데이터는 개별 플레이어별로 저장되어야 하며,
게임 서버 → Redis → API 서버 → RDS 순서로 데이터가 전달되는 구조를 갖는다.
게임 종료 시 게임 서버에서 업적 데이터 생성
endGame 로직에서 플레이어별 능력 사용 기록, 킬 수, 생존 여부를 포함한 데이터를 수집gameAchievements:{gameId} 키에 저장 후, gameAchievements 채널로 Pub/Sub 전송API 서버에서 Redis Pub/Sub을 통해 업적 데이터 구독
GameResultsSubscriber에서 gameAchievements 채널을 구독하여 메시지를 수신GameAchievementsService.saveGameAchievements() 호출API 서버에서 데이터 변환 후 RDS에 저장
GameAchievementsService에서 데이터를 변환하여 개별 플레이어별 레코드로 저장isNaN() 체크를 추가하고 기본값을 설정데이터 구조 정리
gameAchievements는 JSON 형식으로 한 번에 저장되었으나, 개별 플레이어 단위로 변환하여 RDS에 저장하도록 변경GameAchievement 엔티티를 업데이트하여 role, kills, abilitiesUsed, survived 필드를 포함하도록 수정데이터 변환 시 오류 방지
isNaN() 체크를 추가하여 kills와 abilitiesUsed 값이 NaN이 되는 문제 해결stats가 undefined일 경우 경고 메시지를 출력하고 무시하도록 처리Redis 중복 저장 방지
분산 서버 환경에서 데이터 흐름을 설계하는 방법
TypeORM과 TypeScript를 활용한 안전한 데이터 처리
isNaN() 체크와 기본값 설정을 통해 잘못된 데이터가 저장되지 않도록 방어 코드를 추가하는 것이 중요하다.Object.entries().map()을 사용할 때 불필요한 데이터(null 등)를 제거하는 방법을 다시 정리했다.NestJS에서 순환 의존성 문제 해결
GameResultsModule과 GameAchievementsModule이 서로 참조하는 문제를 해결하기 위해 forwardRef()를 사용했다.@Inject(forwardRef(() => ServiceName))을 통해 서비스 간의 의존성을 해결하는 방법을 다시 학습했다.