<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>컴퓨터 잡박사</title>
    <link>https://muticomputer.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 31 Jul 2026 23:23:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Stater</managingEditor>
    <image>
      <title>컴퓨터 잡박사</title>
      <url>https://t1.daumcdn.net/cfile/tistory/997962425DB556AF02</url>
      <link>https://muticomputer.tistory.com</link>
    </image>
    <item>
      <title>poi</title>
      <link>https://muticomputer.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;titleRow.createCell(0).setCellValue(&quot;회원 리스트&quot;);&lt;br&gt;sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));&lt;br&gt;&lt;br&gt;headerRow.createCell(0).setCellValue(&quot;이름&quot;);&lt;br&gt;headerRow.createCell(1).setCellValue(&quot;이메일&quot;);&lt;br&gt;headerRow.createCell(2).setCellValue(&quot;가입일&quot;);&lt;br&gt;&lt;br&gt;dataRow.createCell(0).setCellValue(&quot;홍길동&quot;);&lt;br&gt;dataRow.createCell(1).setCellValue(&quot;hong@test.com&quot;);&lt;br&gt;dataRow.createCell(2).setCellValue(&quot;2025-10-18&quot;);&lt;/p&gt;</description>
      <category>Spring</category>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/128</guid>
      <comments>https://muticomputer.tistory.com/128#entry128comment</comments>
      <pubDate>Mon, 20 Oct 2025 08:23:51 +0900</pubDate>
    </item>
    <item>
      <title>스트림_비교 객체에서 할때</title>
      <link>https://muticomputer.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;스트림&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.util.stream.Stream;

