<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>준수한쭈니네</title>
    <link>https://jjunii486.tistory.com/</link>
    <description>불친절한 쓸데없는 나만의 블뤄그 입니돠</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 03:30:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>쥬니준</managingEditor>
    <image>
      <title>준수한쭈니네</title>
      <url>https://tistory1.daumcdn.net/tistory/1878089/attach/41a3aac87bf44ab684760f539709c406</url>
      <link>https://jjunii486.tistory.com</link>
    </image>
    <item>
      <title>Intellij] 커밋 창 예전 버전으로 변경하기</title>
      <link>https://jjunii486.tistory.com/367</link>
      <description>&lt;h3 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;IntelliJ를 사용하다 보면 기본적으로 커밋 창이 &lt;span&gt;&lt;b&gt;왼쪽에 고정된 독(Dock) 형태&lt;/b&gt;&lt;/span&gt;로 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;span&gt;&lt;b&gt;화면이 작은 노트북&lt;/b&gt;&lt;/span&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;팝업 형태(모달 창)&lt;/b&gt;로 변경할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✅ 기존 독 형태&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvzG5/btsNLrVScgN/tDXn7vpv12FY5LY4KhwyK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvzG5/btsNLrVScgN/tDXn7vpv12FY5LY4KhwyK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvzG5/btsNLrVScgN/tDXn7vpv12FY5LY4KhwyK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrvzG5%2FbtsNLrVScgN%2FtDXn7vpv12FY5LY4KhwyK1%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;672&quot; height=&quot;1414&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;1414&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;⚙️ 설정 변경 방법&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;설정(Preferences 또는 Settings)&lt;/b&gt;&lt;span&gt; 으로 이동&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;버전 관리 &amp;gt; 커밋(Version Control &amp;gt; Commit)&lt;span&gt; 항목 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;ldquo;Use non-modal commit interface(모달이 아닌 커밋 인터페이스 사용)&amp;rdquo;&lt;/b&gt;&lt;span&gt; 옵션의 체크를 &lt;/span&gt;&lt;b&gt;해제&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;1408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZAuQZ/btsNKjqTXxX/CPOSizvtf8DKqbdc7L9kO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZAuQZ/btsNKjqTXxX/CPOSizvtf8DKqbdc7L9kO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZAuQZ/btsNKjqTXxX/CPOSizvtf8DKqbdc7L9kO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZAuQZ%2FbtsNKjqTXxX%2FCPOSizvtf8DKqbdc7L9kO0%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;1938&quot; height=&quot;1408&quot; data-origin-width=&quot;1938&quot; data-origin-height=&quot;1408&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  팝업 형태로 변경된 모습&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단축키 (macOS 기준): &lt;span&gt;⌘ + K&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;커밋 창이 팝업으로 뜨며, &lt;span&gt;&lt;b&gt;Diff, 커밋 메시지, 변경 파일 목록 등&lt;/b&gt;&lt;/span&gt;을 한눈에 확인할 수 있어 훨씬 편리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;1694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVFkEK/btsNKXnnrtY/wthw8d1QhBYBjI6dcOHEVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVFkEK/btsNKXnnrtY/wthw8d1QhBYBjI6dcOHEVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVFkEK/btsNKXnnrtY/wthw8d1QhBYBjI6dcOHEVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVFkEK%2FbtsNKXnnrtY%2Fwthw8d1QhBYBjI6dcOHEVK%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;1486&quot; height=&quot;1694&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;1694&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>개발자의 공부방/에디터 &amp;amp; 유틸리티</category>
      <category>인텔리제이</category>
      <category>인텔리제이 커밋 모달창</category>
      <category>인텔리제이 커밋 팝업</category>
      <category>인텔리제이 커밋창</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/367</guid>
      <comments>https://jjunii486.tistory.com/367#entry367comment</comments>
      <pubDate>Sun, 4 May 2025 00:18:30 +0900</pubDate>
    </item>
    <item>
      <title>AWS] API Gateway + Lambda 트리거 연결</title>
      <link>https://jjunii486.tistory.com/365</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDfNGy/btsLGYVt15I/Fnm4hJQNny9RBOPuiaIBok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDfNGy/btsLGYVt15I/Fnm4hJQNny9RBOPuiaIBok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDfNGy/btsLGYVt15I/Fnm4hJQNny9RBOPuiaIBok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDfNGy%2FbtsLGYVt15I%2FFnm4hJQNny9RBOPuiaIBok%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;3000&quot; height=&quot;1327&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1327&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;기존 경로 rekognition/face-detection&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;수정 경로 rekognition/image/face-detection&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 Gateway에서 경로를 수정했으나 위 스크린샷처럼 Lambda에서 트리거 경로를 인식하지 못 하고 있습니다.&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 Gateway에서는 정상적으로 인식하고 있었습니다.&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;혹시나 해서 트리거를 추가하면 계속 상단 경로에 /rekognition ANY로 만들고 기존에 만들어놨던 경로는 하나도 인식을 못 하고 있었습니다.&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;1000&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cASnk0/btsLE10TG8C/aAgZuFXLNdMpZcbuV92EDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cASnk0/btsLE10TG8C/aAgZuFXLNdMpZcbuV92EDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cASnk0/btsLE10TG8C/aAgZuFXLNdMpZcbuV92EDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcASnk0%2FbtsLE10TG8C%2FaAgZuFXLNdMpZcbuV92EDk%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;1000&quot; height=&quot;860&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;860&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 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;466&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJYFqG/btsLFXQTmFk/EtB8hSYMblVRNQqbAyk41k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJYFqG/btsLFXQTmFk/EtB8hSYMblVRNQqbAyk41k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJYFqG/btsLFXQTmFk/EtB8hSYMblVRNQqbAyk41k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJYFqG%2FbtsLFXQTmFk%2FEtB8hSYMblVRNQqbAyk41k%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;466&quot; height=&quot;130&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Integrations에서 원하는 경로에 통합 분리를 다시 한번 해주면 경로가 정상적으로 인식을 하고 Lambda에서도 정상적으로 노출되는 것을 확인하실 수 있습니다.&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;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3300&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b96tw1/btsLG4n9def/9odNKXgVoJ0IBNmR6LP4e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b96tw1/btsLG4n9def/9odNKXgVoJ0IBNmR6LP4e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b96tw1/btsLG4n9def/9odNKXgVoJ0IBNmR6LP4e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb96tw1%2FbtsLG4n9def%2F9odNKXgVoJ0IBNmR6LP4e0%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;3300&quot; height=&quot;1528&quot; data-origin-width=&quot;3300&quot; data-origin-height=&quot;1528&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;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;3286&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAnTaA/btsLFPMgx1E/b4gJXyyiVXwXzb8CuPufaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAnTaA/btsLFPMgx1E/b4gJXyyiVXwXzb8CuPufaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAnTaA/btsLFPMgx1E/b4gJXyyiVXwXzb8CuPufaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAnTaA%2FbtsLFPMgx1E%2Fb4gJXyyiVXwXzb8CuPufaK%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;3286&quot; height=&quot;1384&quot; data-origin-width=&quot;3286&quot; data-origin-height=&quot;1384&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Lambda Console에서 트리거에 Path마다 트리거가 추가 됐는지 확인&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;blob&quot; data-origin-width=&quot;2732&quot; data-origin-height=&quot;1570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0hVbd/btsLFgKobJd/EndGcR4ljsJz9u4LZbQuk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0hVbd/btsLFgKobJd/EndGcR4ljsJz9u4LZbQuk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0hVbd/btsLFgKobJd/EndGcR4ljsJz9u4LZbQuk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0hVbd%2FbtsLFgKobJd%2FEndGcR4ljsJz9u4LZbQuk1%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;2732&quot; height=&quot;1570&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2732&quot; data-origin-height=&quot;1570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발자의 공부방/서버 &amp;amp; 리눅스</category>
      <category>api gateway 경로 설정</category>
      <category>api gateway 경로 재설정</category>
      <category>lambda api gateway 설정</category>
      <category>lambda api gateway 트리거</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/365</guid>
      <comments>https://jjunii486.tistory.com/365#entry365comment</comments>
      <pubDate>Tue, 7 Jan 2025 16:47:48 +0900</pubDate>
    </item>
    <item>
      <title>경험담] GhatGPT vs Claude vs Gemini 코딩 체감 비교</title>
      <link>https://jjunii486.tistory.com/363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 회사에서는 GhatGPT vs Claude vs Gemini를 다 사용하고 있다.&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;GhatGPT-4o vs Claude 3.5 Sonnet vs Gemini 1.5 Pro&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;아래는 간단한 에러(?)를 잡는 예시를 총 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;&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;/p&gt;
