그래프에 표시하기 위한 데이터리스트 반환 API 구현하기.
이용자가 추이를 확인할 수 있게 선 그래프를 표현하기 위한 데이터 리스트를 반환해주는 API를 구현하면서 여러 고민이 들었다.
- 그래프는 누적 데이터를 보여준다.
- 하루, 주, 월, 년 단위로 데이터 추이를 보여준다.
- 각각 데이터는 (10분, 1시간, 8시간, 1일)의 간격을 가지며 화면에서 선 그래프에 마우스를 가져다 됬을 때 해당되는 데이터의 값을 보여준다.
그래프 표현 용 데이터에 대해 저장과 조회 두가지 관점에서 고민하였다.
- 저장의 관점에서, 그래프에 표시하기 위한 누적 데이터를 저장하며, 배치를 통해 매분 값을 저장한다.
- 조회의 관점에서, 누적 데이터가 매분 저장되어있기 때문에 별도의 계산은 필요하지 않으며, 데이터의 간격이 조건에 따라 10분, 1시간, 8시간, 1일이어야한다.
매 분마다 저장되어있는 테이블의 데이터에 대해서 특정 간격에 따라 데이터를 가져오기 위해 쿼리문에 조건을 추가하여 구현하였다. timestamp (type- datetime) 컬럼이 존재하며,
일(10분 간격) → 분 부분이 10으로 나누어 떨어지는 데이터들 주(1시간 간격) → 분 이 00인 데이터들 월(8시간 간격) → 분이 00이고 시간이 8로 나누어 떨어지는 데이터들 년(1일 간격) → 분, 시간이 00인 데이터들
로 쿼리문을 날려 구현하였다.
쿼리문 예시 - SELECT * FROM table_name tn WHERE tn.timestamp BETWEEN :beforeDate AND :nowDate AND EXTRACT(MINUTE FROM tn.timestamp) = 0 AND MOD(EXTRACT(HOUR FROM tn.timestamp), 8) = 0 ORDER BY tn.timestamp ASC;
EXTRACT는 날짜 함수로써 원하는 날짜 영역을 추출할 수 있다. MOD는 나누기 함수.