<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>우선, 개발 블로그</title>
    <link>https://firstws.tistory.com/</link>
    <description>주니어 백엔드 개발자의 개발 일기입니다:)</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 19:15:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>김먼저</managingEditor>
    <item>
      <title>[UE] UE5 블루프린트 부모클래스 None이 되는 현상</title>
      <link>https://firstws.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;에디터 실행 시 블루프린트 parent class 가 None으로 나와서 배치된 블루프린트가 사라지고 사용이 불가능한 현상&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;lt;Message&amp;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;BP_CurrentDistribution&amp;nbsp;&amp;nbsp;블루프린트에&amp;nbsp;부모&amp;nbsp;클래스가&amp;nbsp;없거나&amp;nbsp;NULL&amp;nbsp;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[0350.96]&amp;nbsp;BP_CurrentDistribution&amp;nbsp;컴파일에&amp;nbsp;실패했습니다.&amp;nbsp;치명적&amp;nbsp;오류&amp;nbsp;1&amp;nbsp;회,&amp;nbsp;경고&amp;nbsp;0&amp;nbsp;회,&amp;nbsp;[소요시간&amp;nbsp;11&amp;nbsp;ms]&amp;nbsp;(/Game/Blueprints/BP_CurrentDistribution.BP_CurrentDistribution)&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;size18&quot;&gt;&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;편집 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;rarr; 에디터 개인설정 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;rarr; 일반 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;rarr; 로드&amp;amp;저장 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;rarr; '시작 시 강제 컴파일' 체크 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;rarr; 에디터 재시작&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PAKmV/btsPuKT3TVH/dLMAertlxvkF7FvucU3VnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PAKmV/btsPuKT3TVH/dLMAertlxvkF7FvucU3VnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PAKmV/btsPuKT3TVH/dLMAertlxvkF7FvucU3VnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPAKmV%2FbtsPuKT3TVH%2FdLMAertlxvkF7FvucU3VnK%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;427&quot; height=&quot;339&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zj0af/btsPthewH5J/olrSH7gw0z2PWhCIScqZD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zj0af/btsPthewH5J/olrSH7gw0z2PWhCIScqZD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zj0af/btsPthewH5J/olrSH7gw0z2PWhCIScqZD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZj0af%2FbtsPthewH5J%2FolrSH7gw0z2PWhCIScqZD0%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;1253&quot; height=&quot;809&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Unreal</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/83</guid>
      <comments>https://firstws.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 23 Jul 2025 08:40:37 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 실행 오류. 명령줄이 너무 깁니다. &amp;gt; 해결 방법</title>
      <link>https://firstws.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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-filename=&quot;명령줄이깁니다-1.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caATQg/btsKxrdYWIy/HhAuayO3lqd8tKKgxv3PC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caATQg/btsKxrdYWIy/HhAuayO3lqd8tKKgxv3PC0/img.png&quot; data-alt=&quot;자주 보는데 해결방법 역시 자주 까먹..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caATQg/btsKxrdYWIy/HhAuayO3lqd8tKKgxv3PC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaATQg%2FbtsKxrdYWIy%2FHhAuayO3lqd8tKKgxv3PC0%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;451&quot; height=&quot;118&quot; data-filename=&quot;명령줄이깁니다-1.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;118&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp; 구성 편집 (Edit Configurations...) 창 열기&lt;/b&gt;&lt;/h3&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-filename=&quot;2-구성편집.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TQ5W/btsKygptb86/tIK3GToJ4hDn6VLcQcUYJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TQ5W/btsKygptb86/tIK3GToJ4hDn6VLcQcUYJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TQ5W/btsKygptb86/tIK3GToJ4hDn6VLcQcUYJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TQ5W%2FbtsKygptb86%2FtIK3GToJ4hDn6VLcQcUYJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;531&quot; data-filename=&quot;2-구성편집.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;531&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. '옵션 수정' 클릭&lt;/b&gt;&lt;/h3&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-filename=&quot;3-옵션 수정.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/skCm7/btsKxXjp9HF/4MbKm9lrKzJibHkTq9t3z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/skCm7/btsKxXjp9HF/4MbKm9lrKzJibHkTq9t3z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/skCm7/btsKxXjp9HF/4MbKm9lrKzJibHkTq9t3z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FskCm7%2FbtsKxXjp9HF%2F4MbKm9lrKzJibHkTq9t3z0%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;1049&quot; height=&quot;199&quot; data-filename=&quot;3-옵션 수정.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;199&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. '명령어 단축' 클릭&lt;/b&gt;&lt;/h3&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-filename=&quot;4-명령줄 단축 옵션 선택.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yDepZ/btsKxTVCs2B/Pzj7CWIymtSwBrweFp18wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yDepZ/btsKxTVCs2B/Pzj7CWIymtSwBrweFp18wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yDepZ/btsKxTVCs2B/Pzj7CWIymtSwBrweFp18wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyDepZ%2FbtsKxTVCs2B%2FPzj7CWIymtSwBrweFp18wK%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;428&quot; height=&quot;791&quot; data-filename=&quot;4-명령줄 단축 옵션 선택.png&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;791&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 'JAR manifest' 선택&lt;/b&gt;&lt;/h3&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-filename=&quot;5-jar manifest 선택.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmJY63/btsKysXKogp/TTRPyeZbSPRsykGDvHtbxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmJY63/btsKysXKogp/TTRPyeZbSPRsykGDvHtbxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmJY63/btsKysXKogp/TTRPyeZbSPRsykGDvHtbxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmJY63%2FbtsKysXKogp%2FTTRPyeZbSPRsykGDvHtbxK%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;1048&quot; height=&quot;678&quot; data-filename=&quot;5-jar manifest 선택.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;678&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. '적용' &amp;gt; '확인' &amp;gt; 실행하기&lt;/b&gt;&lt;/h3&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-filename=&quot;6-적용및확인.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB8WcG/btsKxW5RGHL/c5Dy4kKnM2WJR7tZfvhr3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB8WcG/btsKxW5RGHL/c5Dy4kKnM2WJR7tZfvhr3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB8WcG/btsKxW5RGHL/c5Dy4kKnM2WJR7tZfvhr3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB8WcG%2FbtsKxW5RGHL%2Fc5Dy4kKnM2WJR7tZfvhr3K%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;1048&quot; height=&quot;677&quot; data-filename=&quot;6-적용및확인.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;677&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;</description>
      <category>Error</category>
      <category>intellij 명령줄</category>
      <category>intellij 명령줄이</category>
      <category>intellij 명령줄이 너무 깁니다.</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/82</guid>
      <comments>https://firstws.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 5 Nov 2024 14:30:36 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 구글 드라이브 최신문서함 조건 (쿼리, 매개변수)</title>
      <link>https://firstws.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구글 드라이브 &amp;gt; 최신문서함&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;과 같은 리스트를 구현하는데 애를 좀 먹었습니다...&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;s&gt;(Google Drive Activity API 까지 본건 비밀)&lt;/s&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;	query = &quot;mimeType != 'application/vnd.google-apps.folder' and trashed = false&quot;;
	orderBy = &quot;viewedByMeTime desc&quot;;

	FileList result = service.files().list()
                        .setQ(query)
                    	.setCorpora(&quot;allDrives&quot;)	// corpora를 매개변수로 설정
                    	.setIncludeItemsFromAllDrives(true)	// 내 드라이브와 공유 드라이브 항목 포함
                    	.setSupportsAllDrives(true)	// 모든 드라이브 지원
                    	.setPageSize(pageSize)
                    	.setSpaces(&quot;drive&quot;)
                    	.setOrderBy(orderBy)
                    	.setFields(&quot;files(id, name, owners, mimeType, viewedByMeTime, modifiedTime, webContentLink, webViewLink, hasThumbnail, thumbnailLink, size)&quot;)
                    	.execute();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Corpora&lt;/li&gt;
&lt;li&gt;IncludeItemsFromAllDrives&lt;/li&gt;
&lt;li&gt;SupportsAllDrives&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;corpora 하나만 사용해서는 안되고&amp;nbsp; 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;....후.....퇴근해야지....&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>Java</category>
      <category>구글 드라이브</category>
      <category>구글 드라이브 매개변수</category>
      <category>구글 드라이브 최신문서함</category>
      <category>구글 드라이브 쿼리</category>
      <category>최신문서함</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/81</guid>
      <comments>https://firstws.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 10 Oct 2024 20:28:26 +0900</pubDate>
    </item>
    <item>
      <title>[CD/CD] CD/CD 개념</title>
      <link>https://firstws.tistory.com/80</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CI/CD의 개념과 사용목표&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CI-CD cycle.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AJtcM/btsI0gM9WS0/UuPK5iHG6Ygfkg2Pdl8Kak/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AJtcM/btsI0gM9WS0/UuPK5iHG6Ygfkg2Pdl8Kak/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AJtcM/btsI0gM9WS0/UuPK5iHG6Ygfkg2Pdl8Kak/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAJtcM%2FbtsI0gM9WS0%2FUuPK5iHG6Ygfkg2Pdl8Kak%2Fimg.webp&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;826&quot; height=&quot;156&quot; data-filename=&quot;CI-CD cycle.png&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;156&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;&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(1) CI - 지속적 통합(&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;Continuous Integration)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&amp;nbsp;CI는 &lt;u&gt;코드 변경 사항이 주기적으로 빌드 및 테스트&lt;/u&gt;되어 공유 Repository에 통합되는 과정을 말합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;이를 통해 &lt;u&gt;개발 초기 단계에서 문제를 발견하고 해결&lt;/u&gt;할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #151515;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(2) CD : &lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;지속적 제공/배포(Continuous Delivery/Deployment)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #151515;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #151515;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #151515; text-align: start;&quot;&gt;&amp;nbsp;CD는 CI 과정을 통과한 코드를 &lt;u&gt;자동으로 배포&lt;/u&gt;하는 과정을 말합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 사용 목표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;a. 버그 및 코드 오류를 예방 &amp;rarr; 개발팀의 협업을 강화하고, 소프트웨어의 신뢰성을 높이는데 기여.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;b. 동시에 지속적인 소프트웨어 개발 및 업데이트 주기를 유지하는데 도움.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;c. 복잡성을 줄이고 효율성을 높이며 워크플로우를 간소화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;* 정리하자면, branch에 commit/push하면 빌드 및 테스트코드로 검사하고 무중단배포까지 자동화하는 시스템.&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;s&gt;못했 아니&lt;/s&gt; 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD도 깊게 파고들면 내용이 뭐가 많네요...지속적 배포에는 선행해야할 작업이 많이 필요해 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 CI/CD 구축 포스팅에서 더욱 자세한 개념까지 적겠습니다.&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>CI &amp;amp; CD</category>
      <category>CI CD</category>
      <category>ci/cd</category>
      <category>CICD</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/80</guid>
      <comments>https://firstws.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 11 Aug 2024 22:29:44 +0900</pubDate>
    </item>
    <item>
      <title>[React] 'react-simple-jstree' 에서 클릭한 파일 Path 가져오기</title>
      <link>https://firstws.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트에서 폴더 트리를 사용하는데 클릭한 파일경로를 얻는 방법을 시행착오(?) 끝에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허무할 정도로 간단하게 얻는 방법을 알게되어 포스팅합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;분명 저처럼 메서드 만들어서 알아내려고하는 분이 분명있을거 같....&lt;/s&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;먼저 tsx파일의 return 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706174124773&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const handleNodeSelect = (e: Event, data: any) =&amp;gt; {
    if (data &amp;amp;&amp;amp; data.node &amp;amp;&amp;amp; data.instance) {

      // 클라이언트에서 선택한 폴더의 경로
      const folderPath = data.instance.get_path(data.node, '/');

      console.log(folderPath);

      // API에서 선택된 폴더의 이미지 리스트를 가져오기
      axios.get('/api...', {
        params: {
          folderPath: folderPath,
        },
      })
        .then(response =&amp;gt; {
          console.log(response);
        });
    }
  };