&lt;pre id=&quot;code_1735607345101&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'org.springframework.boot' version '2.6.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}&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;간단한 gradle 빌드 파일의 내용이다. Intelij IDE에서 실행하면 tasks.named 안의 useJUnitPlatform()에 다음과 같은 에러가 뜬다.&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;No candidates found for method call useJUnitPlatform.&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;pre id=&quot;code_1735608068459&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
id 'org.springframework.boot' version '2.6.8'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter-engine' // Add this line
}

tasks.named('test') {
useJUnitPlatform()
}

해당 코드에서     useJUnitPlatform() 에 대해서 설명해주고 IDE에 빨간 줄이 있으면서 다음과 같은 내용이 있는데 해결 방법을 알려줘
No candidates found for method call useJUnitPlatform.&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;ChatGPT - 4o&lt;/p&gt;
&lt;pre id=&quot;code_1735607542913&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3'
}


tasks.withType(Test) {
    useJUnitPlatform()
}

===== 전체 코드 =====

plugins {
    id 'org.springframework.boot' version '2.6.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3'
}

tasks.withType(Test) {
    useJUnitPlatform()
}&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;GPT 같은 경우 버전을 명시했다 왜 5.9.3을 추천했을까란 궁금증때문에 Maven Repository에 들어가서 확인해봤으나 이유를 모르겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.9.3이 사용 조회수가 많은 것도 아닌데 말이다...? (최신 버전은 5.11.4이다.)&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;또한 tasks.withType(Test)로 변경을 했는데 보통 모든 테스트에 대한 설정을 저렇게 하는데 아마도 큰 허용 범위로써 설정을 하면 사용자의 요구에 대한 해결을 빠르게 할 수 있어서 저런 답변을 하지 않았을까 싶다&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;하지만 IDE에서는 불필요한 테스트에 대한 경고(?)를 날려준다&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;Claude&lt;/p&gt;
&lt;pre id=&quot;code_1735607681497&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id 'org.springframework.boot' version '2.6.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine'
}

