<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ooweat Dev  &amp;zwj; </title>
    <link>https://ooweat.tistory.com/</link>
    <description>나의 경험과 삽질이 누군가에게 도움이 되길 바라는 작은 카페.
Tistory 에 github.io 한 방울, velog 한 방울</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 01:23:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ooweat</managingEditor>
    <image>
      <title>ooweat Dev  &amp;zwj; </title>
      <url>https://tistory1.daumcdn.net/tistory/6074566/attach/67a912d566474f25b6e22b562983b80e</url>
      <link>https://ooweat.tistory.com</link>
    </image>
    <item>
      <title>결혼 후 차량고민 (블로거 추천)</title>
      <link>https://ooweat.tistory.com/entry/%EA%B2%B0%ED%98%BC-%ED%9B%84-%EC%B0%A8%EB%9F%89%EA%B3%A0%EB%AF%BC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B6%94%EC%B2%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어느 덧 내가 결혼을 했다. (결혼한 지 벌써 한 달이 넘었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결혼을 하니 슬슬 미래에 대한 고민이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차가 없거나 바꿀 시기가 온 신혼부부들의 공통적인 고민 중 하나로 이동수단을 떼어놓울 수가 없었다.&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 나는 이미 차(세단)도 있고 오토바이도 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이 생각이 있다보니 육아에 유용하게 쓰이는 SUV 로 넘어가고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변에 육아하시는 분들은 '카니발' 을 많이 타시긴 하는데 나에게 '카니발'은 조금 과했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;뭘 타고 싶은데?&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동차 신을 기웃기웃거리다보니 요새 옵션이며 장비며 차 인테리어가 장난 아니더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;나 개발자인데 전기차 타야제!&quot; 라는 마음으로 최신 전기차를 스윽 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합리적인 가격대를 찾아보다가 'EV3' 로 종결되는 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그에 대한 자료를 조사하던 중, 깔끔하게 정리되어있어 보기 좋은 블로그를 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;차량 구매를 마음먹기부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 전, 중, 후 가 모두 포함되어있어서 읽기가 재밌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 찍어내기형 블로그 인가 싶었는데 읽어보면 알짜배기 정보와 경험치만 모아놓으셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차 전문가가 아니라 나와 같은 일반인 시선에서 바라봐주시니 공감대가 형성될 수 밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 글을 점점 잘 쓰셔서 같이 성장하는 느낌이 절로 난다. ㅋㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=bhg20247&amp;amp;logNo=224140828282&amp;amp;categoryNo=75&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=6&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&amp;amp;userTopListOpen=true&amp;amp;userTopListCount=5&amp;amp;userTopListManageOpen=false&amp;amp;userTopListCurrentPage=6&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/PostView.naver?blogId=bhg20247&amp;amp;logNo=224140828282&amp;amp;categoryNo=75&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=6&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&amp;amp;userTopListOpen=true&amp;amp;userTopListCount=5&amp;amp;userTopListManageOpen=false&amp;amp;userTopListCurrentPage=6&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771981748316&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;모델Y, EV5, EV3까지 세 번의 계약... 결국 EV3를 선택한 진짜 이유&quot; data-og-description=&quot;아이패드 병처럼 찾아온 테슬라 병, 세 번의 계약 끝에 남은 건 기술이 아니라 가격 앞에서도 끝까지 지킬 ...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://blog.naver.com/PostView.naver?blogId=bhg20247&amp;amp;logNo=224140828282&amp;amp;categoryNo=75&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=6&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&amp;amp;userTopListOpen=true&amp;amp;userTopListCount=5&amp;amp;userTopListManageOpen=false&amp;amp;userTopListCurrentPage=6&quot; data-og-url=&quot;https://blog.naver.com/bhg20247/224140828282&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnbk76/dJMb81fPE42/kbEpFjRWaOv3bHc6GwK1B1/img.png?width=743&amp;amp;height=321&amp;amp;face=0_0_743_321&quot;&gt;&lt;a href=&quot;https://blog.naver.com/PostView.naver?blogId=bhg20247&amp;amp;logNo=224140828282&amp;amp;categoryNo=75&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=6&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&amp;amp;userTopListOpen=true&amp;amp;userTopListCount=5&amp;amp;userTopListManageOpen=false&amp;amp;userTopListCurrentPage=6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.naver.com/PostView.naver?blogId=bhg20247&amp;amp;logNo=224140828282&amp;amp;categoryNo=75&amp;amp;parentCategoryNo=0&amp;amp;viewDate=&amp;amp;currentPage=6&amp;amp;postListTopCurrentPage=1&amp;amp;from=postView&amp;amp;userTopListOpen=true&amp;amp;userTopListCount=5&amp;amp;userTopListManageOpen=false&amp;amp;userTopListCurrentPage=6&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnbk76/dJMb81fPE42/kbEpFjRWaOv3bHc6GwK1B1/img.png?width=743&amp;amp;height=321&amp;amp;face=0_0_743_321');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;모델Y, EV5, EV3까지 세 번의 계약... 결국 EV3를 선택한 진짜 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아이패드 병처럼 찾아온 테슬라 병, 세 번의 계약 끝에 남은 건 기술이 아니라 가격 앞에서도 끝까지 지킬 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>생각정리</category>
      <category>블로거추천</category>
      <category>생각고민</category>
      <category>수필</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/55</guid>
      <comments>https://ooweat.tistory.com/entry/%EA%B2%B0%ED%98%BC-%ED%9B%84-%EC%B0%A8%EB%9F%89%EA%B3%A0%EB%AF%BC-%EB%B8%94%EB%A1%9C%EA%B1%B0-%EC%B6%94%EC%B2%9C#entry55comment</comments>
      <pubDate>Wed, 25 Feb 2026 10:12:41 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] Postgresql DIFF 두 날짜 사이 계산</title>
      <link>https://ooweat.tistory.com/entry/PostgreSQL-Postgresql-DIFF-%EB%91%90-%EB%82%A0%EC%A7%9C-%EC%82%AC%EC%9D%B4-%EA%B3%84%EC%82%B0</link>
      <description>&lt;pre id=&quot;code_1712215057825&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT DATE_PART('DAYS', CURRENT_TIMESTAMP AT TIME ZONE
                         'Asia/Seoul' - '2024-01-01 00:00:00'::TIMESTAMP)             AS DIFF,
       CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul' - '2023-01-01 00:00:00'::TIMESTAMP AS DIFF2;&lt;/code&gt;&lt;/pre&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2OkIS/btsGmPcsyfv/Ipo4mcsTX1qYvdYDOOtHEK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2OkIS/btsGmPcsyfv/Ipo4mcsTX1qYvdYDOOtHEK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2OkIS/btsGmPcsyfv/Ipo4mcsTX1qYvdYDOOtHEK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2OkIS%2FbtsGmPcsyfv%2FIpo4mcsTX1qYvdYDOOtHEK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;329&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;DATE_PART&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL에서는 특정 날짜 또는 시간 값을 추출할 수 있는 함수가 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용 구문:&lt;/p&gt;
&lt;pre id=&quot;code_1712214400152&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATE_PART(field, source)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 함수의 &lt;u&gt;&lt;b&gt;source&lt;/b&gt;&lt;/u&gt; 부분에 두 날짜의 차이를 구하는 수식을 넣게 되면, days, hours, mins, secs 순으로 계산해서 보여준다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(years와 mons 도 존재하나 days가 최대로 보인다.)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 날짜의 차이를 구하는 경우, 최대 수치는 DAY로 환산되는데, 이렇게 계산된 값을&amp;nbsp;&lt;b&gt;DATE_PART&lt;/b&gt; 함수의 'DAY' 를 이용해 일자만 추출하는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*DATE_PART 의 field 에서 지원하는 형식 목록을 간략하게 소개&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;century&lt;/li&gt;
&lt;li&gt;decade&lt;/li&gt;
&lt;li&gt;year&lt;/li&gt;
&lt;li&gt;month&lt;/li&gt;
&lt;li&gt;day&lt;/li&gt;
&lt;li&gt;hour&lt;/li&gt;
&lt;li&gt;minute&lt;/li&gt;
&lt;li&gt;second&lt;/li&gt;
&lt;li&gt;microseconds&lt;/li&gt;
&lt;li&gt;milliseconds&lt;/li&gt;
&lt;li&gt;dow&lt;/li&gt;
&lt;li&gt;doy&lt;/li&gt;
&lt;li&gt;epoch&lt;/li&gt;
&lt;li&gt;isodow&lt;/li&gt;
&lt;li&gt;isoyear&lt;/li&gt;
&lt;li&gt;timezone&lt;/li&gt;
&lt;li&gt;timezone_hour&lt;/li&gt;
&lt;li&gt;timezone_minute&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 방법은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리&lt;/p&gt;
&lt;pre id=&quot;code_1712215064808&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT CURRENT_TIMESTAMP AT TIME ZONE
       'Asia/Seoul'                                                                   AS TODAY,
       '2024-01-01 00:00:00'::TIMESTAMP                                               AS DIFFDATE,
       DATE_PART('DAY', CURRENT_TIMESTAMP AT TIME ZONE
                        'Asia/Seoul' - '2024-01-01 00:00:00'::TIMESTAMP)              AS DIFF_V1,
       CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul' - '2024-01-01 00:00:00'::TIMESTAMP AS DIFF_V2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clYGjO/btsGmxDctv2/gvlrARIkK7xqw20sxRoDK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clYGjO/btsGmxDctv2/gvlrARIkK7xqw20sxRoDK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clYGjO/btsGmxDctv2/gvlrARIkK7xqw20sxRoDK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclYGjO%2FbtsGmxDctv2%2FgvlrARIkK7xqw20sxRoDK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;158&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 실행결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yoKcw/btsGmCkafyY/Qur997If8tctmEKJpayaoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yoKcw/btsGmCkafyY/Qur997If8tctmEKJpayaoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yoKcw/btsGmCkafyY/Qur997If8tctmEKJpayaoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyoKcw%2FbtsGmCkafyY%2FQur997If8tctmEKJpayaoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;108&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.postgresqltutorial.com/postgresql-date-functions/postgresql-date_part/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.postgresqltutorial.com/postgresql-date-functions/postgresql-date_part/&lt;/a&gt;&lt;/p&gt;</description>
      <category> Study/ETC</category>
      <category>몇 일 차이</category>
      <category>몇일차이</category>
      <category>일수차이</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/54</guid>
      <comments>https://ooweat.tistory.com/entry/PostgreSQL-Postgresql-DIFF-%EB%91%90-%EB%82%A0%EC%A7%9C-%EC%82%AC%EC%9D%B4-%EA%B3%84%EC%82%B0#entry54comment</comments>
      <pubDate>Thu, 4 Apr 2024 16:52:58 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 FTP 서버, vsftpd 설정</title>
      <link>https://ooweat.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-FTP-%EC%84%9C%EB%B2%84-vsftpd-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AE548/btsFK2cJpU0/F5BB3RdJDpmq4mKTY1RlE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AE548/btsFK2cJpU0/F5BB3RdJDpmq4mKTY1RlE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AE548/btsFK2cJpU0/F5BB3RdJDpmq4mKTY1RlE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAE548%2FbtsFK2cJpU0%2FF5BB3RdJDpmq4mKTY1RlE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;327&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;1. vsftpd 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;2. 방화벽 개방&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;vsftpd&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;는&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;기본적으로&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;20&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;번&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;, 21&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;번&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;포트를&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;사용한다&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;방화벽을&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;사용한다면&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;해당&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;포트번호를&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;허용해준다&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo ufw allow 20/tcp
$ sudo ufw allow 21/tcp
$ sudo ufw enable&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;3. 설정 파일 수정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;$ sudo gedit /etc/vsftpd.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 설명&lt;/h3&gt;
&lt;pre id=&quot;code_1710315671753&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# anonymous 유저 허용 여부
anonymous_enable=NO 

# 계정사용자 접속 허용 여부
local_enable=YES 

# 업로드 허용 여부
write_enable=YES 

# 디렉토리나 파일 생성시 umask 값 
# local_umask의 숫자를 변경하여 기본 권한을 변경해 준다.
# 디폴트값 022
local_umask = 022
폴더는 777 - 022 = 775
파일은 666 - 022 = 644

# 사용자 홈디렉토리에 .message 파일에 작성 
dirmessage_enable=YES 
# chroot 적용 자신의 계정에서 상위 디렉토리로 이동 허용 여부
chroot_local_user=YES 

allow_writeable_chroot=YES #home디렉토리로 접근하는 모든 유저들에게 write가 가능하도록

pasv_enable=NO #패시브 모드를 사용하는 경우, YES 로 변경

#패시브모드를 사용할 경우에 아래 내용을 추가한다.
pasv_address=자신의 ip주소
pasv_min_port=20000 #원하는 비특권 포트번호 최소값
pasv_max_port=21000 #원하는 비특권 포트번호 최대값&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;3-2. 실제 운영 중인 conf&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710315877056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Example config file /etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
#
# Run standalone?  vsftpd can run either from an inetd or as a standalone
# daemon started from an initscript.
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 &quot;any&quot; address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
listen_ipv6=YES
#
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using &quot;root&quot; for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
#xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command &quot;SIZE /big/file&quot; in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd.banned_emails
#
# You may restrict local users to their home directories.  See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
chroot_local_user=YES
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
#
# You may activate the &quot;-R&quot; option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as &quot;ncftp&quot; and &quot;mirror&quot; assume
# the presence of the &quot;-R&quot; option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
#
# Customization
#
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
utf8_filesystem=YES
#

allow_writeable_chroot=YES
pasv_address=xxx.xxx.xxx.xxx #(외부에서 접속할 경우 공인IP, 내부에서 접속할 경우 내부IP)
pasv_enable=YES
pasv_min_port=20001
pasv_max_port=21000&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;4. &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;vsftpd&lt;/span&gt;&lt;/b&gt;&amp;nbsp;서비스 재시작&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;수정한 conf 가 반영될 수 있도록 서비스를 재시작 한다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ sudo service vsftpd restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Study/ETC</category>
      <category>ftp</category>
      <category>vsftpd</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/53</guid>
      <comments>https://ooweat.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-FTP-%EC%84%9C%EB%B2%84-vsftpd-%EC%84%A4%EC%A0%95#entry53comment</comments>
      <pubDate>Wed, 13 Mar 2024 16:47:44 +0900</pubDate>
    </item>
    <item>
      <title>Java LocalDateTime 를 Javascript 에서 처리 할 때</title>
      <link>https://ooweat.tistory.com/entry/Java-LocalDateTime-%EB%A5%BC-Javascript-%EC%97%90%EC%84%9C-%EC%B2%98%EB%A6%AC-%ED%95%A0-%EB%95%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUy15D/btsEQcAXLra/TdIYQndrDpIUuHbbUnRkb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUy15D/btsEQcAXLra/TdIYQndrDpIUuHbbUnRkb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUy15D/btsEQcAXLra/TdIYQndrDpIUuHbbUnRkb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUy15D%2FbtsEQcAXLra%2FTdIYQndrDpIUuHbbUnRkb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;50&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RDBMS에서 Model 또는 Dto 에 Date 의 데이터를 받아오다보면 밀리세컨즈까지 포함되는 경우가 있다. (timestamp)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;최대한 작업 단위를 최소화 할 방법이 무엇이 있을까 고민하다가 Javascript 에서 API로 불러올 때, 제일 단순한 방법으로 convert 하는 방법을 채택했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;function convertDateFormat(date) {
  let dateSplit = date;
  if (date.indexOf(&quot;T&quot;) != -1) {
    dateSplit = date.split(&quot;T&quot;);
    dateSplit = dateSplit[0] + ' ' + dateSplit[1].substring(0, 8);
  }
  return dateSplit;
}&lt;/code&gt;&lt;/pre&gt;
</description>
      <category> Develop/Javascript 주섬주섬</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/52</guid>
      <comments>https://ooweat.tistory.com/entry/Java-LocalDateTime-%EB%A5%BC-Javascript-%EC%97%90%EC%84%9C-%EC%B2%98%EB%A6%AC-%ED%95%A0-%EB%95%8C#entry52comment</comments>
      <pubDate>Thu, 15 Feb 2024 09:38:48 +0900</pubDate>
    </item>
    <item>
      <title>javascript 숫자 천 단위 콤마 생성</title>
      <link>https://ooweat.tistory.com/entry/javascript-%EC%88%AB%EC%9E%90-%EC%B2%9C-%EB%8B%A8%EC%9C%84-%EC%BD%A4%EB%A7%88-%EC%83%9D%EC%84%B1</link>
      <description>&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;//천단위 (,) 생성
