<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>To be Master</title>
    <link>https://tbmaster.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 06:36:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>tbMaster</managingEditor>
    <item>
      <title>[influxdb] token 확인하기</title>
      <link>https://tbmaster.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경에 문제가 생겨 influxdb를 다시 설치하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 언제나처럼 influxdb ui에 들어가서 api token 을 확인하려고 하니...&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;admin token이 생성되어 있지만, token 확인 불가능&amp;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사전 준비 사항&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- influxd 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- influx 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;token 확인 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. influx에 config 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;influx 가 설치된 경로로 진입하여, config 파일을 생성한다. config 명은 default로 할 경우, influx 실행 시, 따로 config 명을 입력하지 않아도 되며, host-url, org, 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;※ token 확인하려는데, token을 입력해야 한다. 이 경우,&amp;nbsp; influxdb ui 에서 token 하나 생성해서, 생성한 token을 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T65x4/btrSWyqUsmi/TooMidgyZepqqh2dGiIHUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T65x4/btrSWyqUsmi/TooMidgyZepqqh2dGiIHUK/img.png&quot; data-alt=&quot;[ influx config 생성 명령어&amp;amp;nbsp; (influxdb 문서 캡처 화면) ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T65x4/btrSWyqUsmi/TooMidgyZepqqh2dGiIHUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT65x4%2FbtrSWyqUsmi%2FTooMidgyZepqqh2dGiIHUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;197&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ influx config 생성 명령어&amp;nbsp; (influxdb 문서 캡처 화면) ]&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;2. influx 로 token 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;influx 가 설치된 경로로 진입하여,&amp;nbsp; &lt;b&gt;./influx auth list &lt;/b&gt;명령을 실행하면, 등록된 모든 Token 정보들이 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1670320171422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$./influx auth list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csQhR4/btrSZ3iVblN/KXNHqR6C0KOvZwKaeiSWa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csQhR4/btrSZ3iVblN/KXNHqR6C0KOvZwKaeiSWa0/img.png&quot; data-alt=&quot;[ influx auth list 명령을 실행해서 나온 결과 화면 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csQhR4/btrSZ3iVblN/KXNHqR6C0KOvZwKaeiSWa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsQhR4%2FbtrSZ3iVblN%2FKXNHqR6C0KOvZwKaeiSWa0%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;1083&quot; height=&quot;71&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ influx auth list 명령을 실행해서 나온 결과 화면 ]&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&quot;&gt;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1670320625517&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;Install and use the influx CLI | InfluxDB OSS 2.5 Documentation&quot; data-og-description=&quot;Thank you for your feedback! Let us know what we can do better:&quot; data-og-host=&quot;docs.influxdata.com&quot; data-og-source-url=&quot;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&quot; data-og-url=&quot;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.influxdata.com/influxdb/v2.5/tools/influx-cli/?t=Linux&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;Install and use the influx CLI | InfluxDB OSS 2.5 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Thank you for your feedback! Let us know what we can do better:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.influxdata.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://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670320656405&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;influx auth list | InfluxDB OSS 2.5 Documentation&quot; data-og-description=&quot;Thank you for your feedback! Let us know what we can do better:&quot; data-og-host=&quot;docs.influxdata.com&quot; data-og-source-url=&quot;https://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&quot; data-og-url=&quot;https://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.influxdata.com/influxdb/v2.5/reference/cli/influx/auth/list/&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;influx auth list | InfluxDB OSS 2.5 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Thank you for your feedback! Let us know what we can do better:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.influxdata.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>influxdb</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/160</guid>
      <comments>https://tbmaster.tistory.com/160#entry160comment</comments>
      <pubDate>Tue, 6 Dec 2022 18:58:14 +0900</pubDate>
    </item>
    <item>
      <title>[mysql] ubuntu 18.06에서 MySQL 설치 및 외부접속 허용하기</title>
      <link>https://tbmaster.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에 설치할 때마다 여기저기 찾아보기 힘들어, 이참에 블로그에 정리해보고자 한다.&amp;nbsp;&lt;/p&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: #0593d3;&quot;&gt;1. MySQL 설치하기&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;2. 외부접속 IP 허용 설정하기&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;3. 외부접속 사용자 설정하기&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;4. 테스트&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 설치하기&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;아래 명령을 통해, Ubuntu에서 mysql server 를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665462736510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install mysql-server&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;아래 명령을 통해, 정상 설치되었는지 확인한다. 하단 캡처이미지와 같이 &quot;active&quot;가 뜨면 정상 설치된 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1665462756941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo service mysql status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D4VF4/btrOig8ecix/XBVkmRl4W3VVyHuNoQJsG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D4VF4/btrOig8ecix/XBVkmRl4W3VVyHuNoQJsG1/img.png&quot; data-alt=&quot;[ service 명령어를 이용해, mysqld 동작 확인 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D4VF4/btrOig8ecix/XBVkmRl4W3VVyHuNoQJsG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD4VF4%2FbtrOig8ecix%2FXBVkmRl4W3VVyHuNoQJsG1%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;971&quot; height=&quot;221&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ service 명령어를 이용해, mysqld 동작 확인 ]&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;h2 data-ke-size=&quot;size26&quot;&gt;외부접속 IP 허용 설정하기&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;MySQL의 설정파일을 수정하여, 외부 접속이 가능하도록 변경한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 경로의 mysqld.cnf 파일을 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665463124847&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf&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;수정 내용은 bind-address 이며,&amp;nbsp; &lt;b&gt;bind-address = 127.0.0.1 -&amp;gt; 0.0.0.0&lt;/b&gt; 으로 변경하고, 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgEYYQ/btrOkTLDIpV/Xk13f0l93SKUFBkVKCfQqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgEYYQ/btrOkTLDIpV/Xk13f0l93SKUFBkVKCfQqK/img.png&quot; data-alt=&quot;[ mysqld.cnf 파일 내용 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgEYYQ/btrOkTLDIpV/Xk13f0l93SKUFBkVKCfQqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgEYYQ%2FbtrOkTLDIpV%2FXk13f0l93SKUFBkVKCfQqK%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;574&quot; height=&quot;331&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ mysqld.cnf 파일 내용 ]&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;mysqld.cnf 의 파일 변경이 끝났으면, mysql 을 재시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665463271922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo service mysql restart&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;h2 data-ke-size=&quot;size26&quot;&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;아래 명령을 통해, mysql에 접속한다. mysql 명령을 찾을 수 없다고 하면,&amp;nbsp; &quot;&lt;b&gt;/usr/bin/mysql&lt;/b&gt; -u root -p&quot; 로 접속한다.&lt;/p&gt;