public class MyDto {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer d;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer e;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private Integer f;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public MyDto(Integer a, Integer b, Integer c, Integer d, Integer e, Integer f) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.a = a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.b = b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.c = c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.d = d;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.e = e;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.f = f;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// getter/setter 생략

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ✅ 모든 값이 0인지 확인
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public boolean isAllZero() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return Stream.of(a, b, c, d, e, f)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .allMatch(value -&amp;gt; value != null &amp;amp;&amp;amp; value == 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;객체내에서&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class MyDto {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int c;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public MyDto(int a, int b, int c) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.a = a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.b = b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.c = c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int getA() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void setA(int a) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.a = a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int getB() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void setB(int b) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.b = b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int getC() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void setC(int c) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.c = c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ✅ 모든 값이 0인지 체크하는 메서드
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public boolean isAllZero() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a == 0 &amp;amp;&amp;amp; b == 0 &amp;amp;&amp;amp; c == 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;</description>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/127</guid>
      <comments>https://muticomputer.tistory.com/127#entry127comment</comments>
      <pubDate>Thu, 11 Sep 2025 07:52:57 +0900</pubDate>
    </item>
    <item>
      <title>csv db비교</title>
      <link>https://muticomputer.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;// CSV 리스트&lt;br&gt;List&amp;lt;String&amp;gt; csvOrderNos = Arrays.asList(&quot;1003&quot;, &quot;1001&quot;, &quot;1002&quot;);&lt;br&gt;&lt;br&gt;// DB 결과 (Map으로 저장)&lt;br&gt;Map&amp;lt;String, String&amp;gt; dbResult = new HashMap&amp;lt;&amp;gt;();&lt;br&gt;dbResult.put(&quot;1001&quot;, &quot;고객A&quot;);&lt;br&gt;dbResult.put(&quot;1002&quot;, &quot;고객B&quot;);&lt;br&gt;dbResult.put(&quot;1003&quot;, &quot;고객C&quot;);&lt;br&gt;&lt;br&gt;// CSV 순서 기준으로 다시 정렬&lt;br&gt;List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; orderedList = new ArrayList&amp;lt;&amp;gt;();&lt;br&gt;for (String orderNo : csvOrderNos) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String, String&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row.put(&quot;주문번호&quot;, orderNo);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row.put(&quot;고객명&quot;, dbResult.getOrDefault(orderNo, &quot;&quot;));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orderedList.add(row);&lt;br&gt;}&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/126</guid>
      <comments>https://muticomputer.tistory.com/126#entry126comment</comments>
      <pubDate>Thu, 28 Aug 2025 08:24:41 +0900</pubDate>
    </item>
    <item>
      <title>test</title>
      <link>https://muticomputer.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;
import java.util.ArrayList;
import java.util.List;

public class BatchProcessor {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main(String[] args) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 예시 데이터 10000개 생성
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;String&amp;gt; allData = new ArrayList&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 1; i &amp;lt;= 10000; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allData.add(&quot;Data-&quot; + i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 배치 크기
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int batchSize = 1000;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 1000개씩 끊어서 처리
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; allData.size(); i += batchSize) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int end = i + batchSize;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (end &amp;gt; allData.size()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = allData.size(); // 마지막 구간 처리
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;String&amp;gt; batch = allData.subList(i, end);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;==== Batch &quot; + (i / batchSize + 1) + &quot; (size: &quot; + batch.size() + &quot;) ====&quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (String data : batch) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(data);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;</description>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/125</guid>
      <comments>https://muticomputer.tistory.com/125#entry125comment</comments>
      <pubDate>Wed, 27 Aug 2025 08:32:17 +0900</pubDate>
    </item>
    <item>
      <title>일자계산휴일</title>
      <link>https://muticomputer.tistory.com/124</link>
      <description>&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;Java&quot; data-ke-language=&quot;Java&quot;&gt;&lt;code&gt;private String getValidLastDay(SimpleDateFormat df, String baseDate) throws Exception {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Calendar cal = Calendar.getInstance();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.setTime(df.parse(baseDate));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 말일 세팅
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 휴일체크
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int holidayCheck = selectHolidayCheck(df.format(cal.getTime()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (holidayCheck == 1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 휴일이면 -1달 이동 후 다시 말일 세팅
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.add(Calendar.MONTH, -1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 또 휴일이면 한번 더 (필요하면 이 부분을 더 확장 가능)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int secondHolidayCheck = selectHolidayCheck(df.format(cal.getTime()));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (secondHolidayCheck == 1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.add(Calendar.MONTH, -1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return df.format(cal.getTime());
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;틀&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;Java&quot; data-ke-language=&quot;Java&quot;&gt;&lt;code&gt;} else if(selectHolidayValue.equals(&quot;28&quot;) || selectHolidayValue.equals(&quot;29&quot;) ||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;selectHolidayValue.equals(&quot;30&quot;) || selectHolidayValue.equals(&quot;31&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.debug(selectHolidayValue);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 조회한 달
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDate = paramMap.getString(&quot;endDate&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SimpleDateFormat df = new SimpleDateFormat(&quot;yyyyMMdd&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Calendar cal = Calendar.getInstance();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 조회한 전달
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.setTime(df.parse(endDate));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.add(Calendar.MONTH, -1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDate2 = getValidLastDay(df, df.format(cal.getTime()));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 조회한 전전달
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cal.add(Calendar.MONTH, -1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDate3 = getValidLastDay(df, df.format(cal.getTime()));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 값 설정
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nowMonth = endDate;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onePreMonth = endDate2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;twoPreMonth = endDate3;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 리스트에 추가
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDatelist.add(nowMonth);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDatelist.add(onePreMonth);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDatelist.add(twoPreMonth);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (String date : endDatelist) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endDateInputList.add(date);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.debug(&quot;DateInputList:]&quot; + endDateInputList);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paramMap.put(&quot;depositDateNewCategory&quot;, endDateInputList);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paramMap.put(&quot;taxDateType&quot;, taxDateType);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paramMap.put(&quot;depositType1&quot;, depositType1);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (Exception e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.debug(&quot;[)-]:&quot; + e.getMessage());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JAVA</category>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/124</guid>
      <comments>https://muticomputer.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 27 May 2025 07:25:41 +0900</pubDate>
    </item>
    <item>
      <title>회원별 마지막데이터</title>
      <link>https://muticomputer.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;br&gt;오라클에서 회원별로 마지막 데이터 한 줄씩 가져오려면 ROW_NUMBER()나 RANK()/DENSE_RANK() 같은 윈도우 함수를 활용하는 게 가장 깔끔합니다.&lt;br&gt;&lt;br&gt;예를 들어 아래와 같은 테이블 구조라고 가정해볼게요:&lt;br&gt;&lt;br&gt;SELECT USER_ID, DATA_VALUE, INSERT_DATE&lt;br&gt;FROM (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;USER_ID, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DATA_VALUE, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT_DATE,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY INSERT_DATE DESC) AS RN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM TABLE_NAME&lt;br&gt;)&lt;br&gt;WHERE RN = 1;&lt;br&gt;&lt;br&gt;이렇게 되어 있을 때, 각 USER_ID 별로 가장 마지막 INSERT_DATE 기준으로 한 줄씩 가져오려면 이렇게 하면 돼요:&lt;br&gt;&lt;br&gt;설명&lt;br&gt;	•	PARTITION BY USER_ID : 사용자별로 그룹 나눔&lt;br&gt;	•	ORDER BY INSERT_DATE DESC : 최근 날짜 순 정렬&lt;br&gt;	•	ROW_NUMBER() : 각 사용자 그룹 내에서 1번부터 번호 매김&lt;br&gt;	•	최종적으로 RN = 1인 데이터만 가져오기&lt;br&gt;&lt;br&gt;방법 2: MAX(INSERT_DATE) + JOIN 이용&lt;br&gt;&lt;br&gt;만약 윈도우 함수 사용이 제한적이거나 구버전 오라클이라면 아래처럼도 가능:&lt;br&gt;&lt;br&gt;&lt;br&gt;SELECT T.USER_ID, T.DATA_VALUE, T.INSERT_DATE&lt;br&gt;FROM TABLE_NAME T&lt;br&gt;JOIN (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT USER_ID, MAX(INSERT_DATE) AS MAX_DATE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM TABLE_NAME&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GROUP BY USER_ID&lt;br&gt;) M&lt;br&gt;ON T.USER_ID = M.USER_ID&lt;br&gt;AND T.INSERT_DATE = M.MAX_DATE;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>[DB]</category>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/123</guid>
      <comments>https://muticomputer.tistory.com/123#entry123comment</comments>
      <pubDate>Wed, 30 Apr 2025 08:24:31 +0900</pubDate>
    </item>
    <item>
      <title>일자 노출건</title>
      <link>https://muticomputer.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br&gt;&amp;lt;html lang=&quot;ko&quot;&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;특정 날짜 이후 노출&amp;lt;/title&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#targetArea {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display: none; /* 기본적으로 숨김 */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div id=&quot;targetArea&quot;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;이제 노출되는 영역입니다!&amp;lt;/h2&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;4월 8일 이후에만 보입니다.&amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.addEventListener(&quot;DOMContentLoaded&quot;, function() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const targetDate = new Date(&quot;2025-04-08T00:00:00&quot;); // 기준 날짜&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const now = new Date(); // 현재 날짜&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (now &amp;gt;= targetDate) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.getElementById(&quot;targetArea&quot;).style.display = &quot;block&quot;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;</description>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/122</guid>
      <comments>https://muticomputer.tistory.com/122#entry122comment</comments>
      <pubDate>Wed, 2 Apr 2025 08:25:14 +0900</pubDate>
    </item>
    <item>
      <title>[HTML/CSS] 로딩팝업정리</title>
      <link>https://muticomputer.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[ index.html ]&lt;/p&gt;
&lt;pre id=&quot;code_1740267014204&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;파일 다운로드&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        /* 팝업 스타일 */
        #loadingPopup {
            display: none;
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 300px;
            height: 150px;
            background: rgba(0, 0, 0, 0.8);
            color: white;
            text-align: center;
            padding: 20px;
            border-radius: 10px;
            z-index: 1000;
        }
        /* 로딩 GIF 스타일 */
        #loadingPopup img {
            width: 50px;
            height: 50px;
            margin-top: 10px;
        }
        /* 배경 어둡게 효과 */
        #overlay {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.5);
            z-index: 999;
        }
    &amp;lt;/style&amp;gt;
    &amp;lt;script&amp;gt;
        function showLoadingPopup() {
            document.getElementById(&quot;loadingPopup&quot;).style.display = &quot;block&quot;;
            document.getElementById(&quot;overlay&quot;).style.display = &quot;block&quot;;

            setTimeout(() =&amp;gt; {
                document.getElementById(&quot;loadingPopup&quot;).style.display = &quot;none&quot;;
                document.getElementById(&quot;overlay&quot;).style.display = &quot;none&quot;;
            }, 2000);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;h2&amp;gt;파일 다운로드&amp;lt;/h2&amp;gt;
    &amp;lt;button onclick=&quot;showLoadingPopup()&quot;&amp;gt;파일 다운로드&amp;lt;/button&amp;gt;

    &amp;lt;!-- 어두운 배경 --&amp;gt;
    &amp;lt;div id=&quot;overlay&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;!-- 로딩 팝업 --&amp;gt;
    &amp;lt;div id=&quot;loadingPopup&quot;&amp;gt;
        &amp;lt;h3&amp;gt;파일을 다운로드 중...&amp;lt;/h3&amp;gt;
        &amp;lt;img src=&quot;loading.gif&quot; alt=&quot;로딩 중...&quot;&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;[ loading.html]&lt;/p&gt;
&lt;pre id=&quot;code_1740266953945&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;다운로드 중...&amp;lt;/title&amp;gt;
    &amp;lt;script&amp;gt;
        function closePopup() {
            setTimeout(() =&amp;gt; {
                window.close(); // 2초 후 팝업 자동 종료
            }, 2000);
        }

        window.onload = closePopup;
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h3&amp;gt;파일을 다운로드 중입니다...&amp;lt;/h3&amp;gt;
&amp;lt;div&amp;gt;
    &amp;lt;img src=&quot;loading.gif&quot; alt=&quot;로딩 중...&quot;&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;loading.gif&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngTK3/btsMsf42y1v/erZgEtsYEeUtOvGllRS6TK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngTK3/btsMsf42y1v/erZgEtsYEeUtOvGllRS6TK/img.gif&quot; data-alt=&quot;로딩이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngTK3/btsMsf42y1v/erZgEtsYEeUtOvGllRS6TK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ngTK3/btsMsf42y1v/erZgEtsYEeUtOvGllRS6TK/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;256&quot; height=&quot;256&quot; data-filename=&quot;loading.gif&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로딩이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Jquery</category>
      <category>로딩기능</category>
      <category>로딩바</category>
      <category>로딩처리</category>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/121</guid>
      <comments>https://muticomputer.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 23 Feb 2025 08:31:59 +0900</pubDate>
    </item>
    <item>
      <title>쿼리문 2 레프트</title>
      <link>https://muticomputer.tistory.com/120</link>
      <description>&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;SQL&quot; data-ke-language=&quot;SQL&quot;&gt;&lt;code&gt;SELECT A.id, A.col1, B.col2, B.created_at
FROM A
LEFT JOIN (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT id, col2, created_at,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ROW_NUMBER() OVER (PARTITION BY id ORDER BY created_at DESC) AS rn
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM B
) B ON A.id = B.id AND B.rn = 1;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;설명&lt;br&gt;1. ROW_NUMBER() OVER (PARTITION&lt;br&gt;BY id ORDER BY created_at&lt;br&gt;DESC)&lt;br&gt;&amp;gt; B 테이블에서 id 기준으로 그룹화하고,&lt;br&gt;created&lt;br&gt;Lat DESC(최신순)으로 정렬 각 그룹에서 가장 최신인 데이터에 rn = 1 부여&lt;br&gt;2. LEFT JOIN B ON A.id = B.id&lt;br&gt;AND B.rn = 1&lt;br&gt;• In = 1인 데이터만 가져와서 A 테이블과 조인&lt;br&gt;특정 기준(예: created_at 말고 다른 정렬 기준)으로 데이터를 가져오고 싶다면 ORDER BY&lt;br&gt;부분을 수정하면 됩니다.&lt;/p&gt;</description>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/120</guid>
      <comments>https://muticomputer.tistory.com/120#entry120comment</comments>
      <pubDate>Fri, 7 Feb 2025 08:07:45 +0900</pubDate>
    </item>
    <item>
      <title>쿼리문</title>
      <link>https://muticomputer.tistory.com/119</link>
      <description>&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;SQL&quot; data-ke-language=&quot;SQL&quot;&gt;&lt;code&gt;SELECT *
FROM (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT ROWNUM AS RN, EMPLOYEE_ID, EMPLOYEE_NAME
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT DISTINCT EMPLOYEE_ID, EMPLOYEE_NAME
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM EMPLOYEES
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORDER BY EMPLOYEE_ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE ROWNUM &amp;lt;= 2000
)
WHERE RN &amp;gt; 1000;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Stater</author>
      <guid isPermaLink="true">https://muticomputer.tistory.com/119</guid>
      <comments>https://muticomputer.tistory.com/119#entry119comment</comments>
      <pubDate>Tue, 14 Jan 2025 07:58:29 +0900</pubDate>
    </item>
  </channel>
</rss>