2025년 3월 1주차

김동환·2025년 3월 7일

Weekly I Learned (WIL) - 2025.03.07

1. FACTS (사실, 객관)

이번 주에는 게임 서버와 API 서버에서의 중복 실행 방지, 업적 저장 및 구독 처리 개선에 집중했다.

  • 게임 종료 시 중복 실행 문제 해결

    • Redis Lock을 사용하여 endGame 메서드의 중복 실행을 방지했다.
    • 기존 isGameEnding 변수를 사용하지 않고 Redis를 활용하여 더 안정적인 중복 방지 시스템을 구축했다.
  • 게임 결과 및 업적 저장 시 중복 방지

    • Redis의 exists 메서드를 활용하여 중복 저장을 방지했다.
    • 이미 저장된 데이터가 있는 경우 저장하지 않도록 로직을 추가했다.
  • Pub/Sub 구독 중복 문제 해결

    • GameResultsSubscriber에서 여러 번 구독되는 문제를 해결했다.
    • 기존 구독이 활성화된 경우 새로운 구독을 생성하지 않도록 변경했다.
  • 업적 시스템 개선

    • AchievementsServiceUserAchievementsRepository를 활용하여 업적 데이터를 저장하는 방식을 최적화했다.
    • 업적이 존재하지 않는 경우 더 명확한 예외 메시지를 출력하도록 수정했다.

2. FEELINGS (느낌, 주관)

이번 주는 Redis를 활용한 동시성 제어와 중복 방지에 대해 깊이 있게 고민한 한 주였다.

  • 처음에는 isGameEnding 변수를 사용하여 중복 실행을 방지하려 했지만, Redis Lock을 적용하면서 더 안정적인 방법을 찾게 되어 만족스러웠다.
  • 게임 결과와 업적이 중복 저장되는 문제를 해결하면서, 데이터 정합성을 유지하는 것이 얼마나 중요한지 다시 한 번 깨달았다.
  • NestJS에서 Redis Pub/Sub을 활용하는 과정에서 예상치 못한 구독 중복 문제가 발생했지만, 해결하고 나니 더 구조적으로 이해할 수 있게 되었다.
  • UserAchievementsRepository에서 유저와 업적 데이터를 찾지 못하는 오류가 발생했을 때, 로그인 여부와 데이터의 유효성을 점검해야 한다는 점을 다시 확인하게 되었다.

3. FINDINGS (배운 것)

  • Redis를 활용한 중복 실행 방지 기법

    • NX 옵션을 사용하지 않고도 existsset을 활용하여 중복 실행을 방지할 수 있다.
    • del을 통해 실행이 끝난 후 Lock을 해제하는 것이 중요하다.
  • 게임 결과와 업적 저장 시 중복 방지 로직의 필요성

    • Pub/Sub을 사용할 때 메시지가 중복으로 전송될 수 있기 때문에 exists를 활용한 검증이 필수적이다.
    • Redis에 저장된 데이터를 확인하고 존재하는 경우 새롭게 저장하지 않도록 해야 한다.
  • NestJS에서 의존성 관리 및 예외 처리의 중요성

    • AchievementsServiceUserAchievementsRepository의 의존성을 명확하게 설정해야 오류를 방지할 수 있다.
    • NotFoundException을 활용하여 디버깅이 쉽도록 예외 메시지를 명확히 출력해야 한다.
  • 구독 시스템의 올바른 설계 방식

    • GameResultsSubscriber에서 중복 구독을 방지하는 방법을 적용했다.
    • Redis에서 이미 존재하는 구독을 확인하고 새로운 구독을 생성하지 않는 것이 중요하다.

4. FUTURE (미래)

이번 주에 배운 내용을 바탕으로 다음과 같은 개선을 계획하고 있다.

  • Redis Lock을 활용한 더 정교한 동시성 제어

    • 게임 종료뿐만 아니라, 투표 처리나 능력 사용에도 Lock을 활용할 수 있을지 고민해볼 것이다.
  • 데이터 저장 로직 최적화

    • 업적 데이터를 저장할 때 Batch Insert 방식을 적용하여 성능을 높이는 방안을 검토할 것이다.
  • 게임 결과 및 업적 시스템의 확장

    • 업적이 실시간으로 반영될 수 있도록 WebSocket 이벤트와 연동하는 방법을 고려할 것이다.
  • 구독 시스템 개선 및 모니터링 도입

    • Redis Pub/Sub을 보다 효과적으로 관리할 수 있도록 모니터링 기능을 추가할 예정이다.
    • 중복 실행이나 구독 오류가 발생할 경우 자동으로 복구할 수 있는 로직을 추가할 계획이다.

이번 주는 동시성 문제 해결과 데이터 정합성을 유지하는 데 많은 고민을 했던 한 주였다. 앞으로는 현재 적용한 로직을 더 최적화하고 확장하는 방향으로 개선해 나갈 것이다.

profile
Node.js 7기

0개의 댓글