-
[TIL] 타워 디펜스 팀 프로젝트 진행 (D-2)TIL-sparta 2024. 6. 19. 22:07
학습 키워드: Redis, Node.js, express, socket.io
1. 완료한 과제 진행 사항
요약) 보물 고블린 출현 기능 구현 완료:
https://github.com/eliotjang/tower-defense-game-project/pull/39
클라이언트에서 타이머를 돌리면서 보물 고블린 소환 이벤트 요청을 서버로 보내고, 서버에서는 요청 시각이 유저의 게임 데이터에 유지되고 있는 이전 고블린 소환의 min interval 보다 빠른지를 확인하는 방식으로 검증하여 소환 이벤트가 성공/실패 여부를 다시 클라이언트로 전송하도록 설정했다. 성공 시 클라이언트에서는 gameStart 에서 클라이언트에 넘겨받은 고블린 소환 min/max interval 사이의 무작위 시간에 한 번씩 현재 스테이지 레벨과 같은 레벨의 고블린 몬스터가 출현(프로젝트 초반에 만들어둔 monsterPool이 이를 가능하게 함)하도록 설정했다. 한 가지 문제라면 브라우저 윈도우가 focus 상태가 아닐 때 스크립트가 비활성화 되는 것 때문에 다른 작업을 하다가 돌아오면 게임 클라이언트가 이상하게 동작하는 문제가 있는데, 일단 이 케이스는 웹 브라우저 기반 게임의 한계라고 생각해서 고려하지 않기로 했다.
2. 과제 진행 간 문제점
Redis 함수들의 Concurrency 문제:
https://github.com/eliotjang/tower-defense-game-project/pull/32
게임 시작 시 무료 타워 배치 작업이 게임 데이터 생성 실행과 겹치는 문제와, 무료 타워를 여러 개 배치할 때 유저의 게임 데이터 내 towers 배열을 다수의 async 함수가 동시에 수정하게 되어 정보에 불일치가 생기는 concurrency 문제가 발생했다. 새벽에 수정하다가 넘어가고 오늘 오전에 다음과 같은 방법들을 이용하여 문제를 해결했다.
- createGameData에서 redisClient.watch와 multi()를 통한 transaction을 적용하여 create가 진행되는 동안 patch가 진행되지 않도록 설정했다.
- tower 목록을 유저의 game 데이터에서 분리하여 유저 정보를 포함하는 별도의 prefix 뒤에 index를 붙여 개별 항목으로 추가되고 불러올 수 있도록 변경했다.
--
REFERENCES:> 팀 프로젝트 repo
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 타워 디펜스 팀 프로젝트 종료 (D-Day) (0) 2024.06.21 강의 과제) 응용 계층, DNS, HTTP (2) 2024.06.20 [TIL] 타워 디펜스 팀 프로젝트 진행 (D-3) (0) 2024.06.19 [TIL] 타워 디펜스 팀 프로젝트 발제 (D-4) (0) 2024.06.17 강의 과제) 전송 계층, TCP, UDP, TCP 오류, 흐름 제어, 혼잡 제어 (2) 2024.06.16