return(
....
&amp;lt;TreeView treeData={treeData} onChange={handleNodeSelect} /&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;instance.get_path(data.node, '/')로 간단하게 해결했습니다.&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-filename=&quot;11.PNG&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swu53/btsDXCteeEr/hnlrDYk16Kir0pg5zi6u9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swu53/btsDXCteeEr/hnlrDYk16Kir0pg5zi6u9k/img.png&quot; data-alt=&quot;클릭!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swu53/btsDXCteeEr/hnlrDYk16Kir0pg5zi6u9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fswu53%2FbtsDXCteeEr%2FhnlrDYk16Kir0pg5zi6u9k%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;178&quot; height=&quot;181&quot; data-filename=&quot;11.PNG&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;181&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.PNG&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lsEzI/btsDWJl3oiy/rB7xxHMt5ASM9sHBZWaFYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lsEzI/btsDWJl3oiy/rB7xxHMt5ASM9sHBZWaFYK/img.png&quot; data-alt=&quot;console.log&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lsEzI/btsDWJl3oiy/rB7xxHMt5ASM9sHBZWaFYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlsEzI%2FbtsDWJl3oiy%2FrB7xxHMt5ASM9sHBZWaFYK%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;163&quot; height=&quot;23&quot; data-filename=&quot;22.PNG&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;console.log&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>react-simple-jstree</category>
      <category>react-simple-jstree path</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/79</guid>
      <comments>https://firstws.tistory.com/79#entry79comment</comments>
      <pubDate>Thu, 25 Jan 2024 18:25:08 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript와 TypeScript 차이점</title>
      <link>https://firstws.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 170px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;JavaScript&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;언어&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;스크립팅 언어&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;객체지향 컴파일 언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: center;&quot;&gt;정적 타입 vs 동적 타입&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;동적 타입&lt;br /&gt;&lt;br /&gt;-변수의 타입을 런타임에 결정&lt;br /&gt;- 변수를 선언할 때 타입을 명시할 필요X&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;정적 타입&lt;br /&gt;&lt;br /&gt;-변수의 타입을 컴파일 시점에 결정&lt;br /&gt;-변수를 선언할 때 명시적으로 타입 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;타입 시스템&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;동적 타입 언어이기 때문에&lt;br /&gt;런타임시에만 타입이 검사됨.&lt;br /&gt;이로 인해 런타임 오류가 발생 할 수 있음.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;정적 타입 언어이기 때문에&lt;br /&gt;컴파일 시에 타입 체크를 수행.&lt;br /&gt;이로 인해 오류를 사전에 방지.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: center;&quot;&gt;에러 처리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;런타임에 발생한 에러는 실행 중단 발생.&lt;br /&gt;디버깅 어려움.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;일부 오류는 컴파일 시 발견됨.&lt;br /&gt;따라서 상대적으로 더 안전함.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #333333; text-align: center;&quot;&gt;컴파일러&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: center;&quot;&gt;별도의 컴파일 단계 없이,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: center;&quot;&gt;소스 코드를 직접 실행 가능.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: center;&quot;&gt;TypeScript 컴파일러를 사용하여 JavaScript 코드로 변환 후 실행.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;생태계&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;웹 브라우저 및 Node.js 등 다양한 환경에서 지원되며, 방대한 라이브러리와 생태계 보유.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;주로 대규모 프로젝트 및 엔터프라이즈 소프트웨어 개발에 사용되며, Angular 및 Next.js 같은 프레임워크에서 사용.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;프로젝트 규모&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;작은 규모~대규모 프로젝트까지&lt;br /&gt;다양하게 사용.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;대규모 프로젝트에서의 활용이 강조됨.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.2635%; height: 17px; text-align: center;&quot;&gt;개발 생산성&lt;/td&gt;
&lt;td style=&quot;width: 37.4031%; height: 17px; text-align: center;&quot;&gt;더 유연한 문법으로 인해&lt;br /&gt;초기 개발 속도가 빠를 수 있음.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;타입 체크로 인한 높은 안전성으로 유지보수가 쉽고 생산성을 높일 수 있음.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TypeScript는 JavaScript를 보완하는 형태로 개발되어,&lt;br /&gt;&lt;br /&gt;정적 타입과 모듈 시스템 등의 기능을 통해 더 안전하고 유지보수성이 높은 코드를 작성할 수 있도록 도와줍니다.&lt;br /&gt;&lt;br /&gt;선택은 프로젝트의 요구사항 과 개발자의 선호도에 따라 다르게 될 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>javascript typescript</category>
      <category>javascript typescript 차이점</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/78</guid>
      <comments>https://firstws.tistory.com/78#entry78comment</comments>
      <pubDate>Wed, 15 Nov 2023 09:24:21 +0900</pubDate>
    </item>
    <item>
      <title>[SourceTree] Branch(브랜치) 변경하기</title>
      <link>https://firstws.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 저장소 &amp;rarr; 체크 아웃...&lt;/b&gt;&lt;/span&gt;&lt;/h3&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-filename=&quot;브랜치 바꾸기 11.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUaoYH/btsxq4KI8il/ikakPRRq4rlmAcjd0KkOT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUaoYH/btsxq4KI8il/ikakPRRq4rlmAcjd0KkOT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUaoYH/btsxq4KI8il/ikakPRRq4rlmAcjd0KkOT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUaoYH%2Fbtsxq4KI8il%2FikakPRRq4rlmAcjd0KkOT1%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;519&quot; height=&quot;600&quot; data-filename=&quot;브랜치 바꾸기 11.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;600&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;&amp;nbsp;&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. 새 브랜치 체크아웃 &amp;rarr; 체크아웃할 원격 브랜치 &amp;rarr; 변경하려는 Branch 선택 후 확인&lt;/b&gt;&lt;/span&gt;&lt;/h3&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-filename=&quot;브랜치 바꾸기 1.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buuNd0/btsxrZCrgl0/er2btZlK7EGSeL7wLS7sVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buuNd0/btsxrZCrgl0/er2btZlK7EGSeL7wLS7sVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buuNd0/btsxrZCrgl0/er2btZlK7EGSeL7wLS7sVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuuNd0%2FbtsxrZCrgl0%2Fer2btZlK7EGSeL7wLS7sVK%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;465&quot; height=&quot;411&quot; data-filename=&quot;브랜치 바꾸기 1.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;411&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>Git</category>
      <category>sourcetree branch checkout</category>
      <category>소스트리 브랜치 변경</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/77</guid>
      <comments>https://firstws.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 10 Oct 2023 14:38:42 +0900</pubDate>
    </item>
    <item>
      <title>[React] 리액트(React) 개발 환경 셋팅하기 - win10</title>
      <link>https://firstws.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 리액트 개발에도 참여하게 되어 React 공부를 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드개발자라면 프론트개발에 대해 어느정도 할 줄 알아야한다고 생각했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 또 기회가 오네요 하하하하하하하하하&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;막상 업무를 받으니 하기 귀찮&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 환경 설정부터 시작하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. Node.js (최신버전) 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;blockquote data-ke-style=&quot;style3&quot;&gt;Node.js는 Chrome V8 Javascript 엔진으로 만들어진 Javascript 런타임입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;※ React 개발 환경 셋팅하는데 Node.js를 왜 설치하나요?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;React를 사용하기 위해 Node.js가 반드시 필요한 것은 아닙니다.&lt;/u&gt;&amp;nbsp; Node.js는 JavaScript 런타임 환경으로, 서버 측 애플리케이션 개발을 위해 사용됩니다. React와 Node.js는 다른 목적을 가진 도구이지만, React 앱을 개발할 때 Node.js를 사용하는 이유가 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Build 및 개발 도구&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;nbsp;React 앱은 일반적으로 JSX(JavaScript XML)로 작성되며, 이 JSX 코드를 일반 JavaScript 코드로 변환해야 합니다. 또한 React 컴포넌트를 번들링하고 개발 서버를 실행하는 데 Node.js 기반의 도구가 사용됩니다. 예를 들어, Create React App과 같은 도구는 Node.js를 기반으로 하며 React 앱을 빠르고 효율적으로 개발할 수 있게 도와줍니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 서버 측 렌더링(SSR)&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;nbsp;일부 React 앱은 서버 측 렌더링(SSR)을 사용하여 초기 로드 속도를 향상시킵니다. SSR은 Node.js 서버에서 React 컴포넌트를 실행하고 HTML을 생성한 다음 클라이언트에게 전송하는 방식으로 작동합니다. 이를 통해 검색 엔진 최적화(SEO) 및 초기 로딩 성능 향상을 달성할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. API 통신&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;대부분의 React 앱은 서버와 데이터를 주고받아야 합니다. Node.js는 서버 측 로직을 작성하고 API 엔드포인트를 만드는 데 사용할 수 있습니다. 이러한 API는 React 앱에서 데이터를 요청하고 업데이트하는 데 사용됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 배포 및 호스팅&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Node.js는 React 앱을 서버에 배포하고 호스팅하는 데도 사용됩니다. 서버 측 로직을 실행하고 React 앱을 제공하는 데 도움이 됩니다.&lt;br /&gt;&lt;br /&gt;따라서 React 앱을 개발하고 배포할 때 Node.js를 설치하는 것은 중요합니다. &lt;u&gt;Node.js는 JavaScript를 실행하고 서버 측 작업을 수행하는 환경을 제공하여 React 앱의 개발과 실행을 용이하게 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/u&gt;조금 더 자세히 말하자면, Node.js는 설치하는 경우 NPM(Node Package Manager)이 같이 설치되는데 이 NPM이란 것을 통해 React 개발에 필요한 다양한 모듈들을 다운받아 사용할 수 있습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694146219693&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;Node.js&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko&quot; data-og-url=&quot;https://nodejs.org/ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WG96e/hyTSsgr1nG/YU2wuTzHX5UgJvk8XVvtU1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/cpSTq8/hyTPCkFjDC/gOMfYreHI8xAOEjQMrzpY0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WG96e/hyTSsgr1nG/YU2wuTzHX5UgJvk8XVvtU1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/cpSTq8/hyTPCkFjDC/gOMfYreHI8xAOEjQMrzpY0/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&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;Node.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 사이트에서 Node.js를 다운받아 설치합니다. LTS 버전으로 설치하는 것을 추천합니다.&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-filename=&quot;버전확인하기.PNG&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p73jq/btstsP3N2UY/9WeREDzwfgCuyFrolwl0TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p73jq/btstsP3N2UY/9WeREDzwfgCuyFrolwl0TK/img.png&quot; data-alt=&quot;cmd창에서 버전확인하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p73jq/btstsP3N2UY/9WeREDzwfgCuyFrolwl0TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp73jq%2FbtstsP3N2UY%2F9WeREDzwfgCuyFrolwl0TK%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;175&quot; height=&quot;90&quot; data-filename=&quot;버전확인하기.PNG&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cmd창에서 버전확인하기&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. Visual Studio Code (VS Code) 설치&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;React 개발에 가장 많이 사용되는 IDE(통합 개발 환경)인 VS Code를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/?wt.mc_id=vscom_downloads&quot;&gt;https://code.visualstudio.com/?wt.mc_id=vscom_downloads&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1694146698392&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;Visual Studio Code - Code Editing. Redefined&quot; data-og-description=&quot;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/?wt.mc_id=vscom_downloads&quot; data-og-url=&quot;https://code.visualstudio.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tUSBO/hyTSA6BMCo/AMqlHCq5mU0RYAZe2vw8S0/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/?wt.mc_id=vscom_downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/?wt.mc_id=vscom_downloads&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tUSBO/hyTSA6BMCo/AMqlHCq5mU0RYAZe2vw8S0/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506');&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;Visual Studio Code - Code Editing. Redefined&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. React 프로젝트 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;blockquote data-ke-style=&quot;style3&quot;&gt;VS Code를 실행 &amp;rarr; 상단 &quot;File&quot; 탭&amp;nbsp; &amp;rarr; &quot;Open Folder ..&quot; &amp;rarr; 원하는 위치에 프로젝트 (빈)폴더 생성 &amp;rarr; &quot;폴더 선택&quot; &amp;rarr; 상단 'Terminal' 탭 &amp;rarr; 'New Terminal'&lt;/blockquote&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-filename=&quot;프젝 생성-1.PNG&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxgsw/btstr1pTYXy/kPmROixudayzBbThuRSGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxgsw/btstr1pTYXy/kPmROixudayzBbThuRSGMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxgsw/btstr1pTYXy/kPmROixudayzBbThuRSGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foxgsw%2Fbtstr1pTYXy%2FkPmROixudayzBbThuRSGMK%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;1455&quot; height=&quot;562&quot; data-filename=&quot;프젝 생성-1.PNG&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 'React-project' 라는 빈폴더 생성하고 열었습니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;1)&amp;nbsp; 터미널에 아래 명령어 입력하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694151460482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app &quot;폴더명&quot;&lt;/code&gt;&lt;/pre&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-filename=&quot;프젝 생성-2.PNG&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vjf5A/btsts3Vjl5c/6IVScoDdFngPoM17xQeA71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vjf5A/btsts3Vjl5c/6IVScoDdFngPoM17xQeA71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vjf5A/btsts3Vjl5c/6IVScoDdFngPoM17xQeA71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVjf5A%2Fbtsts3Vjl5c%2F6IVScoDdFngPoM17xQeA71%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;499&quot; height=&quot;915&quot; data-filename=&quot;프젝 생성-2.PNG&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프젝 생성-3.PNG&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnmQ3o/btstrQIKoK1/a2hp7mmljPgvKVjtIIEAsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnmQ3o/btstrQIKoK1/a2hp7mmljPgvKVjtIIEAsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnmQ3o/btstrQIKoK1/a2hp7mmljPgvKVjtIIEAsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnmQ3o%2FbtstrQIKoK1%2Fa2hp7mmljPgvKVjtIIEAsk%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;549&quot; height=&quot;398&quot; data-filename=&quot;프젝 생성-3.PNG&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;398&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;React-project 폴더 안에 'hello-react' 프로젝트가 생성되있는걸 확인!&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2) 프로젝트 구조 알아보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프젝 생성-4.PNG&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uG7S5/btstq1cEcNl/180v34L8DT9JUwqDRVpG3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uG7S5/btstq1cEcNl/180v34L8DT9JUwqDRVpG3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uG7S5/btstq1cEcNl/180v34L8DT9JUwqDRVpG3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuG7S5%2Fbtstq1cEcNl%2F180v34L8DT9JUwqDRVpG3K%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;258&quot; height=&quot;520&quot; data-filename=&quot;프젝 생성-4.PNG&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;520&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;blockquote data-ke-style=&quot;style3&quot;&gt;node_modules : 라이브러리 모음 폴더&lt;br /&gt;public : 이미지 파일과 같은 static 파일 보관함(빌드 시에 압축되지 않음)&lt;br /&gt;src : 소스 코드 보관함.&lt;br /&gt;src - App.js : 메인페이지에 들어갈 HTML을 작성하는 곳&lt;/blockquote&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;3) 프로젝트 실행시키기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694153028659&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/pre&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-filename=&quot;npm-start.PNG&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOZxLz/btstnxpD5ih/TwkS5StIPHNbgW40WUR8SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOZxLz/btstnxpD5ih/TwkS5StIPHNbgW40WUR8SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOZxLz/btstnxpD5ih/TwkS5StIPHNbgW40WUR8SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOZxLz%2FbtstnxpD5ih%2FTwkS5StIPHNbgW40WUR8SK%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;1920&quot; height=&quot;857&quot; data-filename=&quot;npm-start.PNG&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;857&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;http://localhost:3000/ 이 자동으로 연결됩니다!&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;s&gt;이것이 React Hello World?&lt;/s&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;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;src - App.js가 메인페이지에 들어갈 HTML을 작성하는 곳이라고 말씀드렸는데요&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;pre id=&quot;code_1694156881187&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p&amp;gt;
 Hello World!!
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 아래와 같이 작성한 뒤 'Ctrl+S'(저장) 을 눌러봅시다!&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-filename=&quot;output.PNG&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;965&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCvJL/btstxkotbOX/3nrsxbyU9ui0AYdMKF3m10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCvJL/btstxkotbOX/3nrsxbyU9ui0AYdMKF3m10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCvJL/btstxkotbOX/3nrsxbyU9ui0AYdMKF3m10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCvJL%2FbtstxkotbOX%2F3nrsxbyU9ui0AYdMKF3m10%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;1700&quot; height=&quot;965&quot; data-filename=&quot;output.PNG&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;965&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 data-ke-size=&quot;size16&quot;&gt;...끝!!&lt;/p&gt;</description>
      <category>React</category>
      <category>React 개발 환경</category>
      <category>React 설치하기</category>
      <category>리액트 개발 환경</category>
      <category>리액트 설치</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/76</guid>
      <comments>https://firstws.tistory.com/76#entry76comment</comments>
      <pubDate>Fri, 8 Sep 2023 15:22:42 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 실행시간 측정하기</title>
      <link>https://firstws.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694069560731&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from time import time

t1 = time()

# ------- 측정할 로직 ---------

t2 = time()
cost_time = t2 - t1
hours, rem = divmod(cost_time, 3600)
minutes, seconds = divmod(rem, 60)
logger.info(f'cost time : {int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}')&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;blockquote data-ke-style=&quot;style2&quot;&gt;cost time : 01:23:45&lt;/blockquote&gt;</description>
      <category>Python</category>
      <category>Python 실행 시간 측정</category>
      <category>파이썬 실행 시간 측정</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/75</guid>
      <comments>https://firstws.tistory.com/75#entry75comment</comments>
      <pubDate>Thu, 7 Sep 2023 15:53:52 +0900</pubDate>
    </item>
    <item>
      <title>[GCP/Linux] vGPU(가상 GPU) Driver 설치하기(1xNVIDIA T4)</title>
      <link>https://firstws.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GCP Compute Engine을 아래와 같이 설정하였습니다.&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;CPU : Intel Haswell&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처 : &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;x86/64&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;GPU : &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;1xNVIDIA T4&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부팅디스크는 Ubuntu20.04, 30GB입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(이번 포스팅은 가상 GPU 드라이버 설치방법이므로 자세한 사양은 생략하겠습니다.)&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;실물 GPU의 드라이버는 정보가 명확하여 찾기 쉬우나, 가상 GPU(이하 vGPU)는 드라이버 찾기가 조금 다릅니다.&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: #000000;&quot;&gt;이유는 해당하는 vGPU 모델명과 드라이버 다운로드 사이트에서의 모델명과 다른 경우가 있기 때문인데요,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유추는 가능하나 명확하지 않아 다시 검색해봐야하고, CUDA 버전 또한 맞춰줘야합니다.&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;그럼 이제 1xNVIDIA T4 의 Driver를 설치해보겠습니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. NVIDIA 드라이버 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.nvidia.com/Download/index.aspx#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.nvidia.com/Download/index.aspx#&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693268620170&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;Download the latest official NVIDIA drivers&quot; data-og-description=&quot;Download the latest official NVIDIA drivers&quot; data-og-host=&quot;www.nvidia.com&quot; data-og-source-url=&quot;https://www.nvidia.com/Download/index.aspx#&quot; data-og-url=&quot;https://www.nvidia.com/download/Index.aspx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pfFMn/hyTL6ELAaF/o3mT93N7ZwMjskbnyfbkIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/brsOAk/hyTL32l0qO/vknetGdIk2nH6kKxZAKIw0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bffKaG/hyTMfPeVuY/3PxmS1rXLzk90gqe9b6xVk/img.jpg?width=440&amp;amp;height=400&amp;amp;face=0_0_440_400&quot;&gt;&lt;a href=&quot;https://www.nvidia.com/Download/index.aspx#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.nvidia.com/Download/index.aspx#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pfFMn/hyTL6ELAaF/o3mT93N7ZwMjskbnyfbkIk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/brsOAk/hyTL32l0qO/vknetGdIk2nH6kKxZAKIw0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bffKaG/hyTMfPeVuY/3PxmS1rXLzk90gqe9b6xVk/img.jpg?width=440&amp;amp;height=400&amp;amp;face=0_0_440_400');&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;Download the latest official NVIDIA drivers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download the latest official NVIDIA drivers&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.nvidia.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;드라이버 환경선택 cuda 11.7.PNG&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D7WY1/btssk15xUr5/8VM3a7X6wtjfBvlrtpFmyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D7WY1/btssk15xUr5/8VM3a7X6wtjfBvlrtpFmyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D7WY1/btssk15xUr5/8VM3a7X6wtjfBvlrtpFmyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD7WY1%2Fbtssk15xUr5%2F8VM3a7X6wtjfBvlrtpFmyk%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;715&quot; height=&quot;357&quot; data-filename=&quot;드라이버 환경선택 cuda 11.7.PNG&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;357&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CUDA Toolkit 버전은 아래 표를 참고해주세요.&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;GPU(T4)와 호환되는 CUDA 버전 확인하기.PNG&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLYA3/btssuyhyqbr/dDE9iELwrpNpf0RRQlhhfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLYA3/btssuyhyqbr/dDE9iELwrpNpf0RRQlhhfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLYA3/btssuyhyqbr/dDE9iELwrpNpf0RRQlhhfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLYA3%2Fbtssuyhyqbr%2FdDE9iELwrpNpf0RRQlhhfk%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;701&quot; height=&quot;872&quot; data-filename=&quot;GPU(T4)와 호환되는 CUDA 버전 확인하기.PNG&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;872&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;드라이버 다운로드 창.PNG&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCb8yr/btssvdjYyYb/i2DYRJISpJ4p9pQzykN5Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCb8yr/btssvdjYyYb/i2DYRJISpJ4p9pQzykN5Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCb8yr/btssvdjYyYb/i2DYRJISpJ4p9pQzykN5Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCb8yr%2FbtssvdjYyYb%2Fi2DYRJISpJ4p9pQzykN5Q1%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;712&quot; height=&quot;334&quot; data-filename=&quot;드라이버 다운로드 창.PNG&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;334&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이번엔 Version이 맞는지 아래 표를 보고 확인합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CUDA 버전에 호환되는 드라이버 버전.PNG&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3HrhY/btsslclQY2C/FvUdDQuDXuKh8OVt6hngP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3HrhY/btsslclQY2C/FvUdDQuDXuKh8OVt6hngP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3HrhY/btsslclQY2C/FvUdDQuDXuKh8OVt6hngP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3HrhY%2FbtsslclQY2C%2FFvUdDQuDXuKh8OVt6hngP1%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;382&quot; height=&quot;702&quot; data-filename=&quot;CUDA 버전에 호환되는 드라이버 버전.PNG&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;CUDA 버전에 호환되는 드라이버 버전-2.PNG&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXEmfT/btssgEJ3MyM/5rkxNXwxo7KKyb0slYZpu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXEmfT/btssgEJ3MyM/5rkxNXwxo7KKyb0slYZpu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXEmfT/btssgEJ3MyM/5rkxNXwxo7KKyb0slYZpu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXEmfT%2FbtssgEJ3MyM%2F5rkxNXwxo7KKyb0slYZpu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;295&quot; data-filename=&quot;CUDA 버전에 호환되는 드라이버 버전-2.PNG&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;295&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;s&gt;호환맞추기 드럽게 복잡하네&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호환성 체크했다면 드라이버를 다운로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python : 3.8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CUDA Toolkit: 11.7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Driver Version : 515.105.01&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File : NVIDIA-Linux-x86_64-515.105.01.run&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. Driver 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu로 Driver 설치파일을 옮긴 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693273182904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo bash NVIDIA-Linux-x86_64-515.105.01.run&lt;/code&gt;&lt;/pre&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-filename=&quot;T4 드라이버 설치 경고문.PNG&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rd6qL/btssk9paxFh/9kRNfT82KFlHJGXXJbPTQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rd6qL/btssk9paxFh/9kRNfT82KFlHJGXXJbPTQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rd6qL/btssk9paxFh/9kRNfT82KFlHJGXXJbPTQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frd6qL%2Fbtssk9paxFh%2F9kRNfT82KFlHJGXXJbPTQK%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;897&quot; height=&quot;613&quot; data-filename=&quot;T4 드라이버 설치 경고문.PNG&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;613&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;경고문이 뜨는데 OK 눌러주시면 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vGPU T4 설치....1.PNG&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AHUXo/btssuxbV1jC/xvS7Zgeut5Wu6zS4uaIux0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AHUXo/btssuxbV1jC/xvS7Zgeut5Wu6zS4uaIux0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AHUXo/btssuxbV1jC/xvS7Zgeut5Wu6zS4uaIux0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHUXo%2FbtssuxbV1jC%2FxvS7Zgeut5Wu6zS4uaIux0%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;895&quot; height=&quot;611&quot; data-filename=&quot;vGPU T4 설치....1.PNG&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;611&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;설치완료!&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. 드라이버가 잘 설치되었는지 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693273350873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# vGPU 정보 보기
nvidia-smi

# vGPU 실시간 모니터링(1초간격)
watch -n 1 nvidia-smi&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;gpu 모니터링.PNG&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvxOc/btsslaImOrG/jnoJEiQTzv9qBcfd1tebnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvxOc/btsslaImOrG/jnoJEiQTzv9qBcfd1tebnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvxOc/btsslaImOrG/jnoJEiQTzv9qBcfd1tebnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxvxOc%2FbtsslaImOrG%2FjnoJEiQTzv9qBcfd1tebnK%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;636&quot; height=&quot;310&quot; data-filename=&quot;gpu 모니터링.PNG&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;310&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;vGPU 정보가 나오면 설치 성공!&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>AWS &amp;amp; GCP</category>
      <category>1xNVIDIA T4 driver</category>
      <category>1xNVIDIA T4 드라이버</category>
      <category>vGPU driver</category>
      <category>vGPU 드라이버</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/74</guid>
      <comments>https://firstws.tistory.com/74#entry74comment</comments>
      <pubDate>Tue, 29 Aug 2023 10:46:41 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 22.04.3 LTS - Python 버전 변경하기</title>
      <link>https://firstws.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 원하는 버전 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692596840289&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install python3.8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. 설치 경로 확인 &amp;rarr; 기존 설정 초기화&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692596980458&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;which python3.8

# /usr/bin/python3을 /usr/bin/python3.8로 설정하는 작업을 초기화합니다.
sudo update-alternatives --remove-all python3
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. lsb_release 관련 파일 복사&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692597010466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo cp /usr/local/lib/python3/dist-packages/lsb_release.py /usr/local/lib/python3.8/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 설치한 python에서 위 파일이 없는 경우도 있습니다.(그게 접니다..)&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;Ubuntu를 설치할 때는 기본적으로 Python 3.x 버전이 설치되어있는데 해당하는 파일이 없거나 변경했다면&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;&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. pip를 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1692597192419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Python 3.8을 기반으로 pip를 다시 설치
sudo apt-get install python3-pip

# pip 패키지 업그레이드: 이전에 설치한 패키지들도 업그레이드
sudo pip3 install --upgrade pip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5. 패키지 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1692597230651&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 마지막으로 pip 또는 pip3로 설치한 패키지들을 확인
pip list
pip3 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약&amp;nbsp; python 버전을 변경했는데 실행이 잘 안되거나 했을 때,&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;이 단계를 따라 수행하면 Python 관련 명령어와 패키지들이 제대로 설정되어 동작할 것입니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>Python 버전 변경 설정</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/73</guid>
      <comments>https://firstws.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 21 Aug 2023 14:55:09 +0900</pubDate>
    </item>
    <item>
      <title>[Error] Python 버전 변경 후 sudo apt-get update / ModuleNotFoundError: No module named 'apt_pkg' 에러 해결 방법</title>
      <link>https://firstws.tistory.com/72</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Ubuntu 22 / Python 3.10 환경에서 Python 3.8로 변경 후&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;'sudo apt-get update' 명령어 실행 시 아래와 같은 에러메세지가 발생했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Traceback (most recent call last): File &quot;/usr/lib/cnf-update-db&quot;, line 3, in &amp;lt;module&amp;gt; import apt_pkg ModuleNotFoundError: No module named 'apt_pkg' Reading package lists... Done E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db &amp;gt; /dev/null; fi' E: Sub-process returned an error code&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반드시 순서대로 진행해주세요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 시스템에서 &quot;python3-apt&quot; 패키지를 제거합니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1692584291966&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get remove python3-apt&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. &amp;nbsp;&quot;python3-apt&quot;&amp;nbsp;패키지를&amp;nbsp;설치합니다.&amp;nbsp;시스템에&amp;nbsp;해당&amp;nbsp;패키지가&amp;nbsp;없는&amp;nbsp;경우&amp;nbsp;설치됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1692584514535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install python3-apt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. &amp;nbsp;&quot;python3-apt&quot;&amp;nbsp;패키지를&amp;nbsp;재설치합니다.&amp;nbsp;기존의&amp;nbsp;설치된&amp;nbsp;패키지&amp;nbsp;파일을&amp;nbsp;다시&amp;nbsp;받아서&amp;nbsp;설치합니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1692584575648&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install --reinstall python3-apt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 문제의 원인과 해결법을 찾는데에 꽤나 시간을 썼기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저와 같은 문제를 겪은 분이 있다면 도움이 되길 바랍니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Error</category>
      <category>ModuleNotFoundError: No module named 'apt_pkg'</category>
      <category>sudo apt-get update apt_pkg</category>
      <category>sudo apt-get update 에러</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/72</guid>
      <comments>https://firstws.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 21 Aug 2023 11:29:22 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Linux-Ubuntu 20.04 Python 3.8 설치 방법</title>
      <link>https://firstws.tistory.com/71</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Ubuntu 20.04에서 Python 3.8을 설치하는 방법은 두 가지가 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Ubuntu 18.04 및 Kubuntu, Linux Mint 및 Elementary OS를 포함한 모든 Ubuntu 기반 배포에도 동일)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Apt로 설치하기(간단) - 데드 스네이크 PPA 에서 패키지 설치&lt;/li&gt;
&lt;li&gt;소스코드에서 Python 빌드&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. APT 이용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(1) 패키지 목록을 업데이트하고 필수 구성 요소를 설치합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322318995&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(2) 시스템의 소스 목록에 PPA를 추가합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322394498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository ppa:deadsnakes/ppa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 메세지가 표시되면 'Enter'를 눌러줍니다.&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;size18&quot;&gt;&lt;b&gt;(3) Repository를 사용하도록 설정한 후에는 다음과 같이 python을 설치할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322515547&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3.8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(4) 설치 성공 여부와 버전을 다시 확인합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322665427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3.8 --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. 소스코드에서 Python 3.8 설치&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(1) 패키지를 업데이트합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322763612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(2) 필요한 라이브러리를 설치합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322817524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev wget libbz2-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(3) 파이썬 3.8 다운로드 및 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692322852293&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir ~/python38
cd ~/python38

# wget을 사용하여 Python 다운로드 페이지에서 소스 코드를 다운로드
wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz

# 다운로드가 완료되면 gzip 압축된 아카이브를 추출.
tar xvf Python-3.8.12.tgz&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;size18&quot;&gt;&lt;b&gt;(4) Configure 스크립트를 실행합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1692323106570&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd Python-3.8.12

# --enable-optimizations 옵션은 여러 테스트를 실행하여 Python 이진 파일을 최적화
./configure --enable-optimizations&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;size18&quot;&gt;&lt;b&gt;(5) Python 3.8 빌드 프로세스를 시작&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692323146382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make -j $(nproc)&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;size18&quot;&gt;&lt;b&gt;(6) Python 이진 파일 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692323200326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo make altinstall&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;size18&quot;&gt;&lt;b&gt;(7) 설치 여부와 버전 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692323278470&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3.8 --version&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;★ 3.8이 아니더라도 다른 버전(3.6, 3.7, 3.10) 설치가 가능합니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>linux python 설치</category>
      <category>ubuntu python 설치</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/71</guid>
      <comments>https://firstws.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 18 Aug 2023 11:02:37 +0900</pubDate>
    </item>
    <item>
      <title>[Sourcetree] 소스트리 원격 아이콘 느낌표 없애기</title>
      <link>https://firstws.tistory.com/70</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;느낌표.PNG&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjmemZ/btskQQKfqAb/eupwc8nyifvKIk7lGGhY80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjmemZ/btskQQKfqAb/eupwc8nyifvKIk7lGGhY80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjmemZ/btskQQKfqAb/eupwc8nyifvKIk7lGGhY80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjmemZ%2FbtskQQKfqAb%2Feupwc8nyifvKIk7lGGhY80%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;1447&quot; height=&quot;761&quot; data-filename=&quot;느낌표.PNG&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;761&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;Github랑 연동하고 얼마 지나지 않아 '원격' 아이콘에 빨간 느낌표가 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;속쓰림.jpg&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ml5Pj/btskRL9ebNb/TvKkVhhXJOUJjOwSG8Cet1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ml5Pj/btskRL9ebNb/TvKkVhhXJOUJjOwSG8Cet1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ml5Pj/btskRL9ebNb/TvKkVhhXJOUJjOwSG8Cet1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMl5Pj%2FbtskRL9ebNb%2FTvKkVhhXJOUJjOwSG8Cet1%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;445&quot; height=&quot;359&quot; data-filename=&quot;속쓰림.jpg&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;359&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 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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 설정 아이콘 클릭&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;느낌표 - 복사본.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH5P0W/btskRcfbHm4/4JlyFEPBsphkIbkMGwMVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH5P0W/btskRcfbHm4/4JlyFEPBsphkIbkMGwMVn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH5P0W/btskRcfbHm4/4JlyFEPBsphkIbkMGwMVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH5P0W%2FbtskRcfbHm4%2F4JlyFEPBsphkIbkMGwMVn1%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;371&quot; height=&quot;315&quot; data-filename=&quot;느낌표 - 복사본.PNG&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;315&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. 경로 클릭 &amp;rarr; 편집&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;편집-1.PNG&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rs6sW/btskSosq4vg/BVT6C7pKsG4aw6M7VpMeak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rs6sW/btskSosq4vg/BVT6C7pKsG4aw6M7VpMeak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rs6sW/btskSosq4vg/BVT6C7pKsG4aw6M7VpMeak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRs6sW%2FbtskSosq4vg%2FBVT6C7pKsG4aw6M7VpMeak%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;642&quot; height=&quot;373&quot; data-filename=&quot;편집-1.PNG&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;373&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Remote Account 설정하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;편집-2.PNG&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckgLKf/btskSoFYUAL/9MUZmmUzbWbu80bCU6lyB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckgLKf/btskSoFYUAL/9MUZmmUzbWbu80bCU6lyB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckgLKf/btskSoFYUAL/9MUZmmUzbWbu80bCU6lyB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckgLKf%2FbtskSoFYUAL%2F9MUZmmUzbWbu80bCU6lyB0%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;621&quot; height=&quot;416&quot; data-filename=&quot;편집-2.PNG&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;416&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Remote Account를 연동된 깃허브 계정으로 바꾼 후 '확인' 버튼 클릭&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;편집-4.PNG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0F9Py/btskOS9rtXI/OmrWkjKofSUjAAHrPIekNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0F9Py/btskOS9rtXI/OmrWkjKofSUjAAHrPIekNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0F9Py/btskOS9rtXI/OmrWkjKofSUjAAHrPIekNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0F9Py%2FbtskOS9rtXI%2FOmrWkjKofSUjAAHrPIekNk%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;605&quot; height=&quot;344&quot; data-filename=&quot;편집-4.PNG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;344&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;마지막으로 '확인' 클릭&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;끝.PNG&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5vRJf/btskLqMmso2/rf6TRGxRLa2OKVVlOd1K20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5vRJf/btskLqMmso2/rf6TRGxRLa2OKVVlOd1K20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5vRJf/btskLqMmso2/rf6TRGxRLa2OKVVlOd1K20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5vRJf%2FbtskLqMmso2%2Frf6TRGxRLa2OKVVlOd1K20%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;1449&quot; height=&quot;762&quot; data-filename=&quot;끝.PNG&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;762&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;빨간 느낌표가 사라진 것을 확인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;해결.jpg&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0PUSe/btskKk6YuIa/ckstki32kIeWRTSJ7VWzk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0PUSe/btskKk6YuIa/ckstki32kIeWRTSJ7VWzk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0PUSe/btskKk6YuIa/ckstki32kIeWRTSJ7VWzk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0PUSe%2FbtskKk6YuIa%2Fckstki32kIeWRTSJ7VWzk0%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;470&quot; height=&quot;361&quot; data-filename=&quot;해결.jpg&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;361&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;끝!&lt;/b&gt;&lt;/p&gt;</description>
      <category>Git</category>
      <category>sourcetree remote 느낌표</category>
      <category>sourcetree 원격 느낌표</category>
      <category>소스트리 원격 느낌표</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/70</guid>
      <comments>https://firstws.tistory.com/70#entry70comment</comments>
      <pubDate>Wed, 21 Jun 2023 16:00:21 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Random ID 생성하기(날짜/시간 X)</title>
      <link>https://firstws.tistory.com/69</link>
      <description>&lt;pre id=&quot;code_1686788765226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class GenerateRandomId {
    private static final String CHARACTERS = &quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&amp;amp;*()_+-=[]{}|/&quot;;
    private static final int DEFAULT_LENGTH = 10;

    public String generateRandomString() {
        return generateRandomString(DEFAULT_LENGTH);
    }

    public String generateRandomString(int length) {
        StringBuilder sb = new StringBuilder(length);
        Random random = new SecureRandom();
        for (int i = 0; i &amp;lt; length; i++) {
            int randomIndex = random.nextInt(CHARACTERS.length());
            char randomChar = CHARACTERS.charAt(randomIndex);
            sb.append(randomChar);
        }
        return sb.toString();
    }
}&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;저장용 Class.&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;char단위로 설정 및 글자수도 설정이 가능.&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;s&gt;더 좋은 코드가 있다면 댓글 부탁드려요~!&lt;/s&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <category>java random id</category>
      <category>랜덤 아이디 생성</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/69</guid>
      <comments>https://firstws.tistory.com/69#entry69comment</comments>
      <pubDate>Thu, 15 Jun 2023 09:30:26 +0900</pubDate>
    </item>
    <item>
      <title>[Sourcetree] 소스트리 실행이 되지 않을 때(설정 살리기)</title>
      <link>https://firstws.tistory.com/67</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소스트리를 실행했는데 로고만 뜨고 창이 뜨지 않아서 구글링을 했으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 설치해도 실행이 안된다는 후기가 많아 재설치는 패스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;blockquote data-ke-style=&quot;style2&quot;&gt;C:\Users\name\AppData\Local\Atlassian\SourceTree.exe_Url_xx..xx&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로의 파일을 삭제하면 실행은 되나 초기설정도 삭제된다길래&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일의 캐시파일만 삭제하면 되지 않을까...하는 생각을 테스트 진행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 위 경로(&lt;span style=&quot;text-align: left;&quot;&gt;C:\Users\name\AppData\Local\Atlassian\SourceTree.exe_Url_xx..xx) &lt;/span&gt;로 이동합니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;소스트리 삭제할 파일.PNG&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VB48E/btsjXXjXntO/BmdSTFHwDWowqUSaEBYOH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VB48E/btsjXXjXntO/BmdSTFHwDWowqUSaEBYOH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VB48E/btsjXXjXntO/BmdSTFHwDWowqUSaEBYOH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVB48E%2FbtsjXXjXntO%2FBmdSTFHwDWowqUSaEBYOH0%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;1283&quot; height=&quot;381&quot; data-filename=&quot;소스트리 삭제할 파일.PNG&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;381&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;그러면 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;느낌상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Startup.Profile&lt;br /&gt;user.config&lt;/blockquote&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;blockquote data-ke-style=&quot;style2&quot;&gt;Assemblies.cache&lt;br /&gt;Composition.cache&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;캐시파일만 삭제하고 다시 소스트리를 실행시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;소스트리 성공.PNG&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pypcW/btsjXU1LvUm/MuXa7du34xTYuMJSEsP2e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pypcW/btsjXU1LvUm/MuXa7du34xTYuMJSEsP2e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pypcW/btsjXU1LvUm/MuXa7du34xTYuMJSEsP2e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpypcW%2FbtsjXU1LvUm%2FMuXa7du34xTYuMJSEsP2e1%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;1441&quot; height=&quot;761&quot; data-filename=&quot;소스트리 성공.PNG&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;761&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 data-ke-size=&quot;size16&quot;&gt;아하하하하핫&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;p.s.&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;s&gt;이러한 잔버그의 불편함보다 편리함이 많으니까 사용하지 않을까요...?&lt;/s&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>Git</category>
      <category>SourceTree 먹통</category>
      <category>Sourcetree 실행 안될때</category>
      <category>Sourcetree 실행되지 않을 때</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/67</guid>
      <comments>https://firstws.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 15 Jun 2023 08:29:35 +0900</pubDate>
    </item>
    <item>
      <title>[Spring&amp;amp;SpringBoot] ChapGPT Stream으로 응답받기</title>
      <link>https://firstws.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;준비물 : OpenAI Secret API Key&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot;&gt;https://firstws.tistory.com/63&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685511280410&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&quot; data-og-description=&quot;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/63&quot; data-og-url=&quot;https://firstws.tistory.com/63&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crxbcE/hySPjLM61y/bRUaO2WFcjbvRPh5HC5ipk/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/baPaV3/hySPmuZQb1/GpFNLEDtjLLOCbcZeDWVfK/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/djnJO3/hySPie30OI/oYqcFLjmnN0khOxGdjl1k0/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/63&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crxbcE/hySPjLM61y/bRUaO2WFcjbvRPh5HC5ipk/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/baPaV3/hySPmuZQb1/GpFNLEDtjLLOCbcZeDWVfK/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/djnJO3/hySPie30OI/oYqcFLjmnN0khOxGdjl1k0/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710');&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;0. Postman으로 Test 해보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;method : POST&lt;br /&gt;url : https://api.openai.com/v1/chat/completions&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Headers Setting&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Content-Type : application/json&lt;br /&gt;Authorization : ${OpenAI Secret API Key}&lt;/blockquote&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-filename=&quot;1111.PNG&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzst2/btsh9DfI6Bg/lJGOKOkgKTKHl8AuxWG72K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzst2/btsh9DfI6Bg/lJGOKOkgKTKHl8AuxWG72K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzst2/btsh9DfI6Bg/lJGOKOkgKTKHl8AuxWG72K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmzst2%2Fbtsh9DfI6Bg%2FlJGOKOkgKTKHl8AuxWG72K%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;1144&quot; height=&quot;342&quot; data-filename=&quot;1111.PNG&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;342&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Body-JSON&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685511560007&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;model&quot;: &quot;gpt-3.5-turbo&quot;,
  &quot;stream&quot; : true,
  &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Springboot의 장점이 뭐야?&quot;}]
}&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'Send' 클릭해서 요청보내기 - 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2222.PNG&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw7b7C/btsh6ax8pUE/p968EqRor0JugDXys78190/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw7b7C/btsh6ax8pUE/p968EqRor0JugDXys78190/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw7b7C/btsh6ax8pUE/p968EqRor0JugDXys78190/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw7b7C%2Fbtsh6ax8pUE%2Fp968EqRor0JugDXys78190%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;1155&quot; height=&quot;762&quot; data-filename=&quot;2222.PNG&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;762&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 data-ke-size=&quot;size16&quot;&gt;실제 ChatGPT를 사용할 때 답변을 한번에 주는게 아니라 마치 타이핑 치는 것 처럼 출력됩니다. 그 기능을 활성화&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;시키려면 Stream Parameter에 True값을 셋팅해 요청하면 됩니다. (False일 때는 완성된 답변을 반환합니다.)&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;Stream은 SSE(Server-Sent-Events) 즉, 서버와 한번 연결을 맺고나면 일정 시간동안 서버에서 변경이 발생할 때마다&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-filename=&quot;sse.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/By2mr/btsh2PIAUv7/HXYHDRgIpJB7xjgQTI4Ba1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/By2mr/btsh2PIAUv7/HXYHDRgIpJB7xjgQTI4Ba1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/By2mr/btsh2PIAUv7/HXYHDRgIpJB7xjgQTI4Ba1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBy2mr%2Fbtsh2PIAUv7%2FHXYHDRgIpJB7xjgQTI4Ba1%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;2000&quot; height=&quot;1330&quot; data-filename=&quot;sse.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref : &lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685512200472&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에서 Server-Sent-Events 구현하기&quot; data-og-description=&quot;&amp;hellip;&quot; data-og-host=&quot;tecoble.techcourse.co.kr&quot; data-og-source-url=&quot;https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/&quot; data-og-url=&quot;https://post/2022-10-11-server-sent-events/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjnSZ9/hySPnVkCir/ZUKfftAcsZs2OUEFjw3KPk/img.png?width=423&amp;amp;height=276&amp;amp;face=0_0_423_276,https://scrap.kakaocdn.net/dn/beK9Ez/hySPq5AGvk/0QWeCYQMQlWNsgrDdiQQq1/img.png?width=1956&amp;amp;height=1102&amp;amp;face=0_0_1956_1102&quot;&gt;&lt;a href=&quot;https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjnSZ9/hySPnVkCir/ZUKfftAcsZs2OUEFjw3KPk/img.png?width=423&amp;amp;height=276&amp;amp;face=0_0_423_276,https://scrap.kakaocdn.net/dn/beK9Ez/hySPq5AGvk/0QWeCYQMQlWNsgrDdiQQq1/img.png?width=1956&amp;amp;height=1102&amp;amp;face=0_0_1956_1102');&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에서 Server-Sent-Events 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tecoble.techcourse.co.kr&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;설정 - DTO - Config - Controller - Service 순서로 작성해보겠습니다.&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. 설정&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;spring-boot-starter-webflux의 SSE를 사용하여 stream으로 받아올겁니다.&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;pom.xml&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685516206934&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-boot-starter-webflux&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;build.gradle&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685516272973&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. DTO&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685516371885&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//Front단에서 요청하는 DTO
public class QuestionRequest implements Serializable {
    private String question;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685516425557&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//chatGPT에 요청할 DTO Format
public class ChatGptRequest implements Serializable {
    private String model;
    @JsonProperty(&quot;max_tokens&quot;)
    private Integer maxTokens;
    private Double temperature;
    private Boolean stream;
    private List&amp;lt;ChatGptMessage&amp;gt; messages;