function numberWithCommas(number) {

  if(isNaN(number)){
    number = parseInt(number);
  }
  return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &quot;,&quot;);
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> Develop/Javascript 주섬주섬</category>
      <category>JavaScript</category>
      <category>천 단위 콤마</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/51</guid>
      <comments>https://ooweat.tistory.com/entry/javascript-%EC%88%AB%EC%9E%90-%EC%B2%9C-%EB%8B%A8%EC%9C%84-%EC%BD%A4%EB%A7%88-%EC%83%9D%EC%84%B1#entry51comment</comments>
      <pubDate>Thu, 15 Feb 2024 09:29:55 +0900</pubDate>
    </item>
    <item>
      <title>Spring Batch</title>
      <link>https://ooweat.tistory.com/entry/Spring-Batch-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ueS01/btsEy2kXDfv/8okJeh6NjNqvaUeJryRrn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ueS01/btsEy2kXDfv/8okJeh6NjNqvaUeJryRrn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ueS01/btsEy2kXDfv/8okJeh6NjNqvaUeJryRrn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FueS01%2FbtsEy2kXDfv%2F8okJeh6NjNqvaUeJryRrn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;235&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;Spring Batch&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일괄처리를 통해 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;　Spring Batch 의 5가지 특징&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 대용량 처리: 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리가 가능해야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 견고성: 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 자동화: 사용자 개입없이 실행되어야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 신뢰성: 무엇이 잘못되었는지를 추적할 수 있어야 한다. (로깅, 알림)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. 성능: 지정한 시간 안에 처리를 완료하거나, 동시에 실행되는 다른 프로그램을 방해하지 않아야 한다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;Spring Scheduler&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정한 시간&lt;/b&gt;에 등록한 작업을 자동으로 실행시키는 것&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;　Spring Scheduler의 3가지 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Spring Framework의 기본 기능으로 의존성이 불필요 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 접근성: 간단한 어노테이션 선언만으로 사용이 가능하다. (@Component, @Scheduled)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 싱글 쓰레드: 스케줄러는 &lt;b&gt;한 개의 쓰레드&lt;/b&gt;로 동작한다.&lt;/p&gt;

&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;언제 쓸까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정산이나 데이터 백업 등 같이 대량의 데이터를 처리할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 Spring Scheduler 를 이용해 이미 정해진 배치들에 대한 상태를 모니터링하는 배치로도 사용하고 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Single Thread 로 동시성이나 분산에 대한 걱정없이 가볍게 사용할 수 있는 이점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자와의 인터랙션이 없기 때문에 사용자 중심의 에러 처리를 고려하지 않아도 되지만 로그와 별도의 알림을 설정해서 모니터링을 진행해야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전략&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Batch 하나 개발하는데 전략까지 필요할까?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;답은 &quot;YES&quot;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;배치는 코어 데이터를 많이 다루기 때문에 &lt;b&gt;데이터의 안정성이 보장&lt;/b&gt;되어야 하며, &lt;b&gt;예상 배치 시간의 확인&lt;/b&gt;과 &lt;b&gt;시스템의 볼륨을 확인&lt;/b&gt;할 수 있어야 한다. 또 시스템과의 &lt;b&gt;동시성 검토&lt;/b&gt;와 &lt;b&gt;모니터링&lt;/b&gt;이 필수적으로 가능해야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 운용과 설계에 대한 기초 전략을 세웠으니 세부 분류를 진행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;처리하고자 하는 배치의 입력을 구분하여야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;현업에서 사용한 내용은 아래와 같이 크게 3가지의 구분이 나온다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 데이터베이스 //예시) 데이터베이스에서 정산을 진행할 목록을 나열해 배치를 진행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 파일 //예시) 외부연동을 통해 전달받은 결과 파일이나 직전의 배치를 통해 완료된 파일로 배치를 진행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. 메시지 //예시) Queue 구조에서 대기열에 있는 메시지에 대해 배치를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주의해야 할 7가지&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 확장성 - 언제든 조건이 추가될 수 있음에 대비해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단위 테스트 - 정확한 디버깅을 위해 단위 테스트가 가능해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 직관성 - 필요한 리소스만 선언하여 사용할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 재사용성 - 필수적인 기능을 재사용 가능해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 시간제약 - 정확한 측정 아래 계획된 시간 내 진행될 수 있도록 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 독립적 - 다른 스레드와 관계없이 하나의 Job 으로써 독립적으로 실행되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 상태성 - 배치가 진행되며 현재 상태를 남겨야 한다. (BatchStatus - STARTED, FAILED, COMPLETED)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/ Spring</category>
      <category>Spring Batch</category>
      <category>spring scheduler</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/49</guid>
      <comments>https://ooweat.tistory.com/entry/Spring-Batch-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0#entry49comment</comments>
      <pubDate>Wed, 7 Feb 2024 20:16:40 +0900</pubDate>
    </item>
    <item>
      <title>내가 생각하는 개발 문화</title>
      <link>https://ooweat.tistory.com/entry/%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EB%AC%B8%ED%99%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;반복되는 일을 하다보면 그런 생각이 들 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'자동화를 할 수는 없을까?'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 업무 외에 추가된 프로젝트나 보조적으로 하는 모니터링과 같은 업무도 있으면 시간이 부족해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 내가 편하게 일을 하기 위해 혹은 다른 일에 더 시간을 투자하기 위해 등 많은 이유로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나를 위한 프로젝트를 시작하게 되는데 결국 그것이 곧 팀을 위한 프로젝트가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 나를 위한 프로젝트이기에 부담없이 편하게 개발할 수 있었고, 여러 고민들을 자유롭게 생각해보며 개발할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이런 저런 기능들을 추가하다보니 자연스레 확장성도 고려하게 되었고 여러 서비스들을 볼 수 있는 모니터링 프로세스가 되어버렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작은 정산 업무를 진행하고 있을 때 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정산을 위한 매입은 주로 새벽 시간대에 PG사와 송수신 프로세스를 통해 파일을 주고 받으며 자동으로 이루어지는데, 통신상 장애나 데이터 오류로 인해 중도 정지 또는 반송될 때가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 날이면 새벽 4-5시에 PG사 모니터링 담당자에게 전화가 와서 &quot;데이터에 오류가 발생해 처리되지 않았습니다. 6시까지 재전송 해주시지 않으면 익일로 이관됩니다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 새벽에 잠이 덜 깬채 일어나서 원인을 파악하고, 재전송을 하곤 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인을 미리 알 수 있었다면, 내가 또는 팀원 중 누군가가 잠을 더 잘 수 있었을텐데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;지금까지 발생했던 이슈를 정리해보니 어느 시점에서 찾아야 할지 고민이 되기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;매입 파일을 전송하기 직전?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;매입 파일을 만들기 위해 데이터를 출력하기 직전?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이슈는 결국 데이터 내 문제였기 때문에 문제 있는 데이터는 사전에 보류하는 프로세스를 만들어 배포했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 날 아침, 출근 전 확인을 해봤는데, 보류된 데이터가 3개나 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 날 배포하지 않았다면 다음 날 새벽 전화를 받을 밖에 없었다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출근이 너무 기다려졌고 팀에 너무 공유하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 때의 경험이 나에겐 크게 남아 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 추구하는 개발 문화는 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;우리 팀에 필요한 것이 무엇이 있을까? 왜 필요할까?&lt;/b&gt;&quot; 이 두 개의 물음에서 시작되어 생각이 행동으로 번지는 과정 자체가 하나의 문화가 되는 것이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연스레 마음에서 우러나오는 마음을 가지고 왜 필요한지, 누가 시키지 않아도 팀을 위해서, 회사를 위해서 무엇을 하면 좋을지 고민하다 보면 어느 새 옆자리의 동료가 같은 고민을 하고 있는 모습을 볼 수 있다.&lt;/p&gt;</description>
      <category>생각정리</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/47</guid>
      <comments>https://ooweat.tistory.com/entry/%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EB%AC%B8%ED%99%94#entry47comment</comments>
      <pubDate>Sat, 3 Feb 2024 19:27:56 +0900</pubDate>
    </item>
    <item>
      <title>[Mysql/MariaDB] tinyint, smallint, mediumint, int, bigint 의 차이(정수 유형)</title>
      <link>https://ooweat.tistory.com/entry/MysqlMariaDB-tinyint-smallint-mediumint-int-bigint%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;tinyint&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Storage(Bytes) : 1&lt;/li&gt;
&lt;li&gt;Range1 : -128 ~ 127&lt;/li&gt;
&lt;li&gt;Range2 : 0 ~ 255&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;smallint&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Storage(Bytes) : 2&lt;/li&gt;
&lt;li&gt;Range1 : -32,768 ~ 32,767&lt;/li&gt;
&lt;li&gt;Range2 : 0 ~ 65,535&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;mediumint&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Storage(Bytes) : 3&lt;/li&gt;
&lt;li&gt;Range1 : - 8,388,608 ~ 8,388,607&lt;/li&gt;
&lt;li&gt;Range2 : 0 ~ 16,777,215&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Storage(Bytes) : 4&lt;/li&gt;
&lt;li&gt;Range1 : - 2,147,483,648 ~ 2,147,483,647&lt;/li&gt;
&lt;li&gt;Range2 : 0 ~ 4,294,967,295&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;bigint&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Storage(Bytes) : 8&lt;/li&gt;
&lt;li&gt;Range1 : -2^63 ~ 2^63-1&lt;/li&gt;
&lt;li&gt;Range2 : 0 ~ 2^64-1&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;background-color: #303030; color: #d3d4d6; text-align: justify; border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;background-color: #353535; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;TINYINT&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;-128&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;127&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;255&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #353535; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;SMALLINT&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;-32768&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;32767&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;65535&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #353535; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;MEDIUMINT&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;-8388608&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;8388607&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;16777215&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #353535; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;INT&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;-2147483648&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;2147483647&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;4294967295&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #424242; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;BIGINT&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;8&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;2^63&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;2^63&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span&gt;&lt;span&gt;2^64&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reference: &lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704243389648&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MySQL :: MySQL 8.0 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT,
        MEDIUMINT, &quot; data-og-description=&quot;11.1.2&amp;nbsp;Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT MySQL supports the SQL standard integer types INTEGER (or INT) and SMALLINT. As an extension to the standard, MySQL also supports the integer types TINYINT, MEDIUMINT,&quot; data-og-host=&quot;dev.mysql.com&quot; data-og-source-url=&quot;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&quot; data-og-url=&quot;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.mysql.com/doc/refman/8.0/en/integer-types.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL :: MySQL 8.0 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT,&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;11.1.2&amp;nbsp;Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT MySQL supports the SQL standard integer types INTEGER (or INT) and SMALLINT. As an extension to the standard, MySQL also supports the integer types TINYINT, MEDIUMINT,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.mysql.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/numeric-data-type-overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mariadb.com/kb/en/numeric-data-type-overview/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704243394205&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Numeric Data Type Overview&quot; data-og-description=&quot;Overview and usage of the numeric data types.&quot; data-og-host=&quot;mariadb.com&quot; data-og-source-url=&quot;https://mariadb.com/kb/en/numeric-data-type-overview/&quot; data-og-url=&quot;https://mariadb.com/kb/en/numeric-data-type-overview/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/en/numeric-data-type-overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mariadb.com/kb/en/numeric-data-type-overview/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Numeric Data Type Overview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Overview and usage of the numeric data types.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mariadb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Study/ETC</category>
      <category>MariaDB</category>
      <category>MySQL</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/44</guid>
      <comments>https://ooweat.tistory.com/entry/MysqlMariaDB-tinyint-smallint-mediumint-int-bigint%EC%9D%98-%EC%B0%A8%EC%9D%B4#entry44comment</comments>
      <pubDate>Wed, 3 Jan 2024 09:45:36 +0900</pubDate>
    </item>
    <item>
      <title>[java] Page Interceptor</title>
      <link>https://ooweat.tistory.com/entry/java-Page-Interceptor</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3fAgI/btsBy6jGtHe/v8wI5HGg52ZtHtzHESM57k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3fAgI/btsBy6jGtHe/v8wI5HGg52ZtHtzHESM57k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3fAgI/btsBy6jGtHe/v8wI5HGg52ZtHtzHESM57k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3fAgI%2FbtsBy6jGtHe%2Fv8wI5HGg52ZtHtzHESM57k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;242&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;페이지 처리하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;웹 프로젝트를 개발하고 있으면, 데이터 증가로 인해 페이징 처리에 대한 고민을 하지 않을 수 없다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;특정한 개수만큼 보여주기 때문에 가독성도 높을 뿐더러 이에 따른 좋은 사용자 경험이 될 수도 있다.(적은 데이터 호출로 인한 퍼포먼스 향상)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;고전적인 페이징 처리&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;legacy 프로젝트를 보다보면 각 Controller 또는 Service에서 page 에 대한 기능을 개발해놓았다.&lt;/p&gt;
&lt;pre id=&quot;code_1702000034126&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//legacy 프로젝트에서 동작 중이던 페이지 호출 Fun
final int boardSize = 10; // 한 페이지에 게시글 출력 개수

String pageNumber = request.getParameter(&quot;pageNumber&quot;);
if (pageNumber == null) {
    pageNumber = &quot;1&quot;;
}

int startRow = (pageNumber - 1) * boardSize + 1;
int endRow = pageNumber * boardSize;

//LogAspect.logger.info(LogAspect.logMsg + &quot; 페이지번호 : &quot; + pageNumber + &quot;,시작번호 : &quot; + startRow + &quot;,끝번호 : &quot; + endRow);

// 검색 스타트
int count = boardDao.getBoardCount(searchType,searchData,sDate,eDate,company_seq,progress_status,ptn_comp_seq); // 전체 카운트
LogAspect.logger.info(LogAspect.logMsg + &quot; 리스트 개수 : &quot; + count);