test {  // tasks.named('test') 대신 이렇게 변경
    useJUnitPlatform()
}&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;테스트에 대한 버전 명시를 하지 않았고 테스크에 대해서도 이름으로 명시했다.&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;Gemini 1.5 pro&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735608026517&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    // ... other dependencies ...
    testImplementation 'org.junit.jupiter:junit-jupiter-engine' 
}&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;잼미니는 너무 심플하게 대답했다... 장황한 설명을 다 제외하고 해결법을 위와 같이 의존성 주입에 대한 명시만 해놨다..&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;결론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 간단한 예시를 보여준 것 뿐이고 실질적으로 코딩에 대한 부분에 있어서는 체감상 Claude가 한수위인 것 같다.&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>ChatGPT</category>
      <category>Cluade</category>
      <category>gemini 1.5 pro</category>
      <category>ghatgpt vs claude vs gemini</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/363</guid>
      <comments>https://jjunii486.tistory.com/363#entry363comment</comments>
      <pubDate>Tue, 31 Dec 2024 10:24:23 +0900</pubDate>
    </item>
    <item>
      <title>유튜브] 유튜브 전체화면 자동재생</title>
      <link>https://jjunii486.tistory.com/362</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 유튜브의 전체 URL 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YOqJ1SBstME&quot;&gt;https://www.youtube.com/watch?v=YOqJ1SBstME&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=5ojCr7vzJ0g&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cvRtsf/hyXKwMkrrx/W8javsna36qoyb8bSldUP1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/fgGFN/hyXKu12QIZ/KINAQA3a6FUKLb6sskvoz1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;  브루노 마스, 앤더슨 팩, 실크 소닉 그리고 ...&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5ojCr7vzJ0g&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;2. watch?v= 뒤에 필요한 부분만 잘라내기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://www.youtube.com/watch?v=YOqJ1SBstME&quot;&gt;YOqJ1SBstME&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;3. &lt;a href=&quot;https://www.youtube-nocookie.com/embed/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube-nocookie.com/embed/&lt;/a&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;4. 완성된 URL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/YOqJ1SBstME&quot;&gt;https://www.youtube-nocookie.com/embed/YOqJ1SBstME&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733369679551&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;YouTube&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.youtube-nocookie.com&quot; data-og-source-url=&quot;https://www.youtube-nocookie.com/embed/v=5ojCr7vzJ0g&quot; data-og-url=&quot;https://www.youtube-nocookie.com/embed/v=5ojCr7vzJ0g&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/v=5ojCr7vzJ0g&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube-nocookie.com/embed/v=5ojCr7vzJ0g&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;YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube-nocookie.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;5. 선택사항) 무음 자동재생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에 ?autoplay=1&amp;amp;mute=1 을 이용하면 된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/YOqJ1SBstME?autoplay=1&amp;amp;mute=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube-nocookie.com/embed/YOqJ1SBstME?autoplay=1&amp;amp;mute=1&lt;/a&gt;&lt;/p&gt;</description>
      <category>내가 편한 세상</category>
      <category>유튜브 url 전체화면</category>
      <category>유튜브 자동재생</category>
      <category>유튜브 전체화면 자동재생</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/362</guid>
      <comments>https://jjunii486.tistory.com/362#entry362comment</comments>
      <pubDate>Thu, 5 Dec 2024 12:38:10 +0900</pubDate>
    </item>
    <item>
      <title>Docker] Docker 네트워크 에러</title>
      <link>https://jjunii486.tistory.com/361</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시놀로지에 도커 우분투를 설치했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 apt-get upgrade, apt-get install ... 등을 할 때면 다음과 같이 뜨면서 설치가 되지 않습니다.&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;root@ubuntu-1:/# apt-get install vim &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;Reading package lists... Done &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;Building dependency tree... &lt;/span&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;Done &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;Reading state information... Done &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f8f7; color: #29261b; text-align: start;&quot;&gt;E: Unable to locate package vim&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 도커 우분투 컨테이너 정지&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733187896983&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 도커 프로세스 아이디 확인
docker ps