&lt;pre id=&quot;code_1665463469067&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mysql -u root -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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아래 명령을 이용하면, 현재 저장된 User 정보를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1665464310526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql&amp;gt; select User, Host, authentication_string from mysql.user;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUuO26/btrOgyIj4pW/T4yeTKabJdqiWiyzUI4g31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUuO26/btrOgyIj4pW/T4yeTKabJdqiWiyzUI4g31/img.png&quot; data-alt=&quot;[ select 문을 이용해 User 정보 확인 결과 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUuO26/btrOgyIj4pW/T4yeTKabJdqiWiyzUI4g31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUuO26%2FbtrOgyIj4pW%2FT4yeTKabJdqiWiyzUI4g31%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;197&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ select 문을 이용해 User 정보 확인 결과 ]&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;- 생성하고자 하는 사용자에 localhost 및 외부 접속이 가능하도록 설정한다. (여기서는 &quot;user&quot;를 생성하고자 한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1665465088606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# localhost 설정 및 모든 권한 부여
mysql&amp;gt; create user 'user'@localhost indentified by 'password';
mysql&amp;gt; grant all privileges on *.* 'user'@localhost;

# 모든 IP 허용 설정 및 모든 권한 부여
mysql&amp;gt; create user 'user'@'%' indentified by 'password';
mysql&amp;gt; grant all privileges on *.* 'user'@'%';


# 사용자 생성 및 권한 부여 내용 적용
mysql&amp;gt; flush privileges;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DMbbX/btrOkSTFOXn/s8cvISlLeP1yyqIk0miwNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DMbbX/btrOkSTFOXn/s8cvISlLeP1yyqIk0miwNK/img.png&quot; data-alt=&quot;[ localhost, 모든 IP 허용하는 user 생성 결과 화면 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DMbbX/btrOkSTFOXn/s8cvISlLeP1yyqIk0miwNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDMbbX%2FbtrOkSTFOXn%2Fs8cvISlLeP1yyqIk0miwNK%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;520&quot; height=&quot;135&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ localhost, 모든 IP 허용하는 user 생성 결과 화면 ]&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;※ 특정 IP 대역에 대해서만 원격 접속을 허용하고 싶다면, % 대신 xxx.xxx.% 와 같이 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 192.168.0.xxx 하위에 있는 모든 IP 설정 시 -&amp;gt; 192.168.0.%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 192.168.xxx.xxx 하위에 있는 모든 IP 설정 시 -&amp;gt; 192.168.%&amp;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;h2 data-ke-size=&quot;size26&quot;&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;아래는 workbench를 이용해서, connection 테스트를 한 결과이다.&amp;nbsp; Successfully&amp;nbsp; 메시지가 뜨며, 잘 연결됨을 확인할&amp;nbsp; 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwbjx/btrOciffq9d/DSOCM8Dd9qOGAmWxlxksMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwbjx/btrOciffq9d/DSOCM8Dd9qOGAmWxlxksMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwbjx/btrOciffq9d/DSOCM8Dd9qOGAmWxlxksMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvwbjx%2FbtrOciffq9d%2FDSOCM8Dd9qOGAmWxlxksMk%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;807&quot; height=&quot;536&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;536&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;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ubuntu.com/server/docs/databases-mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ubuntu.com/server/docs/databases-mysql&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665462768642&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;Databases - Mysql | Ubuntu&quot; data-og-description=&quot;Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/server/docs/databases-mysql&quot; data-og-url=&quot;https://ubuntu.com/server/docs/databases-mysql&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ubuntu.com/server/docs/databases-mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/server/docs/databases-mysql&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;Databases - Mysql | Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.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://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665466790295&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;How to Create MySQL User and Grant Privileges: A Beginner's Guide&quot; data-og-description=&quot;In this article, you'll learn the basics of MySQL databases. We'll show you how to create a MySQL user and grant or revoke its privileges.&quot; data-og-host=&quot;www.hostinger.com&quot; data-og-source-url=&quot;https://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&quot; data-og-url=&quot;https://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d09iSI/hyP6B3xOvE/yvmNdeGpBxCrpmd4ev6QSk/img.jpg?width=730&amp;amp;height=319&amp;amp;face=0_0_730_319,https://scrap.kakaocdn.net/dn/bbZteM/hyP75on9YK/ItUl7CMKT6c5U5rrwqY0lK/img.png?width=900&amp;amp;height=560&amp;amp;face=0_0_900_560,https://scrap.kakaocdn.net/dn/c5agK4/hyP76OmWR4/HHyIGOUkhOjJNFpVTpqpM0/img.jpg?width=730&amp;amp;height=319&amp;amp;face=0_0_730_319&quot;&gt;&lt;a href=&quot;https://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.hostinger.com/tutorials/mysql/how-create-mysql-user-and-grant-permissions-command-line&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d09iSI/hyP6B3xOvE/yvmNdeGpBxCrpmd4ev6QSk/img.jpg?width=730&amp;amp;height=319&amp;amp;face=0_0_730_319,https://scrap.kakaocdn.net/dn/bbZteM/hyP75on9YK/ItUl7CMKT6c5U5rrwqY0lK/img.png?width=900&amp;amp;height=560&amp;amp;face=0_0_900_560,https://scrap.kakaocdn.net/dn/c5agK4/hyP76OmWR4/HHyIGOUkhOjJNFpVTpqpM0/img.jpg?width=730&amp;amp;height=319&amp;amp;face=0_0_730_319');&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;How to Create MySQL User and Grant Privileges: A Beginner's Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In this article, you'll learn the basics of MySQL databases. We'll show you how to create a MySQL user and grant or revoke its privileges.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.hostinger.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>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/159</guid>
      <comments>https://tbmaster.tistory.com/159#entry159comment</comments>
      <pubDate>Tue, 11 Oct 2022 14:40:19 +0900</pubDate>
    </item>
    <item>
      <title>[spring-rest-docs] adoc 파일을 pdf로 저장하는 방법</title>
      <link>https://tbmaster.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;spring-rest-docs를 적용해서 html로 API 문서를 공유하면 편하다. 하지만, 제출용으로 html 링크를 보낼 수 없는 관계로 pdf 형식으로 변경해야 했다.&amp;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-rest-docs 를 적용하여, .adoc 파일이 다 만들어졌다는 가정하에, pdf 로 문서를 만드는 방법에 대해서 소개한다.&amp;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-rest-docs 적용 링크는 아래를 참고해주세요~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[링크]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tbmaster.tistory.com/96&quot;&gt;https://tbmaster.tistory.com/96&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;adoc&amp;nbsp; 파일 -&amp;gt; pdf 변환 방법&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1664947332730&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$asciidoctor-pdf ./index.adoc -o ./publisher.pdf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 asciidoctor-pdf 를 입력하고 변환하고자 하는 파일(index.adoc), 결과파일(publisher.pdf) 를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면, 결과는 현재위치(./) 에 publisher.pdf 파일이 생성됨을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;asciidoctor-pdf&amp;nbsp; 설치 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;asciidoctor-pdf 는 Ruby로 되어 있어, ruby 를 설치해야 한다.&lt;/p&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. 아래 Ruby 사이트에서 RubyInstaller를 다운로드하여, 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rubyinstaller.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rubyinstaller.org/downloads/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664947477624&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;Downloads&quot; data-og-description=&quot;Which version to download? If you don&amp;rsquo;t know what version to install and you&amp;rsquo;re getting started with Ruby, we recommend that you use the Ruby+Devkit 3.1.X (x64) installer. It provides the biggest number of compatible gems and installs the MSYS2 Devkit &quot; data-og-host=&quot;rubyinstaller.org&quot; data-og-source-url=&quot;https://rubyinstaller.org/downloads/&quot; data-og-url=&quot;https://rubyinstaller.org/downloads/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://rubyinstaller.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rubyinstaller.org/downloads/&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;Downloads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Which version to download? If you don&amp;rsquo;t know what version to install and you&amp;rsquo;re getting started with Ruby, we recommend that you use the Ruby+Devkit 3.1.X (x64) installer. It provides the biggest number of compatible gems and installs the MSYS2 Devkit&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rubyinstaller.org&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;2. Ruby의 gem을 이용하여, asciidoctor-pdf 를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gem 명령은 설치한 Ruby 에서 bin 폴더로 이동하면, gem 파일이 있다. 해당 위치까지 이동하여 아래 명령어를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1664947669402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$gem install asciidoctor-pdf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duor53/btrNOeqt4RX/r9k5kHlErWBxiYQzpXFmXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duor53/btrNOeqt4RX/r9k5kHlErWBxiYQzpXFmXK/img.png&quot; data-alt=&quot;[ asciidoctor-pdf 설치 예시 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duor53/btrNOeqt4RX/r9k5kHlErWBxiYQzpXFmXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fduor53%2FbtrNOeqt4RX%2Fr9k5kHlErWBxiYQzpXFmXK%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;458&quot; height=&quot;31&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ asciidoctor-pdf 설치 예시 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면, 아래와 같이 &quot;asciidoctor-pdf -v&quot; 을 이용해 버전 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cclLw3/btrNNzV0XeB/TYUy7NiEPENaIwxSUkrfg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cclLw3/btrNNzV0XeB/TYUy7NiEPENaIwxSUkrfg0/img.png&quot; data-alt=&quot;[ asciidoctor-pdf&amp;amp;amp;nbsp; 버전 정보 확인 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cclLw3/btrNNzV0XeB/TYUy7NiEPENaIwxSUkrfg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcclLw3%2FbtrNNzV0XeB%2FTYUy7NiEPENaIwxSUkrfg0%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;782&quot; height=&quot;63&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ asciidoctor-pdf&amp;amp;nbsp; 버전 정보 확인 ]&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치가 완료되면, 위의 &lt;b&gt;&quot;adoc파일 -&amp;gt; pdf 변환방법&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;한글이 깨질 경우&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;adoc을 pdf로 변환 후, 한글이 네모박스로 표시되어 변환되었다. 아래와 같이 수정하여, 한글도 출력되도록 하자.&lt;/p&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. 한글 폰트를 찾아,&amp;nbsp; Ruby의 data/fonts 폴더에 넣는다. (나의 경우, Windows 에 있는 한글폰트 중 하나를 사용했다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7BLG/btrNSV3Sbku/dt5HOnuQ6VMYewqnRGMGA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7BLG/btrNSV3Sbku/dt5HOnuQ6VMYewqnRGMGA0/img.png&quot; data-alt=&quot;[ Ruby의 한글 폰트 저장 경로 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7BLG/btrNSV3Sbku/dt5HOnuQ6VMYewqnRGMGA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7BLG%2FbtrNSV3Sbku%2Fdt5HOnuQ6VMYewqnRGMGA0%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;654&quot; height=&quot;44&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Ruby의 한글 폰트 저장 경로 ]&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;2. Ruby의 themes 폴더에서 default-teme.yml에 추가한 한글 폰트로 시작하도록 값을 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NA7Xk/btrNNZAfjTT/rjSOFIlBo1WXIKMim1d0A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NA7Xk/btrNNZAfjTT/rjSOFIlBo1WXIKMim1d0A0/img.png&quot; data-alt=&quot;[ default-theme.yml 파일이 존재하는 경로 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NA7Xk/btrNNZAfjTT/rjSOFIlBo1WXIKMim1d0A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNA7Xk%2FbtrNNZAfjTT%2FrjSOFIlBo1WXIKMim1d0A0%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;662&quot; height=&quot;40&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ default-theme.yml 파일이 존재하는 경로 ]&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;default-theme.yml 파일을 열면 아래와 같은 내용이 나타나며, 한글 폰트를 아래와 같이 입력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Noto Serif&lt;/b&gt; 와 &lt;b&gt;M+ 1mn&lt;/b&gt; 부분을 같이 변경해줘야, adoc의 box 내부 한글도 잘 변환된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cltl9Z/btrNSXtP9ch/m8w84Ety2xkn6iLkZwPV71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cltl9Z/btrNSXtP9ch/m8w84Ety2xkn6iLkZwPV71/img.png&quot; data-alt=&quot;[ default 폰트 변경 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cltl9Z/btrNSXtP9ch/m8w84Ety2xkn6iLkZwPV71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcltl9Z%2FbtrNSXtP9ch%2Fm8w84Ety2xkn6iLkZwPV71%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;395&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ default 폰트 변경 ]&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;3. 이후에 다시, &lt;b&gt;&quot;adoc 파일 -&amp;gt; pdf 변환방법&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.asciidoctor.org/pdf-converter/latest/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.asciidoctor.org/pdf-converter/latest/install/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664948732415&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;Asciidoctor PDF - Install Asciidoctor PDF&quot; data-og-description=&quot;A documentation page for Asciidoctor PDF.&quot; data-og-host=&quot;docs.asciidoctor.org&quot; data-og-source-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/install/&quot; data-og-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/install/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.asciidoctor.org/pdf-converter/latest/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/install/&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;Asciidoctor PDF - Install Asciidoctor PDF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A documentation page for Asciidoctor PDF.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.asciidoctor.org&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://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664948744888&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;Asciidoctor PDF - Convert AsciiDoc to PDF&quot; data-og-description=&quot;A documentation page for Asciidoctor PDF.&quot; data-og-host=&quot;docs.asciidoctor.org&quot; data-og-source-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&quot; data-og-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.asciidoctor.org/pdf-converter/latest/convert-to-pdf/&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;Asciidoctor PDF - Convert AsciiDoc to PDF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A documentation page for Asciidoctor PDF.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.asciidoctor.org&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://wiznxt.tistory.com/857&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiznxt.tistory.com/857&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664948753204&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;Asciidoc adoc 파일 pdf 변환시 한글 폰트 해결 팁 (잔머리)&quot; data-og-description=&quot;Asciidoc을 이용해서 html pdf 내보내기 되고, 마크다운 같이 관리되고 다 좋은데 이것 참 pdf export 하면 기본적으로 한글이 네모난 칸으로 나오는 문제가 발생. 많은 해결했다는 곳들이 있지만, 나만&quot; data-og-host=&quot;wiznxt.tistory.com&quot; data-og-source-url=&quot;https://wiznxt.tistory.com/857&quot; data-og-url=&quot;https://wiznxt.tistory.com/857&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jIJbY/hyP0CosK8h/CBoa2gAHzTckymny30dPFK/img.png?width=738&amp;amp;height=555&amp;amp;face=0_0_738_555,https://scrap.kakaocdn.net/dn/LLAOi/hyP2ezvCpS/Rfsgpoh7YUyQX3dOy3CUw1/img.png?width=738&amp;amp;height=555&amp;amp;face=0_0_738_555,https://scrap.kakaocdn.net/dn/dUMPlX/hyP18MPrhR/2Qr83l58v2HrauCkzfj0zK/img.png?width=808&amp;amp;height=540&amp;amp;face=0_0_808_540&quot;&gt;&lt;a href=&quot;https://wiznxt.tistory.com/857&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wiznxt.tistory.com/857&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jIJbY/hyP0CosK8h/CBoa2gAHzTckymny30dPFK/img.png?width=738&amp;amp;height=555&amp;amp;face=0_0_738_555,https://scrap.kakaocdn.net/dn/LLAOi/hyP2ezvCpS/Rfsgpoh7YUyQX3dOy3CUw1/img.png?width=738&amp;amp;height=555&amp;amp;face=0_0_738_555,https://scrap.kakaocdn.net/dn/dUMPlX/hyP18MPrhR/2Qr83l58v2HrauCkzfj0zK/img.png?width=808&amp;amp;height=540&amp;amp;face=0_0_808_540');&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;Asciidoc adoc 파일 pdf 변환시 한글 폰트 해결 팁 (잔머리)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Asciidoc을 이용해서 html pdf 내보내기 되고, 마크다운 같이 관리되고 다 좋은데 이것 참 pdf export 하면 기본적으로 한글이 네모난 칸으로 나오는 문제가 발생. 많은 해결했다는 곳들이 있지만, 나만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wiznxt.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>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/158</guid>
      <comments>https://tbmaster.tistory.com/158#entry158comment</comments>
      <pubDate>Wed, 5 Oct 2022 14:46:30 +0900</pubDate>
    </item>
    <item>
      <title>[mongodb] image, video 저장하기</title>
      <link>https://tbmaster.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 시작하면서, 이미지, 영상을 저장해야 할 일이 생겼다. 그래서 어떠한 방법들이 있는지 조사하던 중에 MongoDB에서 image, video를 저장할 수 있다하여, 테스트를 진행해보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 저장 및 가져오기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp; ./image/image1.png&amp;nbsp; 파일을 mongoDB에 저장하는 테스트 코드이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP912h/btrNb0MKiGR/95sjPbPLq5k2whLDNkFgG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP912h/btrNb0MKiGR/95sjPbPLq5k2whLDNkFgG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP912h/btrNb0MKiGR/95sjPbPLq5k2whLDNkFgG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP912h%2FbtrNb0MKiGR%2F95sjPbPLq5k2whLDNkFgG0%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;719&quot; height=&quot;186&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: mongoDB에 저장된 이미지를 불러와 ./result/mongo/image1.png 로 저장하는 테스트 코드이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gh5C4/btrNb8DKN9J/ImIqpRaDQFn24hKoUXoI81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gh5C4/btrNb8DKN9J/ImIqpRaDQFn24hKoUXoI81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gh5C4/btrNb8DKN9J/ImIqpRaDQFn24hKoUXoI81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGh5C4%2FbtrNb8DKN9J%2FImIqpRaDQFn24hKoUXoI81%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;767&quot; height=&quot;126&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MongoDB에서 이미지와 영상은 동일한 코드로 저장되고, 불러올 수 있다. 아래는 영상에 대한 저장 및 불러오기 테스트 코드이며, 이미지와 다르지 않다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&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;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsZwSD/btrNb5f0LkS/KPiEjWVz5HKMapQdOJDLak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsZwSD/btrNb5f0LkS/KPiEjWVz5HKMapQdOJDLak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsZwSD/btrNb5f0LkS/KPiEjWVz5HKMapQdOJDLak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsZwSD%2FbtrNb5f0LkS%2FKPiEjWVz5HKMapQdOJDLak%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;764&quot; height=&quot;281&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2cct2/btrM9RbLsg8/8SMwdPIHmP1pwrlKp7etE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2cct2/btrM9RbLsg8/8SMwdPIHmP1pwrlKp7etE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2cct2/btrM9RbLsg8/8SMwdPIHmP1pwrlKp7etE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2cct2%2FbtrM9RbLsg8%2F8SMwdPIHmP1pwrlKp7etE1%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;108&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동작 코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;spring-boot 에서 제공하는 mongodb를 dependecy 하였다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-data-mongodb:2.7.4'&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;GridFSTemplate을 이용하여, GridFS을 이용할 수 있는데, 아래는 GridFSTemplate 이용을 위한 설정 코드이다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// [1]
MongoCredential mongoCredential =
        MongoCredential.createCredential([userName],[database],[password]);

// [2]
mongoClient = MongoClients.create(MongoClientSettings.builder()
        .credential(mongoCredential)
            .applyConnectionString(new ConnectionString(&quot;mongodb://[mongdb_host]:[mongodb_port]&quot;)).build());

// [3]
mongoDatabaseFactory = new SimpleMongoClientDatabaseFactory(mongoClient, db);

// [4]
mappingMongoConverter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDatabaseFactory),
        new MongoMappingContext());

// [5]
gridFsTemplate = new GridFsTemplate(mongoDatabaseFactory, mappingMongoConverter);&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;[1]&amp;nbsp; MongoCredential : MongoDB에 생성한 데이터베이스에 접근하기 위한 인증을 설정하는 클래스로,&amp;nbsp; userName, database, password를 작성해야 한다. 나의 경우, mongodb 에 데이터베이스를&amp;nbsp; 생성한 후, authetication을 부여했기 때문에 MongodCredential을 사용하여 접근 가능하도록 하였다.&lt;/p&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] MongoClient : MongoDB에 접근하기 위한 Client를 생성하는 클래스로,&amp;nbsp; MongoClientSettings를 이용해 MongoClient에 필요한 각종 설정을 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 참고: MongoCredential 등 부가적인 설정을 할 필요가 없다면, [3]의 MongoDatabaseFactory에서 내부적으로 MongoClient를 생성해주기 때문에 따로 정의할 필요없다.&lt;/p&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],[4] MongoDatabaseFactory, MappingMongoConverter : GridFsTemplate 에 파라미터로 필요하여 생성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ MappingMongoConverter는 아직 잘 모르겠다....ㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[5] GridFsTemplate : 이미지, 영상등의 binary 데이터를 조작하기 위해, spring boot에서 제공하는 Template 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;저장하는 데이터에 대한 메타 정보를 저장할 수 있으며, MetaData를 통해 가능하다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public void saveObject(@NotNull byte[] bytes, @NotNull String filename, String contentType) {
    DBObject metaData = new BasicDBObject();
    //metaData.put(&quot;name&quot;, name);
    gridFsTemplate.store(new ByteArrayInputStream(bytes), filename, contentType, metaData);
}&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;/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;저장된 바이너리 데이터를 가져오고 싶을 경우, getResource 메서드를 이용해서 가져온다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;   public Object findObject(String filename) {
        InputStream inputStream = gridFsTemplate.getResource(filename).getContent();
        return inputStream;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;GridFS&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GridFS는 바이너리로 데이터를 조작할 수 있게 한다. 단, 일정크기 이상으로 데이터가 크면, chunk 단위로 잘라 여러 여러 document에 저장한다.&amp;nbsp; chunk 당 document 하나이다. chunk는 기본적으로 255kB로 설정되어 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GridFS 를 쓰게 되면 2개의 Collection이 생성되어 데이터가 저장되는데, &quot;fs.chunks&quot;, &quot;fs.files&quot; collection이 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fs.chunks 는 실제 binary 데이터가 저장되는 collection 이며, fs.files 는 binary 데이터에 대한 metadata가 저장되는 collection이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;fs.files 에 저장된 데이터&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1E39/btrNb9CEBDE/IkD1YqHieeSbaCFWOKxOT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1E39/btrNb9CEBDE/IkD1YqHieeSbaCFWOKxOT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1E39/btrNb9CEBDE/IkD1YqHieeSbaCFWOKxOT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1E39%2FbtrNb9CEBDE%2FIkD1YqHieeSbaCFWOKxOT1%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;575&quot; height=&quot;174&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;174&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;size18&quot;&gt;&lt;b&gt;fs.chunks 에 저장된 데이터&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UPN8S/btrNbZUBbhc/GREkh2vrz97HdkBaMn5d10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UPN8S/btrNbZUBbhc/GREkh2vrz97HdkBaMn5d10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UPN8S/btrNbZUBbhc/GREkh2vrz97HdkBaMn5d10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUPN8S%2FbtrNbZUBbhc%2FGREkh2vrz97HdkBaMn5d10%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;780&quot; height=&quot;384&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;384&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고자료&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.baeldung.com/spring-data-mongodb-gridfs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.baeldung.com/spring-data-mongodb-gridfs&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664272126316&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;GridFS in Spring Data MongoDB | Baeldung&quot; data-og-description=&quot;A quick guide to interacting with GridFS using Spring Data MongoDB.&quot; data-og-host=&quot;www.baeldung.com&quot; data-og-source-url=&quot;https://www.baeldung.com/spring-data-mongodb-gridfs&quot; data-og-url=&quot;https://www.baeldung.com/spring-data-mongodb-gridfs&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PETLi/hyPVffI4NO/Jg9ulH3p0gUqsmkJU5h7D0/img.png?width=208&amp;amp;height=208&amp;amp;face=0_0_208_208,https://scrap.kakaocdn.net/dn/cWfM4v/hyPWCG6u93/ufQ82OJKJGuK7f8QdnU5a1/img.png?width=208&amp;amp;height=208&amp;amp;face=0_0_208_208&quot;&gt;&lt;a href=&quot;https://www.baeldung.com/spring-data-mongodb-gridfs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.baeldung.com/spring-data-mongodb-gridfs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PETLi/hyPVffI4NO/Jg9ulH3p0gUqsmkJU5h7D0/img.png?width=208&amp;amp;height=208&amp;amp;face=0_0_208_208,https://scrap.kakaocdn.net/dn/cWfM4v/hyPWCG6u93/ufQ82OJKJGuK7f8QdnU5a1/img.png?width=208&amp;amp;height=208&amp;amp;face=0_0_208_208');&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;GridFS in Spring Data MongoDB | Baeldung&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A quick guide to interacting with GridFS using Spring Data MongoDB.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.baeldung.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://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664272132242&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;GridFsTemplate (Spring Data MongoDB 3.4.3 API)&quot; data-og-description=&quot;org.bson.types.ObjectId store(InputStream&amp;nbsp;content, String&amp;nbsp;filename, String&amp;nbsp;contentType, Object&amp;nbsp;metadata) Stores the given content into a file with the given name and content type using the given metadata.&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&quot; data-og-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GridFsTemplate (Spring Data MongoDB 3.4.3 API)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;org.bson.types.ObjectId store(InputStream&amp;nbsp;content, String&amp;nbsp;filename, String&amp;nbsp;contentType, Object&amp;nbsp;metadata) Stores the given content into a file with the given name and content type using the given metadata.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&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://www.mongodb.com/docs/manual/core/gridfs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mongodb.com/docs/manual/core/gridfs/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664272138979&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;GridFS &amp;mdash; MongoDB Manual&quot; data-og-description=&quot;Docs Home &amp;rarr; MongoDB Manual GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.Instead of storing a file in a single document, GridFS divides the file into parts, or chunks , and stores each chunk &quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/docs/manual/core/gridfs/&quot; data-og-url=&quot;https://www.mongodb.com/docs/manual/core/gridfs/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAbnk0/hyPVfUir2Y/9KomwJEzNRiXBs7Kfvta51/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/3g06D/hyPVr8gWlv/cbfFK0UlKNnOvlr2zkR0DK/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/docs/manual/core/gridfs/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/docs/manual/core/gridfs/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAbnk0/hyPVfUir2Y/9KomwJEzNRiXBs7Kfvta51/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/3g06D/hyPVr8gWlv/cbfFK0UlKNnOvlr2zkR0DK/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&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;GridFS &amp;mdash; MongoDB Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docs Home &amp;rarr; MongoDB Manual GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.Instead of storing a file in a single document, GridFS divides the file into parts, or chunks , and stores each chunk&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.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://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664272153660&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;Spring Data MongoDB - Reference Documentation&quot; data-og-description=&quot;abs, acos, acosh, add (* via plus), asin, asin, atan, atan2, atanh, ceil, cos, cosh, derivative, divide, exp, floor, integral, ln, log, log10, mod, multiply, pow, round, sqrt, subtract (* via minus), sin, sinh, tan, tanh, trunc&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&quot; data-og-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NEWH6/hyPWAbrQYf/W7Px7Cfu8eqjWKPCcX8uv0/img.png?width=900&amp;amp;height=529&amp;amp;face=0_0_900_529&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NEWH6/hyPWAbrQYf/W7Px7Cfu8eqjWKPCcX8uv0/img.png?width=900&amp;amp;height=529&amp;amp;face=0_0_900_529');&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 Data MongoDB - Reference Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;abs, acos, acosh, add (* via plus), asin, asin, atan, atan2, atanh, ceil, cos, cosh, derivative, divide, exp, floor, integral, ln, log, log10, mod, multiply, pow, round, sqrt, subtract (* via minus), sin, sinh, tan, tanh, trunc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/157</guid>
      <comments>https://tbmaster.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 27 Sep 2022 18:53:45 +0900</pubDate>
    </item>
    <item>
      <title>[influxdb] influxdb-client-java 라이브러리 연동(+ 문제 해결)</title>
      <link>https://tbmaster.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;spring boot 프로젝트에 influxdb 를 연동해야 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring boot 프로젝트는 java 언어로 작성되어 있었으며, build 툴은 gradle 이었다.&amp;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 boot 프로젝트에 influxdb-client-java, flux-dsl 라이브러리가 설치되어 있었고, 큰 문제 없이 사용하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그런데 기능을 추가하면서 필요한 기능이 생겼고, 해당 기능을 사용하려니, flux-dsl 의 버전이 낮아 기능을 제공하지 않았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 기존 4.xx -&amp;gt; 6.5.0 으로 변경했다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;    implementation 'com.influxdb:influxdb-client-java:6.5.0'
// https://mvnrepository.com/artifact/com.influxdb/flux-dsl
   implementation &quot;com.influxdb:flux-dsl:6.5.0&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 발생&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;span style=&quot;color: #ee2323;&quot;&gt;java.lang.NoClassDefFoundError:&amp;nbsp;kotlin/jvm/internal/Intrinsics&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;854&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYHN5Q/btrL83QSOxQ/3Ibzxi6OFdLkw2ujD6qjG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYHN5Q/btrL83QSOxQ/3Ibzxi6OFdLkw2ujD6qjG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYHN5Q/btrL83QSOxQ/3Ibzxi6OFdLkw2ujD6qjG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYHN5Q%2FbtrL83QSOxQ%2F3Ibzxi6OFdLkw2ujD6qjG1%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;266&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;266&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;h3 data-ke-size=&quot;size23&quot;&gt;문제 원인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 에러는 influxdb-client-java 라이브러리에서 제공하는 InfluxDBClientFactory.create 를 이용해,InfluxDBClient 를 생성할 때 발생하였다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;{
    ...
    InfluxDBClient client = InfluxDBClientFactory.create(url, token, org, bucket);
    ...
}&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;정확한 문제를 찾기 위해, InfluxDBClientFactory.create&amp;nbsp; 메서드를 타고 들어갔고, 원인을 알 수 있었다.&amp;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;InfluxDBClientFactory를 이용해 InfluxDBClient 생성할 경우,InfluxDBClientOptions를 생성하게 되는데, InfluxDBClientOptions에서 okhttp3 라이브러리를 이용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 라이브러리에서 사용하는 클래스들 중에는 Kotlin으로&amp;nbsp; 작성된 클래스도 있는데, Influxdb 라이브러리가 결과적으로 kotlin 클래스를 사용하게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 현재 프로젝트가 kotlin 클래스를 빌드할 수 없기 때문에 위와 같은 에러가 발생한 것이다.&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 data-ke-size=&quot;size23&quot;&gt;해결방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kotlin 클래스도 빌드할 수 있게 만들어 주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이, &quot;kotlin-stdlib&quot; 를 dependency에 추가해주면 정상적으로 동작된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSYrn/btrL8ywT4CK/v9p6s9HbEsf2MsgKak7bkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSYrn/btrL8ywT4CK/v9p6s9HbEsf2MsgKak7bkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSYrn/btrL8ywT4CK/v9p6s9HbEsf2MsgKak7bkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSYrn%2FbtrL8ywT4CK%2Fv9p6s9HbEsf2MsgKak7bkK%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;683&quot; height=&quot;66&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;66&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 에러 발생 후, 에러 원인과 해결방법까지 찾는데 많은 시간이 소요됐지만, 의외로 해결방법은 간단했다...ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 꼼꼼히 본다고 했는데, 왜 인지하지 못했는지.... 이 기회를 발판 삼아 로그를 더 잘 봐야겠다는 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;influxdb 라이브러리 관련 docs&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/influxdata/influxdb-client-java/tree/master/client&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663145058308&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 - influxdata/influxdb-client-java: InfluxDB 2 JVM Based Clients&quot; data-og-description=&quot;InfluxDB 2 JVM Based Clients. Contribute to influxdata/influxdb-client-java development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/client&quot; data-og-url=&quot;https://github.com/influxdata/influxdb-client-java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhtVq9/hyPMXS0oZb/2d0mXXpTzVWHMvAoVBzqJ0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/client&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhtVq9/hyPMXS0oZb/2d0mXXpTzVWHMvAoVBzqJ0/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;GitHub - influxdata/influxdb-client-java: InfluxDB 2 JVM Based Clients&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;InfluxDB 2 JVM Based Clients. Contribute to influxdata/influxdb-client-java development by creating an account on GitHub.&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/influxdata/influxdb-client-java/tree/master/flux-dsl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/influxdata/influxdb-client-java/tree/master/flux-dsl&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663145061662&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 - influxdata/influxdb-client-java: InfluxDB 2 JVM Based Clients&quot; data-og-description=&quot;InfluxDB 2 JVM Based Clients. Contribute to influxdata/influxdb-client-java development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/flux-dsl&quot; data-og-url=&quot;https://github.com/influxdata/influxdb-client-java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/S7zOa/hyPMP1Kvz8/jEA5IwJesJYQYMlOdqcKv1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/flux-dsl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/influxdata/influxdb-client-java/tree/master/flux-dsl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/S7zOa/hyPMP1Kvz8/jEA5IwJesJYQYMlOdqcKv1/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;GitHub - influxdata/influxdb-client-java: InfluxDB 2 JVM Based Clients&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;InfluxDB 2 JVM Based Clients. Contribute to influxdata/influxdb-client-java development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>influxdb</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/156</guid>
      <comments>https://tbmaster.tistory.com/156#entry156comment</comments>
      <pubDate>Wed, 14 Sep 2022 17:44:48 +0900</pubDate>
    </item>
    <item>
      <title>[ Annotation ] Custom Annotation 만들기</title>
      <link>https://tbmaster.tistory.com/155</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;커스텀 애너테이션을 만들게 된 이유&amp;nbsp;&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;개발을 하다가 RestController 에서&amp;nbsp; 하나의 메서드에 서로 다른 RequestBody를 받고 싶었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;상황)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 서비스에 대한 동작을 제어하는 메서드 였으며, 동작제어 (시작, 종료) 에 따라, RequestBody에 포함하는 속성이 조금 달랐다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1안)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작제어 별로 메서드 따로 둠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;=&amp;gt;&lt;/b&gt; 고민을 하긴 했는데, 동일한 대상에 속성 값만 달라지는데, 메서드를 따로 둘만큼 기능 상에 큰 차이가 있다고 생각하지 않았기 때문에 일단 패스하였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2안)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 파라미터에 @RequestBody 로 바로 타입 변환하지 않고, HttpRequestServlet을 이용하여, 동작제어에 맞는 타입으로 직접 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;=&amp;gt;&lt;/b&gt; 원래 하고자 했던 기능을 구현할 수 있다. 하나의 메서드에 서로 다른 동작에 따라 다른 RequestBody를 받을 수 있다. 그래서 이 방법을 채택하여 진행하였다.&amp;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;pre id=&quot;code_1658995795016&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @PatchMapping(&quot;[경로]&quot;)
    public Response&amp;lt;Void&amp;gt; exec( ....,
                                            HttpServletRequest request){
        
        //HttpServletRequest 에서 body 추출
        StringBuilder sb = new StringBuilder();
        try(BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()))){
            String tmp = &quot;&quot;;
            while( (tmp = br.readLine())!= null){
                sb.append(tmp);
            }
        }catch(IOException e){
            throw new InvalidRequestException(ErrorCode.INVALID_REQUEST, ErrorCode.INVALID_REQUEST.getMessage());
        }
        
        //추출한 body를 JsonObject로 변환
        Gson gson = new Gson();
        JsonObject jsonObject = gson.fromJson(sb.toString(), JsonObject.class);
        
        //동작제어에 따른 서로 다른 객체로 타입 변환
        String requestStatus = jsonObject.get(&quot;status&quot;).getAsString();
        if(&quot;START&quot;.equals(requestStatus)){
            StartRequest startRequest = new StartRequest(Status.START, jsonObject.get(&quot;id&quot;).getAsLong());
            ...
        }else if(&quot;STOP&quot;.equals(requestStatus)){
            StopRequest stopRequest = new StopRequest(Status.STOP);
            ...
        }else{
            throw new InvalidRequestException(ErrorCode.INVALID_REQUEST, ErrorCode.INVALID_REQUEST.getMessage());
        }

		...
       
    }&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;1. HttpServletRequest 에서 body를 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 동작을 판별에 따른 객체 타입을 다르게 하기 위한, 동작 확인을 위해 JsonObject로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 원래 하고자 했던 동작에 따른 기능 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이를 @RequestBody가 타입 변환해주는 것처럼, 동작에 맞는 타입변환 애너테이션을 만들면 간단하게 원래 기능을 수행할 수 있을 것이라고 생각했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커스텀 애너테이션을 이용하여, @RequestBody 처럼 request의 body를 객체로 변환하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. @interface 선언&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 구현체 만들기&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 등록하기&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 사용하기&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 data-ke-size=&quot;size23&quot;&gt;1. @Interface 선언&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하단은 ExecRequestBody 명의 애너테이션을 선언한 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1658996756888&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ExecRequestBody {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 구현체 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 하단의 코드에서 StartRequest와 StopRequest를 ExecRequest를 상속받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1658997068229&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class ExecRequestBodyArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(ExecRequestBody.class) != null;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        
        //HttpServletRequest에서 body 추출 
        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        StringBuffer sb = new StringBuffer();
        try(BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()))){
            String tmp = &quot;&quot;;
            while( (tmp = br.readLine()) != null){
                sb.append(tmp);
            }
        }catch(IOException e){
            return null;
        }
        return convertToObject(sb.toString());
    }

	//Request Body를 동작에 따른 객체로 변환
    private ExecRequest convertToObject(String str){
        Gson gson = new Gson();
        JsonObject jsonObject = gson.fromJson(str, JsonObject.class);
        if(jsonObject.get(&quot;status&quot;) != null
                &amp;amp;&amp;amp; jsonObject.get(&quot;status&quot;).getAsString().equals(&quot;START&quot;)
                &amp;amp;&amp;amp; jsonObject.get(&quot;id&quot;) != null){
                
           ....
          
            return new StartRequest(Status.START, id);
        }else if(jsonObject.get(&quot;status&quot;) != null
        &amp;amp;&amp;amp; jsonObject.get(&quot;status&quot;).getAsString().equals(&quot;STOP&quot;)){
        
        ...
        
            return new StopTrainingRequest(Status.ModelTraining.TERMINATED);
        }
        throw new InvalidRequestException(ErrorCode.INVALID_REQUEST, ErrorCode.INVALID_REQUEST.getMessage());
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 등록하기&amp;nbsp;&lt;/h3&gt;
&lt;pre id=&quot;code_1658997216286&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final ExecRequestBodyArgumentResolver execRequestBodyArgumentResolver;
    
    @Override
    public void addArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; resolvers) {
        resolvers.add(execRequestBodyArgumentResolver);
        WebMvcConfigurer.super.addArgumentResolvers(resolvers);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 파라미터로 앞서 구현한 커스텀 애너테이션인 &lt;b&gt;@ExecRequestBody&lt;/b&gt;를 붙여주어 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1658997335995&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   @PatchMapping(&quot;[경로]&quot;)
    public Response&amp;lt;Void&amp;gt; exec( ...,
                               @ExecRequestBody ExecRequest request) {

        if (request instanceof StartRequest) {
        
            //Start일 때의 로직
            
        } else if (request instanceof StopRequest) {
            
            //Stop일 때의 로직
            
        }
        ...
    }&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;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://growing-up-constantly.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://growing-up-constantly.tistory.com/53&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658997652364&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] RequestParam값 객체로 매핑하기, Custom Annotation 만들기&quot; data-og-description=&quot;스프링 Controller에서 Request값을&amp;nbsp;도메인객체를 사용해서 받을 때는 Json으로 넘어오는 경우에는 requestBody로 받으면 손쉽게 해결할 수 있었다. 위의 상황을 코드로 이야기하자면 다음과 같다. @Reques&quot; data-og-host=&quot;growing-up-constantly.tistory.com&quot; data-og-source-url=&quot;https://growing-up-constantly.tistory.com/53&quot; data-og-url=&quot;https://growing-up-constantly.tistory.com/53&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPRANJ/hyPeHwwuz1/jovvApa6cpCKS8eOZ3FMfK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/uJ5FB/hyPeLFGyEp/kPOhiiVwb879iVtKCloaE1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/nVsXK/hyPeTX1vug/FUiQYw4m1yrwvtDjCrtR31/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://growing-up-constantly.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://growing-up-constantly.tistory.com/53&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPRANJ/hyPeHwwuz1/jovvApa6cpCKS8eOZ3FMfK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/uJ5FB/hyPeLFGyEp/kPOhiiVwb879iVtKCloaE1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/nVsXK/hyPeTX1vug/FUiQYw4m1yrwvtDjCrtR31/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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] RequestParam값 객체로 매핑하기, Custom Annotation 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 Controller에서 Request값을&amp;nbsp;도메인객체를 사용해서 받을 때는 Json으로 넘어오는 경우에는 requestBody로 받으면 손쉽게 해결할 수 있었다. 위의 상황을 코드로 이야기하자면 다음과 같다. @Reques&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;growing-up-constantly.tistory.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://shinsunyoung.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://shinsunyoung.tistory.com/83&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1658997687480&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Spring Boot Custom Annotation 만들기&quot; data-og-description=&quot;안녕하세요! 이번 포스팅에서는 Spring Boot에서 Custom Annotation을 만드는 방법에 대해 알아보겠습니다. 전체 코드는 Github에서 확인이 가능합니다. ✍️   개념 정리 1. 커스텀 어노테이션이란? 프&quot; data-og-host=&quot;shinsunyoung.tistory.com&quot; data-og-source-url=&quot;https://shinsunyoung.tistory.com/83&quot; data-og-url=&quot;https://shinsunyoung.tistory.com/83&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lkJH4/hyPeE0SR56/R9g7Ijyk07E5Axfl2UmNqk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/b9snAk/hyPeIhRZqP/AdzPaKgx5qvURFtvqFxMg0/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/cUxBJp/hyPeVhenEw/LsxVAEjk6NLEOVKnLuXUhK/img.jpg?width=1280&amp;amp;height=362&amp;amp;face=0_0_1280_362&quot;&gt;&lt;a href=&quot;https://shinsunyoung.tistory.com/83&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://shinsunyoung.tistory.com/83&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lkJH4/hyPeE0SR56/R9g7Ijyk07E5Axfl2UmNqk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/b9snAk/hyPeIhRZqP/AdzPaKgx5qvURFtvqFxMg0/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/cUxBJp/hyPeVhenEw/LsxVAEjk6NLEOVKnLuXUhK/img.jpg?width=1280&amp;amp;height=362&amp;amp;face=0_0_1280_362');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot Custom Annotation 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! 이번 포스팅에서는 Spring Boot에서 Custom Annotation을 만드는 방법에 대해 알아보겠습니다. 전체 코드는 Github에서 확인이 가능합니다. ✍️   개념 정리 1. 커스텀 어노테이션이란? 프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;shinsunyoung.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글에서 확인한 것처럼 커스텀 애너테이션을 사용했을 때 더욱 명확하게 기능을 파악할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 커스텀 애너테이션 사용은 코드 분석에 어려움을 주기 때문에, 반드시 필요한 경우가 아니라면, 남용해서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/155</guid>
      <comments>https://tbmaster.tistory.com/155#entry155comment</comments>
      <pubDate>Thu, 28 Jul 2022 17:44:50 +0900</pubDate>
    </item>
    <item>
      <title>[ spring-rest-docs ] prettyPrint()를 setUp 메서드에 적용하기</title>
      <link>https://tbmaster.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는 Rest API를 Spring Rest Docs을 이용하여, 문서를 생성한다. 그리고 request 및 response 가 보기 쉽게 정렬되서 나오는 prettyPrint를 각 메서드에 적용하여 사용하였다.&amp;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;그러다 최근에 각 메서드 마다 적용하는 prettyPrint를 setUp에 사용 방법 그대로 적용하였더니, 동작되지 않았고, 디버깅한 결과 mockMvc에 configuration에 적용되지 않음을 알게되었다.&amp;nbsp; 그래서 하는 방식을 정리해 둔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작되는 코드(Test 메서드)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zUT8V/btrG6XNZKAh/IkY6nNmB7dL1zR3thAp5Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zUT8V/btrG6XNZKAh/IkY6nNmB7dL1zR3thAp5Kk/img.png&quot; data-alt=&quot;[ 테스트 메서드마다 andDo에 작성했던 방식 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zUT8V/btrG6XNZKAh/IkY6nNmB7dL1zR3thAp5Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzUT8V%2FbtrG6XNZKAh%2FIkY6nNmB7dL1zR3thAp5Kk%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;533&quot; height=&quot;77&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 테스트 메서드마다 andDo에 작성했던 방식 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 안되는 코드(setUp&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RoRKt/btrG24A2ORZ/xh46SuqqKgUftRpd757LNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RoRKt/btrG24A2ORZ/xh46SuqqKgUftRpd757LNk/img.png&quot; data-alt=&quot;[ setUp 메서드에 prettyPrint 적용한 코드 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RoRKt/btrG24A2ORZ/xh46SuqqKgUftRpd757LNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRoRKt%2FbtrG24A2ORZ%2Fxh46SuqqKgUftRpd757LNk%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;752&quot; height=&quot;272&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ setUp 메서드에 prettyPrint 적용한 코드 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작되는 코드(setUp&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwOdkN/btrG3p52hNg/D9TSZibQhtx5gZtIK6hVPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwOdkN/btrG3p52hNg/D9TSZibQhtx5gZtIK6hVPk/img.png&quot; data-alt=&quot;[ setUp 메서드에 prettyPrint 적용한 콛, ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwOdkN/btrG3p52hNg/D9TSZibQhtx5gZtIK6hVPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwOdkN%2FbtrG3p52hNg%2FD9TSZibQhtx5gZtIK6hVPk%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;730&quot; height=&quot;253&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ setUp 메서드에 prettyPrint 적용한 콛, ]&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;withRequestDefaults, withResponsedefaults&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;request preprocessor, response preprocessor의 기본 설정값을 제공하는 메서드다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXFYm/btrG3JXtyjs/S1UlVtLys54kSfweett6k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXFYm/btrG3JXtyjs/S1UlVtLys54kSfweett6k0/img.png&quot; data-alt=&quot;[ OperationPreprocessorsConfigurer.java ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXFYm/btrG3JXtyjs/S1UlVtLys54kSfweett6k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXFYm%2FbtrG3JXtyjs%2FS1UlVtLys54kSfweett6k0%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;789&quot; height=&quot;430&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ OperationPreprocessorsConfigurer.java ]&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>Spring</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/154</guid>
      <comments>https://tbmaster.tistory.com/154#entry154comment</comments>
      <pubDate>Tue, 12 Jul 2022 10:03:41 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리)</title>
      <link>https://tbmaster.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA로 command 명령어를 작성할 수 있다. ProcessBuilder 를 이용하면 되는데, 나는 처음에 ProcessBuilder를 이용하여 scp를 실행하려고 하였다.&amp;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;그런데, ProcessBuilder 를 이용해 scp를 사용하려면, password 입력을 처리가 어려워지는 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다른 방법을 찾아보던 중,&amp;nbsp; jSch 라이브러리를 이용하여, scp를 실행시킬 수 있음을 알았다.&amp;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;h2 data-ke-size=&quot;size26&quot;&gt;외부 라이브러리 추가&lt;/h2&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!-- scp --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.jcraft&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jsch&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.1.55&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;scp 파일 전송 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1657022589120&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;       JSch jSch = new JSch();
        Session session;

        try {
            session = jSch.getSession(accountUserName, scpAddr);
            session.setPassword(accountPassword);
            session.setPort(scpPort);

            Properties config = new Properties();
            config.put(&quot;StrictHostKeyChecking&quot;, &quot;no&quot;);
            session.setConfig(config);

            session.connect();
            Channel channel = session.openChannel(&quot;sftp&quot;);
            ChannelSftp channelSftp = (ChannelSftp) channel;
            channelSftp.connect();

            channelSftp.put(srcPath + &quot;/&quot; + filename, dstPath + &quot;/&quot; + filename);

            channelSftp.quit();
            channel.disconnect();
            session.disconnect();

        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        }&lt;/code&gt;&lt;/pre&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;1. 일단 전송하려는 서버의 Host Name 과 Host IP를 입력해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 내 host pc 명이 KIM 이고 IP가 127.0.0.1 이라면,&amp;nbsp; jSch.getSession(&quot;KIM&quot;, &quot;127.0.0.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;2. 그리고 전송하는 서버가 password가 걸려있다면, session.setPassword를 이용하여, 비밀번호를 입력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 이것때문에, jSch 라이브러리를 사용하게 된 것이다.&amp;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. 그리고 Host 서버에서 ssh 로 default로 22 번이 아닌 다른 포트를 이용하고 있다면, session.setPort를 이용하여, ssh 포트를 입력하면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후로는 위 코드대로 sftp 채널을 열어서 파일을 보내주고 닫으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgr5v5/btrGzveqrEC/qX5L9Ded9FUKZqvwm3vdTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgr5v5/btrGzveqrEC/qX5L9Ded9FUKZqvwm3vdTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgr5v5/btrGzveqrEC/qX5L9Ded9FUKZqvwm3vdTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgr5v5%2FbtrGzveqrEC%2FqX5L9Ded9FUKZqvwm3vdTk%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;1316&quot; height=&quot;667&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;667&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;h2 data-ke-size=&quot;size26&quot;&gt;jSch 라이브러리 쓰면서 주의해야 할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jSch 라이브러리가 password 에 대한 고민을 해결해주는 좋은 친구였지만, 나를 애먹게 하기도 했다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Host에 파일을 전송할 경로를 지정하는 부분이었는데, 나는 scp 를 이용하면, 전체 경로를 작성한다. 예를 들어 C:/Users/KIM/Desktop/data 이런 식으로 작성을 하는데, 이 부분에서 문제가 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jSch 는 C:/Users/KIM 까지 알아서, Host의 default 경로를 가져와서, 내가 입력한 Host의 경로에 붙이는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 내가 &lt;span&gt;C:/Users/KIM/Desktop/data&lt;span&gt; 입력했다면, jSch는 자동으로 &lt;span&gt;C:/Users/KIM/&lt;span&gt;C:/Users/KIM/Desktop/data&lt;span&gt; 이렇게 만들어준다는 뜻이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;따라서, Host에 파일을 전송할 경로에는 C:/Users/KIM 을 제외한 나머지 경로를 넣어줘야 제대로 된 경로가 만들어지며, 파일을 원하는 위치에 잘 전송할 수 있다.&lt;/span&gt;&lt;/span&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;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;또한, 참고로 더 얘기하면, 전체 경로가 존재해야만 파일을 전송할 수 있다.&lt;/span&gt;&lt;/span&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;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;....&lt;/span&gt;&lt;/span&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;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;22.7.7&lt;/b&gt; 절대경로에 대한 내용을 추가하자면, jSch 의 경우 경로의 첫 문자가 '/'로 시작하면, 절대경로라고 본다. 그러나, 이 부분이&amp;nbsp; 리눅스에서는 /home/~... 된다지만, 윈도우에서는 C:/로 시작한다... 윈도우에서는 jSch에서 얘기하는 절대경로 규칙을 따를수가 없다...( 있다면 댓글에 남겨주시면 ...) 암튼 그래서 엄청 해맸다. 나처럼 jSch를 사용하는데 윈도우를 쓰는 사람이라면, 이 내용이 도움이 되길!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/153</guid>
      <comments>https://tbmaster.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 5 Jul 2022 21:13:26 +0900</pubDate>
    </item>
    <item>
      <title>[ Docker ] Docker 외부 포트 설정 (직접 명령어 &amp;amp; REST API 적용)</title>
      <link>https://tbmaster.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 참 험난한 하루였다... 내가 Docker에 올린 프로그램은 scp로 파일을 외부로 전송하는 것이다. 그런데, UnKnownHostException, connection refused, ssh 문제 등 수 많은 다양한 에러들을 확인하고 드디어! 해결했다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.2.를 하기 전 공통사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Dockerfile에 Host와 연결할 포트를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 캡쳐화면은 22번을 Host 와 연결할 포트로 지정한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;ex) &lt;span style=&quot;color: #ee2323;&quot;&gt;EXPOSE 22&lt;/span&gt;&lt;/b&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;392&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLBL9S/btrGAqXWbIg/XM0av9JLr3HpNo0bab3aG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLBL9S/btrGAqXWbIg/XM0av9JLr3HpNo0bab3aG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLBL9S/btrGAqXWbIg/XM0av9JLr3HpNo0bab3aG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLBL9S%2FbtrGAqXWbIg%2FXM0av9JLr3HpNo0bab3aG1%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;392&quot; height=&quot;185&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;185&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;- Dockerfile을 이용하여, Docker Image를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1657020782248&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$docker build --tag [docker image 명(소문자여야 함)]:[Version 번호] [Dockerfile 경로]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ex) &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;$docker build --tag dockerimage:1.0 .&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ docker image 소문자로 안적어서 몇 번 틀렸었음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. docker run 명령어로 외부 포트 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- docker run 을 이용하여, image에 대한 Docker Container 의 create 및 start를 동시에 실행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1657021004910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$docker run -P [host 포트]:[container 포트] [그 외 옵션] [docker이미지]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ex)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;$docker run &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;-P 2000:22&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; --env JAVA_OPTS=&quot;-DBOOTSTRAP_SERVER=127.0.0.1:9092 -DTOPIC=topic&quot;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; dockerimage:1.0&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ --env 는 도커를 통해 실행하는 프로그램에 대한 각종 환경설정을 제공한다. ENV로 설정한 환경 변수는 RUN,CMD,ENTRYPOINT에 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;h2 data-ke-size=&quot;size26&quot;&gt;2. Docker Engine API 를 이용하여 외부 포트 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- docker 에서는 API 또한 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657021372826&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;Docker Engine API v1.41 Reference&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&quot; data-og-url=&quot;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bTWqXS/hyOZE7JMhl/WyyzkgnM5zDShFdtuQJDN0/img.png?width=129&amp;amp;height=128&amp;amp;face=0_0_129_128&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/engine/api/v1.41/#operation/ContainerCreate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bTWqXS/hyOZE7JMhl/WyyzkgnM5zDShFdtuQJDN0/img.png?width=129&amp;amp;height=128&amp;amp;face=0_0_129_128');&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;Docker Engine API v1.41 Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker API 를 이용하여, docker를 실행시키려면 다음과 같은 속성들을 추가해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Docker API에서는 run 으로 한번에 create 및 start를 할 수 없으므로, Container 생성 후 Container 시작을 진행해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 속성은 Create Container 할 때, Body에 작성해야 하는 것들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* ExposedPort 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* HostConfig의 PortBindings 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 속성 2가지 전부 설정해줘야 한다. (처음에 HostConfig의 PortBindings를 확인하지 못하고 ExposedPort만 했다가 여러번 UnknownHostException을 만났다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;ex)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657021612770&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
   &quot;Env&quot;:[
      &quot;JAVA_OPTS=-DBOOTSTRAP_SERVER=172.30.1.2:9092 -DTOPIC=topic&quot;
   ],
   &quot;Image&quot;:&quot;dockerimage:1.0&quot;,
   &quot;ExposedPorts&quot;:{
      &quot;22/tcp&quot;:{
         
      }
   },
   &quot;HostConfig&quot;:{
      &quot;PortBindings&quot;:{
         &quot;22/tcp&quot;:[
            {
               &quot;HostPort&quot;:&quot;2000&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 data-ke-size=&quot;size16&quot;&gt;&amp;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;&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;※ 자바로 scp를 전송하는 코드가 궁금하다면... 아래 클릭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tbmaster.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.07.05 - [etc] - [JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657023271994&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;[JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리)&quot; data-og-description=&quot;JAVA로 command 명령어를 작성할 수 있다. ProcessBuilder 를 이용하면 되는데, 나는 처음에 ProcessBuilder를 이용하여 scp를 실행하려고 하였다. 그런데, ProcessBuilder 를 이용해 scp를 사용하려면, password..&quot; data-og-host=&quot;tbmaster.tistory.com&quot; data-og-source-url=&quot;https://tbmaster.tistory.com/153&quot; data-og-url=&quot;https://tbmaster.tistory.com/153&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BEgJq/hyOZCCanxH/zcYzlofYFAPupGkGk8wX4K/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bUDHdk/hyOZENsGPC/2GqaT94gs5BO1yNLVzbDZk/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/2hydz/hyOZyGMIpf/qTihvMIIx6pVb1PiIKqdr0/img.png?width=1316&amp;amp;height=667&amp;amp;face=0_0_1316_667&quot;&gt;&lt;a href=&quot;https://tbmaster.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tbmaster.tistory.com/153&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BEgJq/hyOZCCanxH/zcYzlofYFAPupGkGk8wX4K/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/bUDHdk/hyOZENsGPC/2GqaT94gs5BO1yNLVzbDZk/img.png?width=800&amp;amp;height=405&amp;amp;face=0_0_800_405,https://scrap.kakaocdn.net/dn/2hydz/hyOZyGMIpf/qTihvMIIx6pVb1PiIKqdr0/img.png?width=1316&amp;amp;height=667&amp;amp;face=0_0_1316_667');&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;[JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JAVA로 command 명령어를 작성할 수 있다. ProcessBuilder 를 이용하면 되는데, 나는 처음에 ProcessBuilder를 이용하여 scp를 실행하려고 하였다. 그런데, ProcessBuilder 를 이용해 scp를 사용하려면, password..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tbmaster.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>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/152</guid>
      <comments>https://tbmaster.tistory.com/152#entry152comment</comments>
      <pubDate>Tue, 5 Jul 2022 20:54:31 +0900</pubDate>
    </item>
    <item>
      <title>[Maven] Maven 프로젝트 실행가능한 Jar 파일 만들기</title>
      <link>https://tbmaster.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 Spring boot가 아닌 일반 Maven Project를 실행가능한 Jar 파일로 만들기 위해 겪었던 고생을 작성해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;나의 Maven 프로젝트의 상황&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- java8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 외부 라이브러리가 포함되어 있음(kafka-client, jsch 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹이 아닌 java 프로젝트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;h2 data-ke-size=&quot;size26&quot;&gt;첫번째 시행착오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 프로젝트 구현 끝내고, 그냥 maven install 하여, jar 파일 실행&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;Main 클래스를 찾을 수 없다고 나옴&amp;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;* 아래 캡쳐화면은 maven project에서 mvn install 실행 후, 생성된 jar 파일을 실행했을 때 나온 에러 메시지로 Manifest 속성이 없다고 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp6eGo/btrGgs2JNe7/ipGZwkECtqp0EvfIuUawgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp6eGo/btrGgs2JNe7/ipGZwkECtqp0EvfIuUawgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp6eGo/btrGgs2JNe7/ipGZwkECtqp0EvfIuUawgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp6eGo%2FbtrGgs2JNe7%2FipGZwkECtqp0EvfIuUawgk%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;479&quot; height=&quot;43&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;43&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;h2 data-ke-size=&quot;size26&quot;&gt;두번째 시행착오&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main클래스를 찾으려면, Manifest가 있어야 한다고 해서, Maven에 Manifest를 plugin으로 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ Manifest 추가 ]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;archive&amp;gt;
            &amp;lt;manifest&amp;gt;
                &amp;lt;mainClass&amp;gt;Main&amp;lt;/mainClass&amp;gt;
                &amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;
                &amp;lt;addExtensions&amp;gt;true&amp;lt;/addExtensions&amp;gt;
            &amp;lt;/manifest&amp;gt;
        &amp;lt;/archive&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/pre&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;dependency 한 외부 라이브러리를 찾지 못함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 아래 캡쳐 화면은 java.lang.NoClassDefFoundError 에러 메시지로, jsch 라이브러리를 프로젝트에서 사용하고 있는데, 찾지 못한다는 얘기다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccz8kz/btrGe9wAhPV/M5VNkUSJM1jGXADu3HjYwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccz8kz/btrGe9wAhPV/M5VNkUSJM1jGXADu3HjYwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccz8kz/btrGe9wAhPV/M5VNkUSJM1jGXADu3HjYwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccz8kz%2FbtrGe9wAhPV%2FM5VNkUSJM1jGXADu3HjYwk%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;724&quot; height=&quot;253&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;253&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;h2 data-ke-size=&quot;size26&quot;&gt;최종&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Manifest만 plugin 한 경우에는 프로젝트에서 사용하는 외부 라이브러리가 자동적으로 추가되지 않는다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 dependency한 외부 라이브러리를 자동으로 추가해주기 위해 plugin을 추가하였다.&amp;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;[ 외부 라이브러리 자동으로 추가할 수 있도록 plugin 설정 ]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;    &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;executions&amp;gt;
            &amp;lt;execution&amp;gt;
                &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
                &amp;lt;goals&amp;gt;
                    &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
                &amp;lt;/goals&amp;gt;
            &amp;lt;/execution&amp;gt;
        &amp;lt;/executions&amp;gt;
    &amp;lt;/plugin&amp;gt;
&amp;lt;/plugins&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘된다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;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;pom.xml 파일에 작성한 plugins&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgbAKv/btrGfOFeeEN/HfDOBIKvk0Xyxg5k3S3WUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgbAKv/btrGfOFeeEN/HfDOBIKvk0Xyxg5k3S3WUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgbAKv/btrGfOFeeEN/HfDOBIKvk0Xyxg5k3S3WUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgbAKv%2FbtrGfOFeeEN%2FHfDOBIKvk0Xyxg5k3S3WUk%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;520&quot; height=&quot;658&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;658&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;h2 data-ke-size=&quot;size26&quot;&gt;참고 사이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656665556889&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;Maven 입문 | Java 응용 프로그램 개발 | maven-jar-plugin 실행 가능한 Jar 생성&quot; data-og-description=&quot;앞장에서 프로그램의 실행은 간단히 했지만 아직 완전하지 않다. target 폴더에 패키지된 Jar 파일이 생성되었지만, 이를 그대로 실행하려고 하면 동작하지 않는다. 예를 들어, 아래와 같이 명령을&quot; data-og-host=&quot;www.devkuma.com&quot; data-og-source-url=&quot;https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&quot; data-og-url=&quot;https://devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/&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;Maven 입문 | Java 응용 프로그램 개발 | maven-jar-plugin 실행 가능한 Jar 생성&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앞장에서 프로그램의 실행은 간단히 했지만 아직 완전하지 않다. target 폴더에 패키지된 Jar 파일이 생성되었지만, 이를 그대로 실행하려고 하면 동작하지 않는다. 예를 들어, 아래와 같이 명령을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.devkuma.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huskdoll.tistory.com/561&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://huskdoll.tistory.com/561&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656665587911&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;Maven Build java.lang.NoClassDefFoundError 처리&quot; data-og-description=&quot;Maven으로&amp;nbsp;build할때 별다른 설정없이 build하면 내가 개발한 프로그램에서 사용하는 jar파일이 같이 묶이지 않습니다. (한마디로 내가 mysql DB에 접속하는 프로그램을 짜서 빌드하면 mysql-connector-java-&quot; data-og-host=&quot;huskdoll.tistory.com&quot; data-og-source-url=&quot;https://huskdoll.tistory.com/561&quot; data-og-url=&quot;https://huskdoll.tistory.com/561&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/du24tq/hyOW21JI8a/lPnDQqLVmPTSrg0rBdxDWK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bzC6xj/hyOW0izDqQ/7e1zanAb9O4YDODMJabEak/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/ha5Sq/hyOW30FbG5/RBfxvAmjtzzYWbS0gH5i80/img.png?width=811&amp;amp;height=741&amp;amp;face=0_0_811_741&quot;&gt;&lt;a href=&quot;https://huskdoll.tistory.com/561&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huskdoll.tistory.com/561&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/du24tq/hyOW21JI8a/lPnDQqLVmPTSrg0rBdxDWK/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/bzC6xj/hyOW0izDqQ/7e1zanAb9O4YDODMJabEak/img.png?width=800&amp;amp;height=730&amp;amp;face=0_0_800_730,https://scrap.kakaocdn.net/dn/ha5Sq/hyOW30FbG5/RBfxvAmjtzzYWbS0gH5i80/img.png?width=811&amp;amp;height=741&amp;amp;face=0_0_811_741');&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;Maven Build java.lang.NoClassDefFoundError 처리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Maven으로&amp;nbsp;build할때 별다른 설정없이 build하면 내가 개발한 프로그램에서 사용하는 jar파일이 같이 묶이지 않습니다. (한마디로 내가 mysql DB에 접속하는 프로그램을 짜서 빌드하면 mysql-connector-java-&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huskdoll.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 springboot만 쓰다가 이렇게 springboot 가 아닌 프로젝트를 단순하게라도 진행하면, 모르는게 더 많고, 해결하는데 더 오래걸리는 것 같다 ...&amp;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;이제라도 springboot 가 아닌 mven project의 실행가능 jar 파일 생성을 알아서 다행이다! 라고 나를 위로해야징..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <author>tbMaster</author>
      <guid isPermaLink="true">https://tbmaster.tistory.com/151</guid>
      <comments>https://tbmaster.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 1 Jul 2022 17:53:36 +0900</pubDate>
    </item>
  </channel>
</rss>