int real_count = 0;
List&amp;lt;BoardDto&amp;gt; boardList = null;

if (count &amp;gt; 0) {
    endRow = 10;
    boardList = boardDao.boardList(startRow,endRow,searchType,searchData,sDate,eDate,company_seq,progress_status,ptn_comp_seq);
    LogAspect.logger.info(LogAspect.logMsg + &quot; boardList 결과 값 : &quot; + boardList.size() + &quot;\n&quot;);
    mav.addObject(&quot;boardListSize&quot;,boardList.size());
    ...
}
mav.addObject(&quot;count&quot;,count); //전체 건수
mav.addObject(&quot;boardSize&quot;,boardSize); // 한 페이지에 게시글 출력 개수
mav.addObject(&quot;pageNumber&quot;,currentPage); //현재 페이지&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;legacy project 中&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전역 설정에 대한 고민&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;페이징 처리는 한 곳에서만 쓰이는 것이 아니기 때문에 '&lt;u&gt;재활용이 가능'&lt;/u&gt;해야하는 것에 목표를 두었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;물론 Controller 나 Service 에서 공통적으로 사용할 수 있도록 Util 클래스를 두어 별도로 구현해도 위 목표에 적합하지만, Spring 에서는 인터셉터(Interceptor) 라는 대안이 있어 이를 활용해서 처리하기로 했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Page Helper&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이 글에서는 com.github.pagehelper 플러그인을 사용해서 처리를 진행했다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;maven dependency&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;pagehelper-spring-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.2.3&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;단위 테스트 진행&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;    @Test
    void paging(){
        int pageSize = 10;      //NOTE: 페이지 당 개수
        PageHelper.startPage(1, pageSize);  //DESC: 1 페이지의 10개
        Page&amp;lt;UserVO&amp;gt; p = (Page&amp;lt;UserVO&amp;gt;) groupMapper.userList();
        log.info(&quot;전체 데이터: {}&quot;, p.getTotal());
        log.info(&quot;전체 페이지: {}&quot;, p.getPages());
        log.info(&quot;현재 페이지: {}&quot;, p.getPageNum());
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxt0gX/btsBGvWH7DS/WLHKUFewkwK878rDL6BD1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxt0gX/btsBGvWH7DS/WLHKUFewkwK878rDL6BD1k/img.png&quot; data-alt=&quot;결과 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxt0gX/btsBGvWH7DS/WLHKUFewkwK878rDL6BD1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxt0gX%2FbtsBGvWH7DS%2FWLHKUFewkwK878rDL6BD1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;70&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;결과 값에서 보듯 전체에 대한 데이터 갯수와 파라미터에 따른 페이지를 미리 구하는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;(Page Helper 에서 쿼리 내 LIMIT 를 자동으로 생성하기 전, 전체 쿼리의 count를 조회해 전체 페이지 정보와 보여줄 페이지를 계산하는 방식)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;위 코드 실행 시 진행되는 쿼리를 보면 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;-- 전체 갯수에 대한 데이터를 구한다.
Connection.prepareStatement: 
SELECT count(0) 
FROM TB_USER

-- 페이지에 해당하는 자료를 조회한다. (setInt의 값을 주어진 초기값에 따라 계산해서 적용)
PreparedStatement.setInt(1, 10): 
SELECT TG.GROUP_NAME AS GROUPNAME
FROM TB_USER 
ORDER BY TU.REG_DATE DESC 
LIMIT 10 //setInt 된 내용은 이 곳에 적용된다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category> Study/ETC</category>
      <category>Interceptor</category>
      <category>page</category>
      <category>page interceptor</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/39</guid>
      <comments>https://ooweat.tistory.com/entry/java-Page-Interceptor#entry39comment</comments>
      <pubDate>Mon, 18 Dec 2023 08:50:46 +0900</pubDate>
    </item>
    <item>
      <title>[logback] 내가쓰는 Spring logback 설정</title>
      <link>https://ooweat.tistory.com/entry/logback-%EB%82%B4%EA%B0%80%EC%93%B0%EB%8A%94-Spring-logback-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uP0jS/btsA4SdKtqQ/JVcjCK6NydkBltHMkhxPN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uP0jS/btsA4SdKtqQ/JVcjCK6NydkBltHMkhxPN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uP0jS/btsA4SdKtqQ/JVcjCK6NydkBltHMkhxPN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuP0jS%2FbtsA4SdKtqQ%2FJVcjCK6NydkBltHMkhxPN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;191&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;Spring logback&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;개인적으로 쓰다가 팀 프로젝트까지 확장해서 사용 중인 logback 설정들을 자주 물어봐서 기록을 남긴다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;물론 커스터마이징 한 부분은 들어내고..&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;프로젝트에 관련된 설정을 담은 application.properties 에 설정 후, logback-spring.xml 에서 상속받아 사용하도록 했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;pom.xml&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701756687641&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- lombok --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;!-- log4jdbc --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.bgee.log4jdbc-log4j2&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;log4jdbc-log4j2-jdbc4.1&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.16&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;application.properties 파일&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;#Logging
logging.root.level=INFO
logging.file.path=/app/services/logs/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;logback-spring.xml 파일&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;!-- 중간 변동 사항을 대비해, application.properties 에서 값을 가져오도록 변경 --&amp;gt;
    &amp;lt;property resource=&quot;application.properties&quot;/&amp;gt;
    &amp;lt;!-- LOG_ROOT_LEVEL 의 기본값은 INFO --&amp;gt;
    &amp;lt;property name=&quot;LOG_ROOT_LEVEL&quot; value=&quot;${logging.root.level}&quot;/&amp;gt;
    &amp;lt;!-- LOG_ROOT_PATH 의 기본 고정값은 --&amp;gt;
    &amp;lt;property name=&quot;LOG_FILE_PATH&quot; value=&quot;${logging.file.path}&quot;/&amp;gt;
    &amp;lt;appender name=&quot;CONSOLE&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&amp;gt;
        &amp;lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&amp;gt;
            &amp;lt;Pattern&amp;gt;[%d{HH:mm:ss}] [%-5level] [%M\(%L\)] - %msg%n&amp;lt;/Pattern&amp;gt;
        &amp;lt;/layout&amp;gt;
    &amp;lt;/appender&amp;gt;
    &amp;lt;appender name=&quot;FILE&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&amp;gt;
        &amp;lt;file&amp;gt;${LOG_FILE_PATH}/${project.name}.log&amp;lt;/file&amp;gt;
        &amp;lt;encoder&amp;gt;
            &amp;lt;Pattern&amp;gt;[%d{HH:mm:ss}] [%-5level] [%M\(%L\)] - %msg%n&amp;lt;/Pattern&amp;gt;
        &amp;lt;/encoder&amp;gt;
        &amp;lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&amp;gt;
            &amp;lt;fileNamePattern&amp;gt;${LOG_FILE_PATH}/${project.name}-%d{yyyy-MM-dd}.log&amp;lt;/fileNamePattern&amp;gt;
            &amp;lt;maxHistory&amp;gt;31&amp;lt;/maxHistory&amp;gt;
        &amp;lt;/rollingPolicy&amp;gt;
    &amp;lt;/appender&amp;gt;
    &amp;lt;logger name=&quot;jdbc&quot; level=&quot;ERROR&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.sqlonly&quot; level=&quot;INFO&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.sqltiming&quot; level=&quot;OFF&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.audit&quot; level=&quot;OFF&quot; appender-ref=&quot;CONSOLE FILE&quot; additivity=&quot;false&quot;&amp;gt;&amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.resultset&quot; level=&quot;OFF&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.resultsettable&quot; level=&quot;OFF&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;logger name=&quot;jdbc.connection&quot; level=&quot;OFF&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
    &amp;lt;/logger&amp;gt;
    &amp;lt;root level=&quot;${LOG_ROOT_LEVEL}&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
        &amp;lt;appender-ref ref=&quot;FILE&quot;/&amp;gt;
    &amp;lt;/root&amp;gt;
    &amp;lt;logger name=&quot;kr.co.ooweat&quot; level=&quot;${LOG_ROOT_LEVEL}&quot; additivity=&quot;false&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;CONSOLE&quot;/&amp;gt;
        &amp;lt;appender-ref ref=&quot;FILE&quot; /&amp;gt;
    &amp;lt;/logger&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/⚒Config</category>
      <category>logback</category>
      <category>logback-spring.xml</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/37</guid>
      <comments>https://ooweat.tistory.com/entry/logback-%EB%82%B4%EA%B0%80%EC%93%B0%EB%8A%94-Spring-logback-%EC%84%A4%EC%A0%95#entry37comment</comments>
      <pubDate>Tue, 28 Nov 2023 09:56:53 +0900</pubDate>
    </item>
    <item>
      <title>[OpenVPN] OpenVPN 연결 오류 Compression for receiving enabled.</title>
      <link>https://ooweat.tistory.com/entry/OpenVPN-OpenVPN-%EC%97%B0%EA%B2%B0-%EC%98%A4%EB%A5%98-Compression-for-receiving-enabled</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCb8he/btsAookH0Rm/MjPc7ITcKnncHKGbU4ZDQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCb8he/btsAookH0Rm/MjPc7ITcKnncHKGbU4ZDQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCb8he/btsAookH0Rm/MjPc7ITcKnncHKGbU4ZDQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCb8he%2FbtsAookH0Rm%2FMjPc7ITcKnncHKGbU4ZDQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;발단&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안패치나 업그레이드를 더 이상 지원하지 않는 CentOS 8.5(이하 A)에서 RHEL9.2(이하 B) 으로 OS를 변경하기 위해 서버를 새로 구축하는 과정 중, 기존에 있던 서비스들을 설정하던 중 발생한 이슈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 API 와 연동을 위해 OpenVPN 을 사용하고 있었는데, OpenVPN 도 보안성 강화를 위해 최신 버전으로 변경하고자 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 OpenVPN 버전: OpenVPN 2.4.12 x86_64-redhat-linux-gnu&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 OpenVPN 버전: OpenVPN&amp;nbsp;2.5.9&amp;nbsp;x86_64-redhat-linux-gnu&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스하고자 하는 항목 중, 두 개의 버전 차이에 따른 구동 이슈는 딱히 없어서 OpenVPN 을 구동하였는데 아래와 같은 오류가 발생하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1OR2d/btsAjtHEQUF/EsNFtns7Ev1cu18nqAJwT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1OR2d/btsAjtHEQUF/EsNFtns7Ev1cu18nqAJwT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1OR2d/btsAjtHEQUF/EsNFtns7Ev1cu18nqAJwT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1OR2d%2FbtsAjtHEQUF%2FEsNFtns7Ev1cu18nqAJwT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;55&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;이슈 확인&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런.. OpenVPN 이 2.5 버전으로 변경되며 비대칭 압축이 기본 동작으로 변경되었는데, 이를 반드시 명시해야만 하는 것으로 변경되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OpenVPN 공식 커뮤니티에서는 아래와 같이 &lt;u&gt;&lt;b&gt;no&lt;/b&gt;&lt;/u&gt; 설정하라고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;AsymmetricCompressionisthedefaultbehaviourinOpenVPN2.5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Asymmetric Compression&lt;/b&gt;&amp;nbsp;is the default behaviour in OpenVPN 2.5&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;--allow-compression&amp;nbsp;and it comes in three flavours:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;asym&amp;nbsp;(default in OpenVPN 2.5) - Use this.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;no&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;yes&amp;nbsp;- Use this if you really do need compression AND you understand the Risk you are taking.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Asymmetric Compression in&amp;nbsp;asym&amp;nbsp;mode means that:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;This node can receive compressed data but it will not send compressed data.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Example configurations:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Recommended: Remove all&amp;nbsp;--comp-lzo&amp;nbsp;and&amp;nbsp;--compress&amp;nbsp;options from your Server and Client configs.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Disable compression: Use&amp;nbsp;--allow-compression no&amp;nbsp;in your Server config.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Asymmetric compression:&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Server use&amp;nbsp;--allow-compression yes&amp;nbsp;and&amp;nbsp;--compress lz4&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Client use&amp;nbsp;--allow-compression asym&amp;nbsp;and&amp;nbsp;--compress lz4&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;This will cause the Server to send compressed data but the Client will only send uncompressed data.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;--comp-lzo&amp;nbsp;and&amp;nbsp;--compress&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;처리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정파일 내, comp-lzo 부분에 no를 추가해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJyFg/btsAnyOGUC3/RLFknKLQl6kwAmZhvFktN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJyFg/btsAnyOGUC3/RLFknKLQl6kwAmZhvFktN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJyFg/btsAnyOGUC3/RLFknKLQl6kwAmZhvFktN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJyFg%2FbtsAnyOGUC3%2FRLFknKLQl6kwAmZhvFktN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;114&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가해주고 openVPN을 재가동하면 정상 동작하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o6Eq2/btsAjv6t7qE/4CzZgWywFodpLkKnmRmnHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o6Eq2/btsAjv6t7qE/4CzZgWywFodpLkKnmRmnHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o6Eq2/btsAjv6t7qE/4CzZgWywFodpLkKnmRmnHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo6Eq2%2FbtsAjv6t7qE%2F4CzZgWywFodpLkKnmRmnHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;64&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
</description>
      <category> Study/ETC</category>
      <category>comp-lzo</category>
      <category>openvpn</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/35</guid>
      <comments>https://ooweat.tistory.com/entry/OpenVPN-OpenVPN-%EC%97%B0%EA%B2%B0-%EC%98%A4%EB%A5%98-Compression-for-receiving-enabled#entry35comment</comments>
      <pubDate>Wed, 15 Nov 2023 15:45:50 +0900</pubDate>
    </item>
    <item>
      <title>[설계] 쿠폰 기능 확장하기</title>
      <link>https://ooweat.tistory.com/entry/%EC%84%A4%EA%B3%84-%EC%BF%A0%ED%8F%B0-%EA%B8%B0%EB%8A%A5-%ED%99%95%EC%9E%A5%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjXXN5/btsAaHTiA4J/ssny0EnmkkXaOafpIKLW20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjXXN5/btsAaHTiA4J/ssny0EnmkkXaOafpIKLW20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjXXN5/btsAaHTiA4J/ssny0EnmkkXaOafpIKLW20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjXXN5%2FbtsAaHTiA4J%2Fssny0EnmkkXaOafpIKLW20%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;306&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;스스로 약속하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;기존에 존재하던 소스를 최대한 재활용하며, 객체지향 생활 체조 9가지 원칙에 따라 개발을 진행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;기존에 존재하던 발권 로직&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존에 개발한 발권 프로세스는 사용자 쿠폰타입, 계정, 금액, 연락처를 입력받아 계정에 등록된 쿠폰 설정 정보 값을 DB 에서 읽어들인 후,&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쿠폰번호 생성 로직을 태워 정보를 저장하고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;_function1&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;현존하는 기능&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 계정에 할당된 쿠폰 설정 정보 읽기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 쿠폰번호 생성 로직&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 쿠폰번호 저장(발권) 로직&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 쿠폰번호 발송 로직&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 쿠폰 정보 읽기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;합칠 기능&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 발송된 쿠폰 번호를 동일한 연락처에 재발송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다이어트 로직&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발송을 담당하는 프로세스가 메소드 단위로 추가되길 원치 않는다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발권 프로세스의 기능들은 개발 당시 단일원칙을 위해 &lt;a href=&quot;#_function1&quot;&gt;모듈화로 신경써서 개발&lt;/a&gt;하였기에 '2. &lt;/b&gt;&lt;b&gt;쿠폰 번호 생성 로직' 에서 갈림길을 나누고,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'5. 쿠폰 정보 읽기' 에서 처리 후, '4. 쿠폰번호 발송 로직' 으로 진행하면 되겠다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699925391396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        //NOTE: additionalInfo &amp;lt;- HashMap&amp;lt;String, String&amp;gt;
        //NOTE: Convenience.StringUtils.rtnRnd(9999): 쿠폰 번호 생성(난수)
        additionalInfo = couponModel.getCouponNo() == null ?
                couponMapper.additionalInfo(
                        Convenience.StringUtils.rtnRnd(9999) + //NOTE: 중간 4자리
                                Convenience.StringUtils.rtnRnd(9999), //NOTE: 끝 4자리
                        couponModel.getGroup())
                :
                couponMapper.getCouponInfo(couponModel.getCouponNo());
                
            couponModel.setCouponNo(additionalInfo.get(&quot;couponNo&quot;));
            couponModel.setExpireDate(additionalInfo.get(&quot;expireDate&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Study/ETC</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/34</guid>
      <comments>https://ooweat.tistory.com/entry/%EC%84%A4%EA%B3%84-%EC%BF%A0%ED%8F%B0-%EA%B8%B0%EB%8A%A5-%ED%99%95%EC%9E%A5%ED%95%98%EA%B8%B0#entry34comment</comments>
      <pubDate>Tue, 14 Nov 2023 10:31:47 +0900</pubDate>
    </item>
    <item>
      <title>[Notion] 연차 계산기 템플릿</title>
      <link>https://ooweat.tistory.com/entry/Notion-%EC%97%B0%EC%B0%A8-%EA%B3%84%EC%82%B0%EA%B8%B0-%ED%85%9C%ED%94%8C%EB%A6%BF</link>
      <description>&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lefbb/btsx3GahKCF/Ab8PjVNyRFW0KpxX7fnbSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lefbb/btsx3GahKCF/Ab8PjVNyRFW0KpxX7fnbSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lefbb/btsx3GahKCF/Ab8PjVNyRFW0KpxX7fnbSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flefbb%2Fbtsx3GahKCF%2FAb8PjVNyRFW0KpxX7fnbSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;400&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;연차계산기 템플릿&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 사용하고 있는 연차 계산기를 공유합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;복제하셔서 본인에게 맞게 커스텀해서 사용하세요 : )&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;연차계산기 템플릿 링크&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a title=&quot;Notion 연차 계산기 템플릿&quot; href=&quot;https://ooweat.notion.site/788d884c7e684de5a4240ad58273a929?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Notion 연차계산기 템플릿&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697002125059&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;연차 계산기&quot; data-og-description=&quot;연차 계산기는 근로자들이 근속 기간에 따라 받을 수 있는 연차의 남은 연차 일수를 계산해주는 도구입니다. 근로법에 따라 근속 기간에 따라 연차 일수가 다르게 지급되며, 연차 계산기를 사용&quot; data-og-host=&quot;ooweat.notion.site&quot; data-og-source-url=&quot;https://ooweat.notion.site/788d884c7e684de5a4240ad58273a929?pvs=4&quot; data-og-url=&quot;https://ooweat.notion.site/788d884c7e684de5a4240ad58273a929&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ooweat.notion.site/788d884c7e684de5a4240ad58273a929?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ooweat.notion.site/788d884c7e684de5a4240ad58273a929?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;연차 계산기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;연차 계산기는 근로자들이 근속 기간에 따라 받을 수 있는 연차의 남은 연차 일수를 계산해주는 도구입니다. 근로법에 따라 근속 기간에 따라 연차 일수가 다르게 지급되며, 연차 계산기를 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ooweat.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPTdDN/btsxSzDbyNO/lbRHGgMW4LlSISem0SzTCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPTdDN/btsxSzDbyNO/lbRHGgMW4LlSISem0SzTCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPTdDN/btsxSzDbyNO/lbRHGgMW4LlSISem0SzTCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPTdDN%2FbtsxSzDbyNO%2FlbRHGgMW4LlSISem0SzTCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;996&quot; height=&quot;871&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;</description>
      <category> Study/ETC</category>
      <category>notion</category>
      <category>노션</category>
      <category>노션 연차 계산기</category>
      <category>연차계산기</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/33</guid>
      <comments>https://ooweat.tistory.com/entry/Notion-%EC%97%B0%EC%B0%A8-%EA%B3%84%EC%82%B0%EA%B8%B0-%ED%85%9C%ED%94%8C%EB%A6%BF#entry33comment</comments>
      <pubDate>Wed, 11 Oct 2023 14:29:34 +0900</pubDate>
    </item>
    <item>
      <title>[MariaDB] 월 중 주차 구하기 WeekOfMonth</title>
      <link>https://ooweat.tistory.com/entry/MariaDB-%EC%9B%94-%EC%A4%91-%EC%A3%BC%EC%B0%A8-%EA%B5%AC%ED%95%98%EA%B8%B0-WeekOfMonth</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWlbj/btst7xawBZ5/8BUobqxHRQzmLKCKZ85Qn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWlbj/btst7xawBZ5/8BUobqxHRQzmLKCKZ85Qn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWlbj/btst7xawBZ5/8BUobqxHRQzmLKCKZ85Qn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWlbj%2Fbtst7xawBZ5%2F8BUobqxHRQzmLKCKZ85Qn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;175&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;정산 페이지의 그래프를 그리기 위해 월 중 주차를 구하는 Function 이 필요하게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아쉽게도 MariaDB에 내장된 함수 중에 WEEKOFMONTH 는 없어서 SELECT 문으로 구현하였다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;SELECT CEILING((DAY(NOW()) - (6 - WEEKDAY(DATE_FORMAT(NOW(), '%Y-%m-01')))) / 7)
           + CASE
                 WHEN 6 - WEEKDAY(DATE_FORMAT(NOW(), '%Y-%m-01')) &amp;gt; 0 THEN 1
                 ELSE 0 END WEEK_OF_MONTH;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;</description>
      <category> Study/ETC</category>
      <category>weekofmonth</category>
      <category>월 중 주차</category>
      <category>월중주차 구하기</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/32</guid>
      <comments>https://ooweat.tistory.com/entry/MariaDB-%EC%9B%94-%EC%A4%91-%EC%A3%BC%EC%B0%A8-%EA%B5%AC%ED%95%98%EA%B8%B0-WeekOfMonth#entry32comment</comments>
      <pubDate>Fri, 15 Sep 2023 15:51:33 +0900</pubDate>
    </item>
    <item>
      <title>확장자 파일 변환기</title>
      <link>https://ooweat.tistory.com/entry/%ED%99%95%EC%9E%A5%EC%9E%90-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장자 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://convertio.co/kr/&quot;&gt;https://convertio.co/kr/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694160858496&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Convertio &amp;mdash; 파일 변환기&quot; data-og-description=&quot;300가지 이상의 포맷 지원 저희는 300가지 이상의 서로 다른 파일 포맷 간의 25600가지 이상의 서로 다른 변환을 지원합니다. 다른 어떤 변환기보다 많은 수입니다. 신속 및 간단 페이지에 간단히 &quot; data-og-host=&quot;convertio.co&quot; data-og-source-url=&quot;https://convertio.co/kr/&quot; data-og-url=&quot;https://convertio.co/kr/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://convertio.co/kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://convertio.co/kr/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Convertio &amp;mdash; 파일 변환기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;300가지 이상의 포맷 지원 저희는 300가지 이상의 서로 다른 파일 포맷 간의 25600가지 이상의 서로 다른 변환을 지원합니다. 다른 어떤 변환기보다 많은 수입니다. 신속 및 간단 페이지에 간단히&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;convertio.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Study/ETC</category>
      <category>gif to mp4</category>
      <category>JPG TO PNG</category>
      <category>png to jpg</category>
      <category>확장자 변환</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/31</guid>
      <comments>https://ooweat.tistory.com/entry/%ED%99%95%EC%9E%A5%EC%9E%90-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98%EA%B8%B0#entry31comment</comments>
      <pubDate>Fri, 15 Sep 2023 15:47:01 +0900</pubDate>
    </item>
    <item>
      <title>차세대 프로젝트 도입기 회고 #1</title>
      <link>https://ooweat.tistory.com/entry/%EC%B0%A8%EC%84%B8%EB%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%8F%84%EC%9E%85%EA%B8%B0-%ED%9A%8C%EA%B3%A0-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y11nt/btsoULFYpuZ/49mJeCcXF63dJZFwIblXd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y11nt/btsoULFYpuZ/49mJeCcXF63dJZFwIblXd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y11nt/btsoULFYpuZ/49mJeCcXF63dJZFwIblXd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY11nt%2FbtsoULFYpuZ%2F49mJeCcXF63dJZFwIblXd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;299&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;발단&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 증가함에 따라 Scale-up 을 할 것인지 Scale-out 을 할 것인지 고민하고 있엇다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러던 중, 연식이 있는 일부 서버들의 배터리가 다운되고, 스토리지가 하나 둘 맛가기 시작했고 Scale-up 으로 진행하기로 했다. (현역으로 몇 년 더 뛸 수 있지만, 재고를 구하려면 중고밖에 답이 없었다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;결정&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Scale-up 을 하는 김에 틈틈히 리팩토링 기회를 노리던 Legacy 프로젝트 소스들도 차세대 작업을 진행하기로 했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 프로젝트들을 담당했던 담당자들도 기회를 노렸으나 &lt;i&gt;&lt;b&gt;&lt;u&gt;ASAP&lt;/u&gt;&lt;/b&gt;&lt;/i&gt; 프로젝트들에 밀려 미루고 미뤘을 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇기에 더욱 '지금이 아니면 안된다' 라는 생각이 지배적이었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기존 서버는 스테이징 서버, CI/CD 서버, 개발서버로 사용하기로 하고, 지금 구조와 동일하게 VM 서버와 DB 서버로 가되 RDBMS 는 기존 Oracle에서 MariaDB 로 변경하며 안정성을 위해 Galera Cluster 를 사용하기로 했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서버는 서비스 중인 프로세스들을 Deploy 하기 위한 &lt;u&gt;뉴타닉스(VM)서버&lt;/u&gt;와 데이터베이스를 위한&lt;u&gt; Dell 사의 R640 (Rack Server)&lt;/u&gt; 로 결정.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;반전&lt;/h3&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반도체 부족 이슈로 일정에 여유가 있을 것이라 생각했지만 뉴타닉스 서버의 도입이 상당이 일찍되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;VM 들을 구축하고, OS 설치와 네트워크 설정, 운영하는 프로세스에 맞는 추가적인 설정을 완료 후, 기존 프로세스들을 카피해 옮기며 구동 테스트를 마쳤다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일이 빠르게 진행되다 보니 데이터베이스 서버를 마냥 기다릴 수 없던 우리 팀은 성능 테스트를 핑계삼아 MariaDB 를 VM에 올리는 욕심을 부려봤다. (기존에 운영중인 프로세스들의 JDBC를 미리 변경)&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런데, 설치 후 Staging단계에서 예상보다 안정적이었고, MAU 1,000 만건을 넘기는 것을 확인하고 VM 상태로 Prod 운영을 시작했다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음....&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
</description>
      <category> Study/ETC</category>
      <category>차세대</category>
      <category>차세대 프로젝트</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/29</guid>
      <comments>https://ooweat.tistory.com/entry/%EC%B0%A8%EC%84%B8%EB%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%8F%84%EC%9E%85%EA%B8%B0-%ED%9A%8C%EA%B3%A0-1#entry29comment</comments>
      <pubDate>Thu, 27 Jul 2023 16:01:30 +0900</pubDate>
    </item>
    <item>
      <title>DDD 란?</title>
      <link>https://ooweat.tistory.com/entry/DDD-%EB%9E%80</link>
      <description>&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfuyvm/btsoQsy6YU6/j5r9Wj7QCcstxP5QYBR8H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfuyvm/btsoQsy6YU6/j5r9Wj7QCcstxP5QYBR8H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfuyvm/btsoQsy6YU6/j5r9Wj7QCcstxP5QYBR8H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfuyvm%2FbtsoQsy6YU6%2Fj5r9Wj7QCcstxP5QYBR8H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;471&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;도메인(Domain-Driven Design)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 모두가 알고 있지만 완벽히 이해하고 정의하기란 쉽지 않기에 한 가지 예를 들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 쇼핑몰을 만든다고 가정한다면, 상품을 주문하는 회원이 있어야하고 주문 시스템, 상품 등록 및 관리 조회, 상품 배송, 결제 등의 기능이 제공되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, '온라인 쇼핑몰' 은 문제 영역인 최상위 도메인에 해당되고, 이를 처리하기 위한 과정 등의 도메인 지식(&lt;span style=&quot;text-align: start;&quot;&gt;Domain Knowledge)들은 상위 도메인에 해당된다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;상위도메인&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xgb20/btsoZcBDo7W/jVGrAY5VPObm1CcBIo6rfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xgb20/btsoZcBDo7W/jVGrAY5VPObm1CcBIo6rfK/img.png&quot; data-alt=&quot;상위 도메인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xgb20/btsoZcBDo7W/jVGrAY5VPObm1CcBIo6rfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxgb20%2FbtsoZcBDo7W%2FjVGrAY5VPObm1CcBIo6rfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;224&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상위 도메인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 도메인은 상위 도메인을 이루어지게하는 필수 구성체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;하위도메인&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원: 회원정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품: 공급처, 판매처, 상품 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문: 주문 상품정보, 주문한 회원, 배송지 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결제: 결제 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송: 배송지, 배송번호, 배송정보..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;도메인 중심 설계(Domain-Driven Design)이란?&lt;/h2&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;도메인(비즈니스 목표)을 중심으로 잘게 쪼개어 설계(또는 문제 해결)해 나가는 방법이다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;객체지향의 특징인 &lt;u&gt;'&lt;b&gt;모듈간의 의존성은 낮추고, 응집성은 최대화'&lt;/b&gt;&lt;/u&gt;&amp;nbsp;하면서 설계한다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;물건을 사기위해(Buy Domain)&lt;/b&gt; 온라인 쇼핑몰에 들어간 A씨는, 그곳에서 물건을 &lt;b&gt;판매 (Sell Domain) &lt;/b&gt;하는&amp;nbsp; B사에서&amp;nbsp;&lt;b&gt;관리(Manage Domain) &lt;/b&gt;하는 물건을 산다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;'Implementing DDD'의 저자 반 버논은 DDD 도입이 필요하지 않은 경우에 대해서는 다음과 같이 말하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;당신의 애플리케이션이 완전히 데이터 중심(data-centric)이며 순수한 CRUD 솔루션에 정말 잘 맞아서, 모든 동작이 간단한 데이터베이스 쿼리를 통해 기본적인 생성, 읽기, 갱신, 삭제 등을 수행할 뿐이라면 DDD가 필요하지 않다. 당신의 팀은 그저 예쁜 데이터베이스 테이블 편집기만 있으면 된다. ...... 당신이 단순한 데이터베이스 개발 도구를 사용해 솔루션을 만들 수 있다면, DDD에 회사의 시간과 돈을 낭비하지 말라.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvOZ40/btsoQKmeifH/oZdXXXBBDaGQLzFAOKa8EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvOZ40/btsoQKmeifH/oZdXXXBBDaGQLzFAOKa8EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvOZ40/btsoQKmeifH/oZdXXXBBDaGQLzFAOKa8EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvOZ40%2FbtsoQKmeifH%2FoZdXXXBBDaGQLzFAOKa8EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;603&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;1. 물건을 사기 위해 필요한 정보를 담은 객체와&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;2. 계산을 하기 위한 정보를 담은 객체&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;3. 관리를 하기 위한 정보를 담은 객체&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;위 3개의&amp;nbsp;Repository 를&amp;nbsp;모두&amp;nbsp;구현하는 것이 맞을까?&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;객체 간 내부 상호작용을 통해(거르고 걸러) 공통&amp;nbsp;&lt;b&gt;집합&lt;/b&gt;을 찾아 Repository로 묶여야만 한다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;오늘 회사에서 집가지 가는 무수히 많은 방법 중 최적의 한 가지 루트를 찾는 네비게이션과 같이 말이다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt; 더 읽을거리&lt;/h2&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/ddd-oriented-microservice&quot;&gt;DDD지향 마이크로 서비스 디자인&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.popit.kr/%ED%95%84%EC%9A%94%ED%95%9C-%EB%82%B4%EC%9A%A9%EB%A7%8C-%EC%B6%94%EB%A0%A4%EC%84%9C-ddd-%EB%8B%B9%EC%9E%A5-%EC%8D%A8%EB%A8%B9%EA%B8%B0/&quot;&gt;필요한 내용만 추려서 DDD 당장 써먹기&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/94&quot;&gt;DDD 핵심만 빠르게 이해하기&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Study/DDD</category>
      <category>DDD</category>
      <category>DDD란</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/26</guid>
      <comments>https://ooweat.tistory.com/entry/DDD-%EB%9E%80#entry26comment</comments>
      <pubDate>Tue, 25 Jul 2023 10:05:09 +0900</pubDate>
    </item>
    <item>
      <title>[React] axios vs fetch / axios fetch 차이 / axios fetch 차이점</title>
      <link>https://ooweat.tistory.com/entry/React-axios-vs-fetch-axios-fetch-%EC%B0%A8%EC%9D%B4-axios-fetch-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4ukI/btsoEpPjTSF/d6g7j7xQ6F64Zxkb9ARSlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4ukI/btsoEpPjTSF/d6g7j7xQ6F64Zxkb9ARSlK/img.png&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;225&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.07&quot; style=&quot;width: 48.504%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4ukI/btsoEpPjTSF/d6g7j7xQ6F64Zxkb9ARSlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4ukI%2FbtsoEpPjTSF%2Fd6g7j7xQ6F64Zxkb9ARSlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttU0P/btsoMIAJSEB/EzOUxCdEP1FiUtYY3Z37kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttU0P/btsoMIAJSEB/EzOUxCdEP1FiUtYY3Z37kk/img.png&quot; style=&quot;width: 50.3332%;&quot; width=&quot;566&quot; height=&quot;318&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;719&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttU0P/btsoMIAJSEB/EzOUxCdEP1FiUtYY3Z37kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttU0P%2FbtsoMIAJSEB%2FEzOUxCdEP1FiUtYY3Z37kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;axiso&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Axios 는 브라우저, Node.js 를 위한 Promise API 를 활용하는 &lt;b&gt;&lt;u&gt;HTTP 비동기 통신 라이브러리&lt;/u&gt;&lt;/b&gt;(return 을 promise 객체로 해주기 때문에, response 데이터를 다루기 쉬운 장점)&lt;/p&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;axios 특징&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영 환경에 따라 브라우저의 XMLHttpRequest 객체 또는 Node.js의 http api 사용&lt;/li&gt;
&lt;li&gt;Promise(ES6) API 사용&lt;/li&gt;
&lt;li&gt;요청과 응답 데이터의 변형&lt;/li&gt;
&lt;li&gt;HTTP 요청 취소&lt;/li&gt;
&lt;li&gt;HTTP 요청과 응답을 JSON 형태로 자동 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;axios 기초문법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690163432286&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* axios 파라미터 문법 예시 */

axios({
    method: &quot;get&quot;, // 통신 방식(GET/POST)
    url: &quot;www.google.com&quot;, // 서버
    headers: {'X-Requested-With': 'XMLHttpRequest'} // 요청 헤더 설정
    params: { name: &quot;ooweat&quot;, blog: &quot;tistory&quot; }, // ?파라미터를 전달
    responseType: 'json', // default
    
    maxContentLength: 2000, // http 응답 내용의 max 사이즈
    validateStatus: function (status) {
      return status &amp;gt;= 200 &amp;amp;&amp;amp; status &amp;lt; 300; // default
    }, // HTTP응답 상태 코드에 대해 promise의 반환 값이 resolve 또는 reject 할지 지정
    proxy: {
      host: '127.0.0.1',
      port: 3100,
      auth: {
        username: 'ooweat',
        password: '1234'
      }
    }, // proxy서버의 hostname과 port를 정의
    maxRedirects: 5, // node.js에서 사용되는 리다이렉트 최대치를 지정
    httpsAgent: new https.Agent({ keepAlive: true }), // node.js에서 https를 요청을 할때 사용자 정의 agent를 정의
})
.then(function (response) {
	console.log(response.data)
    // response Action
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;axios 응용문법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690172620422&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const API =axios.create({
    baseURL: `http://localhost:8080/`,    
    timeout: 30000,
    headers: {
        &quot;Content-Type&quot; : `application/json;charset=UTF-8`,
        &quot;Access-Control-Allow-Origin&quot;: &quot;*&quot;,
        &quot;Accept&quot;: &quot;application/json&quot;,
    }
});

let [resData, setTotAmt] = useState({
        totAmount : 0,
})

API.post(&quot;/common/test&quot;, reqData)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;fetch&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Javascript 에서 기본적으로 제공하는 기능으로, Promise 기반으로 구성되어 있어 axios 가 등장하기 전, &lt;u&gt;&lt;b&gt;비동기 처리 프로그래밍&lt;/b&gt;&lt;/u&gt; 개발 시, 필수적으로 사용하는 기능이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;fetch 는 똑같은 코드가 반복되는 경우가 많기 때문에, 모듈화를 통해 따로 선언해놓고 변수를 할당하는 것이 편의성이 용이하다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690245634755&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function post(host, path, body, headers = {}) {
  const url = `https://${host}/${path}`;
  const options = {
    method: &quot;POST&quot;,
    headers: {
      &quot;Content-Type&quot;: &quot;application/json&quot;,
      ...headers,
    },
    body: JSON.stringify(body),
  };
  const res = await fetch(url, options);
  const data = await res.json();
  if (res.ok) {
    return data;
  } else {
    throw Error(data);
  }
}

//사용 시, 
post(&quot;news.naver.com&quot;, &quot;posts&quot;, {
  title: &quot;날씨&quot;,
  body: &quot;화창&quot;,
  contentSeq: 1049,
})
  .then((data) =&amp;gt; console.log(data))
  .catch((error) =&amp;gt; console.log(error));&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;fetch 기초 문법&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690245385203&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch(&quot;https://news.naver.com&quot;, {
  method: &quot;POST&quot;, // GET(Default), POST, PUT(전체수정), PATCH(일부수정), DELETE(삭제)
  headers: { // 헤더 조작
    &quot;Content-Type&quot;: &quot;application/json&quot;,
  },
  body: JSON.stringify({ // 자바스크립트 객체를 json화 한다.
    title: &quot;날씨&quot;,
    body: &quot;화창한 봄날!&quot;,
    contentSeq: 1049,
  }),
})
  .then((response) =&amp;gt; response.json())
  .then((data) =&amp;gt; console.log(data))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;fetch 응용 문법&lt;/h3&gt;
&lt;pre id=&quot;code_1690245680212&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch(myRequest)
  .then(response =&amp;gt; {
    if (response.status === 200) {
      return response.json();
    } else {
      throw new Error('Something went wrong on api server!');
    }
  })
  .then(response =&amp;gt; {
    console.debug(response);
    // ...
  }).catch(error =&amp;gt; {
    console.error(error);
  });&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;#Index.jsx
import React, {useEffect, useState} from &quot;react&quot;;
import API from '../util/api.js';
import {useParams} from &quot;react-router-dom&quot;;
import Loader from &quot;../component/loader&quot;;

useEffect(() =&amp;gt; {
        async function callAPI() {
            const res = await API.post(&quot;/common/info&quot;, reqData)
            console.log(res.data)
            setResData(res.data)
            setLoading(false)
        }

        setLoading(true)
        callAPI().then(r =&amp;gt; console.log(&quot;Connected&quot;))
    }, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;axios vs fetch 의 차이점&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;axios&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;fetch&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3rd Party lib 로 설치가 필요&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;현대 브라우저에 빌트인이라 설치 필요 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;XSRF 보호를 해준다.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;별도 보호 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;data 속성을 사용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;body 속성을 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;data는 object를 포함한다&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;body는 문자열화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;status가 200이고 statusText가 &amp;lsquo;OK&amp;rsquo;이면 성공이다&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;응답객체가 ok 속성을 포함하면 성공이다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;JSON데이터 형식으로 자동변환&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;.json()메서드 선언 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;요청을 취소할 수 있고 타임아웃이 가능하다.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;해당 기능 존재 하지않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;HTTP 요청을 가로챌수 있음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;기본적으로 제공하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Download 진행에 대해 기본적인 지원을 함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;지원하지 않음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;대부분의 브라우저를 지원함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Chrome 42+, Firefox 39+, Edge 14+, and Safari 10.1+이상에 지원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/⚛️React</category>
      <category>axios</category>
      <category>axios fetch 차이</category>
      <category>axios vs fetch</category>
      <category>fetch</category>
      <category>react</category>
      <category>react ajax</category>
      <category>react api</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/25</guid>
      <comments>https://ooweat.tistory.com/entry/React-axios-vs-fetch-axios-fetch-%EC%B0%A8%EC%9D%B4-axios-fetch-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry25comment</comments>
      <pubDate>Mon, 24 Jul 2023 10:01:37 +0900</pubDate>
    </item>
    <item>
      <title>[Jenkins] github 프로젝트 배포 시 기본 설정 따라하기</title>
      <link>https://ooweat.tistory.com/entry/Jenkins-%EA%B8%B0%EB%B3%B8%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ5VBA/btr5epPo0Zj/6UNrGAdXV5m3zGstkuQjgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ5VBA/btr5epPo0Zj/6UNrGAdXV5m3zGstkuQjgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ5VBA/btr5epPo0Zj/6UNrGAdXV5m3zGstkuQjgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ5VBA%2Fbtr5epPo0Zj%2F6UNrGAdXV5m3zGstkuQjgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;398&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로젝트 설정하기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #e8e6e3; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b data-darkreader-inline-color=&quot;&quot;&gt;&lt;br /&gt;* General&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #c8c3bc; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt; 본문1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZHJzi/btr5gvn5q0s/XkcQdLYNUV9CYFFgx6WzhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZHJzi/btr5gvn5q0s/XkcQdLYNUV9CYFFgx6WzhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZHJzi/btr5gvn5q0s/XkcQdLYNUV9CYFFgx6WzhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZHJzi%2Fbtr5gvn5q0s%2FXkcQdLYNUV9CYFFgx6WzhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;913&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #e8e6e3; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;&lt;b&gt;* 소스 코드 관리&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #c8c3bc; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt; 본문1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwVljq/btr5gu3Ok2k/DzkLI2zvtt3QDRYHdIMun1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwVljq/btr5gu3Ok2k/DzkLI2zvtt3QDRYHdIMun1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwVljq/btr5gu3Ok2k/DzkLI2zvtt3QDRYHdIMun1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwVljq%2Fbtr5gu3Ok2k%2FDzkLI2zvtt3QDRYHdIMun1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;913&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #e8e6e3; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;* 빌드 환경 / Post Steps&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #c8c3bc; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt; 본문1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LwDFW/btr5paQAtaQ/BChGOKMrCPWKbYvotHEjKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LwDFW/btr5paQAtaQ/BChGOKMrCPWKbYvotHEjKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LwDFW/btr5paQAtaQ/BChGOKMrCPWKbYvotHEjKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLwDFW%2Fbtr5paQAtaQ%2FBChGOKMrCPWKbYvotHEjKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;913&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #e8e6e3; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;* 빌드 후 조치&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #c8c3bc; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt; 본문1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VHAxm/btr5nK6cRpg/pnnYXK4smKcrKVyN7VVzI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VHAxm/btr5nK6cRpg/pnnYXK4smKcrKVyN7VVzI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VHAxm/btr5nK6cRpg/pnnYXK4smKcrKVyN7VVzI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVHAxm%2Fbtr5nK6cRpg%2FpnnYXK4smKcrKVyN7VVzI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;913&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> DevOps/ &amp;zwj; Jenkins</category>
      <category>Jenkins</category>
      <category>jenkins 설정</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/20</guid>
      <comments>https://ooweat.tistory.com/entry/Jenkins-%EA%B8%B0%EB%B3%B8%EC%84%A4%EC%A0%95#entry20comment</comments>
      <pubDate>Mon, 20 Mar 2023 14:11:10 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] crontab, 쉘 스크립트 조합으로 리눅스 로그 관리하기 (feat.crontab)</title>
      <link>https://ooweat.tistory.com/entry/Linux-crontab-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A1%B0%ED%95%A9%EC%9C%BC%EB%A1%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-featcrontab</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTHWAA/btr1Kw4IYkG/885g2KnAns1cpwTX2SBjn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTHWAA/btr1Kw4IYkG/885g2KnAns1cpwTX2SBjn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTHWAA/btr1Kw4IYkG/885g2KnAns1cpwTX2SBjn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTHWAA%2Fbtr1Kw4IYkG%2F885g2KnAns1cpwTX2SBjn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;개요(&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;feat. Linux&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;)&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot; data-darkreader-inline-color=&quot;&quot;&gt;*&lt;/span&gt; 왜 이 작업을 하는거지?&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;  OS를 사용하는 순간부터 우리는 필수적으로 &lt;i&gt;&lt;u&gt;&lt;b&gt;Storage capacity&lt;/b&gt;&lt;/u&gt;&lt;/i&gt; 관리를 하게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;OS가 설치되며 기본적으로 가져가는 용량을 뺀 나머지의 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;한정된 용량속에서 우리는 OS를 사용하게 되는데,&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;관리를 하지 않으면 윈도우에서 우리가 늘 'C:\ 드라이브' 에 용량이 부족 또는 Mac OS에서 APFS의 Volume 이 가득차서 일부 서비스가 동작하지 않거나, 원하는 자료를 다운로드 받지 못하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;이 사례가 일반 데스크탑 또는 랩탑이 아닌 &lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;실무에서 사용하는 서버에 적용될 경우 &lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;더 이상 로그를 쌓을 수 없어 서비스가 서버리게 되는 경우도 심심치 않게 볼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;사용하지 않거나 오래된 파일들을 &lt;u&gt;&lt;i&gt;&lt;b&gt;보관 주기에 따라 보관&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;하며 (보관 시, 용량의 차지를 줄이기 위해 &lt;u&gt;&lt;i&gt;&lt;b&gt;압축하여 보관&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;) &lt;u&gt;&lt;i&gt;&lt;b&gt;정해진 일정량 만큼의 데이터를 지속적으로 유지하여 관리&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&amp;nbsp;하는게 OS를 제대로 사용할 수 있는 첫 번째 방법이다.&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 보관주기(&lt;span style=&quot;background-color: #131516; color: #c1bbb3;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Crontab&lt;/span&gt;)와 유지 관리를 위한 간단한 기본 스크립트 프로그래밍(Shell Script)를 통해 간략하게 사용하고자 한다.&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;보관주기와 프로그래밍에 '&lt;span style=&quot;background-color: #131516; color: #c1bbb3;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Crontab&lt;/span&gt;' 과 'Shell Script' 를 사용하는 이유는 모든 OS에서 별도의 모듈 설치 없이 기본적으로 OS 에 내장되어 지원하기 때문이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Crontab&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Crontab 이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #181a1b; color: #c7c2bb;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Crontab은 리눅스 운영체제에서 배치 작업을 스케쥴링 하기 위한 프로그램으로, &lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #c7c2bb;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;특정 시간 또는 정기적인 주기에 따라 작업이 실행되게끔 스케쥴링을 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Crontab은 아래와 같이 주기를 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;   *          *          *         *          *
분(0-59)  시간(0-23)  일(1-31)   월(1-12)   요일(0-7)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Crontab 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 아래 예제를 이용하여 개발/운영 등 실무에 적용할 예정이다. 쉘 스크립트가 실행되며 남기는 로그들을 기록하는 것과 그렇지 않은 것 두 가지 스타일 중 원하고자 하는 내용을 선택하도록 한다.&amp;nbsp; (Tip. 실무에서 log를 백업하는 과정 중 중요도에 따라 저장하는 내용이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WEB 실행 로그나, 간단한 서비스 실행 로그와 같은 경우에는 과감하게 지우며, 지우면서 남기는 로그는 저장하지 않는다. )&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;#매월 1일 00시 00분에 /app/cron/ 경로에 있는 log_backup.sh 프로그램을 실행한다. 
#실행되며 남기는 로그는 저장하지 않는다.
00 00 1 * * /app/cron/log_backup.sh &amp;lt; /dev/null 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1

#매월 1일 00시 00분에 /app/cron/ 경로에 있는 tomcat_log_backup.sh 프로그램을 실행한다. 
#실행되며 남기는 로그 /app/logs/ 경로에 있는 tomcat_cron.log 파일에 저장한다.
00 00 1 * * /app/cron/tomcat_log_backup.sh &amp;gt; /app/logs/tomcat_cron.log&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Shell Script&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shell Script 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘 스크립트란 간단히 말하자면 Unix/Linux 커맨드등을 나열해서 프로그래밍하여 실행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 또한 아주 간단한 프로그래밍 이기 때문에, 언제, 어디서, 어떤 조건으로 어떠한 명령을 실행시킬 것인가 ? 등을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shell Script&lt;span&gt;&amp;nbsp;&lt;/span&gt;적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 아래 예제를 이용하여 적용해보고자 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;*매달 1일에 지난 달 데이터를 백업하며, 90일간의 데이터를 유지한다. 4개월 이상 지난 Dir은 삭제한다.&lt;/blockquote&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;#! /bin/sh
. ~/.bash_profile

#System : Backup
#Purpose : Log Backup
#author : ooweat

#매달 1일에 지난 달 데이터를 백업
currdate=`date '+%Y%m%d'`
#지난 달
BACKUP_MONTH=`date +%Y%m -d '-1month'`
RM_MONTH=`date +%Y%m -d '-4month'`
FILE_STYLE=*`date +%Y-%m -d '-1month'`*

#Tomcat 사용 시,
TARGETPATH=&quot;/app/service/tomcat/logs&quot;
#기타 Service 사용 시,
#TARGETPATH=&quot;/app/service/logs&quot;

echo '#####################################################################################'
echo '##########################[ MONTHLY LOG BACKUP START ]###############################'
echo '#############################[ JOBDATE ]#############################################'
echo '############################[ '$currdate' ]#############################################'
echo '#####################################################################################'

cd $TARGETPATH
if [ ! -d $BACKUP_MONTH ]
then
        mkdir -p $BACKUP_MONTH
        chmod 775 $BACKUP_MONTH
fi
echo '#####################################################################################'
echo 'Log Files Moved On Monthly Dir'
echo '#####################################################################################'
#파일 이동
mv $TARGETPATH/$FILE_STYLE $TARGETPATH/$BACKUP_MONTH/

#백업 디렉토리로 이동
cd $TARGETPATH/$BACKUP_MONTH/

echo '#####################################################################################'
echo 'Files xz'
echo '#####################################################################################'
#압축
xz ./*

cd $TARGETPATH
cd $(pwd)
echo '#####################################################################################'
echo 'Delete Old Files'
echo '#####################################################################################'
#생성일로부터, 90일이 지난 파일 삭제
find $TARGETPATH/* -mtime +90 -exec rm {} \;
echo '#####################################################################################'
echo 'Delete Old Dir'
echo '#####################################################################################'
find $TARGETPATH/$RM_MONTH -exec rmdir {} \;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> DevOps/ OS</category>
      <category>crontab</category>
      <category>Linux</category>
      <category>linux log backup</category>
      <category>log</category>
      <category>Shell script</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/18</guid>
      <comments>https://ooweat.tistory.com/entry/Linux-crontab-%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A1%B0%ED%95%A9%EC%9C%BC%EB%A1%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-featcrontab#entry18comment</comments>
      <pubDate>Mon, 6 Mar 2023 14:29:02 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] CQRS 이런거였어?</title>
      <link>https://ooweat.tistory.com/entry/MSA-CQRS-%EC%9D%B4%EB%9F%B0%EA%B1%B0%EC%98%80%EC%96%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;!--quotation Start --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5czJ9/btr16iSoLYb/k72yhMu1d0oNpNQcGHZZ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5czJ9/btr16iSoLYb/k72yhMu1d0oNpNQcGHZZ10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5czJ9/btr16iSoLYb/k72yhMu1d0oNpNQcGHZZ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5czJ9%2Fbtr16iSoLYb%2Fk72yhMu1d0oNpNQcGHZZ10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;361&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;CQRS (&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Command Query Responsibility Segregation&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;)&lt;span style=&quot;color: #8a3db6;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot; data-darkreader-inline-color=&quot;&quot;&gt;*&lt;/span&gt; CQRS 란?&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt; 직역하자면 명령과 쿼리의 역할을 구분한다는 것이다. Create-Insert, Update, Delete 와 같이 데이터를 변경하는 것과&lt;/p&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;Select-Read 와 같이 데이터를 조회하는 것 두 가지의 책임을 분리한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot; data-darkreader-inline-color=&quot;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;왜 사용할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;우리가 사용하는(혹은 사용했던) 전통적인 CRUD 아키텍쳐 기반에서 시스템을 유지보수하다 보면, 추가적인 요구사항과 정책의 변화들로 자연스럽게 로직상의 Domain Model 복잡도가 증가하게 된다. 시간이 갈 수록 유지보수 비용은 점진적으로 증가하게 되며 해당 시스템은 첫 기획의도와는 다른 방향으로 변질되는 케이스를 종종 볼 수 있다. 그렇게 모든 요구사항을 충족하며 확장성을 고려한 Domain Model 을 만드는 건 굉장히 어려운 일이 되어버렸다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 우리 개발자들은 고민하기 시작했다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;무엇이 문제일까? 왜 문제가 될까?&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;그 시작점은 모델에 있었다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;사용자 조회, Admin, 대시보드 등 비즈니스 로직은 Controller 부터 분리되어 있지만 하나의 Model을 사용하여 명령과 조회를 수행한다는 것을 확인했다.&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 개명을 하게되어 이름만을 바꾸고 싶을 뿐인데 Model 자체를 던져버리는 경우가 많았고, SumCount 와 같은 관리용 데이터 등이 실제 조회에서는 사용되지 않으나 선언되어 있는 경우가 많았다. (이런 내역을 다 알지 못하는 후대 개발자들은 스파게티 코드가 된 프로젝트를 Legacy 모드로 변환시켜 차세대 프로젝트로 재개발을 진행한다.)&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 명령 도메인과 조회 도메인을 분리하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;i&gt;&lt;u&gt;&lt;b&gt;DDD(Domain-driven design)&lt;/b&gt;&lt;/u&gt;&lt;/i&gt; 의 시작으로 볼 수 있으나, B&lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;ounded Context 에서만 사용되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot; data-darkreader-inline-color=&quot;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;어떻게 구현할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #181a1b; color: #c8c3bc;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;마틴 파울러는 CQRS가 아래와 같은 아키텍쳐 패턴과 방법론을 파생하거나 혹은 필요로 한다고 했다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Event Sourcing&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #dfdcd7; --darkreader-inline-bgcolor: #262a31; --darkreader-inline-color: #d1cdc7;&quot; data-darkreader-inline-color=&quot;&quot;&gt;EagerReadDerivation&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Domain Driven Design&lt;/li&gt;
&lt;li&gt;Eventual Consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTY5bB/btr1WlQrGT4/ihzwmJuXofksmldRXBEz70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTY5bB/btr1WlQrGT4/ihzwmJuXofksmldRXBEz70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYVVR6%2FbtqXYZRqqIY%2FkjsYVG9XjP5kgcRG27jCXk%2Fimg.png&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;579&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;32.38&quot; style=&quot;width: 31.6292%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTY5bB/btr1WlQrGT4/ihzwmJuXofksmldRXBEz70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTY5bB%2Fbtr1WlQrGT4%2FihzwmJuXofksmldRXBEz70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QTETv/btr2hJ3tseZ/3rET4b6tBFsmJ4yoETTdF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QTETv/btr2hJ3tseZ/3rET4b6tBFsmJ4yoETTdF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7sO11%2FbtqX0p3aNsB%2FKXZjsm27gKb8kqkCeIquEK%2Fimg.png&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;583&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.5247%; margin-right: 10px;&quot; data-widthpercent=&quot;34.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QTETv/btr2hJ3tseZ/3rET4b6tBFsmJ4yoETTdF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQTETv%2Fbtr2hJ3tseZ%2F3rET4b6tBFsmJ4yoETTdF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU5Ot3/btr1XOELPC0/cQ73SBxsSU0VdbkaONByw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU5Ot3/btr1XOELPC0/cQ73SBxsSU0VdbkaONByw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzhyQH%2FbtqX1oXhHHB%2Fww5BKe31ZXF7eKP3FVx5V1%2Fimg.png&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;601&quot; data-is-animation=&quot;false&quot; style=&quot;width: 32.5206%;&quot; data-widthpercent=&quot;33.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU5Ot3/btr1XOELPC0/cQ73SBxsSU0VdbkaONByw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU5Ot3%2Fbtr1XOELPC0%2FcQ73SBxsSU0VdbkaONByw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #181a1b; color: #c8c3bc;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;왼쪽에서 오른쪽으로 기존 모델 아키텍처에서 CQRS 패턴이 적용되는 모습을 볼 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #181a1b; color: #c8c3bc;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;CQRS 적용의 마지막 단계에서 RDBMS와 NoSQL 관계에서는 Kafka와 같은 메시지 큐가 적용될 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #181a1b; color: #c8c3bc;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;여기에 Redis, Elasticsearch 를 곁들인다면 성능면에서도 훌륭한 개선이 될 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lryk1/btr18EH09VQ/OaaI4sMtotgdPRWovjKb0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lryk1/btr18EH09VQ/OaaI4sMtotgdPRWovjKb0K/img.png&quot; data-alt=&quot;출처:&amp;amp;amp;nbsp;https://www.ibm.com/cloud/architecture/architectures/event-driven-cqrs-pattern/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lryk1/btr18EH09VQ/OaaI4sMtotgdPRWovjKb0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flryk1%2Fbtr18EH09VQ%2FOaaI4sMtotgdPRWovjKb0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;392&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;amp;nbsp;https://www.ibm.com/cloud/architecture/architectures/event-driven-cqrs-pattern/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CQRS 패턴을 알게된 후, &lt;span style=&quot;color: #c8c3bc;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Toy Project 에서 &lt;/span&gt;구현한 경험이 있다. 이 프로젝트는 규모가 작고 통합테스트의 Cost 가 Production 단계에서의 단위테스트보다 작기에 케이스가 적은 관계로 아쉽게도 당장 활용은 어려울 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Legacy 와 스파게티 코드로 가득한 Production 프로젝트들을 개선하는 작업 진행중에 발견하여 스터디한 CQRS 패턴이 훗 날 큰 도움이 되기를 바라며 천천히 차근차근 진행해보아야겠다.&lt;/p&gt;</description>
      <category> Study/MSA</category>
      <category>cqrs</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/17</guid>
      <comments>https://ooweat.tistory.com/entry/MSA-CQRS-%EC%9D%B4%EB%9F%B0%EA%B1%B0%EC%98%80%EC%96%B4#entry17comment</comments>
      <pubDate>Mon, 6 Mar 2023 14:22:57 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Collections / 자바 컬렉션</title>
      <link>https://ooweat.tistory.com/entry/Java-Collections-%EC%9E%90%EB%B0%94-%EC%BB%AC%EB%A0%89%EC%85%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAAcop/btrZAHs9hQl/pyKJAtaLMOf09cTGBcTUA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAAcop/btrZAHs9hQl/pyKJAtaLMOf09cTGBcTUA0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAAcop/btrZAHs9hQl/pyKJAtaLMOf09cTGBcTUA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAAcop%2FbtrZAHs9hQl%2FpyKJAtaLMOf09cTGBcTUA0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;800&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;컬렉션&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt; 컬렉션은 다수의 데이터를 다루는데 굉장히 섬세하고 다양하게 클래스들로 구현되어 제공되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스와 다형성을 이용해 객체지향적 설계를 통한 표준화가 완성되어 있어, 우리 선배 프로그래머들이 머리를 싸매고 고생하셨던 것들을 현재 우리들은 편하게 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Collection프레임웍의 핵심 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;인터페이스&lt;/td&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;List&lt;/td&gt;
&lt;td&gt;순서가 있는 데이터의 집합. 데이터의 중복을 허용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구현)ArrayList, LinkedList, Stack, Vector etc..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;Set&lt;/td&gt;
&lt;td&gt;순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구현)HashSet, TreeSet etc..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;Map&lt;/td&gt;
&lt;td&gt;키와 값의 한 쌍으로 이루어진 데이터의 집합.&lt;br /&gt;순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구현)HashMap, TreeMap, Hashtable, Properties etc..&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용 시에는 각 컬렉션들의 특징을 잘 파악하고, 어떤 컬렉션 클래스를 사용해야하는지 신중이 결정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 역시도.. 상위클래스가 모든 것을 포함하기에 최상위 클래스만 썼던 지난 날들이 생각난다... List가 필요하면 무조건 List를 사용했던..ArrayList를 썼어야 했는데.. 유저가 증가함으로 인해 메모리를 최적화하던 그 순간 느끼게 되었지만 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Collection 인터페이스에 정의된 메서드&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;메서드&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean add(Object o)&lt;br /&gt;boolean addAll(Collection c)&lt;/td&gt;
&lt;td&gt;지정된 객체(o) 또는 Collection(c) 의 객체들을 Collection에 추가한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;void clear()&lt;/td&gt;
&lt;td&gt;Collection의 모든 객체를 삭제한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean contains(Object o)&lt;br /&gt;boolean containsAll(Collection c)&lt;/td&gt;
&lt;td&gt;지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean equals(Object o)&lt;/td&gt;
&lt;td&gt;동일한 Collection 인지 비교한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int hashCode()&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Collection의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;hash code를 반환한다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean isEmpty()&lt;/td&gt;
&lt;td&gt;Collection이 비어있는지 확인한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Iterator iterator()&lt;/td&gt;
&lt;td&gt;&lt;span&gt;Collection의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Iterator를 얻어서 반환한다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean remove(Object o)&lt;/td&gt;
&lt;td&gt;지정된 객체를 삭제한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean removeAll(Collection c)&lt;/td&gt;
&lt;td&gt;지정된 Collection에 포함된 객체들을 삭제한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean retainAll (Collection c)&lt;/td&gt;
&lt;td&gt;지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 이 작업으로 인해 Collection에 변화가 있으면 true를 그렇지 않으면 false를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int size()&lt;/td&gt;
&lt;td&gt;Collection에 저장된 객체의 개수를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object[] toArray()&lt;/td&gt;
&lt;td&gt;Collection에 저장된 객체를 객체배열(Object[])로 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object[] toArray(Object[] a)&lt;/td&gt;
&lt;td&gt;지정된 배열에 Collection의 객체를 저장해서 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/☕Java</category>
      <category>Java Collections</category>
      <category>자바 컬렉션</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/11</guid>
      <comments>https://ooweat.tistory.com/entry/Java-Collections-%EC%9E%90%EB%B0%94-%EC%BB%AC%EB%A0%89%EC%85%98#entry11comment</comments>
      <pubDate>Thu, 16 Feb 2023 17:30:30 +0900</pubDate>
    </item>
    <item>
      <title>[Basic] String to Date, Date to String 형 변환</title>
      <link>https://ooweat.tistory.com/entry/Java-String-to-Date-Date-to-String</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLFbC/btrZznh3pGI/mmj7A0c7cenZBTwEnJ75f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLFbC/btrZznh3pGI/mmj7A0c7cenZBTwEnJ75f1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLFbC/btrZznh3pGI/mmj7A0c7cenZBTwEnJ75f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLFbC%2FbtrZznh3pGI%2Fmmj7A0c7cenZBTwEnJ75f1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;800&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;Code&lt;/h2&gt;
&lt;pre id=&quot;code_1676535993597&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.text.SimpleDateFormat;
import java.util.Date;		
		
        //String to Date
        String str=&quot;2020-08-12 17:52:08&quot;;		
		SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;);
		Date strToDate=sdf.parse(str);	//return : Wed Aug 12 17:52:08 KST 2020		
        
        //Date to String
        SimpleDateFormat f1 = new SimpleDateFormat(&quot;yyyyMMdd&quot;);	
		SimpleDateFormat f2 = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);
		SimpleDateFormat f3 = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;);
		
		Date sysdate =  new Date();	//return : Wed Aug 12 17:52:08 KST 2020
        
		String sys1=f1.format(sysdate);
		String sys2=f2.format(sysdate);
		String sys3=f3.format(sysdate);
        
		System.out.println(sys1);	//return : 20200812
		System.out.println(sys2);	//return : 2020-08-12
		System.out.println(sys3);	//return : 2020-08-12 17:52:08&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
</description>
      <category> Develop/☕Java</category>
      <category>date to string</category>
      <category>String to Date</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/10</guid>
      <comments>https://ooweat.tistory.com/entry/Java-String-to-Date-Date-to-String#entry10comment</comments>
      <pubDate>Thu, 16 Feb 2023 17:25:22 +0900</pubDate>
    </item>
    <item>
      <title>[Basic] String to int , int to String 형변환</title>
      <link>https://ooweat.tistory.com/entry/Java-java-string-to-int-int-to-string</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2uVqc/btrZzMu5AYU/xkLONq07aFGTlE6COFWwg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2uVqc/btrZzMu5AYU/xkLONq07aFGTlE6COFWwg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2uVqc/btrZzMu5AYU/xkLONq07aFGTlE6COFWwg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2uVqc%2FbtrZzMu5AYU%2FxkLONq07aFGTlE6COFWwg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;800&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 class=&quot;h2Style&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1676535942022&quot; class=&quot;reasonml&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//String to Int
String str = &quot;12345&quot;;
int num = Integer.parseInt(str);

//Int to String
int num2 = 123;
String str2 = Integer.toString(num2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/☕Java</category>
      <category>int to string</category>
      <category>string to int</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/9</guid>
      <comments>https://ooweat.tistory.com/entry/Java-java-string-to-int-int-to-string#entry9comment</comments>
      <pubDate>Thu, 16 Feb 2023 17:23:39 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 유용한 필수 플러그인 추천</title>
      <link>https://ooweat.tistory.com/entry/IntelliJ-%EC%9C%A0%EC%9A%A9%ED%95%9C-%ED%95%84%EC%88%98-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%B6%94%EC%B2%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBuO5/btrZtqmha8F/fR3CpnKTnMILWkCyVVuun0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBuO5/btrZtqmha8F/fR3CpnKTnMILWkCyVVuun0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBuO5/btrZtqmha8F/fR3CpnKTnMILWkCyVVuun0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBuO5%2FbtrZtqmha8F%2FfR3CpnKTnMILWkCyVVuun0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;576&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 class=&quot;h2Style&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;플러그인 추천&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&amp;nbsp;개요&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt; IntelliJ 를 사용하면서 상당히 유용했고, 실무에 도움이 된 내용들로 정리해봤다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3w0ta/btrZxeFHu42/BjP8NKLMkzMr8cI3sHkFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3w0ta/btrZxeFHu42/BjP8NKLMkzMr8cI3sHkFFk/img.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;781&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3w0ta/btrZxeFHu42/BjP8NKLMkzMr8cI3sHkFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3w0ta%2FbtrZxeFHu42%2FBjP8NKLMkzMr8cI3sHkFFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buIUlk/btrZBFaBZnw/tFqjJb2SJgfkYK6GsZmOpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buIUlk/btrZBFaBZnw/tFqjJb2SJgfkYK6GsZmOpK/img.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;781&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buIUlk/btrZBFaBZnw/tFqjJb2SJgfkYK6GsZmOpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuIUlk%2FbtrZBFaBZnw%2FtFqjJb2SJgfkYK6GsZmOpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없을 땐 몰랐지만 있으니까 너무 만족스러운 플러그인들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&amp;nbsp;추천시작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서부터 순차적으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. CodeGlance&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우측 상단에 코드의 미니맵을 제공해준다. 스크롤에 따라 함께 움직인다. 코드가 길 수록 빛을 발한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb1oAt/btrZzoHXuga/JXarXyT3PcH1TRkhcLjUZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb1oAt/btrZzoHXuga/JXarXyT3PcH1TRkhcLjUZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb1oAt/btrZzoHXuga/JXarXyT3PcH1TRkhcLjUZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb1oAt%2FbtrZzoHXuga%2FJXarXyT3PcH1TRkhcLjUZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;485&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MXcoJ/btqGzY9uhfN/0g270uFGZ7v6fHMhBN3lfK/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;CodeGlance&quot;&gt;&lt;/span&gt;CodeGlance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Grep Console&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이클립스에서도 유명한 플러그인으로, 콘솔로그에서 내가 원하는 로그나 로그 레벨 별 색상을 지정할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;색상을 지정함으로 콘솔 로그의 가독성을 훨씬 더 좋게 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs7gNA/btrZBsoTxVy/JifzmEHriyBW7mWifn26D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs7gNA/btrZBsoTxVy/JifzmEHriyBW7mWifn26D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs7gNA/btrZBsoTxVy/JifzmEHriyBW7mWifn26D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs7gNA%2FbtrZBsoTxVy%2FJifzmEHriyBW7mWifn26D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;675&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddmEjx/btqGCMfJHW8/DVNJ3dbfZF9FPq7rBYK9K0/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;Grep Console&quot;&gt;&lt;/span&gt;Grep Console&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;3. iBATIS/MyBatis mini-plugin&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;iBATIS/MyBatis&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;를 사용하는 개발자들에게 유용한 플러그인이다.&lt;br /&gt;-Mapper.xml로 바로 이동할 수 있다. (Ctrl + T)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-Mapper.java로 바로 이동할 수 있다. (Ctrl + Q)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxr2c/btrZzMohvF8/le3I4feAtPI86RkEIodMN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxr2c/btrZzMohvF8/le3I4feAtPI86RkEIodMN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxr2c/btrZzMohvF8/le3I4feAtPI86RkEIodMN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuxr2c%2FbtrZzMohvF8%2Fle3I4feAtPI86RkEIodMN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;439&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MuFij/btqGAfpIlU4/aKJbe3EKaIT0pWtlj7vfR1/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;iBATIS/MyBatis mini-plugin&quot;&gt;&lt;/span&gt;iBATIS/MyBatis mini-plugin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;3. Key Promoter X&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;내가 선택한 기능의 키보드 단축키를 알려준다. (초보자가 IntelliJ에 적응할 때 유용)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keypromoter.gif&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ZGxk/btrZxeMss6i/MEXifycmMbXyjkIj0KBvc0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ZGxk/btrZxeMss6i/MEXifycmMbXyjkIj0KBvc0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ZGxk/btrZxeMss6i/MEXifycmMbXyjkIj0KBvc0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/7ZGxk/btrZxeMss6i/MEXifycmMbXyjkIj0KBvc0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;532&quot; data-filename=&quot;keypromoter.gif&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzgFb4/btqGxPrK89r/xXN5vU8PFk2HedSKrAso11/img.gif&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;이미지 출처 : https://plugins.jetbrains.com/plugin/9792-key-promoter-x/&quot;&gt;&lt;/span&gt;이미지 출처 : &lt;a href=&quot;https://plugins.jetbrains.com/plugin/9792-key-promoter-x/&quot;&gt;https://plugins.jetbrains.com/plugin/9792-key-promoter-x/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;4. Rainbow Brackets&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;극찬을 아끼지 않았던 플러그인. 늘 헷갈리는 괄호쌍에 색상을 입혀 가독성을 높여준다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rainbow.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWtxj0/btrZz1ewSPq/jlqTJSaFMLiYSxffc2O4x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWtxj0/btrZz1ewSPq/jlqTJSaFMLiYSxffc2O4x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWtxj0/btrZz1ewSPq/jlqTJSaFMLiYSxffc2O4x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWtxj0%2FbtrZz1ewSPq%2FjlqTJSaFMLiYSxffc2O4x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;669&quot; data-filename=&quot;rainbow.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3UzIK/btqGAQprkxt/o3fkHpsXXlVkrnM2Q4Bqlk/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;이미지 출처 : https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/&quot;&gt;&lt;/span&gt;이미지 출처 : &lt;a href=&quot;https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/&quot;&gt;https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;5. Request mapper&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;Spring MVC 프로젝트에서 단축키 하나로 해당 메서드 및 바로가기 기능을 제공한다. (Shift두 번 기능과 비슷하나 모르시는 분들이 많아 공유한다.)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;-Windows : Shift+Ctrl+\&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;-Mac : Cmd+Shift+\&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;-Linux : Win+Shift+\&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestmapper.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFm6PU/btrZxItbn7c/xrPWDHlXgNI9mK8FJiD1wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFm6PU/btrZxItbn7c/xrPWDHlXgNI9mK8FJiD1wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFm6PU/btrZxItbn7c/xrPWDHlXgNI9mK8FJiD1wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFm6PU%2FbtrZxItbn7c%2FxrPWDHlXgNI9mK8FJiD1wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;704&quot; data-filename=&quot;requestmapper.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qFXy7/btqGCdxWj5T/KSgubehrRBdXJOASMtaTc1/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;이미지 출처 : https://plugins.jetbrains.com/plugin/9567-request-mapper/&quot;&gt;&lt;/span&gt;이미지 출처 : &lt;a href=&quot;https://plugins.jetbrains.com/plugin/9567-request-mapper/&quot;&gt;https://plugins.jetbrains.com/plugin/9567-request-mapper/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이보다 유용하고 재밌는 기능관련 Lombok(getter, setter, toString 등 어노테이션을 줄여주는 라이브러리)과 같은 많은 플러그인들이 숨어있다. 장단점을 찾아보고 추후 추가할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
</description>
      <category> DevKit/⌨IDE</category>
      <category>intelliJ plugin</category>
      <category>recommand</category>
      <category>인텔리제이</category>
      <category>플러그인</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/8</guid>
      <comments>https://ooweat.tistory.com/entry/IntelliJ-%EC%9C%A0%EC%9A%A9%ED%95%9C-%ED%95%84%EC%88%98-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%B6%94%EC%B2%9C#entry8comment</comments>
      <pubDate>Thu, 16 Feb 2023 17:08:19 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 바로 로딩되지 않게 하기 / IntelliJ 실행 시 최근 종료한 프로젝트 바로 실행되지 않게 하기</title>
      <link>https://ooweat.tistory.com/entry/IntelliJ-%EB%B0%94%EB%A1%9C-%EB%A1%9C%EB%94%A9%EB%90%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%ED%95%98%EA%B8%B0-IntelliJ-%EC%8B%A4%ED%96%89-%EC%8B%9C-%EC%B5%9C%EA%B7%BC-%EC%A2%85%EB%A3%8C%ED%95%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%94%EB%A1%9C-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yz3LC/btrZxJyQkJ4/zpTCcKKXFIV3JUrVSIQE9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yz3LC/btrZxJyQkJ4/zpTCcKKXFIV3JUrVSIQE9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yz3LC/btrZxJyQkJ4/zpTCcKKXFIV3JUrVSIQE9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYz3LC%2FbtrZxJyQkJ4%2FzpTCcKKXFIV3JUrVSIQE9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;576&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 class=&quot;h2Style&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;설정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt; 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;pStyle&quot; style=&quot;font-family: GowunDodum-Regular;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 어느정도 진행하고 종료 후, 다시 실행하면 항상 마지막으로 종료한 프로젝트가 자동 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발단계를 우선시하는 IDE 특성상 실행 시 많은 리소스를 소비&lt;/b&gt;하기 때문에 PC의 CPU할당량 및 메모리 점유도가 높아, 사양이 낮은 PC는 프리징 현상이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuv6eD/btrZAGnoUex/AxtUJOfJlsJLp9DJF9AhN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuv6eD/btrZAGnoUex/AxtUJOfJlsJLp9DJF9AhN1/img.png&quot; data-alt=&quot;Windows 기준&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuv6eD/btrZAGnoUex/AxtUJOfJlsJLp9DJF9AhN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuv6eD%2FbtrZAGnoUex%2FAxtUJOfJlsJLp9DJF9AhN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;292&quot; height=&quot;406&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Windows 기준&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 기준 File-Settings을 선택 후,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Appearance &amp;amp; Behaviour -&amp;gt; System Settings 메뉴로 이동한다.&lt;br /&gt;Mac 기준 좌측 상단 IntelliJ IDEA-Preferences를 선택 후,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;Appearance &amp;amp; Behaviour -&amp;gt; System Settings 메뉴로 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beO9WC/btrZz1r1Squ/StDtBSoDeGoGoLUdegJw41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beO9WC/btrZz1r1Squ/StDtBSoDeGoGoLUdegJw41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beO9WC/btrZz1r1Squ/StDtBSoDeGoGoLUdegJw41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeO9WC%2FbtrZz1r1Squ%2FStDtBSoDeGoGoLUdegJw41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;442&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, Project 란의 Reopen projects on startup 체크박스에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;기본 값&lt;/b&gt;으로 되어있는 체크상태를 해제한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzdeD/btrZz5ODuwz/ffQKAmiKb1Lbet9Iy3FyS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzdeD/btrZz5ODuwz/ffQKAmiKb1Lbet9Iy3FyS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzdeD/btrZz5ODuwz/ffQKAmiKb1Lbet9Iy3FyS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvzdeD%2FbtrZz5ODuwz%2FffQKAmiKb1Lbet9Iy3FyS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;485&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재 실행 후 테스트 시 위와 같은 화면을 볼 수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
</description>
      <category> DevKit/⌨IDE</category>
      <category>IntelliJ</category>
      <category>인텔리제이</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/7</guid>
      <comments>https://ooweat.tistory.com/entry/IntelliJ-%EB%B0%94%EB%A1%9C-%EB%A1%9C%EB%94%A9%EB%90%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%ED%95%98%EA%B8%B0-IntelliJ-%EC%8B%A4%ED%96%89-%EC%8B%9C-%EC%B5%9C%EA%B7%BC-%EC%A2%85%EB%A3%8C%ED%95%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%94%EB%A1%9C-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%ED%95%98%EA%B8%B0#entry7comment</comments>
      <pubDate>Thu, 16 Feb 2023 17:02:35 +0900</pubDate>
    </item>
    <item>
      <title>[DBeaver] DBeaver 단축키 모음</title>
      <link>https://ooweat.tistory.com/entry/DBeaver-DBeaver-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation Start --&gt;&lt;/p&gt;
&lt;div class=&quot;qc-ani position-relative&quot; style=&quot;width: 700px; margin: 120px auto;&quot;&gt;
&lt;div class=&quot;quotation-container&quot;&gt;
&lt;div class=&quot;qc-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-text-box&quot;&gt;&lt;i&gt;&lt;/i&gt;
&lt;div class=&quot;qc-box-div&quot;&gt;
&lt;p class=&quot;qc-title&quot; data-ke-size=&quot;size16&quot;&gt;QUOTE THE DAY&lt;/p&gt;
&lt;p id=&quot;quotation&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo; 에러 없는 프로그램을 만드는 데는 두가지 방법이 있다. 그런데 세번째 것만 작동한다. &amp;rdquo;&lt;/p&gt;
&lt;div style=&quot;margin-bottom: 0; margin-left: 20px;&quot;&gt;&lt;span&gt; - &lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot; class=&quot;quotation-writter position-relative&quot;&gt; Alan J. Perlis (앨런 J. 펄리스) &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;qc-random-btn-container flex align-center justify-center&quot; style=&quot;margin-top: -20%; ;margin-bottom: 50px;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;script src=&quot;https://tistory1.daumcdn.net/tistory/4462322/skin/images/random-quotes.js?_version_=1676221895&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--quotation End --&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGHgnx/btrZzHtB39S/nfYEfsOA3Qb89nvf6pkkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGHgnx/btrZzHtB39S/nfYEfsOA3Qb89nvf6pkkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGHgnx/btrZzHtB39S/nfYEfsOA3Qb89nvf6pkkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGHgnx%2FbtrZzHtB39S%2FnfYEfsOA3Qb89nvf6pkkc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;256&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;코드_기여_원리_(Fork_와_Pull_Request_(PR))&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DBeaver (&lt;span style=&quot;color: #8a3db6;&quot;&gt;단축키&lt;/span&gt;)&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SQL Editor&lt;/b&gt;&lt;/h3&gt;
&lt;pre data-ke-language=&quot;html&quot;&gt;&lt;code&gt; &amp;zwj; ⌨
CTRL+Enter	현재 쿼리 실행 ( * )
CTRL+\	새 탭에서 현재 쿼리 실행
ALT+X	현재 스크립트 실행 ( ** )
CTRL+ALT+'	선택된 SQL 식 실행 및 결과 출력
CTRL+SHIFT+E	현재 쿼리 실행 계획 설명
CTRL+ALT+SHIFT+X	현재 스크립트의 쿼리를 동시에 실행하여 별도의 탭에 결과 표시
CTRL+9	활성(Session) 연결 전환 (SQL 스크립트의 경우)
CTRL+Space Option+Space	SQL 완료 제안 팝업
CTRL+ALT+Space	SQL 템플릿 제안 팝업
CTRL+SHIFT+F	현재 포맷터를 사용하여 현재 스크립트 포맷 ( ** )
CTRL+/ CTRL+SHIFT+/	단일 / 다중 회선 주석 전환
ALT+Up ALT+Down	이전 / 다음 쿼리로 이동
CTRL+6 CTRL+SHIFT+6 ALT+6	에디터 / 결과 패널 토글 (최대화 / 최소화 / 스위치)
CTRL+SHIFT+X CTRL+SHIFT+Y	선택한 텍스트를 대문자 / 소문자로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Data viewer&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1676530582870&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TAB	기록 / 격자 모드로 전환
CTRL+~	프리젠 테이션 전환 (그리드, 일반 텍스트, JSON 등)
CTRL+1	외래 키 탐색 메뉴
ALT+Space	활성 셀의 링크로 이동
ALT+Left	이전 탐색 보기
ALT+Right	이후 탐색 보기
CTRL+2	현재 열을 기준으로 정렬 토글
F11	현재 열 필터 메뉴
CTRL+F11	현재 열 필터 사전 패널
F7 CTRL+7	오른쪽 패널 켜기 / 끄기
F5	결과 새로 고침 (쿼리 다시 실행)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Data Editor&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1676530582871&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Enter	인라인 편집기 활성화
SHIFT+Enter	값 편집기 열기 또는 별도의 값 편집기 (LOB 값의 경우)
Delete ALT+Delete	행 삭제
ALT+Insert	새 행 추가
CTRL+ALT+Insert	현재 행 복사
Escape	현재 셀 / 행의 변경 사항 취소
CTRL+R	변경 작업(삭제, 추가 등) 취소&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Database Navigator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1676530582871&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;F2	현재 요소 이름 바꾸기 (지원되는 경우)
F4	선택한 요소의 편집기 열기
F5	선택한 요소 새로 고침
Delete	선택한 요소 삭제 (지원되는 경우)
CTRL+ALT+SHIFT+D	선택한 요소에 북마크 추가
Alt+Enter	선택한 요소의 속성 표시
F3 CTRL+[	현재 연결을위한 SQL 편집기를 엽니 다 ( *** ). 스크립트 선택기 팝업을 표시합니다.
CTRL+F3 CTRL+]	현재 연결을위한 새 SQL 편집기를 엽니 다 ( *** ). 항상 새 스크립트를 만듭니다.
CTRL+Enter	현재 연결에 대한 최근 SQL 편집기를 엽니 다 ( *** ). 마지막으로 수정 한 스크립트를 열거 나 새 스크립트를 만듭니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3._원본_저장소_Remote_설정&quot; style=&quot;font-family: MaplestoryOTFLight;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369; font-family: MaplestoryOTFLight;&quot;&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Other&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1676530582872&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALT+~	데이터베이스 도구 상황에 맞는 메뉴를 표시합니다
CTRL+0	활성 스키마 / 카탈로그 전환 (SQL / 데이터베이스 편집기가 열려있는 경우 사용 가능)
CTRL+SHIFT+C	고급 사본. 다른 상황에서 작동하며 &quot;스마트 복사&quot;작업을 수행합니다 (일반적으로 매개 변수 사용).
CTRL+SHIFT+V	고급 페이스트. &quot;스마트 복사&quot;와 동일하지만 &quot;붙여 넣기&quot;용입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> DevKit/ Tool</category>
      <category>dbeaver</category>
      <category>DBeaver 단축키</category>
      <category>단축키</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/5</guid>
      <comments>https://ooweat.tistory.com/entry/DBeaver-DBeaver-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C#entry5comment</comments>
      <pubDate>Thu, 16 Feb 2023 09:46:05 +0900</pubDate>
    </item>
    <item>
      <title>[DBeaver] 유용한 심플 기본 설정 DBeaver UTF-8</title>
      <link>https://ooweat.tistory.com/entry/DBeaver-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%8B%AC%ED%94%8C-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95-DBeaver-UTF-8</link>
      <description>&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yTuvQ/btrZrv8g6fz/N8gqbNSzJ3iav5b07g1cTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yTuvQ/btrZrv8g6fz/N8gqbNSzJ3iav5b07g1cTK/img.png&quot; data-alt=&quot;DBeaver&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yTuvQ/btrZrv8g6fz/N8gqbNSzJ3iav5b07g1cTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyTuvQ%2FbtrZrv8g6fz%2FN8gqbNSzJ3iav5b07g1cTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DBeaver&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt; Free SQL DB Tool, 내가 바로 DBeaver 다!&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 1.&amp;nbsp;행 번호 표시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 많은 분들이 질문 주신 DBeaver 간단한 기본 설정에 대해 설명드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#1. 행 번호 표시&lt;br /&gt;상단 메뉴에서 윈도우/설정으로 이동해주신 후, 일반/편집기/문서 편집기로 이동합니다.&lt;br /&gt;우측 체크박스에서 행 번호 표시를 선택 하신 후, 적용을 누릅니다.&amp;nbsp; 완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpC0e/btrZsFo2IaI/R2zXsGaHQHmVK4fvtGvP51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpC0e/btrZsFo2IaI/R2zXsGaHQHmVK4fvtGvP51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpC0e/btrZsFo2IaI/R2zXsGaHQHmVK4fvtGvP51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpC0e%2FbtrZsFo2IaI%2FR2zXsGaHQHmVK4fvtGvP51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;647&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 2.&amp;nbsp;자동저장&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 상단 메뉴에서 윈도우/설정으로 이동해주신 후, 일반/편집기/Autosave로 이동합니다.&lt;br /&gt;우측 체크박스에서 Enable autosave for dirty editors 를 선택 하신 후, 원하시는 시간을 입력하셔서 적용을 누릅니다.&amp;nbsp; 완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN6yxV%2FbtrZqzwPYl9%2FTKvIRpe9Bbjbg8gD00bE3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;647&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; 3. UTF-8 설정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 요새 대부분 텍스트 파일 인코딩은 UTF-8이 표준화되고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이를 위해서 설정을 해줍시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상단 메뉴에서 윈도우/설정으로 이동해주신 후, 일반/작업공간으로 이동합니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;좌측 하단의 텍스트 파일 인코딩 박스에서 UTF-8을 선택후 적용! 완료!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#4. 수동 커밋(Manual Commit)&amp;nbsp; 자동 커밋 해제&lt;br /&gt;제일 중요한 부분입니다.&amp;nbsp;대부분의 Tool 들은&amp;nbsp;SQL 명령과 동시에 Auto-Commit이 되도록 설정되어 있기 때문에,&lt;br /&gt;수동으로 변환해 줍니다. 상단의 커밋 / 롤백 버튼으로 관리해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N6yxV/btrZqzwPYl9/TKvIRpe9Bbjbg8gD00bE3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN6yxV%2FbtrZqzwPYl9%2FTKvIRpe9Bbjbg8gD00bE3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;647&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> DevKit/ Tool</category>
      <category>dbeaver</category>
      <category>dbeaver UTF-8</category>
      <category>dbeaver 번호 표시</category>
      <category>DBeaver 설정</category>
      <category>dbeaver 오토커밋</category>
      <category>dbeaver 오토커밋 해제</category>
      <category>dbeaver 자동저장</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/4</guid>
      <comments>https://ooweat.tistory.com/entry/DBeaver-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%8B%AC%ED%94%8C-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95-DBeaver-UTF-8#entry4comment</comments>
      <pubDate>Thu, 16 Feb 2023 09:45:18 +0900</pubDate>
    </item>
    <item>
      <title>[React] date format / moment / react YYYYMMDD YYYY-MM-DD</title>
      <link>https://ooweat.tistory.com/entry/React-date-format-moment-react-YYYYMMDD-YYYY-MM-DD</link>
      <description>&lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm7Nny/btrZrcGKeFQ/ySDtnR6znCpoO1Zn7tQ4T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm7Nny/btrZrcGKeFQ/ySDtnR6znCpoO1Zn7tQ4T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm7Nny/btrZrcGKeFQ/ySDtnR6znCpoO1Zn7tQ4T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm7Nny%2FbtrZrcGKeFQ%2FySDtnR6znCpoO1Zn7tQ4T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;225&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;const currentDate = new Date()

console.log(currentDate)

//Output: 2022-01-29T10:03:47.564Z&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제껏 봐왔던 Javascript의 형식이다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; Monent&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; How to Install&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; npm 또는 yarn 을 이용한 설치 명령어&lt;/p&gt;
&lt;pre id=&quot;code_1676438944681&quot; class=&quot;gauss&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ npm install moment --save
// 또는
$ yarn add moment&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Code Sample 코드 예제&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import &quot;./index.css&quot;
import Moment from 'moment';
import &quot;moment/locale/ko&quot;; // Locale Setting
function App() {

  const formatDate = Moment().format('YYYY-MM-DD')
  
  /*
  * Year : YYYY
  * Month : MM
  * Day : DD
  * Hour : HH
  * Min : mm
  * Sec : ss
  */

  return (
    &amp;lt;div className='container'&amp;gt;
      &amp;lt;h1&amp;gt;{formatDate}&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
    
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 실행해보자!&lt;/h3&gt;
&lt;pre id=&quot;code_1676438944682&quot; class=&quot;gauss&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// format에 맞게 출력된다.
const nowTime = moment().format('YYYYMMDD HH:mm:ss');
console.log(nowTime);
// 출력 결과: 20210818 09:41:32&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> Develop/⚛️React</category>
      <category>moment</category>
      <category>react date</category>
      <category>react date format</category>
      <category>react moment</category>
      <category>react yyyy-mm-dd</category>
      <category>react yyyymmdd</category>
      <author>ooweat</author>
      <guid isPermaLink="true">https://ooweat.tistory.com/3</guid>
      <comments>https://ooweat.tistory.com/entry/React-date-format-moment-react-YYYYMMDD-YYYY-MM-DD#entry3comment</comments>
      <pubDate>Wed, 15 Feb 2023 14:29:36 +0900</pubDate>
    </item>
  </channel>
</rss>