# 도커 컨테이너 정지
docker stop &amp;lt;컨테이너_아이디&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;&lt;b&gt;2. 호스트 네트워크 모드로 재실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733187912222&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 호스트 네트워크 모드로 재실행
docker run --network host -it ubuntu /bin/bash&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;&lt;b&gt;3. 소스 리스트를 LTS 최신 버전으로 변경&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733187935037&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Ubuntu 22.04 LTS (Jammy Jellyfish) 소스 리스트로 변경
echo &quot;deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ jammy universe
deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe&quot; &amp;gt; /etc/apt/sources.list&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;&lt;b&gt;4. 강제 업데이트 및 기본 패키지 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733187958113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 캐시 초기화
apt-get clean
rm -rf /var/lib/apt/lists/*

# 업데이트 강제 실행
apt-get update -o Acquire::ForceHash=yes

# 기본 패키지 설치 시도
apt-get update &amp;amp;&amp;amp; apt-get install -y --fix-missing software-properties-common wget&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발자의 공부방/서버 &amp;amp; 리눅스</category>
      <category>docker unable to locate package</category>
      <category>도커</category>
      <category>도커 네트워크 에러</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/361</guid>
      <comments>https://jjunii486.tistory.com/361#entry361comment</comments>
      <pubDate>Tue, 3 Dec 2024 10:07:49 +0900</pubDate>
    </item>
    <item>
      <title>AWS] Rekognition Streaming</title>
      <link>https://jjunii486.tistory.com/360</link>
      <description>&lt;pre id=&quot;code_1728346024406&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws rekognition create-stream-processor \
  --name &quot;video-stream-processor&quot; \
	--input '{&quot;KinesisVideoStream&quot;:{&quot;Arn&quot;:&quot;arn:aws:kinesisvideo:ap-northeast-2:815665441543:stream/highbuff_video_analysis/1720156626729&quot;}}' \
	--stream-processor-output '{&quot;KinesisDataStream&quot;:{&quot;Arn&quot;:&quot;arn:aws:kinesis:ap-northeast-2:815665441543:stream/video-data-stream&quot;}}' \
	--role-arn &quot;arn:aws:iam::815665441543:role/rekognition&quot; \
	--settings '{&quot;FaceSearch&quot;:{&quot;CollectionId&quot;:&quot;video-face-collection&quot;,&quot;FaceMatchThreshold&quot;:85.0}}' \
	--region ap-northeast-2&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;AWS 서비스 중 Rekognition 서비스가 있는데 이는 이미지, 영상 등에서 물건, 얼굴 등을 인식해서 데이터를 분석하는 서비스입니다.&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;일단 데이터 분석을 하는 Rekognition의 Streaming Video 서비스를 시작하기 위해서 맨 위 명령어를 실행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래와 같이 권한이 없다는 식으로 계속 에러가 발생했는데요...&lt;/p&gt;
&lt;pre id=&quot;code_1728346197607&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;An error occurred (AccessDeniedException) when calling the CreateStreamProcessor operation:​&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;보통 AWS 권한 에러나 기타 에러가 발생했을 경우 : (콜론) 뒤에 상세한 이유가 나옵니다.&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;근데 해당 에러에서는 CreateStreamProcessor 권한이 없다고만 나와있을 뿐 상세한 에러가 나오지 않아서 계속 며칠 동안 이유를 찾고 있었습니다..&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 이유는 Region (지역)&amp;nbsp;&lt;b&gt;ap-northeast-2 &lt;/b&gt;(서울) 지역에서 Streaming Video 분석 서비스를 지원하지 않는거였습니다...&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;분명 AWS 리전별 사용가능한 AWS 서비스 목록에서는 Rekognition을 서비스한다고 나와 있는데말이죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728346408994&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;company&quot; data-og-title=&quot;리전별 AWS 서비스 - AWS&quot; data-og-description=&quot;&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&quot; data-og-url=&quot;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NYA5T/hyXehb2SQ7/cYqlzHffVXHKshfGkP8NMK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bBxbdE/hyXedAINog/i4O19nTzEKADzRULwJ7Hd1/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/about-aws/global-infrastructure/regional-product-services/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NYA5T/hyXehb2SQ7/cYqlzHffVXHKshfGkP8NMK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bBxbdE/hyXedAINog/i4O19nTzEKADzRULwJ7Hd1/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109');&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;리전별 AWS 서비스 - AWS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.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;하지만 &lt;a title=&quot;AWS 계산기&quot; href=&quot;https://calculator.aws/#/createCalculator/Rekognition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(AWS 계산기&lt;/a&gt;) 에서 확인해보니 Rekognition Streaming Video Events 버튼이 아예 활성화되지 않게 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 서울에서는 실시간 영상 분석 서비스가 되지 않는 것이죠.....&lt;/p&gt;
&lt;figure id=&quot;og_1728346508151&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;AWS Pricing Calculator&quot; data-og-description=&quot;&quot; data-og-host=&quot;calculator.aws&quot; data-og-source-url=&quot;https://calculator.aws/#/createCalculator/Rekognition&quot; data-og-url=&quot;https://calculator.aws/#/createCalculator/Rekognition&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://calculator.aws/#/createCalculator/Rekognition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://calculator.aws/#/createCalculator/Rekognition&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;AWS Pricing Calculator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;calculator.aws&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;2406&quot; data-origin-height=&quot;1066&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpqv7M/btsJYJso8Li/FNtWZqIwkDSzCg5ZeKyaMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpqv7M/btsJYJso8Li/FNtWZqIwkDSzCg5ZeKyaMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpqv7M/btsJYJso8Li/FNtWZqIwkDSzCg5ZeKyaMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpqv7M%2FbtsJYJso8Li%2FFNtWZqIwkDSzCg5ZeKyaMk%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;2406&quot; height=&quot;1066&quot; data-origin-width=&quot;2406&quot; data-origin-height=&quot;1066&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;위 에러를 검색했을 때 aws 공식 깃허브에서도 저와 똑같은 에러에 똑같은 이유로 인해 안되는 경우가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rekognition의 일부 기능만 되는 걸로 인해서 실시간 영상 분석도 된다고 생각했었는데...ㅠㅜ 결국 그냥 서비스를 하지 않는거였네요..&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;/p&gt;</description>
      <category>개발자의 공부방/서버 &amp;amp; 리눅스</category>
      <category>aws rekognition</category>
      <category>aws rekognition streaming video service</category>
      <category>aws 실시간 영상 분석</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/360</guid>
      <comments>https://jjunii486.tistory.com/360#entry360comment</comments>
      <pubDate>Tue, 8 Oct 2024 09:19:15 +0900</pubDate>
    </item>
    <item>
      <title>파이썬] 키움증권 Open API OPT10079 주식차트조회</title>
      <link>https://jjunii486.tistory.com/356</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키움증권 Open API를 이욯해서 틱 차트를 조회하는 로직을 알아보고 있었다&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;윈도우 11&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode &amp;amp; python 3 &amp;amp; anaconda 32bit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종목명 : 대한화섬 = &quot;003830&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;파이썬 로직 : 25개 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키움증권 Open API : 27개 데이터&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;2개의 데이터가 누락이 되서 나오고 있었다&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;원인은 복붙한 코드 중 for문에서 체결시간을 가져와서 index로 사용하고 있는데 이 부분이 문제가 되는 것 같았다.&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;pre id=&quot;code_1710138389491&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
import pandas as pd
from datetime import *
import time
from ItemList import ItemList
import pprint

# 초당 조회 횟수를 회피하기 위한 대기시간 지정
TIME_TERM = 0.5

class Main(QAxWidget):
    def __init__(self):
        super().__init__()
        self.scrno = '1000'
        self._create_kiwoom_instance()
        self._set_signal_slots()
        self.login_event_loop = None
        self.tr_event_loop = None
        self.sPrevNext = None
        self.end_date = None
        self.start_time = None
        self.tr = False
        self.dataframes = []

    def gen_scrno(self):
        self.scrno = str(int(self.scrno) + 1)
        return self.scrno

    def _create_kiwoom_instance(self):
        self.setControl(&quot;KHOPENAPI.KHOpenAPICtrl.1&quot;)

    def _set_signal_slots(self):
        self.OnEventConnect.connect(self._event_connect)
        self.OnReceiveTrData.connect(self._receive_tr_data)

    def comm_connect(self):
        self.dynamicCall(&quot;CommConnect()&quot;)
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    def _event_connect(self, nErrCode):
        if nErrCode == 0:
            print('로그인완료')
            print('=' * 50)
        self.login_event_loop.exit()

    def set_input_value(self, id, value):
        self.dynamicCall(&quot;SetInputValue(QString, QString)&quot;, id, value)

    def comm_rq_data(self, rqname, trcode, next, screen_no):
        self.dynamicCall(&quot;CommRqData(QString, QString, int, QString&quot;, rqname, trcode, next, screen_no)
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    def _comm_get_data(self, code, real_type, field_name, index, item_name):
        ret = self.dynamicCall(&quot;CommGetData(QString, QString, QString, int, QString&quot;, code,
                               real_type, field_name, index, item_name)
        return ret.strip()
    
    def _comm_get_big_data(self, sTrCode, sRQName):
        ret = self.dynamicCall(
                &quot;GetCommDataEx(QString, QString)&quot;, sTrCode, sRQName)
        return ret
        
    def _get_repeat_cnt(self, trcode, rqname):
        ret = self.dynamicCall(&quot;GetRepeatCnt(QString, QString)&quot;, trcode, rqname)
        return ret

    def _receive_tr_data(self, sScrNo, sRQName, sTrCode, sRecordName, sPrevNext, nDataLength, sErrorCode, sMessage, sSplmMsg):
        print('TR_Message:', sScrNo, sRQName, sTrCode, sRecordName, sPrevNext, nDataLength, sErrorCode, sMessage, sSplmMsg)
        self.sPrevNext = sPrevNext

        if sRQName == &quot;opt10079_req&quot;:
            self._opt10080(sRQName, sTrCode)

        try:
            self.tr_event_loop.exit()
        except AttributeError:
            pass

    def req_tick_chart(self, code):
        # 최초조회
        time.sleep(TIME_TERM)
        # self.tr = True
        self.set_input_value(&quot;종목코드&quot;, code)
        self.set_input_value(&quot;틱범위&quot;, &quot;1&quot;)
        self.set_input_value(&quot;수정주가구분&quot;, &quot;0&quot;)
        self.start_time = time.time()  # 시작 시간 기록
        self.comm_rq_data(f'opt10079_req', &quot;opt10079&quot;, '0', self.gen_scrno())

        
    def _opt10080(self, rqname, trcode):
        # 조회된 데이터에서 종목코드를 가져옴 (싱글데이터)
        code = self._comm_get_data(trcode, &quot;&quot;, rqname, 0, &quot;종목코드&quot;)

        # 전체 데이터 개수 조회
        data_cnt = self._get_repeat_cnt(trcode, rqname)
        print('전체 데이터 갯수 : ', data_cnt)
        print('-' * 50)

        # 조회된 데이터 갯수 만큼 반복해서 데이터를 가져온 후 딕셔너리에 저장 (멀티데이터)
        total_ret = []
        for i in range(data_cnt):
            ret = {key: self._comm_get_data(trcode, &quot;&quot;, rqname, i, key) for key in ['현재가', '거래량', '체결시간']}
            total_ret.append(ret)
                       
        # pprint.pprint(total_ret)

        # 딕셔너리를 DataFrame으로 변환 / 컬럼명 변경 / datetime 컬럼 생성
        df = pd.DataFrame(total_ret)
        df.columns = ['현재가', '거래량', '체결시간']
        
        df['체결시간'] = pd.to_datetime(df['체결시간'], format=&quot;%Y%m%d%H%M%S&quot;)

        # 최종 조회일자 : 해당 일자이전 기간이 조회데이터에 포함되면 조회를 멈춤
        if df['체결시간'].iat[-1] &amp;lt; self.end_date:
            df = df[df['체결시간'] &amp;gt;= self.end_date]
            self.sPrevNext = None   
       
        df['code'] = code
        df = df.reset_index(drop=True)
        self.dataframes.append(df)
        
        print(df)
        self.getTime()  # 데이터 가져오는 데 걸린 시간 출력
        
    def getTime(self):
        end_time = time.time()
        elapsed_time = end_time - self.start_time
        result = timedelta(seconds=elapsed_time)
        print('-' * 50)
        print('데이터 조회 시간 : ', result)
        print('-' * 50)

    # 데이터 파일로 저장
    def save_data(self):
        combined_df = pd.concat(self.dataframes, ignore_index=True)
        combined_df.to_csv('C:/Users/최하준/Documents/all_data.csv', index=False)

        
if __name__ == &quot;__main__&quot;:
    app = QApplication(sys.argv)

    main = Main()
    main.comm_connect()
    main.end_date = datetime(2024, 3, 11)  # 현재부터 해당 날짜까지 조회

    start_time_total = time.time()

    code_list = [item.value for item in ItemList]

    # with ThreadPoolExecutor(max_workers=MAX_THREAD) as executor:
    for code in code_list:
        main.req_tick_chart(code)
    
    end_time_total = time.time()

    elapsed_time_total = end_time_total - start_time_total
    result_total = timedelta(seconds=elapsed_time_total)
    print(&quot;전체 데이터 조회 시간 : &quot;, result_total)

    main.save_data()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>멍청멍청기록/에러 일기</category>
      <category>opt10079</category>
      <category>주식틱차트조회요청</category>
      <category>키움증권 open api</category>
      <category>파이썬</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/356</guid>
      <comments>https://jjunii486.tistory.com/356#entry356comment</comments>
      <pubDate>Mon, 11 Mar 2024 15:35:16 +0900</pubDate>
    </item>
    <item>
      <title>JPA] QClass import 안되는 문제</title>
      <link>https://jjunii486.tistory.com/355</link>
      <description>&lt;h3 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;i&gt;Mac M1 pro // OS Ventura 13.6&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Intellij version&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Springboot 3.2&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;java 21&lt;/i&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;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클론 코딩 중 JPA Q class 생성 후 Import가 되지 않는 문제가 생겼습니다.&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;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;Intellij Project Structure   Project Settings   Modules  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Build 하위 generated 폴더를 Soures를 눌러서 잡는 방법이 많습니다.&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;하지만 저 같은 경우는 전혀 Import가 되지 않았습니다.&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;b&gt;해결 과정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 디렉토리를 보면 알겠지만 QTodo라고 Q Class가 생성된게 보이긴 합니다만...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임포트가 되지 않습니다...??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caT8JY/btsFpRV0w1O/on6dnjWVPDVvdKA2GVDzs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caT8JY/btsFpRV0w1O/on6dnjWVPDVvdKA2GVDzs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caT8JY/btsFpRV0w1O/on6dnjWVPDVvdKA2GVDzs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaT8JY%2FbtsFpRV0w1O%2Fon6dnjWVPDVvdKA2GVDzs0%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;694&quot; height=&quot;1374&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;1374&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;2) build.gradle 설정&lt;/p&gt;
&lt;pre id=&quot;code_1709114069278&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def querydslSrcDir = 'src/main/generated'
sourceSets {
    main {
        java {
            srcDirs += [ querydslSrcDir ]
        }
    }
}

tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}&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;3) 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 build gradle에서 Q Class의 소스를 src/main/generated 디렉토리 위치를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하고 Build or compileJava 후 Import를 하면 가능해집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;1408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2ReRu/btsFoFapNy8/yOIaFXxujk3i1uO3IvZNyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2ReRu/btsFoFapNy8/yOIaFXxujk3i1uO3IvZNyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2ReRu/btsFoFapNy8/yOIaFXxujk3i1uO3IvZNyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2ReRu%2FbtsFoFapNy8%2FyOIaFXxujk3i1uO3IvZNyK%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;698&quot; height=&quot;1408&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;1408&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;&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;a href=&quot;https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;Spring Boot 에서 QueryDSL JPA 사용하기 (velog.io)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709114606273&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;Spring Boot 에서 QueryDSL JPA 사용하기&quot; data-og-description=&quot;QueryDSL 을 본격적으로 사용해보자&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@soyeon207/QueryDSL-Spring-Boot-에서-QueryDSL-JPA-사용하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/k3o0K/hyVujhmCKf/q6HkRjC20BWsBaRcp8sbQ0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cMmh8c/hyVqkbaw56/ZLvq60UZ074k66tkcdcVi0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/f5zcG/hyVutddBIm/XKNNH57RtDaTTpzG0aM5Q0/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440&quot;&gt;&lt;a href=&quot;https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@soyeon207/QueryDSL-Spring-Boot-%EC%97%90%EC%84%9C-QueryDSL-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/k3o0K/hyVujhmCKf/q6HkRjC20BWsBaRcp8sbQ0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cMmh8c/hyVqkbaw56/ZLvq60UZ074k66tkcdcVi0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/f5zcG/hyVutddBIm/XKNNH57RtDaTTpzG0aM5Q0/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440');&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;Spring Boot 에서 QueryDSL JPA 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;QueryDSL 을 본격적으로 사용해보자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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>개발자의 공부방/스프링</category>
      <category>JPA Q Class</category>
      <category>Q Class Not Import</category>
      <category>QClass 임포트</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/355</guid>
      <comments>https://jjunii486.tistory.com/355#entry355comment</comments>
      <pubDate>Wed, 28 Feb 2024 19:05:28 +0900</pubDate>
    </item>
    <item>
      <title>스프링 시큐리티] 구글 로그인 적용하면서 생긴 문제점 해결 과정</title>
      <link>https://jjunii486.tistory.com/351</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) access token을 발급 받아야하는데 계속 null값으로 나오는 문제를 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 설정한 로그인 페이지가 아닌 OAuth2 google 로그인 기본 페이지가 나오는 문제 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 1,2 문제를 해결 후 구글 로그인 성공 시 설정한 리다이렉션 경로대로 나오지 않는 문제 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해결과정&lt;/b&gt;&lt;/h4&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;pre id=&quot;code_1705139105093&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private String makeToken(Date expiry, User user) {
//        Date now = new Date();
//        SecretKey key = Jwts.SIG.HS256.key().build();
//        SecretKey key = Keys.hmacShaKeyFor(environment.getProperty(&quot;jwt.token.secret&quot;).getBytes(StandardCharsets.UTF_8));
//        SecretKey secretKey = Keys.hmacShaKeyFor(jwtProperties.getSecretKey().getBytes(StandardCharsets.UTF_8));

        return Jwts.builder()
                .setHeaderParam(Header.TYPE, Header.JWT_TYPE)
                .setIssuer(jwtProperties.getIssuer())
                .setIssuedAt(new Date())
                .setExpiration(expiry)
                .setSubject(user.getEmail())
                .claim(&quot;id&quot;, user.getId())
                .signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())
                .compact();

        /*return Jwts.builder()
                .issuer(jwtProperties.getIssuer())
                .issuedAt(new Date())
                .expiration(expiry)
                .subject(user.getEmail())
                .claim(&quot;id&quot;, user.getId())
                .signWith(secretKey, Jwts.SIG.HS256)
                .compact();*/
    }&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;계속 access token에는 null만 죽어라 뜨고 있었습니다...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZpzOT/btsDs4ip37X/TM7A1mwvbZlhHqQGKK9Xi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZpzOT/btsDs4ip37X/TM7A1mwvbZlhHqQGKK9Xi1/img.png&quot; data-alt=&quot;난 예기치 않은 넌 (null) 싫다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZpzOT/btsDs4ip37X/TM7A1mwvbZlhHqQGKK9Xi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZpzOT%2FbtsDs4ip37X%2FTM7A1mwvbZlhHqQGKK9Xi1%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;482&quot; height=&quot;499&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;난 예기치 않은 넌 (null) 싫다...&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때부터 지옥의 Debug 모드가 발동됐습니다...&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;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgUGk5/btsDqajVdbR/9qtpIp0K9ekNt3PJiA0CK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgUGk5/btsDqajVdbR/9qtpIp0K9ekNt3PJiA0CK0/img.png&quot; data-alt=&quot;로그인때문에 브레이크 포인트 많은 것 보소...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgUGk5/btsDqajVdbR/9qtpIp0K9ekNt3PJiA0CK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgUGk5%2FbtsDqajVdbR%2F9qtpIp0K9ekNt3PJiA0CK0%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;864&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;864&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;&amp;nbsp;&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;첫번째 문제 해결도 못 했는데 갑자기 눈에 띄는 두번째 문제...&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;pre id=&quot;code_1705139065923&quot; class=&quot;less&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable)
                .httpBasic(HttpBasicConfigurer::disable)
                .formLogin(FormLoginConfigurer::disable)
                .logout(LogoutConfigurer::disable);

        http.sessionManagement(configure -&amp;gt; configure.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

        http.authorizeHttpRequests(authorize -&amp;gt;
                authorize.requestMatchers(&quot;/api/token&quot;).permitAll()
                        .requestMatchers(&quot;/api/**&quot;).authenticated()
                        .anyRequest().permitAll());

        http.oauth2Login(oauth2Login -&amp;gt;
                oauth2Login.loginPage(&quot;/login&quot;)
                        .authorizationEndpoint(authorizationEndpoint -&amp;gt;
                                authorizationEndpoint.authorizationRequestRepository(oAuth2AuthorizationRequestBseOnCookieRepository()))
                        .successHandler(oAuth2SuccessHandler())
                        .userInfoEndpoint(userInfoEndpoint -&amp;gt; userInfoEndpoint.userService(oAuth2UserCustomService)));

        http.logout(logout -&amp;gt; logout
                .logoutSuccessUrl(&quot;/login&quot;));

        http.exceptionHandling(exceptionHandling -&amp;gt;
                exceptionHandling.defaultAuthenticationEntryPointFor(
                        new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), new AntPathRequestMatcher(&quot;/api/**&quot;)));

        return http.build();
    }&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;결국 원인은...&lt;/p&gt;
&lt;pre id=&quot;code_1705139277971&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Bean&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;@Bean이 누락되어 필터체인을 아예 못 읽고 있었습니다......?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;야잇 시붊ㄴ아ㅔㅁㄴ에ㅐㅁㄴ아ㅐ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SE-4c39456f-64ca-43b4-ac45-ce04ed50e069.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZgRqs/btsDrFXtQQQ/FywKrKoly5wxTEJyd5XFzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZgRqs/btsDrFXtQQQ/FywKrKoly5wxTEJyd5XFzk/img.jpg&quot; data-alt=&quot;아아아아악!!!!!!!!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZgRqs/btsDrFXtQQQ/FywKrKoly5wxTEJyd5XFzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZgRqs%2FbtsDrFXtQQQ%2FFywKrKoly5wxTEJyd5XFzk%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;350&quot; height=&quot;342&quot; data-filename=&quot;SE-4c39456f-64ca-43b4-ac45-ce04ed50e069.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;342&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;&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;3040&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtLvMJ/btsDopu6lbl/3rAnkgp5EablpScOHCY8pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtLvMJ/btsDopu6lbl/3rAnkgp5EablpScOHCY8pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtLvMJ/btsDopu6lbl/3rAnkgp5EablpScOHCY8pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtLvMJ%2FbtsDopu6lbl%2F3rAnkgp5EablpScOHCY8pk%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;3040&quot; height=&quot;200&quot; data-origin-width=&quot;3040&quot; data-origin-height=&quot;200&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;&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;그래도 access token은 null 입니다????&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;images.jpeg&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV40ik/btsDqohVtbb/hTLifKZKycyWddj1VHpPv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV40ik/btsDqohVtbb/hTLifKZKycyWddj1VHpPv0/img.jpg&quot; data-alt=&quot;웃지만 웃는게 아니고 울지만 우는게 아닌 상황입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV40ik/btsDqohVtbb/hTLifKZKycyWddj1VHpPv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV40ik%2FbtsDqohVtbb%2FhTLifKZKycyWddj1VHpPv0%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;279&quot; height=&quot;156&quot; data-filename=&quot;images.jpeg&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;156&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 잠깐만 근데 왜 성공 후 설정한 리다이렉션 경로는 왜 못 읽냐?&lt;/p&gt;
&lt;pre id=&quot;code_1705139704889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
    public static final String REFRESH_TOKEN_COOKIE_NAME = &quot;refresh_token&quot;;
    public static final Duration REFRESH_TOKEN_DURATION = Duration.ofDays(14);
    public static final Duration ACCESS_TOKEN_DURATION = Duration.ofDays(1);
    public static final String REDIRECT_PATH = &quot;/articles&quot;; &amp;lt;-- 경로? 무엇?

	.....&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;이상합니다..? 어라...?&lt;/p&gt;
&lt;pre id=&quot;code_1705139786415&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String targetUrl = getTargetUrl(accessToken);
System.out.println(&quot;targetUrl = &quot; + targetUrl);&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;원초적인 디버깅인 시스템 아웃 프린트가 안찍힙니다? 뭐지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하....&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SE-7a995cd0-bd14-4640-86b2-9e7597a42544.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9b78k/btsDp9yBWS8/rJLGk5OOFwqiYcUgsB8Tt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9b78k/btsDp9yBWS8/rJLGk5OOFwqiYcUgsB8Tt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9b78k/btsDp9yBWS8/rJLGk5OOFwqiYcUgsB8Tt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9b78k%2FbtsDp9yBWS8%2FrJLGk5OOFwqiYcUgsB8Tt0%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;350&quot; height=&quot;336&quot; data-filename=&quot;SE-7a995cd0-bd14-4640-86b2-9e7597a42544.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;336&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넵 @Component가 없었습니다....... &lt;/p&gt;
&lt;pre id=&quot;code_1705139849360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {&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;@Component 넣으니 이제 access token 정상적인 발급과 시스템 아웃 프린트도 잘 나오는군여ㅠㅜㅠㅜ&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 중요한 정보는 log 잘 찍어놓자....&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;i&gt;@Configuration + @Bean은 짝궁이고&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;i&gt;@Component는 네가 만든 클래스 등록해야지하는건데 왜 생각없이 했냐...?&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;딱 대!!&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c_hbeUd018svcb2ftkli0w36x_fx1p51.jpg&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PlzQX/btsDrDyBPeP/NjTzdZWKzFBItao65Q6HT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PlzQX/btsDrDyBPeP/NjTzdZWKzFBItao65Q6HT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PlzQX/btsDrDyBPeP/NjTzdZWKzFBItao65Q6HT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPlzQX%2FbtsDrDyBPeP%2FNjTzdZWKzFBItao65Q6HT1%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;276&quot; height=&quot;276&quot; data-filename=&quot;c_hbeUd018svcb2ftkli0w36x_fx1p51.jpg&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;276&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>멍청멍청기록/에러 일기</category>
      <category>구글 로그인 OAuth2.0</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/351</guid>
      <comments>https://jjunii486.tistory.com/351#entry351comment</comments>
      <pubDate>Sat, 13 Jan 2024 19:02:50 +0900</pubDate>
    </item>
    <item>
      <title>스프링] Cache miss for REQUEST dispatch to '/' (previous null). Performing MatchableHandlerMapping lookup. This is logged once only at WARN level, and every time at TRACE.</title>
      <link>https://jjunii486.tistory.com/350</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 3.2.0 으로 프로젝트를 진행하는 중에 아래와 같은 메시지 트레킹이 계속 되고 있어서 궁금해서 찾아봤다.&lt;b&gt;&lt;/b&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에러 메시지&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705134961512&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Cache miss for REQUEST dispatch to '/login' (previous null).
Performing MatchableHandlerMapping lookup.
This is logged once only at WARN level, and every time at TRACE.&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;&lt;b&gt;원인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 3.2.0 고질병&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 3.2.1 이상으로 업그레이드 하면 사라짐&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;github 이슈 트레킹&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/38587&quot;&gt;Spring Boot 3.2.0 Cache miss for REQUEST dispatch to '/actuator/health/readiness' &amp;middot; Issue #38587 &amp;middot; spring-projects/spring-boot (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705135003770&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Spring Boot 3.2.0 Cache miss for REQUEST dispatch to '/actuator/health/readiness' &amp;middot; Issue #38587 &amp;middot; spring-projects/spring-boot&quot; data-og-description=&quot;This seems to be a new warning with Spring Boot 3.2.0: Cache miss for REQUEST dispatch to '/actuator/health/readiness' (previous null). Performing MatchableHandlerMapping lookup. This is logged onc...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-boot/issues/38587&quot; data-og-url=&quot;https://github.com/spring-projects/spring-boot/issues/38587&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RSFFv/hyU2qXts8G/qJpGHvMl8SGUHhrOzAsHnk/img.png?width=1200&amp;amp;height=600&amp;amp;face=988_116_1046_179&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/38587&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-boot/issues/38587&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RSFFv/hyU2qXts8G/qJpGHvMl8SGUHhrOzAsHnk/img.png?width=1200&amp;amp;height=600&amp;amp;face=988_116_1046_179');&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;Spring Boot 3.2.0 Cache miss for REQUEST dispatch to '/actuator/health/readiness' &amp;middot; Issue #38587 &amp;middot; spring-projects/spring-boot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This seems to be a new warning with Spring Boot 3.2.0: Cache miss for REQUEST dispatch to '/actuator/health/readiness' (previous null). Performing MatchableHandlerMapping lookup. This is logged onc...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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>멍청멍청기록/에러 일기</category>
      <category>Cache miss for REQUEST dispatch to</category>
      <author>쥬니준</author>
      <guid isPermaLink="true">https://jjunii486.tistory.com/350</guid>
      <comments>https://jjunii486.tistory.com/350#entry350comment</comments>
      <pubDate>Sat, 13 Jan 2024 17:38:43 +0900</pubDate>
    </item>
  </channel>
</rss>