Skip to main content

2023.04.27의 깨달음

· 3 min read

그래프에 표시하기 위한 데이터리스트 반환 API 구현하기.

이용자가 추이를 확인할 수 있게 선 그래프를 표현하기 위한 데이터 리스트를 반환해주는 API를 구현하면서 여러 고민이 들었다.

  • 그래프는 누적 데이터를 보여준다.
  • 하루, 주, 월, 년 단위로 데이터 추이를 보여준다.
  • 각각 데이터는 (10분, 1시간, 8시간, 1일)의 간격을 가지며 화면에서 선 그래프에 마우스를 가져다 됬을 때 해당되는 데이터의 값을 보여준다.

그래프 표현 용 데이터에 대해 저장과 조회 두가지 관점에서 고민하였다.

  1. 저장의 관점에서, 그래프에 표시하기 위한 누적 데이터를 저장하며, 배치를 통해 매분 값을 저장한다.
  2. 조회의 관점에서, 누적 데이터가 매분 저장되어있기 때문에 별도의 계산은 필요하지 않으며, 데이터의 간격이 조건에 따라 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는 나누기 함수.