2025년 2월 4주차

김동환·2025년 2월 28일

Week In Learning (WIL)

이번 주에는 마피아 게임 프로젝트에서 여러 가지 중요한 기능을 개발하면서 WebSocket 기반의 실시간 게임 진행을 개선했다. 주요 작업과 느낀 점, 배운 점을 정리하고, 앞으로의 방향성을 정리해보았다.


1. FACTS (사실, 객관)

이번 주 동안 진행한 작업은 다음과 같다.

  • WebSocket 기반 마피아 게임 게이트웨이 개발

    • RoomGateway를 통해 클라이언트의 이벤트를 수신하고, GameService와 연결하여 게임 로직을 처리하도록 구현
    • 마피아, 경찰, 의사 등 각 역할의 밤 행동을 WebSocket 이벤트로 처리하고, 행동이 완료되면 자동으로 밤 결과를 처리하는 로직 추가
    • 경찰 조사 결과를 요청하는 기능을 구현하여 클라이언트가 결과를 받을 수 있도록 함
    • 게임 종료 이벤트를 추가하여, 조건이 충족되면 게임이 자동으로 종료되도록 설정
  • 게임 서버와 인증 서버 연동

    • JWT 기반 인증이 완료된 상태에서, 별도의 프로젝트(로그인, 회원가입, 게시판)와 게임 서버를 연동하기 위한 초기 작업 수행
    • 게임 서버가 JWT를 검증하고, 유저 정보를 가져올 수 있도록 구조 설계
  • Redis를 활용한 상태 관리 개선

    • 게임의 상태를 관리하기 위해 Redis를 사용하고 있으며, 상태 저장 및 조회 로직을 최적화
    • 밤 행동 완료 여부를 Redis에 저장하고, 빠르게 확인할 수 있도록 개선
  • AWS ECS 기반 서버 배포 준비

    • 게임 서버를 여러 개의 Docker 컨테이너로 실행하고, AWS ECS를 활용하여 배포할 계획을 구체화
    • Application Load Balancer(ALB)를 활용하여 클라이언트 요청을 적절한 게임 서버로 분배하는 구조 설계

2. FEELINGS (느낌, 주관)

이번 주 작업을 하면서 느낀 점은 다음과 같다.

  • WebSocket 기반 실시간 처리를 구현하면서, 동기화 문제와 상태 관리의 중요성을 다시 한번 실감했다. 클라이언트 간의 이벤트 순서가 엇갈릴 수 있는 상황을 고려하여 로직을 설계하는 것이 중요하다는 것을 깨달았다.
  • JWT 인증과 게임 서버 연동을 진행하면서, 인증과 인가의 개념을 다시 한번 정리할 수 있었다. 특히, 여러 개의 서버가 연동될 때, 인증 정보를 어떻게 전달하고 검증할지 고민하는 과정이 흥미로웠다.
  • Redis를 활용한 상태 관리가 예상보다 효율적이었고, 이를 통해 성능을 개선할 수 있었다. 다만, Redis에 저장된 데이터를 정확하게 관리하지 않으면 상태가 꼬일 위험이 있다는 점도 경험했다.
  • AWS ECS와 ALB를 활용한 배포 설계를 진행하면서, 마이크로서비스 아키텍처에 대한 이해가 더욱 깊어졌다. 게임 서버를 여러 개 띄울 때, 로드 밸런싱을 어떻게 해야 할지 고민하는 과정이 재미있었다.

3. FINDINGS (배운 것)

이번 주 작업을 통해 배운 점은 다음과 같다.

  • WebSocket 이벤트 설계의 중요성

    • 이벤트가 발생하는 순서를 고려하여 클라이언트와 서버 간의 동기화를 맞추는 것이 핵심이다.
    • 특정 이벤트가 완료되었을 때, 후속 이벤트를 자동으로 트리거하는 방식이 효과적이라는 것을 경험했다.
  • 상태 관리와 데이터 일관성 유지

    • Redis를 활용하여 빠르게 상태를 조회할 수 있지만, 데이터가 꼬이지 않도록 주기적인 검증이 필요하다.
    • checkAllNightActionsCompleted 같은 함수를 활용하여 상태를 지속적으로 체크하는 것이 중요하다.
  • 마이크로서비스 환경에서 인증 처리

    • JWT 기반 인증을 게임 서버와 다른 서비스와 연동하는 과정에서, 토큰을 어떤 방식으로 검증하고 전달할지 고민하는 과정이 필요했다.
    • 서버 간 통신을 최소화하면서도 보안을 유지하는 방안을 고려해야 한다.
  • AWS ECS와 ALB를 활용한 서버 확장

    • 여러 개의 게임 서버를 운영하려면, 클라이언트의 연결을 적절히 분배하는 것이 중요하다.
    • 한 개의 서버가 과부하가 걸리지 않도록, 로드 밸런서를 활용하여 트래픽을 분산하는 것이 필수적이다.

4. FUTURE (미래)

이번 주 배운 것을 바탕으로 앞으로 다음과 같은 방향으로 개선해 나갈 계획이다.

  • WebSocket 이벤트 처리 개선

    • 현재는 기본적인 이벤트 처리가 가능하지만, 클라이언트가 연결이 끊겼을 때의 복구 로직을 추가할 필요가 있다.
    • 이벤트 로깅 및 디버깅 기능을 추가하여, 실시간 문제를 쉽게 파악할 수 있도록 할 계획이다.
  • Redis 기반 상태 관리 고도화

    • 현재는 단순한 키-값 저장 방식을 사용하고 있지만, 게임의 전체 상태를 보다 효율적으로 관리할 수 있도록 개선할 예정이다.
    • TTL을 활용하여 불필요한 데이터가 Redis에 남아 있지 않도록 자동 정리하는 기능을 추가할 계획이다.
  • 마이크로서비스 환경에서 인증 방식 개선

    • 게임 서버가 인증 정보를 보다 효율적으로 활용할 수 있도록, JWT 검증 로직을 최적화할 계획이다.
    • 인증 서버와의 연동을 더욱 원활하게 하기 위해, 게임 서버가 필요한 최소한의 유저 정보만을 캐싱하는 방안을 고려할 것이다.
  • AWS ECS 배포 자동화

    • 현재는 수동으로 ECS 배포를 준비하고 있지만, CI/CD 파이프라인을 구축하여 자동 배포가 가능하도록 개선할 계획이다.
    • 서버 확장을 자동화하기 위해 오토스케일링 정책을 추가할 예정이다.

결론

이번 주에는 WebSocket을 활용한 실시간 게임 진행 로직을 개발하고, 인증 및 상태 관리, 배포 설계까지 다양한 작업을 수행했다. 여러 가지 기술적인 문제를 해결하면서 WebSocket 기반 게임 서버의 구조와 마이크로서비스 환경에서의 인증 및 상태 관리에 대한 이해를 더욱 깊이 할 수 있었다. 앞으로는 보다 안정적이고 확장 가능한 구조로 개선해 나갈 예정이다.

profile
Node.js 7기

0개의 댓글