본문 바로가기

나만무

나만무 : Sleighers 프로젝트 소개 및 정리

728x90

 

 

  프로젝트 소개

한 게임에 최대 5인이 참여할 수 있는 레이싱 게임

직접 제작한 설산 맵에서 썰매 라이딩을 즐길 수 있습니다

 

작업 인원 : 서버 2인, 클라이언트 3인

서버 : Node.js (TCP, WebSocket)     서버 개발을 맡았습니다

클라이언트 : Unity

빌드&배포 : GitHub Actions, AWS Codedeploy, EC2 등

아키텍처

 

아래 파일을 통해 플레이 가능합니다! 구글 로그인을 추천드립니다.

Sleighers.exe
0.64MB

 

 

 

  프로젝트 정리

  서버 설계

인게임/아웃게임으로 나누어 서버를 설계했습니다.

인게임 서버는 보다 속도가 중요하기 때문에 TCP 프로토콜을 사용해 구축했으며,

아웃게임 서버는 event 기반으로 간단히 구축하기 위해 WebSocket을 사용했습니다.

 

 

  구현 기능 - OutGame 서버

  • 로그인 / 회원가입
    • DB는 AWS RDS의 MySQL을 사용했습니다.
    • 일반적인 로그인, Google OAuth. 두 가지 방법을 구현했습니다.
  • 닉네임 설정
  • 매치메이킹
    • 1~5인까지 하나의 게임에 참여할 수 있습니다.
    • 5인이 매칭되면 즉시 게임이 시작됩니다.
    • 5인 미만일 경우, 매칭 시작 후, 일정 시간이 지나면 매칭에 참여한 인원만으로 게임이 시작됩니다.

 

  구현 기능 - InGame 서버

  • 플레이어 Position broadcast
  • Game State, Event 관리
  • 최종 Ranking 판단 및 관리
    • semaphore를 이용해 여러 플레이어가 Goal에 접근한 경우의 동시성 문제를 해결했습니다.

 

  CD 자동화

  • AWS EC2에 배포
  • GitHub Actions + AWS Codedeploy를 이용해 자동화를 구축했습니다.
  • 자동화 구축 과정

 

 

  회고

아직 리드미를 못 써서 깃허브에 볼 게 없겠지만..

서버쪽 깃헙만 남겨봅니다...

뭔가 더 잘 정리하고 싶은데ㅜㅜ 어렵네요...

 

GitHub - SnowRail/Server-node.js: Sleighers Server

Sleighers Server. Contribute to SnowRail/Server-node.js development by creating an account on GitHub.

github.com

 

 

가장 기억에 남았던 작업은 서버 배포 자동화 구축입니다...

하나의 repository에서 두 ec2로 배포하는 과정은 예시를 찾지 못해 시간이 좀 걸렸습니다.

아이디어를 발휘해서 해결했던 문제라 강렬한 기억으로 남아 있습니다 ㅋㅋ

 

서버쪽 기능들은 클라이언트쪽 요청에 따라 만들고, 지우고를 엄청 반복했습니다. 지금은 클라쪽 시스템도 정립되어서 서버쪽 기능들도 구조가 간단해졌습니다.

 

서버 기능 구현했던 것 중 기억에 남았던 이슈는 MySQL 쿼리 사용중 비동기 이슈입니다.

쿼리문 작성 후, 유저 리스트를 받아오는데 비어있는 리스트가 반환되는 상황이었습니다.

connection.query()는 다른 js 코드들과 비동기적으로 실행되어 쿼리 실행이 끝나기 전에 함수의 return이 실행되었던 문제였고, Promise 객체를 사용해 동기적으로 리스트를 반환받아 사용하도록 해결했습니다.

 

개인적으로 GitHub를 단순 백업용이 아니라 제대로 활용했던 경험은 처음이라 Git에 대해서도 많이 배웠던 시간이었습니다.

아쉬운 점도 많지만, 조금씩 더 수정&개발할 예정이고, 한 달 동안 노력했던 결과를 내보일 수 있게 되어 기쁩니다..!