strong-win / stock-craft

Web game project, casually learning stock trading
8 stars 0 forks source link

[스프린트 #4] define ML <-> Server protocol (JSON schema) #26

Closed hojunee closed 2 years ago

hojunee commented 2 years ago

기능 Issue

Contents

본 스프린트는 ML서버와 App서버 간의 통신을 위해서 JSON spec 결정 및 더미데이터를 바탕으로 한 구현을 진행합니다.

핵심 작업사항

  1. JSON spec을 정의합니다.
  2. dev 서버의 MongoDB에 더미데이터를 바탕으로 저장하는 prototype을 생성합니다.

진행사항 체크리스트

  1. 핵심 작업사항에 대한 Git Issue 생성 후 첫 PR 게시 (-> #STRW-31)

    • Code 변경점은 아니기때문에 PR은 생성하지 않았습니다.
    • [x] @beeetea
  2. Issue에 상황별 JSON spec을 정의합니다.

    • [x] @beeetea
  3. JSON spec를 리뷰받습니다.

    • [x] @rxdcxdrnine
  4. MongoDB에 더미데이터를 바탕으로 interaction을 구현합니다.

    • [x] @beeetea
  5. 핵심 작업사항 마무리

    • [x] @beeetea

ML Server ↔ App Server Interaction

언제 데이터가 주고받아져야하는가?

(주말 → ) (아침 → 점심 → 저녁 → 밤) * 5

위에꺼 그림으로 그려서 넣자.

Usecase 정리

다음 tick의 가격이 온다 → 가격을 가공해서 front에 전달

주말에 아이템을 사용한다 → 사용한 형태를 ML서버에 전달해서 이를 반영한다.


밤/주말 -> 새벽

Server → ML

// JSON spec example for payload of req -> ML Server
{
    "game_id": "X13B6F"
    "event": {
        "00504":  2000 // 직접적 변동이 2천원
            ...
    }
}

새벽 -> 아침

ML → Server

// JSON spec example for renewal of price
{
    "game_id": "X13B6F"
    "stock": {
            "00504": {
                "previous_price": 57400,
                "current_price": [58600, 58000, 57000],
                                "info": 1
            },
            ...
        }
    ],
}

Proposal : Item Code


Question:

각 상황에 맞게 오는 field, 즉 필요한 필드가 다른 상황

주말→아침 state를 구분해야하는가?

TO-DO:

매수세/매도세 반영

관련 링크

rxdcxdrnine commented 2 years ago

아이템 사용

매주 주말 혹은 매일 밤마다 아이템 사용을 위한 요청

게임 시작 → 주말 → 새벽 → 아침 → 점심 → 저녁 → → 새벽 → 아침 → ...

request requirements

각 Client 가 새벽 이전의 에 item 을 사용하며, 사용 시 gameId, time, item 을 payload 에 담아 요청 시 App Server 에서 client 마다 item 을 DB 에 저장

request body

{
  "gameId": "ABC123",
  "playerId": "universally-unique-identifier-123"
  "week": 0,
  "day": 1,
  "item": {
    "id": "1034",
    "type": "player",
    "target": "universally-unique-identifier-456"
  } 
}

주가 생성 요청

게임 시작 후 첫 주말 이후 매일 새벽 시작에 다음 날의 아침/점심/저녁의 주가 생성을 위한 요청 게임 시작 → 주말 → 새벽 → 아침 → 점심 → 저녁 → 밤 → 새벽 → 아침 → ...

Web Client ←→ App Server

request requirements

새벽 시작 에 host (방장) 가 time request 을 보내면, DB 에 접근하여 해당 gameId 와 time 으로 새벽 이전의 각 client 가 에 사용한 item list 를 fetch

host 는 이전의 time request 와 마찬가지로 gameId 와 time 만 payload 에 담아 요청

request body

{
  "gameId": "ABC123",
  "week": 1,
  "day": 1
}

App Server ←→ ML Server

request requirements

ML 서버에서 요청된 time 에 해당하는 current price 를 생성하기 위해, DB 에 접근하여 해당 time 이전의 previous price 를 fetch 필요

마찬가지로 DB 에 접근하여 현재 time 에 직전 일자의 trade 를 fetch 하여, 직전 일자의 trading volume 을 합산 필요

host 가 요청 시 payload 에 담긴 gameId 와 time 을 바탕으로 DB 에 접근하여 item list 를 fetch 하고 App Server 의 아이템 처리 로직을 수행 item list 를 ML Server 에서 주가 생성 시 사용할 items 와 events 배열로 mapping

→ 요청해야시 필요한 데이터는 gameId, time 외에 items 와 events 뿐이며, previous price 와 trading volume 은 ML 서버에서 DB 로 fetch 하여 사용 (App Server 와 ML Server 간 payload 를 줄이기 위한 목적)

** items 도 DB 에서 fetch 할 수 있는데, 왜 previous price 와 trading volume 만 DB 에서 fetch 하고 items 는 App Server 로부터 요청 시 payload 로 받는지? → items 는 App Server 내의 아이템 처리 로직을 실행해야하기 때문

request body

{
  "gameId" : "X13B6F",
  "week": 1,
  "day": 1,
  "items": ["1034"],
  "events": {
    "00504": 2000
    }
}

response requirements

gameId 와 time 을 바탕으로 DB 에 접근하여, 이전 날짜에 생성된 주가와 현재 날짜에 생성된 주가를 비교하여 기관에게 정보로 제공할 예정

response body

{
  "gameId": "ABC123",
  "week": 1,
  "day": 1
}

주가 가져오기

게임 시작 후 첫 주말 이후 매일 아침 시작에 다음 날의 아침/점심/저녁의 주가 생성을 위한 요청 게임 시작 → 주말 → 새벽 → 아침 → 점심 → 저녁 → 밤 → 새벽 → 아침 → ...

request requirements

host 는 이전의 time request 와 마찬가지로 gameId 와 time 만 payload 에 담아 요청

request body

{
  "gameId": "ABC123",
  "week": 1,
  "day": 1
}

response requirements

해당 일자의 stock 데이터 응답 필요

response body

{
  "00504": [100, 200, 300],
  "05930": [300, 200, 100],
  "05380": [100, 200, 300],
}
hojunee commented 2 years ago

조금 더 구체화된 부분이 있어 좋네요. :) 위 내용을 보면서 정리한 질문 보내드립니다:

아이템 사용

주가 생성 요청 & 주가 가져오기

주가 가져오기

rxdcxdrnine commented 2 years ago

조금 더 구체화된 부분이 있어 좋네요. :) 위 내용을 보면서 정리한 질문 보내드립니다:

아이템 사용

* req body에 "누가" 썼는지는 표시 안해도 될까요? (emit 하는 과정에서 자동적으로 노출되는 부분인지?)

* item은 복합데이터야할 것 같아요. 현재와 같이 고유번호 뿐만 아니라 대상이 누구인지 등도 함께 올 필요가 있을 것 같습니다.

주가 생성 요청 & 주가 가져오기

* req body spec이 동일한데 이는 w1d1인지 아닌지로 구분하는건가요?

* res json에서 해당 정보를 반환하는 이유는 ACK로서의 의미인가요?

주가 가져오기

* res json에서 key는 여러개일 수 있는건가요? (복수임을 표시할 필요가 있을듯)

아이템 사용

주가 생성 요청 & 주가 가져오기

주가 가져오기

hojunee commented 2 years ago

주가 가져오기

ML -> Server

AS-IS

{
  "00504": [100, 200, 300],
  "05930": [300, 200, 100],
  ...
}

TO-BE

{
 "00504": {
  "info": 1,
  "price": [100, 200, 300]
 },
 ...
}
hojunee commented 2 years ago

Sprint IV가 마무리되었기에 이 Issue는 close합니다. :)