    //@JsonProperty(&quot;top_p&quot;)
    //private Double topP;

    @Builder
    public ChatGptRequest(String model, Integer maxTokens, Double temperature,
                          Boolean stream, List&amp;lt;ChatGptMessage&amp;gt; messages
                          /*,Double topP*/) {
        this.model = model;
        this.maxTokens = maxTokens;
        this.temperature = temperature;
        this.stream = stream;
        this.messages = messages;
        //this.topP = topP;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Config 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1685516522278&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class ChatGptConfig {
    public static final String AUTHORIZATION = &quot;Authorization&quot;;
    public static final String BEARER = &quot;Bearer &quot;;
    public static final String CHAT_MODEL = &quot;gpt-3.5-turbo&quot;;
    public static final Integer MAX_TOKEN = 300;
    public static final Boolean STREAM = true;
    public static final String ROLE = &quot;user&quot;;
    public static final Double TEMPERATURE = 0.6;
    //public static final Double TOP_P = 1.0;
    public static final String MEDIA_TYPE = &quot;application/json; charset=UTF-8&quot;;
    public static final String CHAT_URL = &quot;https://api.openai.com/v1/chat/completions&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. Controller 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1685516599287&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@PostMapping(value=&quot;ask-stream&quot;, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux&amp;lt;String&amp;gt; ask(Locale locale,
                            HttpServletRequest request,
                            HttpServletResponse response,
                            @RequestBody QuestionRequest questionRequest){
        try {
            return chatGptService.ask(questionRequest);
        }catch (JsonProcessingException je){
            log.error(je.getMessage());
            return Flux.empty();
        }
    }&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5. Service 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1685516660639&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private final ObjectMapper objectMapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE );
    public Flux&amp;lt;String&amp;gt; ask(QuestionRequest questionRequest) throws JsonProcessingException {

        client = WebClient.builder()
                .baseUrl(ChatGptConfig.CHAT_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader(ChatGptConfig.AUTHORIZATION,ChatGptConfig.BEARER + apiKey)
                .build();

        List&amp;lt;ChatGptMessage&amp;gt; messages = new ArrayList&amp;lt;&amp;gt;();
        messages.add(ChatGptMessage.builder()
                .role(ChatGptConfig.ROLE)
                .content(questionRequest.getQuestion())
                .build());
        ChatGptRequest chatGptRequest = new ChatGptRequest(
                ChatGptConfig.CHAT_MODEL,
                ChatGptConfig.MAX_TOKEN,
                ChatGptConfig.TEMPERATURE,
                ChatGptConfig.STREAM,
                messages
                //ChatGptConfig.TOP_P
        );
        String requestValue = objectMapper.writeValueAsString(chatGptRequest);

        Flux&amp;lt;String&amp;gt; eventStream = client.post()
                .bodyValue(requestValue)
                .accept(MediaType.TEXT_EVENT_STREAM)
                .retrieve()
                .bodyToFlux(String.class);
        return eventStream;
    }&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;33333.PNG&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOR5Cr/btsiaFYxGLZ/za8Kc8brcwfz6ack7KGFH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOR5Cr/btsiaFYxGLZ/za8Kc8brcwfz6ack7KGFH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOR5Cr/btsiaFYxGLZ/za8Kc8brcwfz6ack7KGFH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOR5Cr%2FbtsiaFYxGLZ%2Fza8Kc8brcwfz6ack7KGFH0%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;1150&quot; height=&quot;781&quot; data-filename=&quot;33333.PNG&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;781&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;테스트상 최소한의 parameter를 사용하였으며, 적용 가능한 parameter가 다양하므로 아래 공식문서를 참조해주세요.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ref :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot;&gt;https://platform.openai.com/docs/api-reference/completions/create&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685516789290&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;OpenAI API&quot; data-og-description=&quot;An API for accessing new AI models developed by OpenAI&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/docs/api-reference/completions/create&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;OpenAI API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API for accessing new AI models developed by OpenAI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.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>Spring &amp;amp; Spring Boot</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/66</guid>
      <comments>https://firstws.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 31 May 2023 16:06:35 +0900</pubDate>
    </item>
    <item>
      <title>[Spring&amp;amp;SpringBoot] OpenAI 이미지 생성 API 사용하기</title>
      <link>https://firstws.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;준비물 : OpenAI Secret API Key&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot;&gt;https://firstws.tistory.com/63&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685493283000&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&quot; data-og-description=&quot;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/63&quot; data-og-url=&quot;https://firstws.tistory.com/63&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crxbcE/hySPjLM61y/bRUaO2WFcjbvRPh5HC5ipk/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/baPaV3/hySPmuZQb1/GpFNLEDtjLLOCbcZeDWVfK/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/djnJO3/hySPie30OI/oYqcFLjmnN0khOxGdjl1k0/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/63&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crxbcE/hySPjLM61y/bRUaO2WFcjbvRPh5HC5ipk/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/baPaV3/hySPmuZQb1/GpFNLEDtjLLOCbcZeDWVfK/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/djnJO3/hySPie30OI/oYqcFLjmnN0khOxGdjl1k0/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710');&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. Postman으로 Test 해보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;method : POST&lt;br /&gt;url : https://api.openai.com/v1/images/generations&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Headers Setting&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Content-Type : application/json&lt;br /&gt;Authorization : ${OpenAI Secret API Key}&lt;/blockquote&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-filename=&quot;11111.PNG&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmFJLQ/btsh2P1KGT8/qlIRDRrJBw7AaStBskvn21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmFJLQ/btsh2P1KGT8/qlIRDRrJBw7AaStBskvn21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmFJLQ/btsh2P1KGT8/qlIRDRrJBw7AaStBskvn21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmFJLQ%2Fbtsh2P1KGT8%2FqlIRDRrJBw7AaStBskvn21%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;1138&quot; height=&quot;309&quot; data-filename=&quot;11111.PNG&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;309&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Body-JSON&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685493677051&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;prompt&quot; : &quot;cute cat Illustrate&quot;,
    &quot;n&quot; : 1,
    &quot;size&quot; : &quot;256x256&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;promt : 요청 메세지&lt;br /&gt;n : 이미지 개수(1~10)&lt;br /&gt;size : 이미지 사이즈('128x128', '256x256', '1024x1024'만 가능)&lt;br /&gt;response_format : url(default), b64_json(Base64) 두가지 가능&lt;/blockquote&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-filename=&quot;2222.PNG&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlXv94/btsh4lsi9oG/3QE16LvH52gUy3SYCoq9g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlXv94/btsh4lsi9oG/3QE16LvH52gUy3SYCoq9g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlXv94/btsh4lsi9oG/3QE16LvH52gUy3SYCoq9g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlXv94%2Fbtsh4lsi9oG%2F3QE16LvH52gUy3SYCoq9g0%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;1140&quot; height=&quot;281&quot; data-filename=&quot;2222.PNG&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;281&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'Send' 클릭해서 요청 보내기 - 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3333.PNG&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3fnIY/btsh33kXFvi/ViqpwKoyyPxg0xLurHI7P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3fnIY/btsh33kXFvi/ViqpwKoyyPxg0xLurHI7P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3fnIY/btsh33kXFvi/ViqpwKoyyPxg0xLurHI7P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3fnIY%2Fbtsh33kXFvi%2FViqpwKoyyPxg0xLurHI7P1%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;1140&quot; height=&quot;600&quot; data-filename=&quot;3333.PNG&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;600&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;url링크를 클릭하거나 브라우저에 붙여넣습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4444.PNG&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKAkr/btsh236L7p5/7M2rtXxbisjty8lF1ViP70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKAkr/btsh236L7p5/7M2rtXxbisjty8lF1ViP70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKAkr/btsh236L7p5/7M2rtXxbisjty8lF1ViP70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKAkr%2Fbtsh236L7p5%2F7M2rtXxbisjty8lF1ViP70%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;1528&quot; height=&quot;830&quot; data-filename=&quot;4444.PNG&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;830&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;ChatGPT보다 쉽고 적용하는 것은 더욱 쉽습니다.&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;이제 DTO - Config - Controller - Service 순서로 작성해보겠습니다.&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. DTO 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685494576156&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//Front단에서 요청하는 DTO
public class CommentRequest implements Serializable {
    private String comment;

    public CommentRequest(String comment) {
        this.comment = comment;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685494710311&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//OpenAI에 요청할 DTO Format('response_format' 추가하셔도됩니다.)
public class ImageGenerationRequest implements Serializable {
    private String prompt;
    private int n;
    private String size;

    @Builder
    public ImageGenerationRequest(String prompt, int n, String size) {
        this.prompt = prompt;
        this.n = n;
        this.size = size;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685494797087&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//요청에 대한 응답을 받을 DTO
public class ImageGenerationResponse {

    private long created;
    private List&amp;lt;ImageURL&amp;gt; data;

    @Getter
    @Setter
    public static class ImageURL {
        private String url;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Config 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685494930073&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ctrit.c_cocaine.infra.openai.chatGPT;

import org.springframework.context.annotation.Configuration;

@Configuration
public class ChatGptConfig {
    public static final String AUTHORIZATION = &quot;Authorization&quot;;
    public static final String BEARER = &quot;Bearer &quot;;
    public static final String MEDIA_TYPE = &quot;application/json; charset=UTF-8&quot;;
    public static final String IMAGE_URL = &quot;https://api.openai.com/v1/images/generations&quot;;
    public static final int IMAGE_COUNT = 2;//  1~10
    public static final String IMAGE_SIZE = &quot;256x256&quot;; // '256x256', '512x512', '1024x1024'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. Controller 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685495050501&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@RequestMapping(&quot;/chat-gpt&quot;)
@RestController
public class ChatGptController {
    private final APIResponse apiResponse;
    private final ChatGptService chatGptService;

    @PostMapping(&quot;/image-generation&quot;)
    public ResponseEntity sendComment(
            Locale locale,
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestBody CommentRequest commentRequest) {
        String code = ResponseCode.CD_SUCCESS;
        ImageGenerationResponse imageGenerationResponse = null;
        try {
            imageGenerationResponse = chatGptService.makeImages(commentRequest);
        } catch (Exception e) {
            apiResponse.printErrorMessage(e);
            code = e.getMessage();
        }
        return apiResponse.getResponseEntity(locale, code,
                imageGenerationResponse != null ? imageGenerationResponse.getData() : new ChatGptResponse());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5. Service 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685495177286&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@RequiredArgsConstructor
@Service
public class ChatGptService {
    private final RestTemplate restTemplate;

	//api key를 application.yml에 넣어두었습니다.
    @Value(&quot;${api-key.chat-gpt}&quot;)
    private String apiKey;

    public ImageGenerationResponse makeImages(CommentRequest commentRequest){
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.parseMediaType(ChatGptConfig.MEDIA_TYPE));
        httpHeaders.add(ChatGptConfig.AUTHORIZATION, ChatGptConfig.BEARER + apiKey);

        ImageGenerationRequest imageGenerationRequest = ImageGenerationRequest.builder()
                .prompt(commentRequest.getComment())
                .n(ChatGptConfig.IMAGE_COUNT)
                .size(ChatGptConfig.IMAGE_SIZE)
                .build();

        HttpEntity&amp;lt;ImageGenerationRequest&amp;gt; requestHttpEntity = new HttpEntity&amp;lt;&amp;gt;(imageGenerationRequest, httpHeaders);

        ResponseEntity&amp;lt;ImageGenerationResponse&amp;gt; responseEntity = restTemplate.postForEntity(
                ChatGptConfig.IMAGE_URL,
                requestHttpEntity,
                ImageGenerationResponse.class
        );
        return responseEntity.getBody();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5555.PNG&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJfrW2/btsh6BnUjMk/tu4rB7F3KDvXd1EtKyplJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJfrW2/btsh6BnUjMk/tu4rB7F3KDvXd1EtKyplJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJfrW2/btsh6BnUjMk/tu4rB7F3KDvXd1EtKyplJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJfrW2%2Fbtsh6BnUjMk%2Ftu4rB7F3KDvXd1EtKyplJK%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;1150&quot; height=&quot;715&quot; data-filename=&quot;5555.PNG&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;715&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6-1.PNG&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccQhBP/btsh3mykmFb/7Af7WeuQQYdFoH2WadNeM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccQhBP/btsh3mykmFb/7Af7WeuQQYdFoH2WadNeM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccQhBP/btsh3mykmFb/7Af7WeuQQYdFoH2WadNeM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccQhBP%2Fbtsh3mykmFb%2F7Af7WeuQQYdFoH2WadNeM1%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;1530&quot; height=&quot;830&quot; data-filename=&quot;6-1.PNG&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6-2.PNG&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wOTlE/btsh2PtXk8B/PKpQd7JgyVacB3hVcOkc41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wOTlE/btsh2PtXk8B/PKpQd7JgyVacB3hVcOkc41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wOTlE/btsh2PtXk8B/PKpQd7JgyVacB3hVcOkc41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwOTlE%2Fbtsh2PtXk8B%2FPKpQd7JgyVacB3hVcOkc41%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;1528&quot; height=&quot;826&quot; data-filename=&quot;6-2.PNG&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;826&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;&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;Ref : &lt;a href=&quot;https://platform.openai.com/docs/api-reference/images&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://platform.openai.com/docs/api-reference/images&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685496573800&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;OpenAI API&quot; data-og-description=&quot;An API for accessing new AI models developed by OpenAI&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/docs/api-reference/images&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/api-reference/images&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/docs/api-reference/images&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;OpenAI API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API for accessing new AI models developed by OpenAI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.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>Spring &amp;amp; Spring Boot</category>
      <category>openai image</category>
      <category>openai image generation</category>
      <category>이미지 생성 API</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/65</guid>
      <comments>https://firstws.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 31 May 2023 10:31:03 +0900</pubDate>
    </item>
    <item>
      <title>[Spring&amp;amp;SpringBoot] ChatGPT Spring에서 사용하기</title>
      <link>https://firstws.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 OpenAI Secret API Key 가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://firstws.tistory.com/63&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685423165457&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&quot; data-og-description=&quot;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/63&quot; data-og-url=&quot;https://firstws.tistory.com/63&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/emeOJ2/hySPjR3ylm/Vvxw3E7cP5fjpm7QRaCa5k/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/1zKFv/hySNedMrgf/a6ClTgIWKkikTwMkKNkAt1/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/bE8Ko3/hySPg15v8y/9kraPugkp7P7RhOdF9yG2k/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/63&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/emeOJ2/hySPjR3ylm/Vvxw3E7cP5fjpm7QRaCa5k/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/1zKFv/hySNedMrgf/a6ClTgIWKkikTwMkKNkAt1/img.png?width=800&amp;amp;height=376&amp;amp;face=0_0_800_376,https://scrap.kakaocdn.net/dn/bE8Ko3/hySPg15v8y/9kraPugkp7P7RhOdF9yG2k/img.png?width=1510&amp;amp;height=710&amp;amp;face=0_0_1510_710');&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;[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. Postman으로 Test해보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;method : POST&lt;br /&gt;url : https://api.openai.com/v1/chat/completions&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Headers Setting&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Content-Type : application/json&lt;br /&gt;Authorization : ${OpenAI Secret API Key}&lt;/blockquote&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-filename=&quot;1111.PNG&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGpKzs/btshYco6GKs/mon4KRHa88VfQOjZTC41uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGpKzs/btshYco6GKs/mon4KRHa88VfQOjZTC41uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGpKzs/btshYco6GKs/mon4KRHa88VfQOjZTC41uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGpKzs%2FbtshYco6GKs%2Fmon4KRHa88VfQOjZTC41uk%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;1273&quot; height=&quot;399&quot; data-filename=&quot;1111.PNG&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;399&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Body-JSON&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1685423581076&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;model&quot;: &quot;gpt-3.5-turbo&quot;,
  &quot;stream&quot; : false,
  &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;100+200=?&quot;}]
}&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-3.5 중에서 가장 유능한 모델인 'gpt-3.5-turbo'를 선정하였습니다.&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-filename=&quot;22222.PNG&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxremZ/btshHNYpf5h/4qlBg5upwb1aRvoQ85MB51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxremZ/btshHNYpf5h/4qlBg5upwb1aRvoQ85MB51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxremZ/btshHNYpf5h/4qlBg5upwb1aRvoQ85MB51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxremZ%2FbtshHNYpf5h%2F4qlBg5upwb1aRvoQ85MB51%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;1277&quot; height=&quot;427&quot; data-filename=&quot;22222.PNG&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;427&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'Send' 클릭해서 요청보내기 - 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;333333.PNG&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNx0b/btshYb4Rh0Z/Use2hKzVM3meXyoSh41N8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNx0b/btshYb4Rh0Z/Use2hKzVM3meXyoSh41N8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNx0b/btshYb4Rh0Z/Use2hKzVM3meXyoSh41N8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNx0b%2FbtshYb4Rh0Z%2FUse2hKzVM3meXyoSh41N8k%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;1273&quot; height=&quot;773&quot; data-filename=&quot;333333.PNG&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 나오면 성공한 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;choices - message - content에 답변이 담겨 있고, 우리는 그걸 꺼내 사용하면 됩니다.&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;이제 DTO - Config - Controller - Service 순서로 작성해보겠습니다.&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. DTO 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685423994763&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//Front단에서 요청하는 DTO
public class QuestionRequest implements Serializable {
    private String question;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685424213707&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//chatGPT에 요청할 DTO Format
public class ChatGptRequest implements Serializable {
    private String model;
    @JsonProperty(&quot;max_tokens&quot;)
    private Integer maxTokens;
    private Double temperature;
    private Boolean stream;
    private List&amp;lt;ChatGptMessage&amp;gt; messages;

    //@JsonProperty(&quot;top_p&quot;)
    //private Double topP;

    @Builder
    public ChatGptRequest(String model, Integer maxTokens, Double temperature,
                          Boolean stream, List&amp;lt;ChatGptMessage&amp;gt; messages
                          /*,Double topP*/) {
        this.model = model;
        this.maxTokens = maxTokens;
        this.temperature = temperature;
        this.stream = stream;
        this.messages = messages;
        //this.topP = topP;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685424135425&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Getter
@NoArgsConstructor
//ChatGPT 답변을 담을 DTO
public class ChatGptResponse {
    private String id;
    private String object;
    private long created;
    private String model;
    private Usage usage;
    private List&amp;lt;Choice&amp;gt; choices;

    @Getter
    @Setter
    public static class Usage {
        @JsonProperty(&quot;prompt_tokens&quot;)
        private int promptTokens;
        @JsonProperty(&quot;completion_tokens&quot;)
        private int completionTokens;
        @JsonProperty(&quot;total_tokens&quot;)
        private int totalTokens;
    }

    @Getter
    @Setter
    public static class Choice {
        private ChatGptMessage message;
        @JsonProperty(&quot;finish_reason&quot;)
        private String finishReason;
        private int index;
    }
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Config 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1685424365847&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class ChatGptConfig {
    public static final String AUTHORIZATION = &quot;Authorization&quot;;
    public static final String BEARER = &quot;Bearer &quot;;
    public static final String CHAT_MODEL = &quot;gpt-3.5-turbo&quot;;
    public static final Integer MAX_TOKEN = 300;
    public static final Boolean STREAM = false;
    public static final String ROLE = &quot;user&quot;;
    public static final Double TEMPERATURE = 0.6;
    //public static final Double TOP_P = 1.0;
    public static final String MEDIA_TYPE = &quot;application/json; charset=UTF-8&quot;;
    //completions : 질답
    public static final String CHAT_URL = &quot;https://api.openai.com/v1/chat/completions&quot;;
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. Controller 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685424506550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@RequestMapping(&quot;/chat-gpt&quot;)
@RestController
public class ChatGptController {
    private final APIResponse apiResponse;
    private final ChatGptService chatGptService;

    @Operation(summary = &quot;Question to Chat-GPT&quot;)
    @PostMapping(&quot;/question&quot;)
    public ResponseEntity sendQuestion(
            Locale locale,
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestBody QuestionRequest questionRequest) {
        String code = ResponseCode.CD_SUCCESS;
        ChatGptResponse chatGptResponse = null;
        try {
            chatGptResponse = chatGptService.askQuestion(questionRequest);
        } catch (Exception e) {
            apiResponse.printErrorMessage(e);
            code = e.getMessage();
        }
        //return 부분은 자유롭게 수정하시면됩니다. ex)return chatGptResponse;
        return apiResponse.getResponseEntity(locale, code,
                chatGptResponse != null ? chatGptResponse.getChoices().get(0).getMessage().getContent() : new ChatGptResponse());
    }
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5. Service 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685424688769&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@RequiredArgsConstructor
@Service
public class ChatGptService {
    private final RestTemplate restTemplate;

	//api key를 application.yml에 넣어두었습니다.
    @Value(&quot;${api-key.chat-gpt}&quot;)
    private String apiKey;

    public HttpEntity&amp;lt;ChatGptRequest&amp;gt; buildHttpEntity(ChatGptRequest chatGptRequest){
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.parseMediaType(ChatGptConfig.MEDIA_TYPE));
        httpHeaders.add(ChatGptConfig.AUTHORIZATION, ChatGptConfig.BEARER + apiKey);
        return new HttpEntity&amp;lt;&amp;gt;(chatGptRequest, httpHeaders);
    }

    public ChatGptResponse getResponse(HttpEntity&amp;lt;ChatGptRequest&amp;gt; chatGptRequestHttpEntity){

        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(60000);
        //답변이 길어질 경우 TimeOut Error가 발생하니 1분정도 설정해줍니다.
        requestFactory.setReadTimeout(60 * 1000);   //  1min = 60 sec * 1,000ms
        restTemplate.setRequestFactory(requestFactory);

        ResponseEntity&amp;lt;ChatGptResponse&amp;gt; responseEntity = restTemplate.postForEntity(
          ChatGptConfig.CHAT_URL,
          chatGptRequestHttpEntity,
          ChatGptResponse.class);

        return responseEntity.getBody();
    }
    public ChatGptResponse askQuestion(QuestionRequest questionRequest){
        List&amp;lt;ChatGptMessage&amp;gt; messages = new ArrayList&amp;lt;&amp;gt;();
        messages.add(ChatGptMessage.builder()
                .role(ChatGptConfig.ROLE)
                .content(questionRequest.getQuestion())
                .build());
        return this.getResponse(
                this.buildHttpEntity(
                        new ChatGptRequest(
                                ChatGptConfig.CHAT_MODEL,
                                ChatGptConfig.MAX_TOKEN,
                                ChatGptConfig.TEMPERATURE,
                                ChatGptConfig.STREAM,
                                messages
                                //ChatGptConfig.TOP_P
                        )
                )
        );
    }
}&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;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;444444.PNG&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZRr01/btshWtq8gwa/EwjkIpEr1v4xt2aprn74G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZRr01/btshWtq8gwa/EwjkIpEr1v4xt2aprn74G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZRr01/btshWtq8gwa/EwjkIpEr1v4xt2aprn74G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRr01%2FbtshWtq8gwa%2FEwjkIpEr1v4xt2aprn74G1%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;1279&quot; height=&quot;522&quot; data-filename=&quot;444444.PNG&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;522&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트상 최소한의 parameter를 사용하였으며, 적용 가능한 parameter가 다양하므로 아래 공식문서를 참조해주세요.&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;ref : &lt;a href=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://platform.openai.com/docs/api-reference/completions/create&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685426412093&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;OpenAI API&quot; data-og-description=&quot;An API for accessing new AI models developed by OpenAI&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/api-reference/completions/create&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/docs/api-reference/completions/create&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;OpenAI API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API for accessing new AI models developed by OpenAI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.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;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>chatGPT spring</category>
      <category>chatGPT 스프링</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/64</guid>
      <comments>https://firstws.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 30 May 2023 15:01:45 +0900</pubDate>
    </item>
    <item>
      <title>[OpenAI] OpenAI API Key 발급 받기(feat.chatGPT)</title>
      <link>https://firstws.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;0. OpenAI API Key&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;OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다.&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;OpenAI는 다양한 유형의 인공지능 모델을 제공하는데요, 대표적인 모델을 살펴보면 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ChatGPT:&amp;nbsp;텍스트&amp;nbsp;기반&amp;nbsp;대화를&amp;nbsp;위한&amp;nbsp;모델로,&amp;nbsp;자연어&amp;nbsp;처리와&amp;nbsp;대화&amp;nbsp;생성에&amp;nbsp;사용됩니다.&amp;nbsp;사용자와 대화하며 자연어 질문에 답변을 생성하거나 상호작용하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;DALL&amp;middot;E:&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;/li&gt;
&lt;li&gt;CLIP:&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;작업을&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;Codex:&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;있어,&amp;nbsp;프로그래밍&amp;nbsp;작업을&amp;nbsp;지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 음성 인식 모델 등 다양한 모델을 제공하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;Reference : &lt;a href=&quot;https://platform.openai.com/docs/api-reference/authentication&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://platform.openai.com/docs/api-reference&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;그리고 대부분의 API는 API Key를 요구하고 있습니다.(chatGPT 포함)&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. OpenAPI 홈페이지 접속하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입을 진행합니다. 저는 Google 계정으로 가입했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://platform.openai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://platform.openai.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685410918498&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;OpenAI API&quot; data-og-description=&quot;An API for accessing new AI models developed by OpenAI&quot; data-og-host=&quot;platform.openai.com&quot; data-og-source-url=&quot;https://platform.openai.com/&quot; data-og-url=&quot;https://platform.openai.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://platform.openai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://platform.openai.com/&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;OpenAI API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An API for accessing new AI models developed by OpenAI&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;platform.openai.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. View API keys&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;111.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuzKJ/btshYbXjUo5/HvQkahT5tfgqV4VoHE3ulK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuzKJ/btshYbXjUo5/HvQkahT5tfgqV4VoHE3ulK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuzKJ/btshYbXjUo5/HvQkahT5tfgqV4VoHE3ulK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuzKJ%2FbtshYbXjUo5%2FHvQkahT5tfgqV4VoHE3ulK%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;1510&quot; height=&quot;710&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;710&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. 'Create new secret key' 클릭&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;2222.png&quot; data-origin-width=&quot;1527&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjzrgI/btshYdU6wuE/xLw8SIEsrUDL56sVAaXLe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjzrgI/btshYdU6wuE/xLw8SIEsrUDL56sVAaXLe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjzrgI/btshYdU6wuE/xLw8SIEsrUDL56sVAaXLe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjzrgI%2FbtshYdU6wuE%2FxLw8SIEsrUDL56sVAaXLe0%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;1527&quot; height=&quot;642&quot; data-filename=&quot;2222.png&quot; data-origin-width=&quot;1527&quot; data-origin-height=&quot;642&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. key name 설정 및 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;3333.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yWWyB/btshKSdmJpB/NAYpvskUWAK9akrlNOq1t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yWWyB/btshKSdmJpB/NAYpvskUWAK9akrlNOq1t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yWWyB/btshKSdmJpB/NAYpvskUWAK9akrlNOq1t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyWWyB%2FbtshKSdmJpB%2FNAYpvskUWAK9akrlNOq1t1%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;1528&quot; height=&quot;651&quot; data-filename=&quot;3333.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;651&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5. API Key 생성 확인 및 저장하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;4444.png&quot; data-origin-width=&quot;1525&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I3EYf/btshBjXgTNx/yCuXOMhFhRVkQ8wYoh6GN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I3EYf/btshBjXgTNx/yCuXOMhFhRVkQ8wYoh6GN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I3EYf/btshBjXgTNx/yCuXOMhFhRVkQ8wYoh6GN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI3EYf%2FbtshBjXgTNx%2FyCuXOMhFhRVkQ8wYoh6GN0%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;1525&quot; height=&quot;685&quot; data-filename=&quot;4444.png&quot; data-origin-width=&quot;1525&quot; data-origin-height=&quot;685&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;API Secret Key가 생성되었습니다.&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;창을 닫으면 key를 다신 볼 수 없으므로 따로 저장하시길 바랍니다.&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;이제 저 키를 가지고 OpenAI API(chatGPT 등)를 이용할 수 있습니다.&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 - Spring에서 적용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/64&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://firstws.tistory.com/64&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685426545506&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&amp;amp;SpringBoot] ChatGPT Spring에서 사용하기&quot; data-og-description=&quot;일단 OpenAI Secret API Key 가 필요합니다. https://firstws.tistory.com/63 [OpenAI] OpenAI API Key 발급 받기(feat.chatGPT) 0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/64&quot; data-og-url=&quot;https://firstws.tistory.com/64&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qy8aM/hySPnmEgMz/tIaKqRplsYC1u5JWcoMV8K/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/AJko1/hySM6UoRq9/4o5B8W1tJFdRYx9BGtyRtk/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/Irztf/hySNcmK2u7/KMDl6JRtfESFnhiAhoYRL1/img.png?width=1273&amp;amp;height=773&amp;amp;face=0_0_1273_773&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/64&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/64&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qy8aM/hySPnmEgMz/tIaKqRplsYC1u5JWcoMV8K/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/AJko1/hySM6UoRq9/4o5B8W1tJFdRYx9BGtyRtk/img.png?width=800&amp;amp;height=250&amp;amp;face=0_0_800_250,https://scrap.kakaocdn.net/dn/Irztf/hySNcmK2u7/KMDl6JRtfESFnhiAhoYRL1/img.png?width=1273&amp;amp;height=773&amp;amp;face=0_0_1273_773');&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&amp;amp;SpringBoot] ChatGPT Spring에서 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일단 OpenAI Secret API Key 가 필요합니다. https://firstws.tistory.com/63 [OpenAI] OpenAI API Key 발급 받기(feat.chatGPT) 0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.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;# Image Generation - Spring에서 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://firstws.tistory.com/65&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685496770599&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&amp;amp;SpringBoot] OpenAI 이미지 생성 API 사용하기&quot; data-og-description=&quot;준비물 : OpenAI Secret API Key https://firstws.tistory.com/63 [OpenAI] OpenAI API Key 발급 받기(feat.chatGPT) 0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. O&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/65&quot; data-og-url=&quot;https://firstws.tistory.com/65&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/65&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;[Spring&amp;amp;SpringBoot] OpenAI 이미지 생성 API 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;준비물 : OpenAI Secret API Key https://firstws.tistory.com/63 [OpenAI] OpenAI API Key 발급 받기(feat.chatGPT) 0. OpenAI API Key OpenAI에서 개발한 인공지능 모델들을 외부에서 사용할 수 있도록 인증하는 역할을 합니다. O&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.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>개발 , 컴퓨터, IT지식</category>
      <category>chatgpt API key</category>
      <category>chatgpt secret key</category>
      <category>openai api key</category>
      <category>openai secret key</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/63</guid>
      <comments>https://firstws.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 30 May 2023 10:58:49 +0900</pubDate>
    </item>
    <item>
      <title>[Github] Personal access token 생성하기(Sourcetree Authorization Password)</title>
      <link>https://firstws.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브(GitHub)에서는 ID / password 기반의 Authentication(인증)을 지원하지 않고,&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;ID / Personal Access Token 방식의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Token&lt;span&gt; Authentication 방식을 요구하고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sourcetree에 계정을 로그인하려면 깃허브 ID와 Personal 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;이제부터 소스트리(Sourcetree)에서 요구하는 깃헙의 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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. Settings&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃헙(&lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/&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;rarr; 'settings' 클릭&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-filename=&quot;github-settings.png&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bat34Y/btsg0mNo3wg/C7MnfCEczBI7DTynpgfJi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bat34Y/btsg0mNo3wg/C7MnfCEczBI7DTynpgfJi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bat34Y/btsg0mNo3wg/C7MnfCEczBI7DTynpgfJi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbat34Y%2Fbtsg0mNo3wg%2FC7MnfCEczBI7DTynpgfJi1%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;1687&quot; height=&quot;859&quot; data-filename=&quot;github-settings.png&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;859&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. Developer settings&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 하단에 'Developer settings' 클릭&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-filename=&quot;github-dev settings.png&quot; data-origin-width=&quot;1539&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcAzt6/btsg0Ov8wc2/eKbwKl1sQuZwsnnkZe9MLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcAzt6/btsg0Ov8wc2/eKbwKl1sQuZwsnnkZe9MLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcAzt6/btsg0Ov8wc2/eKbwKl1sQuZwsnnkZe9MLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcAzt6%2Fbtsg0Ov8wc2%2FeKbwKl1sQuZwsnnkZe9MLk%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;1539&quot; height=&quot;863&quot; data-filename=&quot;github-dev settings.png&quot; data-origin-width=&quot;1539&quot; data-origin-height=&quot;863&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Personal access tokens&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Personal access tokens &amp;rarr; Tokens(classic) &amp;rarr; Generate new token &amp;rarr; Generate new token(classic)&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-filename=&quot;github-gen new token.png&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ql8Ht/btsgQo6pE3h/gnpdlmXnCdOizxlirknwjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ql8Ht/btsgQo6pE3h/gnpdlmXnCdOizxlirknwjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ql8Ht/btsgQo6pE3h/gnpdlmXnCdOizxlirknwjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fql8Ht%2FbtsgQo6pE3h%2FgnpdlmXnCdOizxlirknwjK%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;1317&quot; height=&quot;425&quot; data-filename=&quot;github-gen new token.png&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;425&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Generate new tokens&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11111.PNG&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JUqNK/btsg1WHclKt/Me9FUnkxFKezf645NFoJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JUqNK/btsg1WHclKt/Me9FUnkxFKezf645NFoJtk/img.png&quot; data-alt=&quot;Note, Expiration, scope를 설정합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JUqNK/btsg1WHclKt/Me9FUnkxFKezf645NFoJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJUqNK%2Fbtsg1WHclKt%2FMe9FUnkxFKezf645NFoJtk%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;776&quot; height=&quot;933&quot; data-filename=&quot;11111.PNG&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Note, Expiration, scope를 설정합니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;222222.PNG&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umCF1/btsg0vcr8tT/KDPWVfbWLTYumyL7nK2rBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umCF1/btsg0vcr8tT/KDPWVfbWLTYumyL7nK2rBk/img.png&quot; data-alt=&quot;설정하고 Generate token 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umCF1/btsg0vcr8tT/KDPWVfbWLTYumyL7nK2rBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumCF1%2Fbtsg0vcr8tT%2FKDPWVfbWLTYumyL7nK2rBk%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;962&quot; height=&quot;896&quot; data-filename=&quot;222222.PNG&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정하고 Generate token 클릭&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4. Personal access tokens 확인하고 저장하기.&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;3333333.PNG&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b857my/btsg0mNpL11/0saLw70udmBQrwEqwhqfX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b857my/btsg0mNpL11/0saLw70udmBQrwEqwhqfX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b857my/btsg0mNpL11/0saLw70udmBQrwEqwhqfX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb857my%2Fbtsg0mNpL11%2F0saLw70udmBQrwEqwhqfX0%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;1126&quot; height=&quot;463&quot; data-filename=&quot;3333333.PNG&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;463&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;파란 박스안에 문구처럼 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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;444444.PNG&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR3gyZ/btsgUtTSCXn/w3FT9r19kb5Cb0TPDnb5sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR3gyZ/btsgUtTSCXn/w3FT9r19kb5Cb0TPDnb5sK/img.png&quot; data-alt=&quot;다시 들어갔을 때 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR3gyZ/btsgUtTSCXn/w3FT9r19kb5Cb0TPDnb5sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR3gyZ%2FbtsgUtTSCXn%2Fw3FT9r19kb5Cb0TPDnb5sK%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;1138&quot; height=&quot;411&quot; data-filename=&quot;444444.PNG&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;411&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;깃허브 계정을 인증할 때 계정 로그인 password가 아닌 발급받은 personal 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;</description>
      <category>Git</category>
      <category>github personal access token</category>
      <category>Github Personal access token 생성</category>
      <category>sourcetree github password</category>
      <category>소스트리 깃허브 비밀번호</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/62</guid>
      <comments>https://firstws.tistory.com/62#entry62comment</comments>
      <pubDate>Tue, 23 May 2023 08:56:01 +0900</pubDate>
    </item>
    <item>
      <title>[openpose] openpose window demo 버전 실행하기(keypoints.json 얻기)</title>
      <link>https://firstws.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;smplify-x 를 실행시키기 위해서는 이미지과 해당 이미지의 관절포인트가 있는 keypoints.json 파일이 필요하여&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;openpose를 실행시켜 json 파일을 얻기 위해 실행하게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 이 방법으로는 keypoints.json 데이터를 얻을 수가 없어 방법을 찾게 된다면 포스팅하도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 방법은 openpose.zip 파일을 다운받아 실행시키는 방법으로 진행하였습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. openpose 다운로드하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 깃허브에서 openpose releases 를 다운 받습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684393600174&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;Releases &amp;middot; CMU-Perceptual-Computing-Lab/openpose&quot; data-og-description=&quot;OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - CMU-Perceptual-Computing-Lab/openpose&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&quot; data-og-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose/releases&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;Releases &amp;middot; CMU-Perceptual-Computing-Lab/openpose&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - CMU-Perceptual-Computing-Lab/openpose&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1. openpose download.PNG&quot; data-origin-width=&quot;1685&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wVnaY/btsgmFAGO6e/19na4bgNa0CLs7PkkqWPN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wVnaY/btsgmFAGO6e/19na4bgNa0CLs7PkkqWPN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wVnaY/btsgmFAGO6e/19na4bgNa0CLs7PkkqWPN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwVnaY%2FbtsgmFAGO6e%2F19na4bgNa0CLs7PkkqWPN1%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;1685&quot; height=&quot;863&quot; data-filename=&quot;1. openpose download.PNG&quot; data-origin-width=&quot;1685&quot; data-origin-height=&quot;863&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. Model의 가중치 파일을 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openpose\models에 있는 getBaseModels.bat를 실행시켜 파일을 다운받습니다.&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;Model의 가중치 파일을 다운로드해서 해당하는 폴더로 넣어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 : &lt;a href=&quot;https://firstws.tistory.com/60&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://firstws.tistory.com/60&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684394067376&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;[openpose] 이미지에서 관절 포인트 검출하기&quot; data-og-description=&quot;smplify-x 를 실행시키기 위해서는 이미지과 해당 이미지의 관절포인트가 있는 keypoints.json 파일이 필요하여 openpose를 실행시켜 json 파일을 얻기 위해 실행하게 되었습니다. 그러나 이 방법으로는 ke&quot; data-og-host=&quot;firstws.tistory.com&quot; data-og-source-url=&quot;https://firstws.tistory.com/60&quot; data-og-url=&quot;https://firstws.tistory.com/60&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eQJen/hySF75pzjH/CYRnAKNxXNib1Aj5UCOL71/img.png?width=800&amp;amp;height=410&amp;amp;face=0_0_800_410,https://scrap.kakaocdn.net/dn/VzU2Y/hySE2xS2i8/paYkkks8kNEHpLiQKRXTOK/img.png?width=800&amp;amp;height=410&amp;amp;face=0_0_800_410,https://scrap.kakaocdn.net/dn/V3DIA/hySGbmstxM/bJlplro3U7zsedC1XUceEK/img.png?width=1687&amp;amp;height=865&amp;amp;face=0_0_1687_865&quot;&gt;&lt;a href=&quot;https://firstws.tistory.com/60&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firstws.tistory.com/60&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eQJen/hySF75pzjH/CYRnAKNxXNib1Aj5UCOL71/img.png?width=800&amp;amp;height=410&amp;amp;face=0_0_800_410,https://scrap.kakaocdn.net/dn/VzU2Y/hySE2xS2i8/paYkkks8kNEHpLiQKRXTOK/img.png?width=800&amp;amp;height=410&amp;amp;face=0_0_800_410,https://scrap.kakaocdn.net/dn/V3DIA/hySGbmstxM/bJlplro3U7zsedC1XUceEK/img.png?width=1687&amp;amp;height=865&amp;amp;face=0_0_1687_865');&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;[openpose] 이미지에서 관절 포인트 검출하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;smplify-x 를 실행시키기 위해서는 이미지과 해당 이미지의 관절포인트가 있는 keypoints.json 파일이 필요하여 openpose를 실행시켜 json 파일을 얻기 위해 실행하게 되었습니다. 그러나 이 방법으로는 ke&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firstws.tistory.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. 이미지파일 및 output 폴더 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openpose\examples\media 폴더에 테스트용 이미지와 영상이 있는 것을 확인하고,&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-filename=&quot;2. 이미지폴더.PNG&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yomj6/btsguDt2O0g/rRZpP0pS544wkskVJBLkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yomj6/btsguDt2O0g/rRZpP0pS544wkskVJBLkm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yomj6/btsguDt2O0g/rRZpP0pS544wkskVJBLkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyomj6%2FbtsguDt2O0g%2FrRZpP0pS544wkskVJBLkm0%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;921&quot; height=&quot;520&quot; data-filename=&quot;2. 이미지폴더.PNG&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;520&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;해당 이미지의 keypoints.json 파일을 저장할 폴더(output)를 생성합니다.&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-filename=&quot;output.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf5uXs/btsgsSlrVSR/fkREtSnYitEMuvms0IVReK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf5uXs/btsgsSlrVSR/fkREtSnYitEMuvms0IVReK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf5uXs/btsgsSlrVSR/fkREtSnYitEMuvms0IVReK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf5uXs%2FbtsgsSlrVSR%2FfkREtSnYitEMuvms0IVReK%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;978&quot; height=&quot;415&quot; data-filename=&quot;output.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;415&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. Windows PowerShell 에서 실행하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell를 실행하고 openpose 폴더까지 들어가준 후&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;blockquote data-ke-style=&quot;style2&quot;&gt;bin\OpenPoseDemo.exe --image_dir examples/media --write_json output/&lt;/blockquote&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: #666666; text-align: left;&quot;&gt;--image_dir : 이미지가 있는 폴더 경로 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;--write_json : json 파일을 저장할 경로 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;powershell.PNG&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boHwIM/btsgndjGzGI/qSZei4iqlwjNKr8m1o6tO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boHwIM/btsgndjGzGI/qSZei4iqlwjNKr8m1o6tO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boHwIM/btsgndjGzGI/qSZei4iqlwjNKr8m1o6tO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboHwIM%2FbtsgndjGzGI%2FqSZei4iqlwjNKr8m1o6tO1%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;1233&quot; height=&quot;151&quot; data-filename=&quot;powershell.PNG&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;153&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;4. output 폴더에 이미지에 대한 keypoints.json 파일이 생성되었는지 확인합니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;output-result.PNG&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nq2jd/btsgn2WpWNr/n7SLRYr7qTWziQ0SmSK33k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nq2jd/btsgn2WpWNr/n7SLRYr7qTWziQ0SmSK33k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nq2jd/btsgn2WpWNr/n7SLRYr7qTWziQ0SmSK33k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnq2jd%2Fbtsgn2WpWNr%2Fn7SLRYr7qTWziQ0SmSK33k%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;919&quot; height=&quot;553&quot; data-filename=&quot;output-result.PNG&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;553&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>openpose keypoints</category>
      <category>openpose keypoints.json</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/61</guid>
      <comments>https://firstws.tistory.com/61#entry61comment</comments>
      <pubDate>Thu, 18 May 2023 16:25:08 +0900</pubDate>
    </item>
    <item>
      <title>[openpose] 이미지에서 관절 포인트 검출하기</title>
      <link>https://firstws.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;smplify-x 를 실행시키기 위해서는 이미지과 해당 이미지의 관절포인트가 있는 keypoints.json 파일이 필요하여&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;openpose를 실행시켜 json 파일을 얻기 위해 실행하게 되었습니다.&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;그러나 이 방법으로는 keypoints.json 데이터를 얻을 수가 없어 방법을 찾게 된다면 포스팅하도록 하겠습니다.&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;다음 방법은 openpose.zip 파일을 다운받아 실행시키는 방법으로 진행하였습니다.&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1. GitHub에서 openpose를 다운로드 받습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/CMU-Perceptual-Computing-Lab/openpose&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684279762920&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;GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint detection library for body, face, hand&quot; data-og-description=&quot;OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint de...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose&quot; data-og-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CMU-Perceptual-Computing-Lab/openpose&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;GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint detection library for body, face, hand&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint de...&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;openpose 다운로드.png&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuBVVf/btsgcsgvWF9/KqXJHhUPkobGk0Ssz7nCA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuBVVf/btsgcsgvWF9/KqXJHhUPkobGk0Ssz7nCA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuBVVf/btsgcsgvWF9/KqXJHhUPkobGk0Ssz7nCA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuBVVf%2FbtsgcsgvWF9%2FKqXJHhUPkobGk0Ssz7nCA1%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;1687&quot; height=&quot;865&quot; data-filename=&quot;openpose 다운로드.png&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;865&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 data-ke-size=&quot;size16&quot;&gt;openpose-master\models 에 있는 getModels.bat를 실행시켜줍니다.&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-filename=&quot;2. model 경로.PNG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDMTm/btsgfszDLBE/IZ7anE6pK9TuX5c2pC5cYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDMTm/btsgfszDLBE/IZ7anE6pK9TuX5c2pC5cYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDMTm/btsgfszDLBE/IZ7anE6pK9TuX5c2pC5cYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDMTm%2FbtsgfszDLBE%2FIZ7anE6pK9TuX5c2pC5cYk%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;605&quot; height=&quot;198&quot; data-filename=&quot;2. model 경로.PNG&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;198&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 data-ke-size=&quot;size16&quot;&gt;(시간이 조금 걸립니다. 15분있다가 오니까 다 설치되었네요.)&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-filename=&quot;3. 모델 설치.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dP0AYV/btsgbHLZUz8/F3kfirglajafbUHHbN8zYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dP0AYV/btsgbHLZUz8/F3kfirglajafbUHHbN8zYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dP0AYV/btsgbHLZUz8/F3kfirglajafbUHHbN8zYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdP0AYV%2FbtsgbHLZUz8%2FF3kfirglajafbUHHbN8zYK%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;978&quot; height=&quot;511&quot; data-filename=&quot;3. 모델 설치.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;511&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2. Model 셋팅&lt;/b&gt;&lt;/span&gt;&lt;/h4&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-filename=&quot;4. Model - MPI.PNG&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnjJ8Z/btsgcN5N09I/FFIVVaEZyPCaCUHIpQzInK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnjJ8Z/btsgcN5N09I/FFIVVaEZyPCaCUHIpQzInK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnjJ8Z/btsgcN5N09I/FFIVVaEZyPCaCUHIpQzInK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnjJ8Z%2FbtsgcN5N09I%2FFFIVVaEZyPCaCUHIpQzInK%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;646&quot; height=&quot;137&quot; data-filename=&quot;4. Model - MPI.PNG&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pose 폴더에는&amp;nbsp; body_25, coco, mpi 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;사용할 모델을 선택한 뒤 경로만 설정 및 Body_Pairs, Pose_Pairs 를 형식에 맡게 변경해주시면 됩니다.&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;저는 mpi폴더에 있는 모델데이터로 테스트를 진행하였습니다.&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;MPII Human Pose Dataset에서 훈련된 관절 검출 모델입니다.&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;첫번째 파일 pose_deploy_linevec.prototxt는&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;아래에 있는 pose_deploy_linevec_faster_4_stages.prototxt 보다 무겁지만 정확한 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.prototxt : 모델의 구성요소에 대한 정보.&lt;br /&gt;.caffemodel : 훈련된 모델 가중치를 저장.&lt;/blockquote&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;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3. 개발 환경 셋팅&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;opencv가 꼭 필요하니 설치해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;pip install opencv-python&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 파이참으로 새 프로젝트를 생성한 뒤 main.py에 다음 코드를 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684286275459&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
import cv2

def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    # MPII에서 각 파트 번호, 선으로 연결될 POSE_PAIRS
    BODY_PARTS = {&quot;Head&quot;: 0, &quot;Neck&quot;: 1, &quot;RShoulder&quot;: 2, &quot;RElbow&quot;: 3, &quot;RWrist&quot;: 4,
                  &quot;LShoulder&quot;: 5, &quot;LElbow&quot;: 6, &quot;LWrist&quot;: 7, &quot;RHip&quot;: 8, &quot;RKnee&quot;: 9,
                  &quot;RAnkle&quot;: 10, &quot;LHip&quot;: 11, &quot;LKnee&quot;: 12, &quot;LAnkle&quot;: 13, &quot;Chest&quot;: 14,
                  &quot;Background&quot;: 15}

    POSE_PAIRS = [[&quot;Head&quot;, &quot;Neck&quot;], [&quot;Neck&quot;, &quot;RShoulder&quot;], [&quot;RShoulder&quot;, &quot;RElbow&quot;],
                  [&quot;RElbow&quot;, &quot;RWrist&quot;], [&quot;Neck&quot;, &quot;LShoulder&quot;], [&quot;LShoulder&quot;, &quot;LElbow&quot;],
                  [&quot;LElbow&quot;, &quot;LWrist&quot;], [&quot;Neck&quot;, &quot;Chest&quot;], [&quot;Chest&quot;, &quot;RHip&quot;], [&quot;RHip&quot;, &quot;RKnee&quot;],
                  [&quot;RKnee&quot;, &quot;RAnkle&quot;], [&quot;Chest&quot;, &quot;LHip&quot;], [&quot;LHip&quot;, &quot;LKnee&quot;], [&quot;LKnee&quot;, &quot;LAnkle&quot;]]

        #COCO
    #Output
    #Format
    #Nose &amp;ndash; 0, Neck &amp;ndash; 1, Right
    #Shoulder &amp;ndash; 2, Right
    #Elbow &amp;ndash; 3, Right
    #Wrist &amp;ndash; 4, Left
    #Shoulder &amp;ndash; 5, Left
    #Elbow &amp;ndash; 6, Left
    #Wrist &amp;ndash; 7, Right
    #Hip &amp;ndash; 8, Right
    #Knee &amp;ndash; 9, Right
    #Ankle &amp;ndash; 10, Left
    #Hip &amp;ndash; 11, Left
    #Knee &amp;ndash; 12, LAnkle &amp;ndash; 13, Right
    #Eye &amp;ndash; 14, Left
    #Eye &amp;ndash; 15, Right
    #Ear &amp;ndash; 16, Left
    #Ear &amp;ndash; 17, Background &amp;ndash; 18

        #MPII
    #Output
    #Format
    #Head &amp;ndash; 0, Neck &amp;ndash; 1, Right
    #Shoulder &amp;ndash; 2, Right
    #Elbow &amp;ndash; 3, Right
    #Wrist &amp;ndash; 4, Left
    #Shoulder &amp;ndash; 5, Left
    #Elbow &amp;ndash; 6, Left
    #Wrist &amp;ndash; 7, Right
    #Hip &amp;ndash; 8, Right
    #Knee &amp;ndash; 9, Right
    #Ankle &amp;ndash; 10, Left
    #Hip &amp;ndash; 11, Left
    #Knee &amp;ndash; 12, Left
    #Ankle &amp;ndash; 13, Chest &amp;ndash; 14, Background &amp;ndash; 15

    # 각 파일 path
    protoFile = &quot;C:\\openpose_data\\pose_deploy_linevec.prototxt&quot;
    weightsFile = &quot;C:\\openpose_data\\pose_iter_160000.caffemodel&quot;

    # 위의 path에 있는 network 불러오기
    net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

    # 이미지 읽어오기
    image = cv2.imread(&quot;C:\\openpose_data\\model.jpg&quot;)

    # frame.shape = 불러온 이미지에서 height, width, color 받아옴
    imageHeight, imageWidth, _ = image.shape

    # network에 넣기위해 전처리
    inpBlob = cv2.dnn.blobFromImage(image, 1.0 / 255, (imageWidth, imageHeight), (0, 0, 0), swapRB=False, crop=False)

    # network에 넣어주기
    net.setInput(inpBlob)

    # 결과 받아오기
    output = net.forward()

    # output.shape[0] = 이미지 ID, [1] = 출력 맵의 높이, [2] = 너비
    H = output.shape[2]
    W = output.shape[3]
    print(&quot;이미지 ID : &quot;, len(output[0]), &quot;, H : &quot;, output.shape[2], &quot;, W : &quot;, output.shape[3])  # 이미지 ID

    # 키포인트 검출시 이미지에 그려줌
    points = []
    # for i int range(len()):
        # coco
    # for i in range(0,18)
    for i in range(0, 15):
        # 해당 신체부위 신뢰도 얻음.
        probMap = output[0, i, :, :]

        # global 최대값 찾기
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

        # 원래 이미지에 맞게 점 위치 변경
        x = (imageWidth * point[0]) / W
        y = (imageHeight * point[1]) / H

        # 키포인트 검출한 결과가 0.1보다 크면(검출한곳이 위 BODY_PARTS랑 맞는 부위면) points에 추가, 검출했는데 부위가 없으면 None으로
        # if prob &amp;gt; threshold :
        if prob &amp;gt; 0.1:
            cv2.circle(image, (int(x), int(y)), 3, (0, 255, 255), thickness=-1,
                       lineType=cv2.FILLED)  # circle(그릴곳, 원의 중심, 반지름, 색)
            cv2.putText(image, &quot;{}&quot;.format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1,
                        lineType=cv2.LINE_AA)
            points.append((int(x), int(y)))
        else:
            points.append(None)

    cv2.imshow(&quot;Output-Keypoints&quot;, image)
    cv2.waitKey(0)

    # 이미지 복사
    imageCopy = image

    # 각 POSE_PAIRS별로 선 그어줌 (머리 - 목, 목 - 왼쪽어깨, ...)
    for pair in POSE_PAIRS:
        partA = pair[0]  # Head
        partA = BODY_PARTS[partA]  # 0
        partB = pair[1]  # Neck
        partB = BODY_PARTS[partB]  # 1

        # print(partA,&quot; 와 &quot;, partB, &quot; 연결\n&quot;)
        if points[partA] and points[partB]:
            cv2.line(imageCopy, points[partA], points[partB], (0, 255, 0), 2)

    cv2.imshow(&quot;Output-Keypoints&quot;, imageCopy)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;protoFile = &quot;C:\\openpose_data\\pose_deploy_linevec.prototxt&quot;&lt;br /&gt;weightsFile = &quot;C:\\openpose_data\\pose_iter_160000.caffemodel&quot;&lt;br /&gt;image = cv2.imread(&quot;C:\\openpose_data\\model.jpg&quot;)&lt;/blockquote&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-filename=&quot;model.jpg&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXi6v7/btsgjmsmmwZ/qfHEANJdB7HQqOHrK1MTL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXi6v7/btsgjmsmmwZ/qfHEANJdB7HQqOHrK1MTL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXi6v7/btsgjmsmmwZ/qfHEANJdB7HQqOHrK1MTL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXi6v7%2FbtsgjmsmmwZ%2FqfHEANJdB7HQqOHrK1MTL1%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;554&quot; height=&quot;832&quot; data-filename=&quot;model.jpg&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;832&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;result_20230517_105404.jpg&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GScj1/btsgcpRuo6F/cKq3mD3TAUTKDClkWS2In1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GScj1/btsgcpRuo6F/cKq3mD3TAUTKDClkWS2In1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GScj1/btsgcpRuo6F/cKq3mD3TAUTKDClkWS2In1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGScj1%2FbtsgcpRuo6F%2FcKq3mD3TAUTKDClkWS2In1%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;554&quot; height=&quot;832&quot; data-filename=&quot;result_20230517_105404.jpg&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;832&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;coco는 테스트 하고 올리겠습니다!&lt;/p&gt;</description>
      <category>머신러닝 &amp;amp; 딥러닝</category>
      <category>openpose</category>
      <category>openpose 실행</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/60</guid>
      <comments>https://firstws.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 17 May 2023 10:56:07 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝] \smplifyx\fit_single_frame.py&amp;quot;, line 46, in &amp;lt;module&amp;gt; from human_body_prior.tools.model_loader import load_vposer ImportError: cannot import name 'load_vposer' from 'human_body_prior.tools.model_loader'</title>
      <link>https://firstws.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오류메세지는 'human_body_prior.tools.model_loader'에서 'load_vposer'을 가져올 수 없다는 것을 나타냅니다.&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;human_body_prior를 github에서 clone 받거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;-e git+https://github.com/nghorbani/human_body_prior#egg=human_body_prior&lt;/blockquote&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;model_loader에서 'load_vposer' 함수가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;pip install human_body_prior&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 pip install 로 설치했을때는&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;model_loader에서 'load_vposer' 함수가 있습니다.&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;&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;깃허브에서 가져오면 'load_vposer'함수가 없다.&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;터미널에서 설치하면 'load_vposer'함수가 있다!!&lt;/p&gt;</description>
      <category>Error</category>
      <category>human_body_prior load_vposer</category>
      <category>smpl human_body_prior load_vposer</category>
      <category>smpl load_vposer</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/59</guid>
      <comments>https://firstws.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 16 May 2023 09:50:47 +0900</pubDate>
    </item>
    <item>
      <title>[Error] import pyrender - python 호환 문제</title>
      <link>https://firstws.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;SMPL 데모를 실행하는 과정에서 다음과 같은 에러 메세지가 발생하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Exception: pyglet 2.0.7 requires Python 3.8 or newer.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;setup.py에는 'pyrender&amp;gt;=0.1.23' 이게 실행되었고 pyrender == 0.1.45가 설치되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제는 pyrender가 아닌 pyglet == 2.0.7이 설치되었다는 것 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pyglet == 2.0.7은 python 3.8 이상 버전과 호환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SMPL은 python 3.6 으로 개발된 것으로 알고 있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;python 3.6과 호환되는 pyglet 1.5.21 버전을 설치하여 이 문제(import pyrender)를 해결하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;* pyglet 1.3.2 버전도 python 3.6과 호환이 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; OpenGL 3 컨텍스트를 생성하는데 필요한 WGL_ARB_create_context 확장을 지원하지 않는다는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; 에러메세지가 발생하여 위 문제를 해결한 1.5.21버전을 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;nbsp;- pyrender를 import시키는데 왜 pyglet 버전이 문제인가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp; &lt;u&gt;&amp;rarr; pyrender가 3D 렌더링을 위해 pyglet을 사용하기 때문입니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pyrender는 3D 시각화 및 렌더링 라이브러리입니다. 3D 모델을 표시하고 렌더링하는 데 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pyrender는 내부적으로 pyglet을 사용하여 그래픽 컨텍스트를 생성하고 OpenGL을 통해 렌더링합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서, pyrender를 사용하려면 pyglet 라이브러리도 설치해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pyglet은 윈도우 시스템, OpenGL 지원 및 그래픽 렌더링에 필요한 기능을 제공합니다.&lt;/p&gt;</description>
      <category>Error</category>
      <category>pyrender pyglet</category>
      <category>pyrender pyglet python 버전</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/58</guid>
      <comments>https://firstws.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 11 May 2023 09:11:08 +0900</pubDate>
    </item>
    <item>
      <title>[PyTorch] CUDA 11.2 + GTX 1080 Ti에 맞는 torch version 셋팅하기</title>
      <link>https://firstws.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS에서 제공하는 Simple BaseLine을 실행시키려는데&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;저는 CUDA 11.2 버전 + GTX 1080 Ti 인데&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_1682558582608&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 -f https://download.pytorch.org/whl/torch_stable.html&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;명령어를 보면 CUDA 11.0 버전으로 설치한 것을 알 수 있는데 11.2버전과도 호환 가능한 것으로 확인됩니다.&lt;/p&gt;</description>
      <category>머신러닝 &amp;amp; 딥러닝</category>
      <category>CUDA 11.2 pytorch version</category>
      <category>CUDA 11.2 파이토치</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/57</guid>
      <comments>https://firstws.tistory.com/57#entry57comment</comments>
      <pubDate>Thu, 27 Apr 2023 10:26:11 +0900</pubDate>
    </item>
    <item>
      <title>[Anaconda] Python 버전 변경하기(feat.Solving environment 무한/오래걸림)</title>
      <link>https://firstws.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MircroSoft에서 제공하는 Simple Baseline 딥러닝 모델을 깃헙에서 클론하고&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;문서를 보니 Python 3.6버전에서 개발되었다는 것을 확인.&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;Python Interpreter에는 Python 3.7버전이 설치되어 있어서 3.6으로 다운그레이드 시키려는데&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;Solving environment가 계속 실행되는 현상을 확인.&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-filename=&quot;conda 무한+python 버전.PNG&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdEUh3/btr97opML0T/RIqYFBCrJ2VNuSdmROGITk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdEUh3/btr97opML0T/RIqYFBCrJ2VNuSdmROGITk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdEUh3/btr97opML0T/RIqYFBCrJ2VNuSdmROGITk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdEUh3%2Fbtr97opML0T%2FRIqYFBCrJ2VNuSdmROGITk%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;876&quot; height=&quot;217&quot; data-filename=&quot;conda 무한+python 버전.PNG&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;217&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;이 현상의 원인이 Anaconda가 구버전이라서 생긴 이슈이며,&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;해결법은 Anaconda를 업데이트하면된다고 해서 시도했습니다.&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;pre id=&quot;code_1681433859825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda update --all&lt;/code&gt;&lt;/pre&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-filename=&quot;conda update --all.PNG&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQuzFm/btr91yANLWq/kGbwSiGWz7f5Pk3RpGeRcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQuzFm/btr91yANLWq/kGbwSiGWz7f5Pk3RpGeRcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQuzFm/btr91yANLWq/kGbwSiGWz7f5Pk3RpGeRcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQuzFm%2Fbtr91yANLWq%2FkGbwSiGWz7f5Pk3RpGeRcK%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;845&quot; height=&quot;156&quot; data-filename=&quot;conda update --all.PNG&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;156&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;update proceed.PNG&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co1vkG/btr92tyTgeo/FLMcTjL0DuIpIZncgi9HMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co1vkG/btr92tyTgeo/FLMcTjL0DuIpIZncgi9HMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co1vkG/btr92tyTgeo/FLMcTjL0DuIpIZncgi9HMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco1vkG%2Fbtr92tyTgeo%2FFLMcTjL0DuIpIZncgi9HMK%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;899&quot; height=&quot;414&quot; data-filename=&quot;update proceed.PNG&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;414&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;&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.6버전 파이썬을 설치하기로 했습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681434888524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda uninstall python
conda install python=3.6&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;3.6파이썬.PNG&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAtLj/btr91BdbT5R/VttSYzMKSOcEB8TqiDNHzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAtLj/btr91BdbT5R/VttSYzMKSOcEB8TqiDNHzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAtLj/btr91BdbT5R/VttSYzMKSOcEB8TqiDNHzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAtLj%2Fbtr91BdbT5R%2FVttSYzMKSOcEB8TqiDNHzk%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;797&quot; height=&quot;419&quot; data-filename=&quot;3.6파이썬.PNG&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;419&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;결론 : conda update는 기존에 없는 패키지를 설치할 때 오류가 발생하면 유효하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 버전 변경에는 유효하지 않는 과정을 겪었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 파이썬 버전을 변경 시도 시 안되면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제하고 다시 설치하면 됩니다!&lt;/p&gt;</description>
      <category>개발 , 컴퓨터, IT지식</category>
      <category>anaconda python 버전 변경</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/56</guid>
      <comments>https://firstws.tistory.com/56#entry56comment</comments>
      <pubDate>Fri, 14 Apr 2023 10:17:15 +0900</pubDate>
    </item>
    <item>
      <title>[Anaconda] win10(윈도우10)에서 Anaconda 가상환경 만들기</title>
      <link>https://firstws.tistory.com/55</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;가상환경이 필요한 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;독립적인 환경에서 작업을 할 수 있다.&quot;&lt;/blockquote&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;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;서로 충돌이 나거나 호환이 안되는 경우가 발생합니다.(특히 Python)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Anaconda 설치하기&lt;/b&gt;&lt;/h3&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;a href=&quot;https://www.anaconda.com/products/distribution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.anaconda.com/products/distribution&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681195495547&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;Anaconda | Anaconda Distribution&quot; data-og-description=&quot;Anaconda's open-source Distribution is the easiest way to perform Python/R data science and machine learning on a single machine.&quot; data-og-host=&quot;www.anaconda.com&quot; data-og-source-url=&quot;https://www.anaconda.com/products/distribution&quot; data-og-url=&quot;https://www.anaconda.com/products/distribution&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RsziU/hySeY2FSw4/ihIhxT15Jssi12TdufkKj1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/KYACZ/hySe1588HF/WLiiinwvH6GenzKBgN8gz0/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418,https://scrap.kakaocdn.net/dn/bujSYg/hySe3QpOjo/xltoTjML7CyENHAgJnVzHk/img.png?width=650&amp;amp;height=650&amp;amp;face=0_0_650_650&quot;&gt;&lt;a href=&quot;https://www.anaconda.com/products/distribution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.anaconda.com/products/distribution&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RsziU/hySeY2FSw4/ihIhxT15Jssi12TdufkKj1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/KYACZ/hySe1588HF/WLiiinwvH6GenzKBgN8gz0/img.jpg?width=796&amp;amp;height=418&amp;amp;face=0_0_796_418,https://scrap.kakaocdn.net/dn/bujSYg/hySe3QpOjo/xltoTjML7CyENHAgJnVzHk/img.png?width=650&amp;amp;height=650&amp;amp;face=0_0_650_650');&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;Anaconda | Anaconda Distribution&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda's open-source Distribution is the easiest way to perform Python/R data science and machine learning on a single machine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.anaconda.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;/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-filename=&quot;아나설치1.PNG&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKKZx7/btr9pX8TPKH/I3Fexq6KJuPwrqh9A4PW3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKKZx7/btr9pX8TPKH/I3Fexq6KJuPwrqh9A4PW3k/img.png&quot; data-alt=&quot;2개 중 아무거나 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKKZx7/btr9pX8TPKH/I3Fexq6KJuPwrqh9A4PW3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKKZx7%2Fbtr9pX8TPKH%2FI3Fexq6KJuPwrqh9A4PW3k%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;1238&quot; height=&quot;732&quot; data-filename=&quot;아나설치1.PNG&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2개 중 아무거나 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;아나설치2.PNG&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tBZUY/btr9yxauiEY/ZJamoYzbYOEXb77sIzNhTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tBZUY/btr9yxauiEY/ZJamoYzbYOEXb77sIzNhTk/img.png&quot; data-alt=&quot;최신 버전 클릭!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tBZUY/btr9yxauiEY/ZJamoYzbYOEXb77sIzNhTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtBZUY%2Fbtr9yxauiEY%2FZJamoYzbYOEXb77sIzNhTk%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;1292&quot; height=&quot;647&quot; data-filename=&quot;아나설치2.PNG&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;647&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;&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;저 파이썬 버전은 Anaconda Base Python 버전이구요&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Andaconda Prompt 실행하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ana prompt.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGEYy0/btr9sirexVI/oaXm98mnj9HMxXEPFK3iRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGEYy0/btr9sirexVI/oaXm98mnj9HMxXEPFK3iRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGEYy0/btr9sirexVI/oaXm98mnj9HMxXEPFK3iRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGEYy0%2Fbtr9sirexVI%2FoaXm98mnj9HMxXEPFK3iRK%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;833&quot; height=&quot;710&quot; data-filename=&quot;ana prompt.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;710&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Anaconda Prompt 실행!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프롬프트.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5H6KM/btr9A0XjQ6R/BndfQxnCo0SZZAZtNwNQWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5H6KM/btr9A0XjQ6R/BndfQxnCo0SZZAZtNwNQWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5H6KM/btr9A0XjQ6R/BndfQxnCo0SZZAZtNwNQWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5H6KM%2Fbtr9A0XjQ6R%2FBndfQxnCo0SZZAZtNwNQWk%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;626&quot; height=&quot;327&quot; data-filename=&quot;프롬프트.PNG&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;511&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 가상환경 만들기&lt;/b&gt;&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681197559664&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda create -n 가상환경이름
conda create -n 가상환경이름 python=3.7
conda create -n 가상환경이름 python=3.7 anconda&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;파이썬 버전 설정 뒤에 'anaconda'를 붙이고 생성하면 Anaconda에서 제공하는 기본 설치 패키지가 설치됩니다.&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; numpy, matplotlib, pandas 등 다 직접 설치해야합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;생성1.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg6HOk/btr9A4FoydZ/kGrdh2Z7ylC7B00dtpv7t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg6HOk/btr9A4FoydZ/kGrdh2Z7ylC7B00dtpv7t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg6HOk/btr9A4FoydZ/kGrdh2Z7ylC7B00dtpv7t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg6HOk%2Fbtr9A4FoydZ%2FkGrdh2Z7ylC7B00dtpv7t0%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;979&quot; height=&quot;285&quot; data-filename=&quot;생성1.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;생성2.PNG&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dABiU6/btr9poZUvlz/9fsnLPAP8SmyUceFmXjnT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dABiU6/btr9poZUvlz/9fsnLPAP8SmyUceFmXjnT0/img.png&quot; data-alt=&quot;'y' 입력 후 엔터!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dABiU6/btr9poZUvlz/9fsnLPAP8SmyUceFmXjnT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdABiU6%2Fbtr9poZUvlz%2F9fsnLPAP8SmyUceFmXjnT0%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;980&quot; height=&quot;511&quot; data-filename=&quot;생성2.PNG&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'y' 입력 후 엔터!&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 가상 환경 리스트&lt;/b&gt;&lt;/h3&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_1681198065148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda env list&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;가상환경 리스트.PNG&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnj3tp/btr9BHpIczb/ISEpUWAkcBmmPZgiLXd9d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnj3tp/btr9BHpIczb/ISEpUWAkcBmmPZgiLXd9d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnj3tp/btr9BHpIczb/ISEpUWAkcBmmPZgiLXd9d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnj3tp%2Fbtr9BHpIczb%2FISEpUWAkcBmmPZgiLXd9d1%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;979&quot; height=&quot;434&quot; data-filename=&quot;가상환경 리스트.PNG&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;434&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 가상 환경 활성화&lt;/b&gt;&lt;/h3&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;pre id=&quot;code_1681198376710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create activate 가상환경이름&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;가상환경 활성화.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4E5B/btr9nIqYILd/KuPXGbJFLtUlqYS68fwWuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4E5B/btr9nIqYILd/KuPXGbJFLtUlqYS68fwWuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4E5B/btr9nIqYILd/KuPXGbJFLtUlqYS68fwWuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4E5B%2Fbtr9nIqYILd%2FKuPXGbJFLtUlqYS68fwWuk%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;978&quot; height=&quot;400&quot; data-filename=&quot;가상환경 활성화.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;400&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 가상 환경 비활성화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681198733334&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda deactivate&lt;/code&gt;&lt;/pre&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-filename=&quot;디액티베이트.PNG&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pxs9x/btr9zwbFis2/6mPkMZJYflzJ614dmGNJN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pxs9x/btr9zwbFis2/6mPkMZJYflzJ614dmGNJN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pxs9x/btr9zwbFis2/6mPkMZJYflzJ614dmGNJN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPxs9x%2Fbtr9zwbFis2%2F6mPkMZJYflzJ614dmGNJN1%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;393&quot; height=&quot;85&quot; data-filename=&quot;디액티베이트.PNG&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;85&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 가상 환경에 라이브러리 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681199137387&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install 라이브러리
pip install pandas numpy

pip install tensorflow==1.15.0
#&amp;lt;upgrade&amp;gt;
pip install --upgrade tensorflow==2.7.0

pip install tensorflow==2.7.0
#&amp;lt;downgrade&amp;gt;
pip install --upgrade tensorflow==1.15.0&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 가상 환경 삭제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681200031092&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;conda env remove -n 가상환경이름&lt;/code&gt;&lt;/pre&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-filename=&quot;삭제.PNG&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNfyGl/btr9AlAP9rb/KY9BdpgA56ADF77e1SyoSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNfyGl/btr9AlAP9rb/KY9BdpgA56ADF77e1SyoSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNfyGl/btr9AlAP9rb/KY9BdpgA56ADF77e1SyoSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNfyGl%2Fbtr9AlAP9rb%2FKY9BdpgA56ADF77e1SyoSK%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;610&quot; height=&quot;380&quot; data-filename=&quot;삭제.PNG&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;380&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>개발 , 컴퓨터, IT지식</category>
      <category>win10 anaconda</category>
      <category>win10 아나콘다</category>
      <category>아나콘다 가상 환경</category>
      <category>아나콘다 가상환경</category>
      <category>윈10 anaconda</category>
      <category>윈10 아나콘다</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/55</guid>
      <comments>https://firstws.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 11 Apr 2023 16:53:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring&amp;amp;Spring Boot] @Transaction, rollback이 안될 때가 있다??</title>
      <link>https://firstws.tistory.com/54</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;@Transaction 어노테이션을 걸고 service 로직을 구현 및 테스트를 진행하다가&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예외가 발생했으나 DB에는 데이터가 저장되는 기이한 현상을 겪어 (주니어라 그래요 이해좀)&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;&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;Spring 프레임워크에서 @Transactional 어노테이션은 트랜잭션 관리를 쉽게 해주는 기능을 제공합니다.&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;@Transactional 어노테이션을 사용하면, 메소드가 실행될 때 트랜잭션을 시작하고,&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;&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;제가 체크하는 로직에 예외처리를 했고 여기서 에러가 터질때마다 DB에 데이터는 저장되는데&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; 분명 난 @Transactional 어노테이션을 걸었고, 예외가 발생하여 분명 커밋이 되지 않았을텐데 저장이 되었다...??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Transactional 어노테이션을 사용하여 트랜잭션을 설정했다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 실행 중 예외가 발생하면 자동으로 롤백됩니다. 이는 기본 동작입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하.지.만!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 예외(Exception)는 롤백이 되지 않는 Exception이 있습니다.&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;blockquote data-ke-style=&quot;style2&quot;&gt;1. &amp;nbsp;Checked Exception : 각각 꼭 처리해서 체크해줘야하는 예외. 처리를 안해줘도 되는 예외.&lt;/blockquote&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. Unchecked Exception : 체크되지 않는 예외&lt;br /&gt;&lt;br /&gt;ex) RunTimeException&lt;br /&gt;&lt;br /&gt;2. Error : H/W Error&lt;br /&gt;&lt;br /&gt;ex) OutOfMemoryError&lt;/blockquote&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그러면 Checked Exception에서 롤백을 하고싶을땐 어떻게 해야할까??&lt;/b&gt;&lt;/h4&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;blockquote data-ke-style=&quot;style2&quot;&gt;@Transactional(rollbackFor = xxxException.class)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rollbackFor 속성에 checked Exception class를 입력하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679987789945&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; @Transactional(rollbackFor = BadRequestCException.class, Exception.class)
    public void setUser(Long userSeq, DTO dto) throws Exception {
    
    ...
    
        if(dto.getProjectSeq() == null) {
            throw new BadRequestCException(&quot;Project is empty.&quot;);
        }

        //중복 체크
        for(Dtos dto : abcds){
            if(!set.add(dto.getUserId())){
                throw new Exception(&quot;Duplicate ID exists.(User ID = &quot; + userId());
            }
        }
        ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>@Transaction rollback</category>
      <category>@Transaction 롤백</category>
      <category>@Transaction 롤백안됨</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/54</guid>
      <comments>https://firstws.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 28 Mar 2023 16:17:54 +0900</pubDate>
    </item>
    <item>
      <title>[m1 homebrew 설치 Warning 해결방법] /opt/homebrew/bin is not in your PATH</title>
      <link>https://firstws.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 M1에서 MediaPipe를 사용해보려고 구글 문서&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;Homebrew를 설치하는데 다음과 같은 에러 메세지가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;/opt/homebrew/bin&amp;nbsp;is&amp;nbsp;not&amp;nbsp;in&amp;nbsp;your&amp;nbsp;PATH&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 설치하라는대로 그대로했는데 왜 안되나....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 글들을 봐도 설치 후 바로 버전확인이 가능했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가 제가 Mac계열은 처음 사용해보는거라 더더욱 답답했습니다....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도움을 받아 해결하게 되어 다음에 이런일이 발생하거나 저와 같은 분들이 있으면 이글을 보고 해결하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도움이 되었으면 좋겠습니다:)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1. Homebrew 설치하기&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;a href=&quot;https://brew.sh/index_ko&quot;&gt;https://brew.sh/index_ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679032463895&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;Homebrew&quot; data-og-description=&quot;The Missing Package Manager for macOS (or Linux).&quot; data-og-host=&quot;brew.sh&quot; data-og-source-url=&quot;https://brew.sh/index_ko&quot; data-og-url=&quot;https://brew.sh/index_ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/01O0Q/hyRWs5k64d/KIOkcB9Gsq9pfRKIklRZKk/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/Zioji/hyRWuWoVDM/5YkpjQbOeTKMiCAElHqbE0/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560&quot;&gt;&lt;a href=&quot;https://brew.sh/index_ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brew.sh/index_ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/01O0Q/hyRWs5k64d/KIOkcB9Gsq9pfRKIklRZKk/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560,https://scrap.kakaocdn.net/dn/Zioji/hyRWuWoVDM/5YkpjQbOeTKMiCAElHqbE0/img.png?width=1200&amp;amp;height=560&amp;amp;face=0_0_1200_560');&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;Homebrew&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Missing Package Manager for macOS (or Linux).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brew.sh&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서&lt;/p&gt;
&lt;pre id=&quot;code_1679032482979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;&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;size18&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 환경설정하기&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이거였습니다!! 환경설정!!! 아닛 다른분들은 이 과정 없이 잘 하시던데....흠.....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 한 줄씩 입력해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 줄의 [user] 부분은 사용자마다 다르기때문에 꼭 바꿔주셔야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679032609098&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;' &amp;gt;&amp;gt; /Users/[user]/.zprofile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679032620145&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 설치확인하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679032646961&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew --version&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;</description>
      <category>개발 , 컴퓨터, IT지식</category>
      <category>homebrew not in your PATH</category>
      <category>opt/homebrew/bin is not in your PATH</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/53</guid>
      <comments>https://firstws.tistory.com/53#entry53comment</comments>
      <pubDate>Fri, 17 Mar 2023 14:58:48 +0900</pubDate>
    </item>
    <item>
      <title>Redis서버 win10에서 설치하기</title>
      <link>https://firstws.tistory.com/52</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Redis서버 window버전 설치하기&lt;/b&gt;&lt;/h4&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;figure id=&quot;og_1678405932734&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;Releases &amp;middot; microsoftarchive/redis&quot; data-og-description=&quot;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-url=&quot;https://github.com/microsoftarchive/redis/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ftETl/hyRSPlgoRZ/36zd8ic3y4KWK4hjQGJio1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/microsoftarchive/redis/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ftETl/hyRSPlgoRZ/36zd8ic3y4KWK4hjQGJio1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Releases &amp;middot; microsoftarchive/redis&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis&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;&lt;a href=&quot;https://github.com/microsoftarchive/redis/releases&quot;&gt;https://github.com/microsoftarchive/redis/releases&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최초.PNG&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t545d/btr22MSb9wn/WVE1lk0epOQdUwltFNAVv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t545d/btr22MSb9wn/WVE1lk0epOQdUwltFNAVv1/img.png&quot; data-alt=&quot;.msi 파일 다운로드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t545d/btr22MSb9wn/WVE1lk0epOQdUwltFNAVv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft545d%2Fbtr22MSb9wn%2FWVE1lk0epOQdUwltFNAVv1%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;899&quot; height=&quot;528&quot; data-filename=&quot;최초.PNG&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;.msi 파일 다운로드&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설치파일 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-1.PNG&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrseG/btr27V18rXs/CLsduZKR2PhF3x0CDOaHFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrseG/btr27V18rXs/CLsduZKR2PhF3x0CDOaHFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrseG/btr27V18rXs/CLsduZKR2PhF3x0CDOaHFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwrseG%2Fbtr27V18rXs%2FCLsduZKR2PhF3x0CDOaHFk%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;596&quot; height=&quot;464&quot; data-filename=&quot;redis_setup-1.PNG&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-2.PNG&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl8qUM/btr27V8T4u2/rbIn2F09D2s2YGnzU2eiZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl8qUM/btr27V8T4u2/rbIn2F09D2s2YGnzU2eiZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl8qUM/btr27V8T4u2/rbIn2F09D2s2YGnzU2eiZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl8qUM%2Fbtr27V8T4u2%2FrbIn2F09D2s2YGnzU2eiZK%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;603&quot; height=&quot;463&quot; data-filename=&quot;redis_setup-2.PNG&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-3.PNG&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cp90o/btr2Zx9AIyP/T3g6FSLQw1po4yFwm0oHL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cp90o/btr2Zx9AIyP/T3g6FSLQw1po4yFwm0oHL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cp90o/btr2Zx9AIyP/T3g6FSLQw1po4yFwm0oHL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCp90o%2Fbtr2Zx9AIyP%2FT3g6FSLQw1po4yFwm0oHL0%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;615&quot; height=&quot;486&quot; data-filename=&quot;redis_setup-3.PNG&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-4.PNG&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ6SZ0/btr2RirVNe2/yBO6TNwbdgGMG7aqX6TM71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ6SZ0/btr2RirVNe2/yBO6TNwbdgGMG7aqX6TM71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ6SZ0/btr2RirVNe2/yBO6TNwbdgGMG7aqX6TM71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ6SZ0%2Fbtr2RirVNe2%2FyBO6TNwbdgGMG7aqX6TM71%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;615&quot; height=&quot;482&quot; data-filename=&quot;redis_setup-4.PNG&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;Redis의 기본포트는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;6379&lt;/span&gt;&lt;/b&gt; 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-5.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sKC9b/btr2ZzM3Dxl/nPwnBuykUcNjWSs3GBTf70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sKC9b/btr2ZzM3Dxl/nPwnBuykUcNjWSs3GBTf70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sKC9b/btr2ZzM3Dxl/nPwnBuykUcNjWSs3GBTf70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsKC9b%2Fbtr2ZzM3Dxl%2FnPwnBuykUcNjWSs3GBTf70%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;616&quot; height=&quot;479&quot; data-filename=&quot;redis_setup-5.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-6.PNG&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEfCrO/btr21A5xp4c/L5WgkKBPsuTsKFZhUz3wd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEfCrO/btr21A5xp4c/L5WgkKBPsuTsKFZhUz3wd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEfCrO/btr21A5xp4c/L5WgkKBPsuTsKFZhUz3wd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEfCrO%2Fbtr21A5xp4c%2FL5WgkKBPsuTsKFZhUz3wd0%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;612&quot; height=&quot;473&quot; data-filename=&quot;redis_setup-6.PNG&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-7.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1yTp7/btr22IvygGn/eNWuFcUpoKMcNbZRUfKKoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1yTp7/btr22IvygGn/eNWuFcUpoKMcNbZRUfKKoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1yTp7/btr22IvygGn/eNWuFcUpoKMcNbZRUfKKoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1yTp7%2Fbtr22IvygGn%2FeNWuFcUpoKMcNbZRUfKKoK%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;616&quot; height=&quot;476&quot; data-filename=&quot;redis_setup-7.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;476&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Redis 실행하기&lt;/b&gt;&lt;/h4&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-8.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg1HjG/btr2RYz6ty0/btZfqSxhrWsvcgzkihBqj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg1HjG/btr2RYz6ty0/btZfqSxhrWsvcgzkihBqj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg1HjG/btr2RYz6ty0/btZfqSxhrWsvcgzkihBqj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg1HjG%2Fbtr2RYz6ty0%2FbtZfqSxhrWsvcgzkihBqj1%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;1320&quot; height=&quot;912&quot; data-filename=&quot;redis_setup-8.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 서비스가 실행되지 않는다면 Redis 설치 경로에 있는 'redis-server.exe' 파일을 실행하면 됩니다.&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;Redis 서버를 실행시켰다면, Redis 명령어를 사용할 수 있는 'redis-cli.exe'를 실행시킵니다.&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-filename=&quot;redis_setup-10.PNG&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqiPKO/btr2Un7wJTw/FOwmz5GIbZ7kbzcoxITF9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqiPKO/btr2Un7wJTw/FOwmz5GIbZ7kbzcoxITF9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqiPKO/btr2Un7wJTw/FOwmz5GIbZ7kbzcoxITF9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqiPKO%2Fbtr2Un7wJTw%2FFOwmz5GIbZ7kbzcoxITF9K%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;865&quot; height=&quot;563&quot; data-filename=&quot;redis_setup-10.PNG&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 설치 경로는 C:\Program Files\Redis 입니다.&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;창이 뜨면 Redis가 잘 작동되는지 테스트하기 위해 다음과 같이 명령어를 입력합니다.&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-filename=&quot;redis_setup-11.PNG&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2YHr/btr2Zy1ISO9/z6EIusJSaptVKkJYoQNJOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2YHr/btr2Zy1ISO9/z6EIusJSaptVKkJYoQNJOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2YHr/btr2Zy1ISO9/z6EIusJSaptVKkJYoQNJOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2YHr%2Fbtr2Zy1ISO9%2Fz6EIusJSaptVKkJYoQNJOK%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;425&quot; height=&quot;255&quot; data-filename=&quot;redis_setup-11.PNG&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;255&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;ping &amp;rarr; PONG 으로 Redis가 잘 작동하는 것을 확인할 수 있습니다.&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;set 명령어는 key-value 형태로 입력이 가능하고,&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;get으로 조회 가능합니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Redis 서비스 설정하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis의 기본 포트는 6379로 설정되어 있습니다.&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;포트 번호를 수정하고 싶다면 'redis.window-service.conf' 파일에서 수정할 수 있습니다.&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-filename=&quot;redis_setup-12.PNG&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgfP8n/btr2YjqgC5l/lZVLUeOLJcGJk6l8TVEq31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgfP8n/btr2YjqgC5l/lZVLUeOLJcGJk6l8TVEq31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgfP8n/btr2YjqgC5l/lZVLUeOLJcGJk6l8TVEq31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgfP8n%2Fbtr2YjqgC5l%2FlZVLUeOLJcGJk6l8TVEq31%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;854&quot; height=&quot;573&quot; data-filename=&quot;redis_setup-12.PNG&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;redis.window.conf : 명령줄이나 스크립트에서 실행되고 사용자 공간에서 관리된다.&lt;br /&gt;&lt;br /&gt;redis.window-service.conf : 서비스/데몬으로 실행될 때 실행되며, 백그라운드에서 실행되고 OS에 의해 관리된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;.conf 파일 여는 방법&lt;br /&gt;&lt;br /&gt;&amp;nbsp;- 메모장을 관리자 권한으로 실행&lt;br /&gt;&amp;nbsp;- 메모장 - 열기 - .conf 파일 선택 후 열기&lt;/blockquote&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;3.1. 포트 변경&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis.window.conf 파일을 열어서 'port'라고 검색하면 아래와 같이 6379로 설정되어 있는 것을 확인할 수 있으며,&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ 주의 : 메모장에서 검색할 때는 현재 row 밑에만 검색하는 경우가 대부분이기 때문에&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;메모장 첫째줄부터 검색&lt;/u&gt;해야합니다!!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;redis_setup-13.PNG&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHpwG/btr2ZAZzFtJ/PoVzHET1qoWRORkH3mkOz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHpwG/btr2ZAZzFtJ/PoVzHET1qoWRORkH3mkOz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHpwG/btr2ZAZzFtJ/PoVzHET1qoWRORkH3mkOz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHpwG%2Fbtr2ZAZzFtJ%2FPoVzHET1qoWRORkH3mkOz0%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;1418&quot; height=&quot;1063&quot; data-filename=&quot;redis_setup-13.PNG&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;1063&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2. 비밀번호 변경&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트번호 변경하는 파일(redis.window.conf)에서 'requirepass' 를 검색합니다.&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-filename=&quot;redis_setup-14.PNG&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3fiIZ/btr2RXackLe/7C8nFYmjtdrTYKyNERkDG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3fiIZ/btr2RXackLe/7C8nFYmjtdrTYKyNERkDG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3fiIZ/btr2RXackLe/7C8nFYmjtdrTYKyNERkDG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3fiIZ%2Fbtr2RXackLe%2F7C8nFYmjtdrTYKyNERkDG1%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;1375&quot; height=&quot;1024&quot; data-filename=&quot;redis_setup-14.PNG&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;1024&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;# 은 주석처리를 의미하고, requirepass는 주석 처리가 되어 있으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 비밀번호는 설정되어 있지 않은 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호를 설정하고 싶다면 해당 부분의 주석처리를 풀고 'foobared' 부분에 설정할 비밀번호를 입력하면 됩니다.&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;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;비밀번호를 설정하지 않았을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;SpringBoot에서는 application.properties / application.yml에서 다음과 같이 설정해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678412666535&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis:
        lettuce:
            pool:
                min-idle: 0
                max-idle: 8
                max-active: 8
        port: 6379
        host: localhost
        password: ''&lt;/code&gt;&lt;/pre&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;3.3. 외부 접근 허용 IP 설정하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'redis.window.conf'에서 'bind' 를 검색합니다.&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-filename=&quot;redis_setup-15.PNG&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJsjbG/btr27WtgMan/7YycmdRIggQhul5RKd4Uf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJsjbG/btr27WtgMan/7YycmdRIggQhul5RKd4Uf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJsjbG/btr27WtgMan/7YycmdRIggQhul5RKd4Uf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJsjbG%2Fbtr27WtgMan%2F7YycmdRIggQhul5RKd4Uf1%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;632&quot; height=&quot;604&quot; data-filename=&quot;redis_setup-15.PNG&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;604&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;마찬가지로 주석 처리(#) 없이 'bind ip' 를 입력하고 저장하면 됩니다.&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;3.4. 메모리 최대 크기 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis 데이터베이스 자체 메모리를 차지하는 것이므로 maxmemory를 설정할 수 있습니다.&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;'redis.window.conf'에서 'maxmemory' 를 검색합니다.&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-filename=&quot;redis_setup-16.PNG&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1fFhY/btr27ls73VI/I6LKmP4kK3Q078Kb26BcyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1fFhY/btr27ls73VI/I6LKmP4kK3Q078Kb26BcyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1fFhY/btr27ls73VI/I6LKmP4kK3Q078Kb26BcyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1fFhY%2Fbtr27ls73VI%2FI6LKmP4kK3Q078Kb26BcyK%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;686&quot; height=&quot;337&quot; data-filename=&quot;redis_setup-16.PNG&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;337&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.5. log 파일 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;log 파일이 생기지 않도록 기본설정이 되어있습니다.&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;log파일을 생성하게끔 설정하려면&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;'redis.window.conf'에서 'logfile'을 검색합니다.&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-filename=&quot;redis_setup-17.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAljYQ/btr2ZAyvxB9/ohNIOaskjoAy6WKsAO2zRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAljYQ/btr2ZAyvxB9/ohNIOaskjoAy6WKsAO2zRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAljYQ/btr2ZAyvxB9/ohNIOaskjoAy6WKsAO2zRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAljYQ%2Fbtr2ZAyvxB9%2FohNIOaskjoAy6WKsAO2zRK%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;616&quot; height=&quot;390&quot; data-filename=&quot;redis_setup-17.PNG&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;390&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;logfile &quot;&quot; 의 빈문자열 안에 어떤 파일로 log를 기록할 것인지를 설정합니다.&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;ex) logfile &quot;redis_server_log.txt&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.6. 설정한 값 적용하기&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;메모장에 값을 넣고 저장한다고 적용되지 않습니다. 반드시 redis를 재시작 해줘야합니다.&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;rarr; 서비스 탭 &amp;rarr;&amp;nbsp; Redis 다시 시작&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-filename=&quot;redis_setup-18.PNG&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ifcB/btr27lUeX1T/VMS5zTyncfZUNALvotZmI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ifcB/btr27lUeX1T/VMS5zTyncfZUNALvotZmI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ifcB/btr27lUeX1T/VMS5zTyncfZUNALvotZmI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ifcB%2Fbtr27lUeX1T%2FVMS5zTyncfZUNALvotZmI1%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;1322&quot; height=&quot;418&quot; data-filename=&quot;redis_setup-18.PNG&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;418&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;다시 시작하면 redis.window.conf 파일 설정대로 초기화됩니다.&lt;/p&gt;</description>
      <category>개발 , 컴퓨터, IT지식</category>
      <category>redis</category>
      <category>redis server</category>
      <category>redis 비밀번호</category>
      <category>레디스</category>
      <category>레디스 서버</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/52</guid>
      <comments>https://firstws.tistory.com/52#entry52comment</comments>
      <pubDate>Fri, 10 Mar 2023 11:15:30 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] 엑셀 값 가져오기(.xls &amp;amp; .xlsx)</title>
      <link>https://firstws.tistory.com/51</link>
      <description>&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.xls : 97-03 통합문서로 과거의 엑셀 파일. HSSF~&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.xlsx : 요즘 엑셀 문서의 확장자명. XSSF~, SXSSF~(대용량처리)&lt;/blockquote&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;gradle&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1678075643499&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678075643499&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*;&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;저는 Amazos S3에서 inputStream으로 가져와 파일을 읽는 경우입니다.&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;(MultipartFile을 InputStream 으로 가져와도 됩니다.)&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;size18&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678075618205&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Workbook workbook = null;
if(resourcePath.endsWith(&quot;.xlsx&quot;)){
	workbook = new XSSFWorkbook(file);
}else if(resourcePath.endsWith(&quot;.xls&quot;)){
	workbook = new HSSFWorkbook(file);
}else{
	throw new RuntimeException(&quot;file type not matched&quot;);
}
if(workbook == null){
	throw new RuntimeException(&quot;no data in file&quot;);
}

// 해당 인덱스에 있는 시트를 반환.
Sheet sheet = workbook.getSheetAt(0);

// 모든 행의 개수를 반환.
int rows = sheet.getPhysicalNumberOfRows();

// 지정된 행 번호에 해당하는 row 데이터를 반환.
Row row = sheet.getRow(rowIdx);

// 지정된 셀 번호에 해당하는 Cell 값을 반환.
Cell cell = row.getCell(1);

// 셀의 값을 String타입으로 반환.
String cellText = cell.getStringCellValue();&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;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>spring springboot .xls .xlsx</category>
      <category>spring springboot excel</category>
      <category>spring 엑셀 파일</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/51</guid>
      <comments>https://firstws.tistory.com/51#entry51comment</comments>
      <pubDate>Mon, 6 Mar 2023 13:09:38 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 문자열 비교 .equals 제대로 사용하기(feat.Null)</title>
      <link>https://firstws.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 작성하다보면 문자열 비교 메서드 .equals 를 종종 사용하게 되는데&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_1677029383668&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String zz = &quot;AA&quot;;

zz.equals(&quot;AA&quot;) = true

zz.equals(&quot;AB&quot;) = false&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;그런데 만약 체크하려는 변수(zz)에 Null이 있다면 어떻게 될까요??&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;span style=&quot;background-color: #f7f7f8; color: #374151;&quot;&gt;NullPointerException이 발생할 것 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677029369700&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String zz = null;

zz.equals(&quot;AA&quot;) -&amp;gt; NullPointerException&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;span style=&quot;background-color: #f7f7f8; color: #374151;&quot;&gt;그러면 앞에 Null에 대한 체크를 해야할까요??&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151;&quot;&gt;아닙니다. 순서를 바꿔주기만 해도 null-safe하게 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677029401796&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String zz = null;

&quot;AA&quot;.equals(zz) = false&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;size18&quot;&gt;&lt;b&gt;요약 : &lt;span style=&quot;background-color: #f7f7f8; color: #374151;&quot;&gt;NullPointerException을 피하기 위해&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 비교할 문자열은 .equals 앞에,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 변수는 .equals 뒤에 놓자!&lt;/b&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <category>.equals null</category>
      <category>.equals NullPointerException</category>
      <category>equals null</category>
      <category>equals NullPointerException</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/50</guid>
      <comments>https://firstws.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 22 Feb 2023 10:32:44 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL/JPA] LIMIT 구문을 사용 - 가장 최근/최신 데이터 가져오기(feat.Aurora)</title>
      <link>https://firstws.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 최근/최신 데이터를 &quot;1건&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;(DB마다 조금씩 다르니 확인하고 적용시키는 것을 추천드립니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석 함수 사용 - ROW_NUMBER(), RANK()&lt;/li&gt;
&lt;li&gt;서브 쿼리&lt;/li&gt;
&lt;li&gt;LIMIT 구문 사용&lt;/li&gt;
&lt;/ul&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개 다 사용해봤지만 가장 편리하고 쉬운 LIMIT 구문을 사용해보겠습니다.&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675816982083&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM 테이블명
WHERE 조건
ORDER BY 생성날짜 DESC, &quot;다른조건&quot; DESC
LIMIT 0, 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIMIT 사용법에는 2가지가 있는데요,&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;1. LIMIT x;&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; - 조회된 결과(Result Grid)에서 x번째 row Data를 가져옵니다.&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. LIMIT x,y;&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; - LIMIT x : offset, y : 표기할 데이터 갯수&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; &amp;nbsp; &amp;nbsp;100개 데이터가 조회&amp;nbsp; &amp;rarr; LIMIT 2,1; &amp;rarr; 3번째 데이터 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;LIMIT 2,2;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; 3,4번째 데이터 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LIMIT 10,5; &amp;rarr;&amp;nbsp; 11~15번째 데이터 조회&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIMIT 1;&amp;nbsp; 또는 LIMIT 0, 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;(MySQL, AWS-Aurora 에서는 적용 되는 것을 확인했습니다.)&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>JPA &amp;amp; SQL</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/49</guid>
      <comments>https://firstws.tistory.com/49#entry49comment</comments>
      <pubDate>Wed, 8 Feb 2023 09:56:36 +0900</pubDate>
    </item>
    <item>
      <title>[Java] String의 숫자 여부 판별하기(StringUtils, NumberUtils, Method)</title>
      <link>https://firstws.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서 String이 숫자인지를 판별하기 위해 여러가지 편리한 유틸이 있습니다.&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;제가 시도하다가 성공한 것과 안된 것들 모두 알아보겠습니다. (2023.02.07 - gradle 기준 작성)&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;1. NumberUtils.isCreatable&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import org.apache.commons.lang3.math.NumberUtils;&lt;br /&gt;Boolean b = NumberUtils.isCreatable(&quot;123&quot;);&lt;/blockquote&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. Plain Java&lt;/p&gt;
&lt;pre id=&quot;code_1675732697167&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private boolean isNumeric(String strNum){
	if(strNum == null){
		return false;
	}
	try{
		double d = Double.parseDouble(strNum);
	}catch (NumberFormatException nfe){
		return false;
	}
	return true;
}&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;됐었는데, 안됐습니다~&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(버전이 안맞거나 지원이 끊긴 경우로 생각됩니다.)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. NumberUtils.isNumber&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import org.apache.commons.lang3.math.NumberUtils;&lt;br /&gt;Boolean b = NumberUtils.isNumber(&quot;123&quot;);&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. StringUtils.inNumberic&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;import org.apache.commons.lang3.StringUtils;&lt;br /&gt;Boolean b = StringUtils.isNumberic(&quot;123&quot;);&amp;nbsp;&amp;nbsp;&amp;rarr; 음수 인식X&lt;/blockquote&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;NumberUtils.isCreatable 메서드를 까보면 2. Plain Java보다 복잡한 것 같아 메서드 만들어서 사용했습니다.&lt;/p&gt;</description>
      <category>Java</category>
      <category>Java String Number</category>
      <category>String 숫자 여부</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/48</guid>
      <comments>https://firstws.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 7 Feb 2023 10:21:20 +0900</pubDate>
    </item>
    <item>
      <title>[Error/JPA&amp;amp;SQL] SQLException: Data truncated for column 에러 원인과 해결방법</title>
      <link>https://firstws.tistory.com/47</link>
      <description>&lt;div&gt;&amp;nbsp;다음과 같은 에러 메세지 발생!&lt;span style=&quot;color: #0451a5;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #0451a5;&quot;&gt;could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement could not execute statement java.sql.SQLException: Data truncated for column 'XXXX' at row 1&quot;&lt;/span&gt;&lt;/div&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;에러 발생 원인&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터 크기를 벗어났을 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;데이터 타입이 다를 때&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Error</category>
      <category>Data truncated</category>
      <category>SQLException Data truncated</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/47</guid>
      <comments>https://firstws.tistory.com/47#entry47comment</comments>
      <pubDate>Wed, 1 Feb 2023 11:10:30 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] LocalDateTime 받기(클라이언트Json&amp;rarr;서버)</title>
      <link>https://firstws.tistory.com/46</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;Postman&lt;span&gt; - &lt;/span&gt;&lt;/b&gt;Json 작성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674007599882&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;sendDate&quot; : &quot;2023-01-18T11:22:33&quot;
}&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;size18&quot;&gt;&lt;b&gt;받을 DTO의 변수에 다음과 같이 셋팅하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674007830341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class TransferInfoDto {
        //@JsonDeserialize(using = LocalDateDeserializer.class)
        //@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = &quot;yyyy-MM-dd'T'hh:mm:ss&quot;, timezone = &quot;Asia/Seoul&quot;)
        @DateTimeFormat(pattern = &quot;yyyy-MM-dd'T'HH:mm:ss&quot;)
        private LocalDateTime sendDate;
    }&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;size18&quot;&gt;&lt;b&gt;@DateTimeFormat&lt;/b&gt; : Spring에서 지원하는 어노테이션으로 'LocalDate'와 'LocalDateTime'과 같은&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;날짜 관련 타입의 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;직렬화&lt;/span&gt;&lt;/b&gt;를 지원하는 어노테이션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pattern 중간에 'T'를 넣는 이유는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;띄어쓰기를 사용하면 값이 안넘어가거나 잘못넘어갈수도 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pattern에서 T를 그대로 사용할 수 없어 ' '로 감싸서 표현합니다.&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-filename=&quot;date.PNG&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSWUGF/btrWwLfzSXT/FvLo1ysvNjDIFF6zf05Cfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSWUGF/btrWwLfzSXT/FvLo1ysvNjDIFF6zf05Cfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSWUGF/btrWwLfzSXT/FvLo1ysvNjDIFF6zf05Cfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSWUGF%2FbtrWwLfzSXT%2FFvLo1ysvNjDIFF6zf05Cfk%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;472&quot; height=&quot;25&quot; data-filename=&quot;date.PNG&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;25&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;성공!!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;(Post로 보내는 Request Body(json객체))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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: #ef5369;&quot;&gt;&lt;b&gt;Response(서버&amp;rarr;클라이언트) : @JsonFormat&lt;/b&gt;&lt;/span&gt; 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Request(클라이언트&amp;rarr;서버) : @DateTimeFormat&lt;/b&gt;&lt;/span&gt; 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Post - Request Body 요청시&amp;nbsp; @DateTimeFormat과 @JsonFormat 둘다 사용이 가능하다고 하는데&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;저는 @DateTimeFormat만 되네요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝!!&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>LocalDateTime DTO로 받기</category>
      <category>LocalDateTime POST JSON</category>
      <category>LocalDateTime 받기</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/46</guid>
      <comments>https://firstws.tistory.com/46#entry46comment</comments>
      <pubDate>Wed, 18 Jan 2023 12:24:17 +0900</pubDate>
    </item>
    <item>
      <title>[Error/MyBatis] BuilderException != \&amp;quot;\&amp;quot;</title>
      <link>https://firstws.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Mybatis&amp;nbsp;mapper&amp;nbsp;작성&amp;nbsp;후&amp;nbsp;테스트하다가&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;에러가&amp;nbsp;발생했습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;org.apache.ibatis.builder.BuilderException:&amp;nbsp;Error&amp;nbsp;evaluating&amp;nbsp;expression&amp;nbsp;'registrationId&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;AND&amp;nbsp;registrationId&amp;nbsp;!=&amp;nbsp;\&quot;\&quot;'.&lt;/blockquote&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;에러가 발생한 부분&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;if test='registrationId != null AND registrationId != &quot;&quot;'&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;원인 : AND를 '&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;대문자&lt;/b&gt;&lt;/span&gt;'로 표기하여 &lt;span style=&quot;color: #ef5369;&quot;&gt;에러&lt;/span&gt; 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;size18&quot;&gt;연산자는 대문자가 아닌 '&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;소문자&lt;/b&gt;&lt;/span&gt;'로 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;변경&lt;/b&gt;&lt;/span&gt;해주셔야합니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;수정 후&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&amp;lt;if test='registrationId != null and registrationId != &quot;&quot;'&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;&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>Error</category>
      <category>org.apache.ibatis.builder.BuilderException</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/45</guid>
      <comments>https://firstws.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 16 Jan 2023 15:59:22 +0900</pubDate>
    </item>
    <item>
      <title>[Swagger] DTO에서 parameter 숨기기</title>
      <link>https://firstws.tistory.com/44</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;특정 DTO 필드 Parameter Swagger 문서상에서 Hidden 시키기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request DTO에서 Parameter 하나를 추가해 쿼리를 돌리려하는데 몇가지 고민이 생겼습니다.&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;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;2. DTO에 넣자니 swagger에 보여서 싫고, 받은 DTO를 Map이나 또 다른 DTO를 만드는 것도 싫다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (Parameter 하나만 추가되기 때문)&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. 요약 : DTO에 parameter를 추가하되 swagger에 보이고 싶지 않다!&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673838980709&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static class UserDto {
	private String name;
    
	@ApiModelProperty(hidden = true)
	private Integer age;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숨기고 싶은 parameter에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ApiModelProperty(hidden&amp;nbsp;=&amp;nbsp;true)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어노테이션과 hidden 설정을 해주시면 됩니다!!&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>swagger DTO 특정 parameter hidden</category>
      <category>swagger DTO 특정 parameter 숨기기</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/44</guid>
      <comments>https://firstws.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 16 Jan 2023 12:18:12 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Integer &amp;rarr; int 캐스팅하기(Integer to int)</title>
      <link>https://firstws.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Json에서 나타낼 수 있는 숫자의 종류는 다음과 같습니다.&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;1. 정수(integer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 실수(fraction)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 지수(exponent)&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;Json ex)&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; &amp;nbsp;&quot;age&quot; : 20&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;위와 같은 Json을 받으면 데이터타입이 'Integer' 로 'int'의 래퍼클래스입니다.&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;이 Integer를 int로 캐스팅해보겠습니다.&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;방법 1.&lt;/p&gt;
&lt;pre id=&quot;code_1673410559858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int test = (int)json.get(&quot;age&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;방법 2.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673410498846&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer temp = (Integer) json.get(&quot;age&quot;);
int age = temp.intValue();&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;참조타입에서 원시타입으로 캐스팅할 때는 '방법 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;이유를 모르겠지만, 강제 캐스팅이 안먹힐 때가 있는데 그때는 '방법2'로 사용하고 있습니다.&lt;/p&gt;</description>
      <category>Java</category>
      <category>Integer int 캐스팅</category>
      <category>Integer to int</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/42</guid>
      <comments>https://firstws.tistory.com/42#entry42comment</comments>
      <pubDate>Wed, 11 Jan 2023 13:19:01 +0900</pubDate>
    </item>
    <item>
      <title>[Mybatis] Mybatis에서 inner class 사용법.</title>
      <link>https://firstws.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DTO Class&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1672875584815&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Outer{

	public static class InnerA{
    	//...
	}
	public static class InnerB{
    	//...
	}
    //....
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 시도했던 &lt;span style=&quot;color: #ee2323;&quot;&gt;틀린&lt;/span&gt; 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;select id = &quot;test&quot; parameterType=&quot; Outer.InnerA&quot; resultType=&quot;int&quot;&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Outer&lt;span style=&quot;color: #ee2323;&quot;&gt;.&lt;/span&gt;InnerA - (X)&lt;/b&gt;&lt;/h4&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Mybatis Inner class 사용법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672875838008&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;select id=&quot;test parameterType=&quot;Outer$InnerA&quot; resultType=&quot;int&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&quot;Outer&lt;span style=&quot;color: #ee2323;&quot;&gt;$&lt;/span&gt;InnerA&quot;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>Mybatis inner class</category>
      <category>Mybatis에서 inner class 사용법</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/41</guid>
      <comments>https://firstws.tistory.com/41#entry41comment</comments>
      <pubDate>Thu, 5 Jan 2023 08:46:34 +0900</pubDate>
    </item>
    <item>
      <title>[Java] for문 vs 향상된(개선된) for문</title>
      <link>https://firstws.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 작성하다가 스크롤 바에 노란색 줄과 경고창(?)이 떠서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐가 문제인지 살펴봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672356382564&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;TestDTO&amp;gt; testdtoList = abc(5);

for(int i = 0; i &amp;lt; testdtoList.size(); i++){
    int zz = testdtoList.get(i).getNumber();
}&lt;/code&gt;&lt;/pre&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-filename=&quot;for.PNG&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7zYYA/btrUOKXtyIk/Qw8AzICxuRE2dH4nC3cy71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7zYYA/btrUOKXtyIk/Qw8AzICxuRE2dH4nC3cy71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7zYYA/btrUOKXtyIk/Qw8AzICxuRE2dH4nC3cy71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7zYYA%2FbtrUOKXtyIk%2FQw8AzICxuRE2dH4nC3cy71%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;355&quot; height=&quot;28&quot; data-filename=&quot;for.PNG&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;28&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;for1.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8QLU/btrURS8jl7G/Zx1qK0kwbdYGoEwLWkesqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8QLU/btrURS8jl7G/Zx1qK0kwbdYGoEwLWkesqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8QLU/btrURS8jl7G/Zx1qK0kwbdYGoEwLWkesqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8QLU%2FbtrURS8jl7G%2FZx1qK0kwbdYGoEwLWkesqK%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;420&quot; height=&quot;89&quot; data-filename=&quot;for1.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;89&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672356609971&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;TestDTO&amp;gt; testdtoList = abc(5);

for(TestDTO testDto : testdtoList){
    int zz = testdto.getNumber();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;경고등은 사라졌지만 의문은 사라지지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;성능이 엄청나게 차이나나??&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;-&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;No! 성능차이는 거의 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그럼 어떤 상황에서 써야할까?&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- &lt;span style=&quot;color: #ef5369;&quot;&gt;해당 리스트나 배열을 모두 읽어야할 때!&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;인덱스 값을 사용 못하기 때문에 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;전체를 읽어야하면 &lt;span style=&quot;color: #000000;&quot;&gt;향상된(개선된) for문을,&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;인덱스 값이 필요한 경우&lt;/b&gt;&lt;/span&gt;라면 일반 for문을 사용.&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그럼 전체를 읽어야하는 상황에서 왜 향상된(개선된) for문을 권장할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;- 코드 가독성이 좋다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;- 인덱스가 배열의 크기가 다를 경우 발생하는&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;arrayIndexOutofBoundsException을 방지할 수 있다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; 정리 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;로직 특성상 index에 접근할 필요가 있다면 일반for문을,&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그런 특정한 케이스가 아니라면 향상된 for문을&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용하는 쪽을 권장한다고 합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java</category>
      <category>for문 향상된for문</category>
      <category>for문 향상된for문 성능</category>
      <category>for문 향상된for문 성능차이</category>
      <category>for문 향상된for문 차이</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/40</guid>
      <comments>https://firstws.tistory.com/40#entry40comment</comments>
      <pubDate>Fri, 30 Dec 2022 09:22:31 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] 원시타입, 참조타입/Boolean boolean의 차이점 및 이슈</title>
      <link>https://firstws.tistory.com/39</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Boolean&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참조 타입 : reference type&lt;/li&gt;
&lt;li&gt;true, false, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt; 값을 가진다.&lt;/li&gt;
&lt;li&gt;주로 Null 체크를 필요로할 때 참조형을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;boolean&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시 타입 : primitive type&lt;/li&gt;
&lt;li&gt;true, false 값을 가진다.&lt;/li&gt;
&lt;li&gt;Null 체크가 불필요할 때 자료형(원시 타입)을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;참조 타입과 원시 타입의 차이&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;자료형(원시 타입) : int, float, double, boolean, ...&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;참조형 : Integer, Float, Double, Boolean, ...&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자료형을 객체로 감싼 것이 참조형이다.&amp;nbsp;&amp;rarr; Unboxing&lt;/li&gt;
&lt;li&gt;원시 타입은 null 입력 가능, 제네릭 타입에서 사용 불가.&lt;/li&gt;
&lt;li&gt;참조형은 null 입력 불가, 제네릭 타입에서 사용 가능.&lt;/li&gt;
&lt;li&gt;원시 타입은 데이터를 stack메모리에 저장.&lt;/li&gt;
&lt;li&gt;참조형은 하나의 인스턴스이기 때문에 stack메모리에는 참조값(주소값)을, 실제 값은 heap메모리에 저장.&lt;/li&gt;
&lt;li&gt;메모리&amp;nbsp;&amp;rarr; 참조 타입 &amp;gt;&amp;gt; 원시 타입&lt;/li&gt;
&lt;li&gt;속도/성능 &amp;rarr; 원시 타입 &amp;gt;&amp;gt; 참조 타입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 55%; height: 334px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;원시타입 / 참조타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;원시타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;참조타입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;boolean / Boolean&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;1 bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;128 bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;byte / Byte&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;8 bits&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;128 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;short / Short&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;16 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;128 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;char / Character&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;16 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;128 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;int / Integer&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;32 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;128 &lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;float / Float&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span&gt;32&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span&gt;128&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9f9f9;&quot;&gt;bits&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;long / Long&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;64 bits&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;196 bits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;double / Double&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;64 bits&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;196 bits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;....뭐 이정도는 대충 알고 있었으나 예상치 못한 문제가 발생했습니다.&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;Service에서 로직을 처리하고 Controller에서 DTO를 ResponseEntity로 감싸서 return하였는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;boolean isHidden.PNG&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjZtCJ/btrUN2JCIvB/AWlwtKKgki83KTmwFP4lk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjZtCJ/btrUN2JCIvB/AWlwtKKgki83KTmwFP4lk0/img.png&quot; data-alt=&quot;DTO 변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjZtCJ/btrUN2JCIvB/AWlwtKKgki83KTmwFP4lk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjZtCJ%2FbtrUN2JCIvB%2FAWlwtKKgki83KTmwFP4lk0%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;269&quot; height=&quot;57&quot; data-filename=&quot;boolean isHidden.PNG&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DTO 변수&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;boolean isHidden - result.PNG&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykXNz/btrUKYnTMhP/Ppg3vJRAH42PW0GdqQCfkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykXNz/btrUKYnTMhP/Ppg3vJRAH42PW0GdqQCfkk/img.png&quot; data-alt=&quot;return ResponseEntity.ok().body(DTO)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykXNz/btrUKYnTMhP/Ppg3vJRAH42PW0GdqQCfkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykXNz%2FbtrUKYnTMhP%2FPpg3vJRAH42PW0GdqQCfkk%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;231&quot; height=&quot;149&quot; data-filename=&quot;boolean isHidden - result.PNG&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;return ResponseEntity.ok().body(DTO)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;boolean isHidden - result22.PNG&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QodOJ/btrUNUELVo3/4tk4SyugM01NqmMX0OAtZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QodOJ/btrUNUELVo3/4tk4SyugM01NqmMX0OAtZ1/img.png&quot; data-alt=&quot;Postman으로 받은 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QodOJ/btrUNUELVo3/4tk4SyugM01NqmMX0OAtZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQodOJ%2FbtrUNUELVo3%2F4tk4SyugM01NqmMX0OAtZ1%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;224&quot; height=&quot;130&quot; data-filename=&quot;boolean isHidden - result22.PNG&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Postman으로 받은 데이터&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;........????&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;아니, 왜 변수명이 바뀌지??&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;isHidden = isHidden &amp;ne; hidden&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;(DTO 변수명 = return시 변수명 &amp;ne; Postman 변수명)&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Service 코드 디버깅타면서 따라가다가 결국 Controller return 영역까지 따라갔습니다.&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;.&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;.&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;구글링 결과,&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;객체의 속성이 'boolean' 타입에 &quot;is&quot; prefix를 사용하게 될 경우&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;getter가 &quot;isXXXX&quot;로 생성된다고 합니다.&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;위와 같은 해결법으로,&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;1. 타입을 래퍼클래스 Boolean을 사용하여 getter, setter를 생성.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;2. boolean 타입일 경우 getter 메서드 getIsXXXX()를 작성.&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;....응?&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;일단, Boolean으로 바꿔서 Test를 진행했습니다.&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Boolean isHidden(2).PNG&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxZYAQ/btrURqwbT1s/QSaA8YGlaX7g6qQMXxk4PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxZYAQ/btrURqwbT1s/QSaA8YGlaX7g6qQMXxk4PK/img.png&quot; data-alt=&quot;참조형으로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxZYAQ/btrURqwbT1s/QSaA8YGlaX7g6qQMXxk4PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxZYAQ%2FbtrURqwbT1s%2FQSaA8YGlaX7g6qQMXxk4PK%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;263&quot; height=&quot;60&quot; data-filename=&quot;Boolean isHidden(2).PNG&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;60&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Boolean isHidden - result(2).PNG&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mLnSj/btrUQbMQLnF/zmkaSEn64ZVPEmvKzm6dKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mLnSj/btrUQbMQLnF/zmkaSEn64ZVPEmvKzm6dKK/img.png&quot; data-alt=&quot;return ResponseEntity.ok().body(DTO)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mLnSj/btrUQbMQLnF/zmkaSEn64ZVPEmvKzm6dKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmLnSj%2FbtrUQbMQLnF%2FzmkaSEn64ZVPEmvKzm6dKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;292&quot; height=&quot;152&quot; data-filename=&quot;Boolean isHidden - result(2).PNG&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;return ResponseEntity.ok().body(DTO)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Boolean isHidden - result22 (2).PNG&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XbXVT/btrUKmbcTKN/QoX56t8Qd91uyeOcasjIkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XbXVT/btrUKmbcTKN/QoX56t8Qd91uyeOcasjIkK/img.png&quot; data-alt=&quot;Postman으로 받은 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XbXVT/btrUKmbcTKN/QoX56t8Qd91uyeOcasjIkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXbXVT%2FbtrUKmbcTKN%2FQoX56t8Qd91uyeOcasjIkK%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;217&quot; height=&quot;113&quot; data-filename=&quot;Boolean isHidden - result22 (2).PNG&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Postman으로 받은 데이터&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;....된다....!!!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;&lt;b&gt;끝!!&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>boolean Boolean issue</category>
      <category>boolean Boolean return</category>
      <category>boolean Boolean 이슈</category>
      <category>boolean Boolean 차이</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/39</guid>
      <comments>https://firstws.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 28 Dec 2022 18:29:31 +0900</pubDate>
    </item>
    <item>
      <title>[MyBatis/Error] org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression</title>
      <link>https://firstws.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;MyBatis SQL 작성하다가 위와 같은 에러가 발생했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672115077634&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;when test=&quot;prev_experiment_group_seq != null AND prev_experiment_group_seq != '' AND prev_experiment_group_seq &amp;gt; 0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lt;로그 창&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672115159433&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Caused by: org.apache.ibatis.ognl.ParseException: Encountered &quot; &amp;lt;IDENT&amp;gt; &quot;AND &quot;&quot; at line 1, column 35.
Was expecting one of:
    &amp;lt;EOF&amp;gt; 
    &quot;,&quot; ...
    &quot;=&quot; ...
    &quot;?&quot; ...
    &quot;||&quot; ...
    &quot;or&quot; ...
    &quot;&amp;amp;&amp;amp;&quot; ...
    &quot;and&quot; ...
    &quot;|&quot; ...
    &quot;bor&quot; ...
    &quot;^&quot; ...
    &quot;xor&quot; ...
    &quot;&amp;amp;&quot; ...
    &quot;band&quot; ...
    &quot;==&quot; ...
    &quot;eq&quot; ...
    &quot;!=&quot; ...
    &quot;neq&quot; ...
    &quot;&amp;lt;&quot; ...
    &quot;lt&quot; ...
    &quot;&amp;gt;&quot; ...
    &quot;gt&quot; ...
    &quot;&amp;lt;=&quot; ...
    &quot;lte&quot; ...
    &quot;&amp;gt;=&quot; ...
    &quot;gte&quot; ...
    &quot;in&quot; ...
    &quot;not&quot; ...
    &quot;&amp;lt;&amp;lt;&quot; ...
    &quot;shl&quot; ...
    &quot;&amp;gt;&amp;gt;&quot; ...
    &quot;shr&quot; ...
    &quot;&amp;gt;&amp;gt;&amp;gt;&quot; ...
    &quot;ushr&quot; ...
    &quot;+&quot; ...
    &quot;-&quot; ...
    &quot;*&quot; ...
    &quot;/&quot; ...
    &quot;%&quot; ...
    &quot;instanceof&quot; ...
    &quot;.&quot; ...
    &quot;(&quot; ...
    &quot;[&quot; ...
    &amp;lt;DYNAMIC_SUBSCRIPT&amp;gt; ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AND &amp;rarr; and 로 수정하니 해결되었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AND뿐만 아니라 위와 같은 양식으로 바꿔주면 대부분 해결 가능하며,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;위와 같은 경우가 아니라면,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Malformed OGNL expression은 보통 따옴표를 잘못 사용한 경우에 발생합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;꼭 다시 확인해보세요!!:)&lt;/b&gt;&lt;/p&gt;</description>
      <category>Error</category>
      <category>ExpressionSyntaxException: Malformed</category>
      <category>Malformed OGNL expression</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/38</guid>
      <comments>https://firstws.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 27 Dec 2022 13:31:26 +0900</pubDate>
    </item>
    <item>
      <title>[MyBatis] resultType 정리(feat. List&amp;lt;DTO&amp;gt;로 리턴받기)</title>
      <link>https://firstws.tistory.com/37</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. MyBatis-Mapper resultType 정리&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;table style=&quot;border-collapse: collapse; width: 74.7674%; height: 1701px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;alias(별칭)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;Data Type(데이터 타입)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;date&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;map&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;hashmap&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;HashMap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;list&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;arraylist&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ArrayList&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;decimal&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BigDecimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;bigdecimal&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BigDecimal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;biginteger&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BigInteger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_byte&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_long&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_short&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_int&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_integer&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_double&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_float&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_boolean&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_byte[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;byte[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_long[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;long[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_short[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;short[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_int[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_integer[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_double[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;double[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_float[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;floate[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;_boolean[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;boolean[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;byte&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;long&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;short&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;integer&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;double&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;float&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;byte[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Byte[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;long[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Long[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;short[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Short[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;int[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Integer[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;integer[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Integer[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;double[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Double[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;float[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Floate[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;boolean[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Boolean[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;object&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;date[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Date[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;decimal[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BigDecimal[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;bigdecimal[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BigDecimal[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;object[]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Object[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;collection&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;iterator&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Iterator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ResultSet&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ResultSet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 주의 : 원시형의 경우는 언더스코어(_)를 앞에 붙인다. 붙이지 않을 경우 래퍼(Wrapper) 클래스로 변환된다.&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;2. MyBatis에서 List&amp;lt;DTO&amp;gt; 형태로 return 받기.&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;쿼리문을 작성하다보면 List&amp;lt;DTO&amp;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;구글링과 몇번의 테스트 끝에 return받아냈습니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;resultType=&quot;hashmap&quot;&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;위와 같이 작성해주시면 됩니다~! (hashmap, hashMap 둘 다 가능!!)&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring &amp;amp; Spring Boot</category>
      <category>MyBatis resultType</category>
      <category>MyBatis resultType List DTO</category>
      <category>MyBatis resultType 정리</category>
      <author>김먼저</author>
      <guid isPermaLink="true">https://firstws.tistory.com/37</guid>
      <comments>https://firstws.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 16 Dec 2022 16:04:36 +0900</pubDate>
    </item>
  </channel>
</rss>