<aside> 💡
치킨스톡게임은 4명의 플레이어가 8분 동안 가상의 주식 시장에서 거래하며 최고 수익률을 달성하는 실시간 경쟁 게임입니다. 단순한 주식 거래뿐만 아니라 정보 카드 시스템과 플레이어 간 심리전이 핵심 요소입니다.
게임 종료 시 총 자산 가치(현금 + 보유 주식 가치)가 가장 높은 플레이어가 승리
1단계: 게임 준비
2단계: 게임 시작 (15분간 진행)
3단계: 게임 종료
핵심 시스템
주식 거래 시스템
정보카드 시스템
정보카드 유형
긍정적 뉴스 카드: 특정 종목/섹터의 상승 요인
부정적 뉴스 카드: 특정 종목/섹터의 하락 요인
가짜 뉴스 카드: 실제로는 영향이 없는 허위 정보
섹터 정보 카드: 특정 업종 전체에 영향을 주는 정보
정보 활용 방법
채팅 시스템
정보카드 활용 팁
문제 상황 :
executeTrade
)를 호출하면 플레이어의 current_cash
만 변경됨trade
테이블과 holding
테이블에는 새로운 데이터가 생성되지 않음원인 : TypeORM 트랜잭션 전략 잘못 사용함
// 문제 코드
await AppDataSource.transaction(async (manager) => {
const player = await manager.findOne(PlayerEntity, {...});
// Repository 인스턴스를 직접 사용
await this.tradeRepository.create({...}); // 별도 트랜잭션
await this.holdingRepository.incrementQuantity(...); // 별도 트랜잭션
await this.playerRepository.updateCash(...); // 별도 트랜잭션
});
manager
는 하나의 트랜잭션을 관리하지만, Repository 메서드들은 각각 새로운 트랜잭션을 생성하기 때문에, 원자성 깨짐해결 : Repository 대신 manager
를 직접 사용:
await AppDataSource.transaction(async (manager) => {
// 모든 데이터베이스 작업을 manager로 실행
const trade = manager.create(TradeEntity, {...});
await manager.save(trade);
await manager.update(PlayerEntity, {id: playerId}, {...});
await manager.save(holdingEntity);
});