/backend-msa

컨테이너 기반 MSA로 구현한 부산 연합 IT 동아리 백엔드

Primary LanguageJava

PROJECT 모의투자 게임 💸

💡 The purpose of a project

동아리 페이지 활성화를 위한 모의투자 게임 프로젝트


Stack

Java : 11
SpringBoot : 2.6.3
Python : 3.9
Django : 3.2.7
JPA : 2.6.1
Redis : 6.2.6
Mysql : 5.7
Docker : 20.10.12
AWS EC2



Service Architecture

image



주요기능

Api Gateway


  • Architecture

image

가장 앞단에 위치한 Nginx 는 Reverse Proxy 역할로, 소켓 및 HTTP 요청을 로드밸런싱 해준다. 

proxy 서버로는 소켓 통신을 사용하는 Investment 서버와 ApiGateway 서버를 두었다.
하나의 엔드포인트로 API를 관리하기 위해서 Django 로 구현한 API Gateway를 적용했다.
Celery와 RabbitMQ 를 사용해 모든 Request를 비동기 처리한다.
  1. HTTP Request 를 올바른 서비스로 매핑한다.

  2. JWT 기반의 인증 방식을 사용하여 End-Point별 접근 권한을 설정한다.


Investment Service

  • ERD

image



  • Architecture

image

소켓 통신을 위한 서브 프로토콜로 STOMP를 사용했다. 
STOMP를 이용한 메시지 전달은 redis Publish/Subscribe 기능을 사용하여 구현 하였고, 채널별로 message를 구별하기위해 redis에서 ChannelTopic을 관리하였다.

전체 동작 흐름은 아래의 그림과 같다.

image


  • 게임 시나리오

  1. 방 생성
생성 요청은 HTTP 프로토콜을 사용해 요청을 하기 때문에 ApiGateway 를 거쳐서 Investment 서비스로 전달된다. 
Socket Message 전달을 위한 새로운 ChannelTopic이 생성된다.
이때 게임에 사용될 2~4개의 기업이 선택된다.
  1. 방 입장
방 입장 요청을 보낸 후, 조건을 만족한 User는 소켓 연결을 시도한다.
방에 입장하기 위한 조건으로 입장료를 설정하였다. 따라서 각 User의 보유 포인트를 확인하기 위하여 Profile Service의 API를 호출한다.
  1. 게임 준비
유저는 게임 준비, 취소 요청을 보낼 수있고, 해당 channel topic을 구독한 사용자 모두에게 이를 알려준다.
  1. 게임 시작
모든 유저가 게임 준비 상태일때 방장은 게임을 시작할 수 있다.
게임이 시작되면 1.에서 선택된 기업의 실제 5년치 주가 정보 중 랜덤으로 연속된 60일이 선택된다.

멀티 스레드를 사용해 서버에서 10초마다 1일치 주가 정보를 전송한다.
이때 클라이언트의 주가 동기화 문제 및 정보 위조 문제를 해결하기 위해서 서버에서 주가 정보를 10초에 한 번씩 publish 하는 방법을 선택했다.

유저는 실시간으로 매수, 매도 요청을 보낼 수 있고, 60일 간의 주가를 모두 전송받으면 게임이 종료되며, 수익률을 기반으로 참가자들의 순위를 확인할 수 있다.
방 입장에 사용된 포인트는 최종 순위에 따라 차등 부여된다.

Crawling Service

pykrx 라이브러리를 사용해 주가 정보 크롤링


Profile Service

유저 포인트 및 기타 정보


Board Service

게시판


Survey Service

동아리 지원