이번 주에는 게임 서버와 API 서버에서의 중복 실행 방지, 업적 저장 및 구독 처리 개선에 집중했다.
게임 종료 시 중복 실행 문제 해결
endGame 메서드의 중복 실행을 방지했다. isGameEnding 변수를 사용하지 않고 Redis를 활용하여 더 안정적인 중복 방지 시스템을 구축했다. 게임 결과 및 업적 저장 시 중복 방지
exists 메서드를 활용하여 중복 저장을 방지했다. Pub/Sub 구독 중복 문제 해결
GameResultsSubscriber에서 여러 번 구독되는 문제를 해결했다. 업적 시스템 개선
AchievementsService와 UserAchievementsRepository를 활용하여 업적 데이터를 저장하는 방식을 최적화했다. 이번 주는 Redis를 활용한 동시성 제어와 중복 방지에 대해 깊이 있게 고민한 한 주였다.
isGameEnding 변수를 사용하여 중복 실행을 방지하려 했지만, Redis Lock을 적용하면서 더 안정적인 방법을 찾게 되어 만족스러웠다. UserAchievementsRepository에서 유저와 업적 데이터를 찾지 못하는 오류가 발생했을 때, 로그인 여부와 데이터의 유효성을 점검해야 한다는 점을 다시 확인하게 되었다. Redis를 활용한 중복 실행 방지 기법
NX 옵션을 사용하지 않고도 exists와 set을 활용하여 중복 실행을 방지할 수 있다. del을 통해 실행이 끝난 후 Lock을 해제하는 것이 중요하다. 게임 결과와 업적 저장 시 중복 방지 로직의 필요성
exists를 활용한 검증이 필수적이다. NestJS에서 의존성 관리 및 예외 처리의 중요성
AchievementsService와 UserAchievementsRepository의 의존성을 명확하게 설정해야 오류를 방지할 수 있다. NotFoundException을 활용하여 디버깅이 쉽도록 예외 메시지를 명확히 출력해야 한다. 구독 시스템의 올바른 설계 방식
GameResultsSubscriber에서 중복 구독을 방지하는 방법을 적용했다. 이번 주에 배운 내용을 바탕으로 다음과 같은 개선을 계획하고 있다.
Redis Lock을 활용한 더 정교한 동시성 제어
데이터 저장 로직 최적화
게임 결과 및 업적 시스템의 확장
구독 시스템 개선 및 모니터링 도입
이번 주는 동시성 문제 해결과 데이터 정합성을 유지하는 데 많은 고민을 했던 한 주였다. 앞으로는 현재 적용한 로직을 더 최적화하고 확장하는 방향으로 개선해 나갈 것이다.