TIL (Today I Learned) - 2025.03.10
1. GameResultsSubscriber에서 승리/패배한 유저의 점수 및 돈 업데이트
gameResults 채널을 구독하여 게임 결과를 수신한 후, 승리한 유저와 패배한 유저를 구분하여 점수(score)와 돈(money)을 업데이트.
- 승리한 유저:
money +1000, score +100
- 패배한 유저:
score -100 (돈은 변동 없음)
updateUserStats 함수를 활용하여 QueryBuilder로 한 번의 SQL 쿼리로 여러 유저의 데이터를 업데이트하도록 최적화.
2. GameResultsSubscriber에서 시민 팀(비마피아) 승리 시 보상 대상 명확화
- 기존 코드에서는 마피아가 이기면 마피아만 보상을 받고, 마피아가 지면 마피아를 제외한 모든 플레이어가 보상을 받는 구조.
- 이를 개선하여 시민 팀(의사, 경찰, 일반 시민)만 보상을 받을 수 있도록 로직을 수정.
winningPlayers 필터를 개선하여 승리 팀이 mafia면 마피아만 보상을 받고, citizens면 시민, 의사, 경찰만 보상을 받도록 변경.
3. GameResultsModule에서 UsersRepository를 사용하기 위한 설정 추가
GameResultsSubscriber에서 @InjectRepository(User)를 사용할 수 있도록 GameResultsModule에 UsersModule을 imports에 추가.
TypeOrmModule.forFeature([User])을 포함하여 UsersRepository를 사용할 수 있도록 수정.
4. 기존 코드 유지하면서 기능 확장
- 기존
endGame 및 GameResultsSubscriber의 핵심 기능은 유지하면서 중복 실행 방지, 보상 로직, 유저 테이블 연동 등의 기능을 확장.
updateUserStats를 활용하여 여러 유저의 데이터를 동시에 업데이트하여 성능을 개선.
Redis Pub/Sub을 활용한 비동기 처리 로직을 유지하면서 안정성을 강화.