<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>우당탕탕 개발 일지</title>
        <link>https://velog.io/</link>
        <description>App/Back-End Developer #Spring #Flutter</description>
        <lastBuildDate>Mon, 05 Dec 2022 12:57:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>우당탕탕 개발 일지</title>
            <url>https://velog.velcdn.com/images/jaeyunkim-1024/profile/c78090fa-f4b5-4231-b439-b6eb211ebcaa/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 우당탕탕 개발 일지. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jaeyunkim-1024" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Redshift 날짜 계산  ( '1 month'::interval )]]></title>
            <link>https://velog.io/@jaeyunkim-1024/Redshift-%EB%82%A0%EC%A7%9C-%EA%B3%84%EC%82%B0-1-monthinterval</link>
            <guid>https://velog.io/@jaeyunkim-1024/Redshift-%EB%82%A0%EC%A7%9C-%EA%B3%84%EC%82%B0-1-monthinterval</guid>
            <pubDate>Mon, 05 Dec 2022 12:57:43 GMT</pubDate>
            <description><![CDATA[<h1 id="redshift-🤔">Redshift..? 🤔</h1>
<p>이번 프로젝트에서는 AWS의 데이터 웨어하우스 Redshift를 사용했습니다. 처음에는 RDS로 처리하려고 했지만 하루 쌓이는 데이터양이 🥲,,, 샤딩/파티셔닝 뭔 짓을 해도 안 될 사이즈여서 Redshift를 선택했습니다. 다만,,,</p>
<p>그 누구도!!! 이걸 !!! 전문적으로 다뤄본 사람이 사내에 1명도 없었던 것이 문제!!!!!
<del>(수익 모델도 없는 플랫폼이 저 놈 때문에 16억이.....팀장님들이 윗 선에 정말 할 말이 없었겠ㅇ)</del>
이로 인해, 나는 안되는 영어를 가지고 Document를 읽고 Open case를 해 AWS 직원과 몇가지 피드백 및 Q&amp;A를 했습니다.....오전 내내...재택이었는데 출근해서...🥹( <del>파파고 만만세</del> ) </p>
<p>몇 가지 알게 된 것은 아래와 같습니다.</p>
<ul>
<li>Redshift는 postgresql 기반으로 n개 붙인 것(노드 라고 칭합니다.)</li>
<li>노드수가 많아질 수록 빨라집니다(돈도 많이 듭니다..)</li>
</ul>
<p>그 외 몇가지 있지만,,그건 프로젝트 회고록에서... 신기하게 동작하는게 많더라구요.
이번 글에선 그 신기하게 동작되는 것들 중 날짜 계산 도중 발견한 재밌는 점을 작성하려고 합니다.
백엔드 개발을 하면서 대시보드,차트는 수 없이 그려봤지만 이런 경우는 또 처음 접해 되게 흥미로워 내용을 공유합니다.</p>
<h1 id="차트의-category-최근-한달">차트의 Category, 최근 한달</h1>
<p>요런 Line Chart 를 다들 한 번 쯤 구현해보았을 겁니다.</p>
<p><img src="https://velog.velcdn.com/images/jaeyunkim-1024/post/6568a151-b81b-47d9-9d83-961ec4ec8eca/image.png" alt=""></p>
<p><del>아니 근데 12월 왜 안 나옴? 제발여...</del></p>
<p>각설하고, 최초 문제의 시작은 아래와 같은 요건이었습니다.</p>
<blockquote>
<p>최근 한 달 데이터를 보고 싶어요!!!!!</p>
</blockquote>
<p>최근 한 달? 31일? 30일? 전월이 윤년이면? 어떻게 계산하지? 의문이 들었으나 우리 모두가 간단하게 생각해버린게 화근이었던 것 같습니다.</p>
<blockquote>
<p>오늘이 7월4일이면  <strong>6월3일부터 7월3일까지</strong> 보여줘~!</p>
</blockquote>
<p>그냥 1달 빼버리면 된다고 생각했는데 이슈가 생겨버렸다....</p>
<h1 id="이슈-발생🔥">이슈 발생🔥</h1>
<p><strong>문제의 발생일은 12월 1일(데이터 배치로 인해 정확히는 어제 기준으로 최근 한 달을 보여줌)</strong></p>
<p>이상적인 날짜 범위는 <strong>10월 30일 ~ 11월 30일</strong> 이다. </p>
<p>원인은 아래의 이유들로 발생한 이슈.</p>
<p><em><strong>1.JAVA에서 범위에는 포함되지만 해당 날짜 데이터가 없을 경우 ROW가 뽑히질 않고 그러면 차트에 나타나질 않으니 빈 값 처리 해주는 로직이 들어가있다. 
2. 근데 이상하게 DB에서 최근 한달을 계산을 하니 31일부터 나온다. 30일 어디갔는데?</strong></em></p>
<p>이제 문제의 쿼리와 그 결과값을 보여드리겠읍니다..읍읍😡</p>
<h3 id="case-1-월말일-경우30일-혹은-31일">CASE 1: 월말일 경우(30일 혹은 31일)</h3>
<pre><code>SELECT 
    TO_DATE(&#39;20221130&#39;, &#39;yyyyMMdd&#39;) - &#39;1 month&#39;::interval AS &#39;쿼리  A&#39;,
    ADD_MONTH(TO_DATE(&#39;20221130&#39;,&#39;yyyyMMdd&#39;),-1) as &#39;쿼리 B&#39;;
</code></pre><p><img src="https://velog.velcdn.com/images/jaeyunkim-1024/post/c9d1aaa9-716c-4763-887a-c92b7753530f/image.png" alt=""></p>
<p>여기까진 이해가 된다. 그래, 이래서 이슈였으니까. 근데 문제는 머릿 속에 번뜩 든 어떤 생각과 그 생각을 증명해준 쿼리 결과값이었다.....(B가 문제의 쿼리..)</p>
<h3 id="case-2--월초일-경우매월-1일">CASE 2 : 월초일 경우(매월 1일)</h3>
<pre><code>SELECT 
    TO_DATE(&#39;20221201&#39;, &#39;yyyyMMdd&#39;) - &#39;1 month&#39;::interval AS &#39;쿼리  A&#39;,
    ADD_MONTH(TO_DATE(&#39;20221201&#39;,&#39;yyyyMMdd&#39;),-1) as &#39;쿼리 B&#39;;
</code></pre><p><img src="https://velog.velcdn.com/images/jaeyunkim-1024/post/99508f12-f45d-401b-bb7f-4d1fdb49a2d9/image.png" alt=""></p>
<p>이상해. 이상해. 이상하다고.</p>
<p>이렇게 되면 매월 1일 일 때, 차트 범례의 시작 값이 31일인 차트는 절대 나타날 수 없다. 꽤 심각한 버그...😱</p>
<h4 id="tmi-postgresql에서는-sysdate-1-을-하면-날짜-계산이-된다">[TMI] postgresql에서는 SYSDATE()-1 을 하면 날짜 계산이 된다</h4>
<blockquote>
<p>쿼리 B에서 하면 되지 않나요? </p>
</blockquote>
<p>쿼리 B가 기존에 적용되어있던 쿼리다. 문제는 Java,React 및 그외 언어에서 위와 같은 조건으로 계산을 할 경우, 시작일이 31일이 아닌 30일이 나온다. 아까, JAVA에서 빈 날짜 처리 로직이 있다고 말한거 :) postgresql 동작과 빈 날짜 처리 로직이 합쳐지면서 나타난 이슈인게 확인되었습니다. 🔥</p>
<h1 id="이슈-해결👏">이슈 해결👏</h1>
<p>근본적인 해결을 못 하고 기존에, DB에서 SYSDATE()를 이용하여 날짜를 계산하고 있었으나, 서버에서 변수를 넘겨주는 형식으로 변경하였다. 또한, 날짜 계산도 월이 아닌 일로 계산하는 걸로...</p>
<p>나의 예측은, Redshift 아니 postgresql에서는 아래와 같은 원리로 날짜 계산을 하지 않을까?</p>
<p>-날짜 계산의 단위가 month이고 그 일자가 1일 경우, 무조건 &#39;월&#39; 만 빼고, 날짜는  &#39;01&#39;로 반환</p>
<p>ADD_MONTHS 와 ::interval 의 동작이 왜 다른지는 아직 AWS에 질문을 못 해봤다. 시간 날 때 반드시 open case해서 물어봐야지..</p>
<h1 id="회고👨💻">회고👨‍💻</h1>
<p>다음에는 반드시 정확한 DAY를 달라 해야겠다..</p>
]]></description>
        </item>
    </channel>
</rss>