(spring) 통계 api 중 벽을 만났다.

전성영·2022년 8월 1일
1

spring

목록 보기
25/31

프로젝트 중 사용자가 투두를 달성한 갯수와 획득한 경험치량을 통계로 보여줘야 하는 api를 만들어야 했다.

일간, 주간, 월간 세 가지가 있었다.

먼저 일간은 현재 날짜 기준 하루 전 부터 일주일 동안을 보여주었고,
주간은 4주 전까지, 월간은 6달 전까지 보여주었다.

먼저 Querydsl를 공부하고 있었고 장점이 많아서 적용을 시키기로 결정했다!

적용하는 방법은 따로 정리를 해놓았다. 여기

일간부터 시작! 아니다 일간, 주간, 월간은 비슷비슷 하기 때문에 일간만 정리해보려고 한다.

일간

먼저 쿼리는 아래 사진처럼 작성하였다.

문제점

where 절의 조건에 맞지 않는다면 날짜도 나오지 않는 것.



예시

preiod List에 7개의 날짜가 있는 것처럼 myAchievement나 myExpChanges에도 7가지의 데이터가 들어있어야 하는데 들어있지 않았다.

이것을 해결하려고 진짜 많이 생각하고 여러가지 방법을 시도해보았다.

가장 기억에 남는 것은 CTE 라는 것을 만드는 것이었다.

CTE란 쿼리 실행 중 메모리에 존재하는 테이블이다.

하지만 dsl에는 적용이 되지 않았고, 내가 구현하고 싶은 기능에 적합하지 않다고 생각했다.

해결방안

Map 자료구조를 이용하여 해결을 하였다.
key값으로 날짜들을 먼저 삽입 후 value 값을 0으로 초기화 해주었다.

그렇게 되면 데이터가 들어오면 0 -> 들어온 데이터가 될 것이고
데이터가 들어오지 않는다면 0으로 나올 것이다.

따라서 원하는 결과물을 얻을 수 있었다!!!

결과


현재 날짜 기준으로 원하는 날짜를 추출한 후

Map 초기화 + Map에 데이터 저장을 해주었다.

맞는 방법인진 모르겠지만 어쨌든 해결!
써놓고 보면 별 거 없지만 정말 처음엔 멘붕 그 자체였다.

프로젝트를 진행하면서 가장 재미있었던??? api 였던 거 같다.
기억에 남을듯?????

아 맞다. Bean 등록 및 DI 에러 도 중간에 있었지만 해결하였다!

주간과 월간을 간단하게 정리해보자.
로직은 비슷비슷 하니깐 다른 부분만 살짝 맛만 보자!

주간


sWeek에 4주전의 날짜를 저장한다.
startWeek라는 Calendar 객체도 만들어 준다.
split을 하여 4주 전의 날짜에 해당하는 년, 월, 일 을 각각 저장 후 아까 만들어놓았던 startWeek에 저장을 한다.
Calendar.DAY_OF_WEEK을 이용하여 현재 요일이 무슨 요일인지 반환해준다
(ex 일요일 - 1, 월요일 - 2)

그렇게 모든 작업을 마친 후 startWeekMon로 저장을 해준다.

그 다음 i를 증가시키면서 1주일씩 + 해준다.
그 후 Calendar.WEEK_OF_MONTH 를 통해 몇 주차 인지 구하면 된다!

대충 이런 느낌이다.
팀원 한 분이랑 같이 진행했는데 팀원분이 더 빨리 하셔서 이 방법으로 하였다.

월간

해당 월의 첫째 날 을 가져오기 위해 .withDayOfMonth()를 사용하였다.
마지막 날은 .lengthOfMonth() 로 가져왔다.

이렇게 하면 끝~~

진짜 재밌었다.

느낀점

아직 많이 부족하고 상상의 나라를 펼치기엔 뇌가 굳어있는 것 같았다.
또한 Calendar와 localDate 관련해서 무수한 함수들이 제공되는 것을 알고 신기했다!

profile
Slow and Steady

0개의 댓글