history 로직

2022-06-04

햇 ^__^

지금부터는 azure 랑 관련이 있는건 아니고, azure 에 구축한 클라이언트 앱 또는 api 서버를 수정을 어떻게 해 나가는지에 대한 기록이 될 것 같습니다.

따로 포트폴리오라는 category를 만들어야 될 것 같은데, 일단 azure 카테고리에서 포스팅을 하도록 하겠습니다.

매일 1분 단위로 데이러를 쌓고 있는데, 쌓은 데이터의 스키마 및 데이터는 아래와 같습니다.

select * from investing;
createTime current high low changePrice changeRate tradingVolume tradeTime score stock
2022-05-04 14:35:00 3350 3640 3310 -270 92.54 1190000 15:59:00 215 골드앤에스
2022-05-04 14:35:00 207500 208500 204000 3500 101.72 75490 15:44:04 981 삼성화재
2022-05-04 14:35:00 2565 2570 2550 -10 99.61 8310 15:30:27 215 유화증권
2022-05-04 14:35:00 8850 8920 8400 -30 99.66 424210 15:40:56 1075 디아이
2022-05-04 14:35:00 1470 1485 1455 0 100.0 724100 15:49:00 579 대신정보통신

여기서 제가 원하는 것은 score가 가장 높은 stock들 각각 몇분동안 유지를 했었고, 처음 금액과 끝날때의 금액을 알고자 합니다.

한마디로 시뮬레이션을 돈 것 같은 쿼리를 짜보고 싶은데, 쿼리로는 어떻게 짜야 될지 감이 오지 않습니다.

불가능 할것 같진 않는데, 그냥 시뮬레이션 테이블이라는걸 만들어 진행하도록 하겠습니다.

시나리오

제가 생각하는 시나리오는 아래와 같습니다.

  1. score 가 1075 이면, 인서트를 한다.
  2. 단 state 가 ing 인, stock 이 있으면 업데이트를 한다.
  3. 업데이트는 current 와 currentTime을 업데이트 한다.
  4. 인서트는 initCurrent, initTime, state: ing, stock 를 한다.
  5. 하나의 스탭이 종료되는 시점에 state : ing 이면서, currentTime 이 현재시간이 아닌 stock 은 state: end로 변환한다.

  6. 다음 스탭을 진행한다. 단 현재 시간이 되면 멈춘다.

이 시나리오를 구현해 보도록 하겠습니다.

구현

1 테이블 생성

먼저 simulation 이라는 테이블을 생성합니다.

create table SIMULATION (
    stock varchar(100),
    state varchar(3),
    initCurrent int(11),
    initTime timestamp,
    current int(11),
    currentTime timestamp
);

2 start api 를 만들기

url은 아래와 같이 만들도록 하겠습니다.

SimulationApi.start()

/simulation/start

3 investing 테이블에서 현제 데이터 가져오기

현제 데이터의 조건은 아래와 같다고 생각하겠습니다.

where
    score = 1075
and
    createTime = DATE_FORMAT({현재시간},'%Y-%m-%d %H:%i:00')

현재 시간은 처음 테스트 시에는 아래가 기준입니다.

select min(createTime)
from INVESTING

그 뒤 테스트 동안은 아래의 시간을 기준으로 사용 할 것입니다.

select max(createTime)
from SIMULATION

실제 운영시에는 당연히 현재시간이 기준이 됩니다.

now()

4 업데이트용 인서트용 나눠서 가져오기

가져올때, join 구문을 이용하여

SIMULATION 에서 state 가 ing 인 stcok 과 일치하는 데이터는 update 용

InvestingDao.getDataForUpdate()

stock in (select STOCK
from SIMULATION
where STATE = 'ing')

일치하지 않는 데이터 는 insert 용 으로 가져온다.

SIMULATIONDao.getDataForInsert()

stock not in (select STOCK
from SIMULATION
where STATE = 'ing')

5 인서트 진행

인서트용 데이터는 인서트

SimulationDao.getInsert()

insert into SIMULATION (
    stock,
    state,
    initCurrent,
    initTime
) values (
    #{stock},
    "ing",
    
)
    stock varchar(100),
    state = '',
    initCurrent int(11),
    initTime timestamp,
    current int(11),
    currentTime timestamp
);

6 업데이트 진행

업데이트 데이터는 업데이트

SimulationDao.getDataForInsert()

currentTime

7

results matching ""

    No results matching ""

    99 other / uml

    04 react / JSX