이번 프로젝트에서는 AWS의 데이터 웨어하우스 Redshift를 사용했습니다. 처음에는 RDS로 처리하려고 했지만 하루 쌓이는 데이터양이 🥲,,, 샤딩/파티셔닝 뭔 짓을 해도 안 될 사이즈여서 Redshift를 선택했습니다. 다만,,,
그 누구도!!! 이걸 !!! 전문적으로 다뤄본 사람이 사내에 1명도 없었던 것이 문제!!!!!
(수익 모델도 없는 플랫폼이 저 놈 때문에 16억이.....팀장님들이 윗 선에 정말 할 말이 없었겠ㅇ)
이로 인해, 나는 안되는 영어를 가지고 Document를 읽고 Open case를 해 AWS 직원과 몇가지 피드백 및 Q&A를 했습니다.....오전 내내...재택이었는데 출근해서...🥹( 파파고 만만세 )
몇 가지 알게 된 것은 아래와 같습니다.
그 외 몇가지 있지만,,그건 프로젝트 회고록에서... 신기하게 동작하는게 많더라구요.
이번 글에선 그 신기하게 동작되는 것들 중 날짜 계산 도중 발견한 재밌는 점을 작성하려고 합니다.
백엔드 개발을 하면서 대시보드,차트는 수 없이 그려봤지만 이런 경우는 또 처음 접해 되게 흥미로워 내용을 공유합니다.
요런 Line Chart 를 다들 한 번 쯤 구현해보았을 겁니다.
아니 근데 12월 왜 안 나옴? 제발여...
각설하고, 최초 문제의 시작은 아래와 같은 요건이었습니다.
최근 한 달 데이터를 보고 싶어요!!!!!
최근 한 달? 31일? 30일? 전월이 윤년이면? 어떻게 계산하지? 의문이 들었으나 우리 모두가 간단하게 생각해버린게 화근이었던 것 같습니다.
오늘이 7월4일이면 6월3일부터 7월3일까지 보여줘~!
그냥 1달 빼버리면 된다고 생각했는데 이슈가 생겨버렸다....
문제의 발생일은 12월 1일(데이터 배치로 인해 정확히는 어제 기준으로 최근 한 달을 보여줌)
이상적인 날짜 범위는 10월 30일 ~ 11월 30일 이다.
원인은 아래의 이유들로 발생한 이슈.
1.JAVA에서 범위에는 포함되지만 해당 날짜 데이터가 없을 경우 ROW가 뽑히질 않고 그러면 차트에 나타나질 않으니 빈 값 처리 해주는 로직이 들어가있다.
2. 근데 이상하게 DB에서 최근 한달을 계산을 하니 31일부터 나온다. 30일 어디갔는데?
이제 문제의 쿼리와 그 결과값을 보여드리겠읍니다..읍읍😡
SELECT
TO_DATE('20221130', 'yyyyMMdd') - '1 month'::interval AS '쿼리 A',
ADD_MONTH(TO_DATE('20221130','yyyyMMdd'),-1) as '쿼리 B';
여기까진 이해가 된다. 그래, 이래서 이슈였으니까. 근데 문제는 머릿 속에 번뜩 든 어떤 생각과 그 생각을 증명해준 쿼리 결과값이었다.....(B가 문제의 쿼리..)
SELECT
TO_DATE('20221201', 'yyyyMMdd') - '1 month'::interval AS '쿼리 A',
ADD_MONTH(TO_DATE('20221201','yyyyMMdd'),-1) as '쿼리 B';
이상해. 이상해. 이상하다고.
이렇게 되면 매월 1일 일 때, 차트 범례의 시작 값이 31일인 차트는 절대 나타날 수 없다. 꽤 심각한 버그...😱
쿼리 B에서 하면 되지 않나요?
쿼리 B가 기존에 적용되어있던 쿼리다. 문제는 Java,React 및 그외 언어에서 위와 같은 조건으로 계산을 할 경우, 시작일이 31일이 아닌 30일이 나온다. 아까, JAVA에서 빈 날짜 처리 로직이 있다고 말한거 :) postgresql 동작과 빈 날짜 처리 로직이 합쳐지면서 나타난 이슈인게 확인되었습니다. 🔥
근본적인 해결을 못 하고 기존에, DB에서 SYSDATE()를 이용하여 날짜를 계산하고 있었으나, 서버에서 변수를 넘겨주는 형식으로 변경하였다. 또한, 날짜 계산도 월이 아닌 일로 계산하는 걸로...
나의 예측은, Redshift 아니 postgresql에서는 아래와 같은 원리로 날짜 계산을 하지 않을까?
-날짜 계산의 단위가 month이고 그 일자가 1일 경우, 무조건 '월' 만 빼고, 날짜는 '01'로 반환
ADD_MONTHS 와 ::interval 의 동작이 왜 다른지는 아직 AWS에 질문을 못 해봤다. 시간 날 때 반드시 open case해서 물어봐야지..
다음에는 반드시 정확한 DAY를 달라 해야겠다..
문제를 발견하고 절규하는 모습이 인상적이시네요 ! 좋아요 누르고 갑니다 💖