<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT PROGRAM &amp;amp; 가상화폐 SINCE 2006</title>
    <link>https://since.tistory.com/</link>
    <description>프로그래밍 언어  관련 지식 &amp;amp; 가상화폐  관련 내용 공유 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 26 Jun 2026 19:42:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>영진은정아빠</managingEditor>
    <item>
      <title>과속카메라 단속 기준</title>
      <link>https://since.tistory.com/40</link>
      <description>&lt;div id=&quot;SE-f31f76fd-bc1b-4730-9076-1ef1ee79cd46&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgQBzH/btsO3QmEdYX/HMK13p2IG9Txq3efWFESSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgQBzH/btsO3QmEdYX/HMK13p2IG9Txq3efWFESSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgQBzH/btsO3QmEdYX/HMK13p2IG9Txq3efWFESSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgQBzH%2FbtsO3QmEdYX%2FHMK13p2IG9Txq3efWFESSk%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;545&quot; height=&quot;555&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3c9f165d-af7c-4796-b4e5-9f30e5532b3c&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f21b8290-582c-4bc7-92da-05d0700b4bf2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시민들이 운전 중 가장 민감하게 반응하는 순간은 신호가 막 바뀌는 교차로에서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;&amp;ldquo;노란불을 지나도 될까?&amp;rdquo;&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 하는 찰나, 그리고 과속카메라 앞에서 &amp;ldquo;조금 빨라도 괜찮겠지?&amp;rdquo;라고 생각할 때입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-14f13cd3-cb16-4e57-a105-3750ac7e2491&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0fb96c6b-ab66-419e-86e5-b86f307e9e20&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그런데 실제로는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;몇 km/h까지 과속이 허용되는지, 카메라가 인식하는 기준이 어떻게 되는지 정확히 아는 운전자는 많지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f08b658c-efd3-47d3-9b0f-73e1420973a7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4e80f5bd-1835-43fe-8954-52d767093010&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 글에서는 도로교통법, 단속장비의 기술기준, 그리고 현장 운영 관행을 바탕으로, &amp;ldquo;속도와 신호 단속의 허용오차&amp;rdquo;를 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9219399d-0103-48a8-8b9d-c172e3a8add8&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-29cba97c-d80d-4846-9818-c4aa62b8d31d&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c498e164-9e7c-41c7-86c9-8953866f676a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt; 과속단속, 몇 km/h까지 허용되나?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bee09f54-b5b8-4ad7-84f8-9d53c5b2b00b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ad6a5a7a-9b8b-40a8-83c1-c440893d1de5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;법적 기준 자체는 단속 여지 없이 &amp;ldquo;1km/h라도 초과하면 위반&amp;rdquo;입니다. 하지만 현실적으로는 기술적 오차와 행정 실효성 문제로 인해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;일정 범위 내의 초과는 &amp;lsquo;단속 유예&amp;rsquo;되는 관행&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-945fdc2d-dcb3-4d43-a0a4-a794a6d78a90&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-727e3ce6-992a-4b0b-98cd-197688945f67&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;* 실제 허용오차 범위&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aaf4d9d6-b392-48a1-8a0f-d78967d65fea&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;과속카메라 기준 허용오차는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-eb649611-730c-4c3d-8a1a-50872084c79c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e482eb6a-dca5-4a58-b2ee-90fe85592bc0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;➤ 약 &lt;/span&gt;&lt;span&gt;&lt;b&gt;속도 제한 + 10% &amp;plusmn; 약간의 여유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cd5d811b-21a6-48e2-bdb9-ecc81ddd1ecc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;➤ 예 : 제한속도 100km/h 구간 &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;b&gt;최대 110~113km/h 정도까지는 단속 유예&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1d8c4ec7-d10a-4693-a4c3-319de4b584d7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b260a121-8d11-4e47-903b-be67fefa1458&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;* 관련 근거 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57f63b3b-3183-4019-b569-6c2aa2800b10&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;「자동차 속도측정기 성능 기준」(국토교통부 고시)에 따라, &lt;/span&gt;&lt;span&gt;&lt;b&gt;과속카메라의 측정 정확도는 &amp;plusmn;3km/h&lt;/b&gt;&lt;/span&gt;&lt;span&gt;로 규정되어 있음. 따라서 경찰청, 지자체는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;제한속도의 약 10%까지 유예&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하도록 운영하는 사례가 많음 (관할청의 내부 지침에 따라 달라짐)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c0df491e-3181-4119-85f4-2bc344c64d0c&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d8c72f0a-b80e-442f-ae9d-b23bc9ad0b9c&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 &lt;/span&gt;&lt;span&gt;&lt;b&gt;단속 유예가 공식 면책은 아니며&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;특정 캠페인 기간이나 사고 다발 구간에서는 &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;1km/h 초과도 단속 대상&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;이 될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-433dd666-6429-48d8-b72b-519984cadc93&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-53d8ecbf-c760-44ed-b7ff-bbafc6092313&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-aedd6e0f-d399-4501-bb5f-c1454fde8f38&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;신호 단속 카메라 &amp;ndash; 노란불에 걸려도 위반일까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1c15b412-aa99-4be8-bc66-d5de1d1b2aeb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-591c69f1-73f5-4548-95f0-24b1fd4519d9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;많은 운전자가 &lt;/span&gt;&lt;span&gt;&lt;b&gt;노란불일 때 진입했는데 적발되었다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;고 주장하는 사례가 있습니다. 하지만 실제 신호 단속은 다음과 같은 방식으로 작동합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d157d42f-f5a2-47ba-8dd7-76a75437aee6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c9b70469-f656-4bd9-bed0-d10334150214&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;* 신호 단속 작동 방식&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dd5febd4-fe32-4a63-8362-8e1cd43812f2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;- 적색 신호가 들어온 이후 교차로 정지선을 넘으면 적발&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8c7749bd-2bb1-43a3-a7e6-106ab238c014&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;- 노란불일 때 진입한 경우는 적발되지 않음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-19369ba4-f495-4d5a-b3f2-1577d2964d79&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 단, 노란불 후 적색으로 바뀐 뒤 진입하면 적발 대상&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3fa46480-c972-4b23-bca8-5db5a141bbef&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d0956834-59ba-4ba2-8894-a0a4ed199396&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;* 기술적 조건&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-40e8f6e1-5409-43a7-abfa-2b516032f8b0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;대부분의 &lt;/span&gt;&lt;span&gt;&lt;b&gt;신호 단속 카메라는 &amp;lsquo;적색 신호 후 0.3~0.5초 지연시간&amp;rsquo;을 설정&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하여, 급정지 회피나 신호전환 인지 지연을 고려함&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f1f0d793-8d67-4051-a5d0-51a13fbb7f41&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfyMbn/btsO3zltQBr/gT1tgWicqEr5k0VDsJ82Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfyMbn/btsO3zltQBr/gT1tgWicqEr5k0VDsJ82Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfyMbn/btsO3zltQBr/gT1tgWicqEr5k0VDsJ82Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfyMbn%2FbtsO3zltQBr%2FgT1tgWicqEr5k0VDsJ82Vk%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;80&quot; height=&quot;43&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-989b3f8e-bfad-410f-87aa-552bccbd0219&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;고정식 카메라 설치 예시&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bac775c3-f4a6-4e71-9a93-0d7fcef73224&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5be42eb6-4a73-4770-afc6-8d0c3c08b902&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-cd5438bc-72fe-4f0f-8abf-e09ce5364eed&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;복합단속카메라 : 신호와 속도 동시에 단속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e6ad7946-0630-46a5-b00d-2ab7d89e1fa9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9180365e-52d9-4beb-8899-673190a1a673&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최근 설치되는 고정식 카메라는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;신호와 속도를 동시에 단속&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는 복합단속장비(디지털 영상녹화장비)가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6fdd5fe1-2968-4fa1-a0be-9366e3e631f0&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f7f7f7;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;단속 조건&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #f7f7f7;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;기준&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;신호위반&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;적색등 점등 후 정지선 통과&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;과속위반&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;제한속도 +10% 초과 (&amp;plusmn;3km/h 오차 고려)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cab5fd10-8060-4695-b002-ab46033f8780&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-34a59405-1cbd-42c0-94f9-eacb929b76bf&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;단, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;신호위반과 과속을 동시에 한 경우&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;&lt;b&gt;두 건 모두 단속&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #0078cb;&quot;&gt;될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b38877ff-59d1-4042-81a4-2c1b7022e9b5&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-567ef8a6-95cc-45da-b10d-846c0b6ceac4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-16027494-02af-47ce-a8ee-32208078450b&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-236720b6-1a8a-470c-bad5-69e0d82d08d3&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2756e292-96b6-4aab-b1f6-064b82092f1a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁 : 단속 안되려면?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-985531e6-a8cd-408a-a4d6-0634ed6e03c7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;&lt;b&gt;제한속도 +5km/h 이내로 운행&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; 오차 포함해도 안전지대&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;&lt;b&gt;신호등 &amp;lsquo;황색&amp;rsquo;일 때는 멈출 준비&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; 적색 전 진입 여부가 관건&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;&lt;b&gt;복합단속구간 표지 확인&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &amp;lsquo;단속카메라 있음&amp;rsquo; 표지판 무시 금물&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-025bc4a7-d96c-4aab-bae6-31bd30a6a1d9&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciY3ZS/btsO3EUoEAG/e7KnhDP7AWS1bE6Ks2HStk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciY3ZS/btsO3EUoEAG/e7KnhDP7AWS1bE6Ks2HStk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciY3ZS/btsO3EUoEAG/e7KnhDP7AWS1bE6Ks2HStk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciY3ZS%2FbtsO3EUoEAG%2Fe7KnhDP7AWS1bE6Ks2HStk%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;80&quot; height=&quot;44&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1eda4f96-4496-4e63-aa05-1e03ed12bc1d&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;고정식 카메라의 단속원리&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-68c49dba-f958-40b6-9dd6-b5dd94b991b9&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4fkT/btsO3TKbQpb/AKfEW1fGzbVsna5k1uKva1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4fkT/btsO3TKbQpb/AKfEW1fGzbVsna5k1uKva1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4fkT/btsO3TKbQpb/AKfEW1fGzbVsna5k1uKva1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4fkT%2FbtsO3TKbQpb%2FAKfEW1fGzbVsna5k1uKva1%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;80&quot; height=&quot;44&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-4873fae6-0f30-45ef-a178-8016cc16de94&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이동식 카메라 단속원리&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c14a231b-242f-414d-af74-312cb8759486&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6cf9d8b9-22f7-4ae3-8863-2748c5e7c246&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;한편, 많은 운전자분들께서 도로를 주행하시다 보면 가장 자주 접하게 되는 단속 경고 중 하나가 내비게이션을 통해 안내되는 &amp;ldquo;전방 500m 앞, 이동식 과속 단속구역입니다. 서행하십시오.&amp;rdquo;라는 음성 안내입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d31b7584-54f5-45b7-b7c5-1acf5638db6e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-06c429ce-cf09-4999-9ee8-79d57949e54f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 전국적으로 약 900여 곳에 이동식 단속구역이 설치되어 있으나, 실제로 단속 장비가 상시 운용되고 있는 곳은 그리 많지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4d91665c-2f69-4c45-b157-6debe6eabb10&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-02728122-7569-4e08-b27c-3948131a8d13&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dh2ia/btsO29HgVDw/NDnbKNbCwUESOOVqF2W6R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dh2ia/btsO29HgVDw/NDnbKNbCwUESOOVqF2W6R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dh2ia/btsO29HgVDw/NDnbKNbCwUESOOVqF2W6R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDh2ia%2FbtsO29HgVDw%2FNDnbKNbCwUESOOVqF2W6R0%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;80&quot; height=&quot;64&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybZNH/btsO2IKc2YV/9txsugX3luh6LKLDGBAY9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybZNH/btsO2IKc2YV/9txsugX3luh6LKLDGBAY9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybZNH/btsO2IKc2YV/9txsugX3luh6LKLDGBAY9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybZNH%2FbtsO2IKc2YV%2F9txsugX3luh6LKLDGBAY9K%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;80&quot; height=&quot;55&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1d3f5f1b-91f0-4ad0-a3f5-e6fc4dcab3f6&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;허울뿐인 이동식 카메라 부스&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-95efeb7e-294a-4c3a-aecc-27a836433920&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8ef2db5f-31be-4dcc-bea7-d8bfab75a81b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실제로 경찰이 보유한 이동식 단속 장비는 약 300여 대 수준으로, 전체 단속 부스의 3분의 1 정도만 실제로 단속이 가능한 실정입니다. 이 중에는 정비 중이거나 야간에는 사용이 불가능한 장비도 다수 포함되어 있어, 실질적으로 단속이 이루어지는 경우는 제한적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-49c93d79-ce8d-45b2-872c-d5b009f53591&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9f51abd7-62c8-497b-9b39-900058fe3da8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한, 투광기 등 보조장비의 부족과 단속 인력의 한계로 인해 야간 시간대에는 단속이 거의 이루어지지 않는 것이 현실입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a801a719-6a86-49fc-b7c2-5227754535f7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8ad0b54e-544c-4328-95d5-39354a0df80d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이로 인해 &amp;ldquo;단속도 안 하면서 겁만 준다&amp;rdquo;, &amp;ldquo;또 빈 부스에 속았다&amp;rdquo;는 불만이 운전자들 사이에서 꾸준히 제기되고 있습니다. 그럼에도 불구하고 경찰은 이러한 이동식 단속 부스 설치만으로도 과속을 억제하는 효과가 있다고 판단하고 있으며, 운전자들에게 심리적 경각심을 유도함으로써 교통사고 예방에 기여할 수 있을 것으로 기대하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-585eb5bf-0355-46c4-be7e-1f60b652fca6&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6e29f3ea-0425-4443-b07e-b59ad85e2886&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1630c896-95e0-4e07-8400-151ee65bcd6e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;마무리하면서&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e1d70aca-ee84-45ad-a782-95c12c923bbc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-804321a2-0c73-40a5-956e-659f8882fe8f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;과속카메라와 신호위반 단속은 단순히 '벌금 부과'를 위한 시스템이 아니라, 교통사고를 줄이고 도로 위 안전을 유지하기 위한 &lt;/span&gt;&lt;span&gt;&lt;b&gt;예방 중심의 공공기술 인프라&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 기술적으로 오차 허용 범위는 존재하지만, 법적으로는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;1km/h 초과도 단속 대상이 될 수 있으며&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, 특히 사고 위험이 높은 지점이나 보호구역에서는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;미세한 속도 초과도 정밀하게 포착됩니다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-814092a0-0cef-47a8-9890-08da5acbcb02&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea7205a7-ecf9-4159-959a-5a30bbe1448f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한, 최근엔 단속 기술도 급속히 고도화되고 있습니다. 고정식 및 이동식 단속 장비 외에도, 전국 주요 고속도로와 도시 간선도로에는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;구간단속 시스템&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 확대 설치되어 &amp;lsquo;캥거루 운전&amp;rsquo;이나 단속구간만 감속하는 얌체 운전까지 체계적으로 차단하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-123bbc9a-7958-4b22-a466-cc164c28814b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0e0e1c3c-bd55-4809-b4a4-e06eb2b25df8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 나아가, 2020년대 이후 경찰청과 국토교통부는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;암행순찰차&amp;middot;헬기&amp;middot;드론을 활용한 비가시적 단속체계&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 적극 도입했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-694630d1-07d8-462d-80b6-6326e8832298&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-772719a5-515f-46b4-b795-85154552b46b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어, &lt;/span&gt;&lt;span&gt;&lt;b&gt;600m 상공에서 차량 번호판까지 식별 가능한 고성능 카메라를 장착한 경찰헬기&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, 그리고 &lt;/span&gt;&lt;span&gt;&lt;b&gt;3천만 화소급 카메라를 탑재한 드론&lt;/b&gt;&lt;/span&gt;&lt;span&gt;은 주요 고속도로의 병목지점과 지정차로 위반&amp;middot;끼어들기&amp;middot;갓길운행 등을 실시간으로 단속하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1b02f6f9-b9ef-467d-ab2d-607ade73df6f&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ImtbW/btsO2m8bqiW/kdXWtZslqZGtNzDFi6lh11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ImtbW/btsO2m8bqiW/kdXWtZslqZGtNzDFi6lh11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ImtbW/btsO2m8bqiW/kdXWtZslqZGtNzDFi6lh11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FImtbW%2FbtsO2m8bqiW%2FkdXWtZslqZGtNzDFi6lh11%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;80&quot; height=&quot;58&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beFkgX/btsO3aGczJZ/LkrpiqnngbkZux7zZkHZ1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beFkgX/btsO3aGczJZ/LkrpiqnngbkZux7zZkHZ1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beFkgX/btsO3aGczJZ/LkrpiqnngbkZux7zZkHZ1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeFkgX%2FbtsO3aGczJZ%2FLkrpiqnngbkZux7zZkHZ1k%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;80&quot; height=&quot;49&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Blyw/btsO29gdpzm/HV7669ZyoQ1CGZnKoC8ZxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Blyw/btsO29gdpzm/HV7669ZyoQ1CGZnKoC8ZxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Blyw/btsO29gdpzm/HV7669ZyoQ1CGZnKoC8ZxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Blyw%2FbtsO29gdpzm%2FHV7669ZyoQ1CGZnKoC8ZxK%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;80&quot; height=&quot;50&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-320b1d9f-bfe4-4283-82dc-58b64111ecde&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;속도로 법규 위반 단속에 나선 헬기와 드&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9dc0794b-ed78-476b-91e8-920d8084c68b&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f1281e24-6968-4078-9b32-eabd0cb908fa&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 공중 단속 시스템은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;단속 사각지대를 최소화하고, 운전자의 인식 개선 및 교통법규 준수를 유도하는 데 매우 효과적&lt;/b&gt;&lt;/span&gt;&lt;span&gt;인 것으로 평가받고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-efead5f8-7292-4b26-9a47-164e18f6ae20&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b03cd12-2337-4d31-91cc-4af5611d5c13&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;결국 단속 기준을 회피하려는 정보 탐색보다 중요한 것은, &lt;/span&gt;&lt;span&gt;&lt;b&gt;&amp;lsquo;속도제한은 곧 생명 보호의 기준&amp;rsquo;이라는 원칙적 인식&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-02d122b6-c18b-44d3-a828-cd5e82629c7b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b856bca-bc84-4484-a18e-f8a9de9e0b45&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;속도를 지키는 것은 단속 회피가 아닌, &lt;/span&gt;&lt;span&gt;&lt;b&gt;나 자신과 타인의 안전을 지키는 첫 걸음&lt;/b&gt;&lt;/span&gt;&lt;span&gt;임을 기억해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d57a74e5-57e2-4c7e-a12a-8d346606ca54&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2cd98b7e-11f5-471c-a17a-9ad04dad2fd6&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b2741f9d-7934-4151-b707-be3dcc990850&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #387cbb;&quot;&gt;#과속카메라&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#신호위반&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#단속기준&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#속도초과&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#운전자정보&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#교통안전&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#도로교통법&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#복합단속카메라&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#운전팁&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#운전자상식&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#황색신호&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#정지선단속&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#단속오차&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#교차로주의&lt;/span&gt; &lt;span style=&quot;color: #387cbb;&quot;&gt;#자동차단속&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cc617a85-4827-11f0-bae7-b32a6d7bb3e1&quot; style=&quot;background-color: #ffffff; color: #3d4444; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be1IUT/btsO1ynH7sP/zVHz3MUCKjMvaj6PGbe6TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be1IUT/btsO1ynH7sP/zVHz3MUCKjMvaj6PGbe6TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be1IUT/btsO1ynH7sP/zVHz3MUCKjMvaj6PGbe6TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe1IUT%2FbtsO1ynH7sP%2FzVHz3MUCKjMvaj6PGbe6TK%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;80&quot; height=&quot;23&quot; data-origin-width=&quot;80&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://blog.naver.com/gulgomi/223898208191&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/gulgomi/223898208191&lt;/a&gt;&lt;/p&gt;</description>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/40</guid>
      <comments>https://since.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 3 Jul 2025 16:20:43 +0900</pubDate>
    </item>
    <item>
      <title>'서머타임' 오는 일요일, 11월 3일 해제</title>
      <link>https://since.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;올해 서머타임(Daylight Saving Time&amp;middot;DST: 일광절약시간제)이 오는 일요일, 11월 3일 오전 2시 해제된다. 3일 오전 2시를 1시로 한시간 뒤로 돌리면 된다. 이를 보통 Fall Back(서머타임 시작은 Spring Forward)이라 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이에 따라 뉴욕, 워싱턴DC 등 미 동부지역과 한국의 시차는 13시간에서 14시간으로, LA등 서부는 16시간에서 17시간으로 각각 늘어난다. 즉 미국 동부시간 11월 3일 오전 7시는 한국시간으로는 14시간 빠른 3일 오후 9시가 된다. 서머타임 해제 후 미국 다른 지역과 한국의 시차를 보면 △시카고 등 미국 중부지역 15시간 △덴버 등 산악지역 16시간 등이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 하와이와 사모아, 괌, 푸에르토리코, 미국령 버진 아일랜드, 애리조나주 등은 서머타임을 적용하지 않아 이에 해당되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;미국에서는 연방정부의 허가를 받으면 서머타임을 도입하지 않을 수도, 일년 내내 도입할 수도 있다. 현재 7개주-Alabama, Arkansas, Florida, Nevada, Oregon, Tennessee and Washington- 는 영구 서머타임(permanent DST) 도입을 의결하고 연방정부의 승인을 기다리고 있다. 반면, 텍사스는 서머타임없이 기준시를 유지하는 안을 고려하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서머타임 제도는 낮이 길어지는 여름철에 표준시를 한 시간 앞당겨 에너지를 절약하고 경제활동을 촉진한다는 취지로 세계 70여 개국에서 시행 중이다. 1차 세계대전 당시 연료를 아끼기 위해 도입된 서머타임제는 2차 세계대전 이후 폐지됐다가 미국에선 1967년, 유럽에선 1996년부터 다시 시행됐다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;미국과 캐나다 등 북미지역의 서머타임제는 매년 3월 둘째주 일요일 오전 2시부터 11월 첫 번째 일요일 오전 2시까지 시행된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/33</guid>
      <comments>https://since.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 19 Feb 2020 11:13:44 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL, MariaDB] Redo log 속도Insert (innodb_flush_log_at_trx_commit</title>
      <link>https://since.tistory.com/32</link>
      <description>&lt;p&gt;&lt;b&gt;innodb_flush_log_at_trx_commit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MySQL, MariaDB에서 사용되는 Redo log 옵션(innodb_flush_log_at_trx_commit)에 대해 알아본다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Redo log의 기록 옵션은 총 3가지로&amp;nbsp;innodb_flush_log_at_trx_commit 옵션에 의해 결정된다.&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;innodb_flush_log_at_trx_commit&amp;nbsp;는 커밋&amp;nbsp;로그에&amp;nbsp;대하여&amp;nbsp;Disk Flush를 언제 발생 시킬지에 대한 옵션이다.&lt;br /&gt;기본값은 1로&amp;nbsp;설정이&amp;nbsp;되어있고&amp;nbsp;1은&amp;nbsp;트랜젝션이&amp;nbsp;발생할&amp;nbsp;때마다&amp;nbsp;디스크에&amp;nbsp;플러시가&amp;nbsp;발생한다.&lt;br /&gt;2로&amp;nbsp;설정하면&amp;nbsp;1초마다&amp;nbsp;디스크로&amp;nbsp;플러시가&amp;nbsp;발생하게되고,&amp;nbsp;그만큼&amp;nbsp;io가&amp;nbsp;줄어들기때문에&amp;nbsp;성능&amp;nbsp;향상을&amp;nbsp;기대할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;(단&amp;nbsp;장애시&amp;nbsp;1초&amp;nbsp;정도의&amp;nbsp;트랜젝션은&amp;nbsp;유실될&amp;nbsp;수&amp;nbsp;있다.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1.&amp;nbsp;innodb_flush_log_at_trx_commit 0&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;: 1초 간격으로 Disk에 Flush(저장)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;: &lt;span style=&quot;color: #333333;&quot;&gt;트랜잭션&lt;/span&gt;(commit, rollback)에 관계없이 1초 간격으로 disk에 기록하므로, disk 쓰기 요청이 많은 편이며, 1초 간격이라는 의미로 데이터의 안정성이 보장되는 편(1초내외)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2.&amp;nbsp;innodb_flush_log_at_trx_commit 1 (default)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;:&amp;nbsp;트랜잭션 시(commit, rollback) 로그&amp;nbsp;파일과&amp;nbsp;데이터&amp;nbsp;파일에&amp;nbsp;기록로그&amp;nbsp;버퍼는&amp;nbsp;각&amp;nbsp;트랜젝션이&amp;nbsp;실행될&amp;nbsp;때마다&amp;nbsp;로그&amp;nbsp;파일에&amp;nbsp;기록되고&amp;nbsp;로그&amp;nbsp;파일에서&amp;nbsp;디스크&amp;nbsp;연산에&amp;nbsp;대한&amp;nbsp;플러시가&amp;nbsp;실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;3.&amp;nbsp;innodb_flush_log_at_trx_commit 2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;:&amp;nbsp;트랜잭션 시(commit, rollback)&amp;nbsp;로그&amp;nbsp;파일에만&amp;nbsp;기록,&amp;nbsp;매초&amp;nbsp;데이터&amp;nbsp;파일에&amp;nbsp;기록&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;* 위에서 언급된 1초 간격의&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;Flush는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로세스 스케쥴링에 따라 차이가 발생할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;성능 차이는 1이 가능 느리지만, 데이터 보장에 대한 설정은 1이 가장 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;성능을 우선으로 생각하는 시스템의 경우 0, 2 옵션을 추천.&lt;/span&gt;&lt;/p&gt;</description>
      <category>DBMS/MySQL</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/32</guid>
      <comments>https://since.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 10 Sep 2019 10:17:00 +0900</pubDate>
    </item>
    <item>
      <title>[CentOS 7] MongoDB(몽고DB) 설치 가이드</title>
      <link>https://since.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;219&quot; height=&quot;72&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/toCET/btqxQTnoGdd/cXKifsYNMlxgJ2dYb2uj5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/toCET/btqxQTnoGdd/cXKifsYNMlxgJ2dYb2uj5K/img.png&quot; data-alt=&quot;몽고DB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/toCET/btqxQTnoGdd/cXKifsYNMlxgJ2dYb2uj5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtoCET%2FbtqxQTnoGdd%2FcXKifsYNMlxgJ2dYb2uj5K%2Fimg.png&quot; width=&quot;219&quot; height=&quot;72&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;몽고DB&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CentOS 7 몽고DB 설치 가이드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;몽고DB는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다. NoSQL 데이터베이스로 분류되는 몽고DB는 JSON과 같은 동적 스키마형 도큐먼트들을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[출처 : 위치백과]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* 설치되는 몽고DB 버전은 4.2버전을 기준으로 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. CentOS YUM 리파지토리(repository) 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;몽고DB는 CentOS에 기본 리파지토리에 포함되어 있지 않다. 리파지토리 파일을 생성하기 위해 아래 내용을 입력하여 파일을 생성한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;경로 :&amp;nbsp;/etc/yum.repos.d/mongodb-org.repo&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;$[mongo@localhost ~]# sudo vi /etc/yum.repos.d/mongodb-org.repo&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[mongodb-org-4.2] &lt;br /&gt;name=MongoDB&amp;nbsp;Repository &lt;br /&gt;baseurl=&lt;span style=&quot;color: #0051a1;&quot;&gt;&lt;a style=&quot;color: #0051a1;&quot; href=&quot;https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;gpgcheck=1 &lt;br /&gt;enabled=1 &lt;br /&gt;gpgkey=&lt;span style=&quot;color: #0051a1;&quot;&gt;&lt;a style=&quot;color: #0051a1;&quot; href=&quot;https://www.mongodb.org/static/pgp/server-3.4.asc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.mongodb.org/static/pgp/server-4.2.asc&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;리파지토리 등록확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;$[mongo@localhost ~]# yum repolist&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;.&amp;nbsp;.&amp;nbsp;. &lt;br /&gt;repo&amp;nbsp;id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repo&amp;nbsp;name &lt;br /&gt;base/7/x86_64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CentOS-7&amp;nbsp;-&amp;nbsp;Base&lt;br /&gt;&lt;u&gt;mongodb-org-3.2/7/x86_64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MongoDB&amp;nbsp;Repository&lt;/u&gt;&lt;br /&gt;.&amp;nbsp;.&amp;nbsp;.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;2. 몽고DB 설치하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;YUM 리파지토리에 등록을 완료하였으므로 설치는 YUM을 이용해서 설치한다.&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;$[mongo@localhost ~]# sudo&amp;nbsp;yum&amp;nbsp;install&amp;nbsp;mongodb-org&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;위의 yum install mongodb-org 커멘드를 이용해 설치가 완료 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;3. 몽고DB 시작, 종료, 상태 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 시작&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;$[mongo@localhost ~]#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;sudo&amp;nbsp;systemctl&amp;nbsp;start&amp;nbsp;mongod&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;- 종료&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;$[mongo@localhost ~]#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;sudo&amp;nbsp;systemctl stop mongod&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;- 상태 확인&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;$[mongo@localhost ~]#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;sudo&amp;nbsp;systemctl status mongod&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;4. 몽고DB 로그 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 몽고DB 실행 로그는 아래 경로에서 확인 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;경로 :&amp;nbsp;/var/log/mongodb/mongod.log&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 54px;&quot;&gt;
&lt;td style=&quot;height: 54px;&quot; width=&quot;615&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;$[mongo@localhost ~]#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;tail /var/log/mongodb/mongod.log&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이상으로 CentOS&amp;nbsp;7에서 MongoDB(몽고DB)&amp;nbsp;설치를 마친다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>DBMS/MongoDB</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/31</guid>
      <comments>https://since.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 29 Aug 2019 09:23:18 +0900</pubDate>
    </item>
    <item>
      <title>Java, max user processes, open files</title>
      <link>https://since.tistory.com/30</link>
      <description>&lt;p&gt;올해 사내 블로그 포스팅 주제로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Linux의 open files, max user processes&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정에 대해 정리하게 되었습니다.&lt;/p&gt;
&lt;p&gt;계기는 단순했습니다.&lt;br /&gt;팀에서 서버 작업하던 중 쓰레드와 관련해서 문제가 발생했는데요.&lt;br /&gt;제가 진행하던 일이 아니라서 옆에서 해결하는 과정을 지켜봤습니다.&lt;br /&gt;부끄럽게도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전혀 모르는 내용이 오고 갔습니다&lt;/b&gt;.&lt;br /&gt;복기가 필요하단 생각에 정리를 진행 하던 중, 이왕 하는김에 회사 블로그에 올리면 좀 더 자세히 공부하지 않을까 하는 마음에 선택하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(퀄리티는 에피타이저,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;마음만은 메인 디쉬&lt;/b&gt;로 가겠습니다!)&lt;/p&gt;
&lt;p&gt;여기에서 사용된 코드는 실제 회사에서 사용한 코드는 아니며, 포스팅을 위해 최대한 유사하게 만들어진 별도의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/jojoldu/linux-thread&quot;&gt;샘플 코드&lt;/a&gt;임을 먼저 말씀드립니다.&lt;/p&gt;
&lt;h2 id=&quot;1-max-user-processes&quot;&gt;1. Max user processes&lt;/h2&gt;
&lt;p&gt;Linux에는 OS 레벨에서의 제한 설정이 있습니다.&lt;br /&gt;보통 이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit&lt;span&gt;&amp;nbsp;&lt;/span&gt;(user limit) 이란 명령어로 확인하는데요.&lt;br /&gt;2가지 옵션으로 대부분 확인합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ulimit -a
&lt;ul&gt;
&lt;li&gt;soft ulimit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ulimit -aH
&lt;ul&gt;
&lt;li&gt;hard ulimit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;톰캣을 이용해서 서버 운영 도중, 다음과 같이&lt;span&gt;&amp;nbsp;&lt;/span&gt;OutOfMemoryError가 발생했다고 가정하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTaNkb/btquO6XPVyF/Ui3Vdfg7Dmqkt4Oe8vSydK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTaNkb/btquO6XPVyF/Ui3Vdfg7Dmqkt4Oe8vSydK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTaNkb/btquO6XPVyF/Ui3Vdfg7Dmqkt4Oe8vSydK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTaNkb%2FbtquO6XPVyF%2FUi3Vdfg7Dmqkt4Oe8vSydK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;더이상 쓰레드를 생성할 수 없다는 에러인데요.&lt;br /&gt;뭐가 문제였는지 하나씩 확인해보겠습니다.&lt;br /&gt;맨 처음 서버를 할당 받은 초기 상태 그대로라&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit -a는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eigJaY/btquM8v0q7E/bAJ2PTuQ4Wj7D9ct3Nc6N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eigJaY/btquM8v0q7E/bAJ2PTuQ4Wj7D9ct3Nc6N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eigJaY/btquM8v0q7E/bAJ2PTuQ4Wj7D9ct3Nc6N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeigJaY%2FbtquM8v0q7E%2FbAJ2PTuQ4Wj7D9ct3Nc6N1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;화면을 보시면&lt;span&gt;&amp;nbsp;&lt;/span&gt;open files&lt;span&gt;&amp;nbsp;&lt;/span&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes의 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1024로 동일하게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;잡혀있습니다.&lt;br /&gt;쓰레드 생성에 문제가 발생한거라&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes가 문제인것 같지만, 확신할 수 없으니 테스트 환경을 구축해서 실험해보겠습니다.&lt;/p&gt;
&lt;p&gt;테스트용 서버는 AWS EC2의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;t2.micro&lt;/b&gt;입니다.&lt;br /&gt;t2.micro로 생성후&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit -a로 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOsRqr/btquOHcWEIx/3jXp0SnRyqjCcMZ6C53JVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOsRqr/btquOHcWEIx/3jXp0SnRyqjCcMZ6C53JVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOsRqr/btquOHcWEIx/3jXp0SnRyqjCcMZ6C53JVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOsRqr%2FbtquOHcWEIx%2F3jXp0SnRyqjCcMZ6C53JVk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;t2.micro는 기본 설정이&lt;span&gt;&amp;nbsp;&lt;/span&gt;open files가 1024,&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes가 3902로 잡혀있다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;자 그럼 간단하게 추측할 수 있는 것이, 현재 설정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;1024 &amp;lt;= 동시에 생성가능한 쓰레드수 &amp;lt;= 3902라면&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes가 부족해서 발생한 문제임을 알 수 있겠죠?&lt;br /&gt;이를 확인하기 위해 간단한 스프링부트 프로젝트를 생성하겠습니다.&lt;/p&gt;
&lt;p&gt;코드는 간단합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;/4000으로 HTTP 요청이 오면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;비동기로 4천개의 쓰레드를 동시에 생성&lt;/b&gt;하고, 20분간 유지합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c25Smc/btquN8B7jsI/X9KK3OZpIcTvocZKGIHtkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c25Smc/btquN8B7jsI/X9KK3OZpIcTvocZKGIHtkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c25Smc/btquN8B7jsI/X9KK3OZpIcTvocZKGIHtkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc25Smc%2FbtquN8B7jsI%2FX9KK3OZpIcTvocZKGIHtkk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;프로젝트를 테스트용 EC2에 배포하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;curl과&lt;span&gt;&amp;nbsp;&lt;/span&gt;tail -f nohup으로 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz1oO4/btquOpKk7X2/M6zKoxBIPzmk1vvnCsacXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz1oO4/btquOpKk7X2/M6zKoxBIPzmk1vvnCsacXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz1oO4/btquOpKk7X2/M6zKoxBIPzmk1vvnCsacXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz1oO4%2FbtquOpKk7X2%2FM6zKoxBIPzmk1vvnCsacXk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;사진속을 보시면 3855번째에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;unable to create new native thread&lt;span&gt;&amp;nbsp;&lt;/span&gt;에러 메세지가 발생했습니다.&lt;br /&gt;즉, open file 제한인 1024개를 초과해서 쓰레드가 생성된 것입니다!&lt;br /&gt;&lt;b&gt;max user processes만큼만 쓰레드가 생성&lt;/b&gt;된것을 확인할 수 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/344292&quot;&gt;Linux에서는 프로세스와 쓰레드를 동일하게 봅니다&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2-open-files&quot;&gt;2. Open files&lt;/h2&gt;
&lt;p&gt;두번째로 위에 있던 open files 값은 어떤 값을 가리키는지 알아보겠습니다.&lt;br /&gt;&lt;a href=&quot;http://meetup.toast.com/posts/54&quot;&gt;open files에 관해 검색&lt;/a&gt;을 해보면 이 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로세스가 가질 수 있는 소켓 포함 파일 개수&lt;/b&gt;를 나타낸다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;자 그럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;소켓을 open files 값 보다 많이 만들면&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;어떻게 되는지 테스트 해보겠습니다.&lt;br /&gt;테스트 방법은 간단합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RestTemplate로 다른 서버로 API요청 (소켓 생성)을 보내고, 해당 서버에서는 20분간 응답을 대기 시킵니다.&lt;/li&gt;
&lt;li&gt;위 요청을 동시에 1100개를 보냅니다.&lt;/li&gt;
&lt;li&gt;open files의 제한이 1024개이기 때문에 1100개가 발송되기전에 open files 관련된 에러가 발생하면 실험 성공!
&lt;ul&gt;
&lt;li&gt;Java, Spring을 실행시키면 기본적으로 몇개의 file이 오픈됩니다.&lt;/li&gt;
&lt;li&gt;이를 계산하면서 하기가 애매하니, 1100개를 보내면 기본 open된 파일 + 추가 생성된 파일을 합쳐서 1024개가 넘어가는 시점에 에러가 발생한다는 계산입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;API 요청을 받아, 20분간 대기시켜줄 서버로 ec2를 한대 더 생성합니다.&lt;/p&gt;
&lt;p&gt;테스트에 사용한 코드는 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;요청을 보낼 메소드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eYZeLc/btquPLFVonT/hsEMCliHRciHUiSeC6yvPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eYZeLc/btquPLFVonT/hsEMCliHRciHUiSeC6yvPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eYZeLc/btquPLFVonT/hsEMCliHRciHUiSeC6yvPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeYZeLc%2FbtquPLFVonT%2FhsEMCliHRciHUiSeC6yvPk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RestTemplate 타임아웃이 먼저 나면 안되기 때문에 타임아웃을 30분으로 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;요청을 받을 메소드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNoWy3/btquNvxNWLG/xvsYwMHZMkRVOj1IUfAkT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNoWy3/btquNvxNWLG/xvsYwMHZMkRVOj1IUfAkT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNoWy3/btquNvxNWLG/xvsYwMHZMkRVOj1IUfAkT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNoWy3%2FbtquNvxNWLG%2FxvsYwMHZMkRVOj1IUfAkT1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;자 그리고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동시에 1100개의 요청&lt;/b&gt;을 보낼수 있도록 간단한 비동기 요청 스크립트를 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1tUx/btquP4kXd1H/ZOBrssKwIqpTv4hCzPJrK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1tUx/btquP4kXd1H/ZOBrssKwIqpTv4hCzPJrK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1tUx/btquP4kXd1H/ZOBrssKwIqpTv4hCzPJrK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1tUx%2FbtquP4kXd1H%2FZOBrssKwIqpTv4hCzPJrK1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(실제 운영환경에선&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://naver.github.io/ngrinder/&quot;&gt;Ngrinder&lt;/a&gt;등을 통해서 하겠지만, 여기선 간단한 테스트이니 스크립트로 대체합니다.)&lt;/p&gt;
&lt;p&gt;준비가 다 되었으니 한번 테스트를 진행해보겠습니다!&lt;/p&gt;
&lt;p&gt;&amp;hellip;..&lt;/p&gt;
&lt;p&gt;테스트를 진행하자마자 바로 에러가 발생했습니다.&lt;br /&gt;로그를 확인해보니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEow8w/btquOoEEPoI/CqSyCgLQSlN9SbgPLimIxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEow8w/btquOoEEPoI/CqSyCgLQSlN9SbgPLimIxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEow8w/btquOoEEPoI/CqSyCgLQSlN9SbgPLimIxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEow8w%2FbtquOoEEPoI%2FCqSyCgLQSlN9SbgPLimIxK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;단순 쓰레드 생성과 달리,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;EC2의 서버 메모리가 먼저 부족&lt;/b&gt;해져서 EC2 사양을 높여서 다시 실험하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2ykG9/btquNF7Ytyb/6AflInWs7oAsCwMDuprNoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2ykG9/btquNF7Ytyb/6AflInWs7oAsCwMDuprNoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2ykG9/btquNF7Ytyb/6AflInWs7oAsCwMDuprNoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2ykG9%2FbtquNF7Ytyb%2F6AflInWs7oAsCwMDuprNoK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(t2.micro는 메모리가 1GB인지라, t2.large (8GB) 로 변경합니다.)&lt;/p&gt;
&lt;p&gt;업데이트된 EC2의&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p641H/btquO7h80BL/jnHxspq9g12Zalk5zqSOb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p641H/btquO7h80BL/jnHxspq9g12Zalk5zqSOb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p641H/btquO7h80BL/jnHxspq9g12Zalk5zqSOb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp641H%2FbtquO7h80BL%2FjnHxspq9g12Zalk5zqSOb1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo2Jm0/btquN828cuf/Ft6h3XKbgnxR8m6rjxSikk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo2Jm0/btquN828cuf/Ft6h3XKbgnxR8m6rjxSikk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo2Jm0/btquN828cuf/Ft6h3XKbgnxR8m6rjxSikk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo2Jm0%2FbtquN828cuf%2FFt6h3XKbgnxR8m6rjxSikk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AWS EC2의 사양을 올릴수록&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes가 적절한 값으로 증가하는 것을 확인할 수 있습니다.&lt;br /&gt;이를 통해 알 수 있는 것은, AWS EC2를 사용하실 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes&lt;span&gt;&amp;nbsp;&lt;/span&gt;AWS 내부에서 인스턴스 사양에 맞게 적절한 값을 세팅해주니, 굳이 저희가 손댈필요는 없다는 것입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;자 그럼 다시 한번 테스트를 해보겠습니다.&lt;br /&gt;테스트용 서버에 프로젝트를 배포하고, 해당 프로젝트가 생성한 open file count를 아래 명령어로 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;ls&lt;/span&gt; &lt;span&gt;-l&lt;/span&gt; /proc/&lt;span&gt;$PID&lt;/span&gt;/fd | wc &lt;span&gt;-l&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldakf/btquO6Q5HWh/gzG8XtSelVmv2jNytDELx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldakf/btquO6Q5HWh/gzG8XtSelVmv2jNytDELx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldakf/btquO6Q5HWh/gzG8XtSelVmv2jNytDELx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fldakf%2FbtquO6Q5HWh%2FgzG8XtSelVmv2jNytDELx1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;PID를 찾고,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3mgW6/btquPLTrEFq/LtYzIwatbbNAFja4fnej40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3mgW6/btquPLTrEFq/LtYzIwatbbNAFja4fnej40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3mgW6/btquPLTrEFq/LtYzIwatbbNAFja4fnej40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3mgW6%2FbtquPLTrEFq%2FLtYzIwatbbNAFja4fnej40%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;생성된 open file 리스트를 확인할 수 있습니다.&lt;br /&gt;준비가 다 되었으니, 1100개 요청을 보내는 스크립트를 실행해봅니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA3XlJ/btquP30D8xd/AcsQcBzqmHpdw7xRejbs61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA3XlJ/btquP30D8xd/AcsQcBzqmHpdw7xRejbs61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA3XlJ/btquP30D8xd/AcsQcBzqmHpdw7xRejbs61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA3XlJ%2FbtquP30D8xd%2FAcsQcBzqmHpdw7xRejbs61%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;엇?&lt;br /&gt;결과가 뭔가 이상합니다.&lt;br /&gt;분명&lt;span&gt;&amp;nbsp;&lt;/span&gt;open files의 값은 1024개로 되어있는데 1330개가 열려있다고 나오다니요.&lt;/p&gt;
&lt;p&gt;이상하다는 생각에 스크립트를 몇번 더 실행합니다.&lt;br /&gt;(한번 실행때마다 1100개의 요청이 간다고 생각하시면 됩니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTN2u/btquN8IRj5P/nxYwjx4TxyBDLTmL16vF90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTN2u/btquN8IRj5P/nxYwjx4TxyBDLTmL16vF90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTN2u/btquN8IRj5P/nxYwjx4TxyBDLTmL16vF90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTN2u%2FbtquN8IRj5P%2FnxYwjx4TxyBDLTmL16vF90%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;2번을 추가로 더 실행해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;3300개의 요청이 갔음에도 에러없이 처리&lt;/b&gt;되고 있습니다.&lt;br /&gt;언제 터지는지 확인하기 위해 추가로 더 요청해봅니다 (총 4400개가 갑니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnOHgu/btquO8aiAd2/pQjeEJYxiRVtg7t4C9Ryu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnOHgu/btquO8aiAd2/pQjeEJYxiRVtg7t4C9Ryu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnOHgu/btquO8aiAd2/pQjeEJYxiRVtg7t4C9Ryu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnOHgu%2FbtquO8aiAd2%2FpQjeEJYxiRVtg7t4C9Ryu1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;드디어 Open File 에러가 발생했습니다!&lt;br /&gt;보시면 4097개까지만 열린채로 에러가 발생한 것을 알 수 있는데요.&lt;br /&gt;&lt;b&gt;이전 요청이 3532개를 생성했으니 추가로 1100개를 요청하면 4600개 이상이 생성되어야&lt;/b&gt;하는데 왜 4097개까지만 생성된 것인지 궁금합니다.&lt;/p&gt;
&lt;p&gt;혹시나 하는 마음에&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit -aH로 soft가 아닌, hard옵션을 확인해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXaMSV/btquOHYkBEM/kmxNq4AdO1h4vxboS5kBL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXaMSV/btquOHYkBEM/kmxNq4AdO1h4vxboS5kBL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXaMSV/btquOHYkBEM/kmxNq4AdO1h4vxboS5kBL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXaMSV%2FbtquOHYkBEM%2FkmxNq4AdO1h4vxboS5kBL0%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;오?&lt;br /&gt;마침 딱 4096개 입니다!&lt;br /&gt;프로세스별 open file은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;soft 값이 아닌 hard 값까지 생성&lt;/b&gt;가능한게 아닐까? 라는 추측이 됩니다.&lt;br /&gt;검증하기 위해 hard의 open files를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;5120&lt;/b&gt;개로 증가시킵니다.&lt;br /&gt;(soft 옵션은 그대로 1024개 입니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm0lfo/btquP4ebVOG/9Y2bZVachiI4FR6y2ikP8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm0lfo/btquP4ebVOG/9Y2bZVachiI4FR6y2ikP8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm0lfo/btquP4ebVOG/9Y2bZVachiI4FR6y2ikP8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm0lfo%2FbtquP4ebVOG%2F9Y2bZVachiI4FR6y2ikP8K%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;자 그리고 다시 요청을 진행해보겠습니다.&lt;br /&gt;이번에 4096개가 넘는 요청이 가능해진다면 soft가 아닌, hard 값까지 생성 가능하다는걸 알수있겠죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewh7CJ/btquNvxNW3h/ckSjT73fCtwIoHfXtyJRB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewh7CJ/btquNvxNW3h/ckSjT73fCtwIoHfXtyJRB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewh7CJ/btquNvxNW3h/ckSjT73fCtwIoHfXtyJRB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fewh7CJ%2FbtquNvxNW3h%2FckSjT73fCtwIoHfXtyJRB1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;예상대로 4000개가 넘는 API 요청 (4635)이 가능해졌습니다!&lt;/p&gt;
&lt;p&gt;실제로&lt;span&gt;&amp;nbsp;&lt;/span&gt;ulimit -a로 확인할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;soft 값으로 소켓 생성이 제한되지는 않는다&lt;/b&gt;는 것을 알 수 있습니다.&lt;br /&gt;결국&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;소켓 생성 제한은 hard 옵션에 따라간다&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;라는 이야기가 됩니다&amp;hellip;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KD9ha/btquOFTItCS/kxpiixOWK7CUemBgjv76c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KD9ha/btquOFTItCS/kxpiixOWK7CUemBgjv76c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KD9ha/btquOFTItCS/kxpiixOWK7CUemBgjv76c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKD9ha%2FbtquOFTItCS%2FkxpiixOWK7CUemBgjv76c0%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 글을 마무리하려던중, 깜짝 놀랄 이야기를 들었습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;파이썬은 안그러는데요?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;추가&quot;&gt;추가&lt;/h3&gt;
&lt;p&gt;제보를 해주신 배민찬의 모 선임님과 함께 확인을 해봤습니다.&lt;br /&gt;soft limit으로 1024, hard limit으로 4096인걸 확인하고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파이썬 스크립트로 file을 임의로&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;열어봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv4l2n/btquM9V1Fhx/VWcEHh7Ia8QEDkDkDqzh2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv4l2n/btquM9V1Fhx/VWcEHh7Ia8QEDkDkDqzh2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv4l2n/btquM9V1Fhx/VWcEHh7Ia8QEDkDkDqzh2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv4l2n%2FbtquM9V1Fhx%2FVWcEHh7Ia8QEDkDkDqzh2K%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;여기서 3개를 빼야하는 이유는 stdin, stdout, stderr의 표준 입/출력이 포함됐기 때문입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1021개에서 1개를 더 추가하니 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;Too many open files&lt;span&gt;&amp;nbsp;&lt;/span&gt;Error가 발생합니다!&lt;br /&gt;헉? soft 옵션이 파이썬에서 잘 적용된걸까요?&lt;/p&gt;
&lt;p&gt;진짜 그런지 한번 더 확인해봅니다.&lt;br /&gt;open files soft 값을 2000으로 증가시킨후 다시 1997개가 넘는 file을 open 해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQjHN/btquOoxT8YJ/0nKou1RlTOaSbdN6mDTtnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQjHN/btquOoxT8YJ/0nKou1RlTOaSbdN6mDTtnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQjHN/btquOoxT8YJ/0nKou1RlTOaSbdN6mDTtnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQjHN%2FbtquOoxT8YJ%2F0nKou1RlTOaSbdN6mDTtnK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;여기서도 마찬가지로 1997개 이상 file open시에 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;Too many open files&lt;span&gt;&amp;nbsp;&lt;/span&gt;Error가 발생합니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;왜 파이썬은 soft옵션까지만 file이 오픈되고, Java에선 hard 옵션까지 file이 오픈되는건지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상했습니다.&lt;/p&gt;
&lt;p&gt;이상하단 생각에&lt;span&gt;&amp;nbsp;&lt;/span&gt;strace로 JVM 로그를 확인해보니!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJQvYI/btquNvxNWWL/6GkQEP9uEn0DjSRcZpO69k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJQvYI/btquNvxNWWL/6GkQEP9uEn0DjSRcZpO69k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJQvYI/btquNvxNWWL/6GkQEP9uEn0DjSRcZpO69k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJQvYI%2FbtquNvxNWWL%2F6GkQEP9uEn0DjSRcZpO69k%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이렇게&lt;span&gt;&amp;nbsp;&lt;/span&gt;setrlimit으로 limit을 업데이트하는 로그가 찍혀있습니다!&lt;/p&gt;
&lt;p&gt;왜 이런 로그가 발생했는지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html&quot;&gt;오라클 Java 옵션&lt;/a&gt;을 찾아봤습니다.&lt;br /&gt;문서에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;MaxFDLimit&lt;span&gt;&amp;nbsp;&lt;/span&gt;라는 옵션이 있었는데요, 뭔가 file limit과 관련돼 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEb2N9/btquNEOJSOr/XDAUKCsl4fgJcjUUAp3T40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEb2N9/btquNEOJSOr/XDAUKCsl4fgJcjUUAp3T40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEb2N9/btquNEOJSOr/XDAUKCsl4fgJcjUUAp3T40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEb2N9%2FbtquNEOJSOr%2FXDAUKCsl4fgJcjUUAp3T40%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 옵션이 뭔지 찾아보니&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/dmlloyd/openjdk/blob/c3f27ada97987466e9c6e33e02e676bd69b78664/src/hotspot/os/linux/os_linux.cpp#L4998&quot;&gt;openjdk&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;코드에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이 옵션이 true일 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;setrlimit&lt;span&gt;&amp;nbsp;&lt;/span&gt;으로 limit을 증가&lt;/b&gt;시키는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5TO3/btquM7YdyDA/n3UK2n7uPYpPDCpCCuNYH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5TO3/btquM7YdyDA/n3UK2n7uPYpPDCpCCuNYH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5TO3/btquM7YdyDA/n3UK2n7uPYpPDCpCCuNYH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5TO3%2FbtquM7YdyDA%2Fn3UK2n7uPYpPDCpCCuNYH1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그리고 설치된 Java의&lt;span&gt;&amp;nbsp;&lt;/span&gt;MaxFDLimit&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;기본값이 true&lt;/b&gt;임을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Drs5d/btquN8B7jEb/bK32Tgl6FRIAkmLFzNNmr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Drs5d/btquN8B7jEb/bK32Tgl6FRIAkmLFzNNmr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Drs5d/btquN8B7jEb/bK32Tgl6FRIAkmLFzNNmr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrs5d%2FbtquN8B7jEb%2FbK32Tgl6FRIAkmLFzNNmr1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;리눅스 OS 환경에서는 JDK 실행시 자동으로 limit 사이즈를 증가&lt;/b&gt;시켜준다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;결론&quot;&gt;결론&lt;/h2&gt;
&lt;p&gt;위 2개의 실험으로 얻은 결론입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java에서 동시에 생성 가능한 쓰레드 수는&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes를 따라간다.&lt;/li&gt;
&lt;li&gt;Java에서 소켓 통신(HTTP API, JDBC 커넥션 등)은&lt;span&gt;&amp;nbsp;&lt;/span&gt;open file&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 따라간다.
&lt;ul&gt;
&lt;li&gt;단, JDK 내부 코드상에서 hard limit 값이 soft limit에 update된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;참고로 Tomcat은 8 버전부터 기본 Connector 방식을 NIO로 사용합니다.&lt;br /&gt;(7 버전까지는 BIO)&lt;br /&gt;그러다보니 maxConnections은 10,000, maxThreads는 200이 기본값입니다.&lt;br /&gt;(BIO에서는 둘의 값이 동일해야 합니다)&lt;br /&gt;이번 테스트에서 사용되는 connection 수가 1만을 넘지 않기 때문에 기본옵션으로 진행했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;번외-limit-옵션-설정방법&quot;&gt;번외) limit 옵션 설정방법&lt;/h2&gt;
&lt;p&gt;보통 soft limit과 hard limit을 다르게 설정하진 않습니다.&lt;br /&gt;&lt;b&gt;둘의 값을 동일하게 적용&lt;/b&gt;하는데요.&lt;br /&gt;서버의 open files, max user processes등 옵션을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;permanent (영구) 적용&lt;/b&gt;하기 위해선&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/security/limits.conf&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 수정하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLWJv6/btquM9hteg8/RwykfEDJ4ZN37mXJGgRu01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLWJv6/btquM9hteg8/RwykfEDJ4ZN37mXJGgRu01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLWJv6/btquM9hteg8/RwykfEDJ4ZN37mXJGgRu01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLWJv6%2FbtquM9hteg8%2FRwykfEDJ4ZN37mXJGgRu01%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;맨 앞의&lt;span&gt;&amp;nbsp;&lt;/span&gt;*가 있는 자리는 사용자 계정을 나타냅니다.&lt;br /&gt;ec2-user로 지정하시면 ec2-user 계정에서만 옵션이 적용되는데요.&lt;br /&gt;이미지처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;*로 지정하시면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 사용자 계정&lt;/b&gt;에 옵션이 적용됩니다.&lt;/p&gt;
&lt;p&gt;이렇게 적용후, 다시 접속해서 확인해보시면!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bir7sR/btquO55JO8W/k1Gl5zV5ycriOGtz18e8p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bir7sR/btquO55JO8W/k1Gl5zV5ycriOGtz18e8p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bir7sR/btquO55JO8W/k1Gl5zV5ycriOGtz18e8p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbir7sR%2FbtquO55JO8W%2Fk1Gl5zV5ycriOGtz18e8p1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;옵션이 잘 적용되어있음을 확인할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;마무리&quot;&gt;마무리&lt;/h2&gt;
&lt;p&gt;제가 준비한 내용은 여기까지입니다.&lt;br /&gt;좋은 기회로 그 동안 막연하게 알고 있던&lt;span&gt;&amp;nbsp;&lt;/span&gt;max user processes,&lt;span&gt;&amp;nbsp;&lt;/span&gt;open file를 제대로 정리해볼 수 있었습니다.&lt;/p&gt;
&lt;p&gt;부족함이 많은 글임에도 끝까지 읽어주셔서 감사합니다.&lt;br /&gt;다음에도 이와 같이 기본적인 내용이지만, 프로젝트에서 도움을 받는 일이 발생한다면 잘 정리해서 공유드리겠습니다.&lt;br /&gt;그럼, 다음에 또 뵙겠습니다.&lt;br /&gt;감사합니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYj9p0/btquNuMpx79/SMo0ihuWLLNHaWNdHE8v70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYj9p0/btquNuMpx79/SMo0ihuWLLNHaWNdHE8v70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYj9p0/btquNuMpx79/SMo0ihuWLLNHaWNdHE8v70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYj9p0%2FbtquNuMpx79%2FSMo0ihuWLLNHaWNdHE8v70%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(사용된 모든 짤은 레진코믹스의 레바툰입니다.)&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://faq.hostway.co.kr/Linux_ETC/7179&quot;&gt;호스트웨이 ulimit 설정관련&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://meetup.toast.com/posts/53&quot;&gt;리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JAVA</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/30</guid>
      <comments>https://since.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 25 Apr 2019 15:10:19 +0900</pubDate>
    </item>
    <item>
      <title>Google Cloud의 Speech API 사용해보기</title>
      <link>https://since.tistory.com/29</link>
      <description>&lt;h2 id=&quot;google-cloud의-speech-api-사용해보기&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 30px; text-align: center;&quot;&gt;Google Cloud의 Speech API 사용해보기&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 내용은&amp;nbsp;https://jungwoon.github.io/google%20cloud/2018/01/17/Speech-Api/ 사이트가 출처 입니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;이번에는 구글의 Speech API를 한번 정리해보도록 하겠습니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;Speech API는 구글의 머신러닝 기술을 이용하여 음성을 분석해주는 기술입니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;크게 아래와 같은 기능들을 이용할 수 있습니다.&lt;/p&gt;&lt;ol style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;오디오를 텍스트로 변경&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;노이즈 켄슬링&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;스트리밍 제공&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;전 세계 80가지 이상의 언어와 방언을 인식&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;자세한 부분은&amp;nbsp;&lt;a href=&quot;https://cloud.google.com/speech/docs/&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(64, 64, 64); text-decoration-line: underline;&quot;&gt;공식 문서&lt;/a&gt;를 확인해주세요&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;사전-준비&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;사전 준비&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;이제 개발을 하기 전에 필요한 사전 설정부분에 대해서 설명 드립니다.&lt;/p&gt;&lt;h4 id=&quot;cloud-translation-api-사용-허용해주기&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 10px; margin-bottom: 10px; font-size: 18px;&quot;&gt;Cloud Translation API 사용 허용해주기&lt;/h4&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;먼저 Cloud Translation API의 사용 설정을 해줍니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;a href=&quot;https://console.cloud.google.com/&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(64, 64, 64); text-decoration-line: underline;&quot;&gt;Google Cloud Console&lt;/a&gt;에서 아래와 같이&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;speech&lt;/code&gt;로 검색을 해줍니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*LNhNcJo8TclXr3lgO4GRzA.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;아래와 같이 나오면&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;사용 설정&lt;/code&gt;을 눌러서 API를 Enable 해줍니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*mpTQuvjXz5oQ5YSmT8fbVA.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;h4 id=&quot;gcloud-sdk-설치-후-인증받기&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 10px; margin-bottom: 10px; font-size: 18px;&quot;&gt;gcloud sdk 설치 후 인증받기&lt;/h4&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;우선&amp;nbsp;&lt;a href=&quot;https://jungwoon.github.io/google%20cloud/2017/10/26/install-gcloud/&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(64, 64, 64); text-decoration-line: underline;&quot;&gt;Google Cloud SDK(=gcloud) 설치하기&lt;/a&gt;를 참고하여 gcloud 설치를 먼저 해줍니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그 다음&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;gcloud auth login&lt;/code&gt;을 터미널에 입력을 해줍니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/600/1*O1KuxZdZw_KBfmxunh2yWg.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그럼 아래와 같이 브라우저가 뜨면서 구글 계정을 선택하는 화면이 나오는데, 해당 프로젝트 계정을 클릭합니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*7RKsET0X_n7kK6kWQ1CYQQ.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그럼 다음과 같이 권한 요청이 나오는데,&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;허용&lt;/code&gt;을 누릅니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1600/1*vcKxHlphpBcUkA6BuvzRBg.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h4 id=&quot;서비스-계정키를-다운-받아서-bashrc에-등록하기-및-사용설정하기&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 10px; margin-bottom: 10px; font-size: 18px;&quot;&gt;서비스 계정키를 다운 받아서 .bashrc에 등록하기 및 사용설정하기&lt;/h4&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;GCP 서비스를 이용하기 위한 서비스 계정 키를 얻기 위해&amp;nbsp;&lt;a href=&quot;http://console.cloud.google.com/&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(64, 64, 64); text-decoration-line: underline;&quot;&gt;Google Cloud Console&lt;/a&gt;에서&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;메뉴 - API 및 서비스 - 서비스 계정&lt;/code&gt;을 누릅니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*4-ZoTgS8yilA_0Gskcg_Yg.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;아래와 같이 나오면 우측에 메뉴를 누르고&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;키 만들기&lt;/code&gt;를 누릅니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*VsgBvxgCVepRa4JuxOyo9A.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그럼 아래와 같이&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;JSON&lt;/code&gt;&amp;nbsp;또는&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;P12&lt;/code&gt;를 선택하라고 하는데 여기서는 JSON을 선택하고&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;생성&lt;/code&gt;&amp;nbsp;버튼을 누릅니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*PDkxgzEXHL2Dczop6thgqw.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그럼 자동으로 Local로 다운로드 받아지게 됩니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;(한번밖에 다운로드 되지 않기 때문에 잘 보관해야 합니다)&lt;/code&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*9J42lsbpxj98C2lS3MOPtQ.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그 다음&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;vi ~/.bashrc&lt;/code&gt;를 입력을 합니다. (다른 쉘을 쓰면 거기에 맞는걸 열어줍니다)&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*QumrcEfuwN2NPo_nnxM_Yw.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;아래의 105번 라인과 같이 위에서 다운받은 서비스 계정 키의 경로를&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt;에 넣어줍니다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*E0fpt06SLamFdXSakReqnQ.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;## Google Cloud
export GOOGLE_CLOUD_SDK_PATH=/Users/jungwoon/google-cloud-sdk
export PATH=$PATH:$GOOGLE_CLOUD_SDK_PATH/bin
export GOOGLE_APPLICATION_CREDENTIALS=/Users/jungwoon/GoogleCredential/bigquerybyjw.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그 다음 터미널에서&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;$ gcloud auth application-default login&lt;/code&gt;을 해주어야 합니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*WdGVW0xeXmda4UijQGPSPg.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그럼 아래와 같이 나오는데 여기서&amp;nbsp;&lt;code class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 18px; padding: 2px 4px; color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px;&quot;&gt;Y&lt;/code&gt;를 눌러서 진행을 합니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*JP_MMkFHJA0tMuu1PBjfuA.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;그 다음 브로우저가 열리면서 어떤 계정에 연결을 할건지에 대해서 나오는데, 연결하고자 하는 계정을 클릭합니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1200/1*iG56mP8w2EKHFiVbzqOiOg.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;마지막으로 아래와 같은 화면에서 허용을 해주어야 사용할 수 있게 됩니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1000/1*DiQZv3P_SrVSn0mGZnFgdw.png&quot; alt=&quot;&quot; class=&quot;img-responsive&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle; display: block; max-width: 100%; height: auto;&quot;&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;실습&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;실습&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;진행은 JAVA로 진행하려고 하고, 먼저 Client Library를 가져오는 방법에 대해서 봐보도록 하겠습니다.&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h4 id=&quot;maven-설정&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 10px; margin-bottom: 10px; font-size: 18px;&quot;&gt;Maven 설정&lt;/h4&gt;&lt;div class=&quot;language-xml highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.google.cloud&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;google-cloud-speech&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.32.0-alpha&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: navy;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h4 id=&quot;gradle-설정&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 10px; margin-bottom: 10px; font-size: 18px;&quot;&gt;Gradle 설정&lt;/h4&gt;&lt;div class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;compile 'com.google.cloud:google-cloud-speech:0.32.0-alpha'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;실습-1&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;실습&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;소스 자체가 크게 어렵지는 않기 때문에, 소스내의 주석을 통해서 설명을 하도록 하겠습니다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin: 30px 0px; line-height: 1.5; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;크게 1분 이하의 오디오 파일을 분석하는 소스와 1분 이상의 오디오 파일을 분석하는 소스로 구분하였습니다.&lt;/p&gt;&lt;div class=&quot;language-java highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;com.google.cloud.speech.v1.*&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;com.google.protobuf.ByteString&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.io.IOException&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Files&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Path&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Paths&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.util.List&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;SpeechApiTest&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;./audio.raw&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionSpeech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 1분 미만의 오디오 파일일때&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;recognitionSpeech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechClient&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechClient&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Client 생성&lt;/span&gt;
            
            &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 오디오 파일에 대한 설정부분&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setEncoding&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;AudioEncoding&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;LINEAR16&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setSampleRateHertz&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(0, 153, 153);&quot;&gt;16000&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setLanguageCode&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;en-US&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;getRecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Audio 파일에 대한 RecognitionAudio 인스턴스 생성&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognizeResponse&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;recognize&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 요청에 대한 응답&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionResult&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getResultsList&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 응답 결과들&lt;/span&gt;

            &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionResult&lt;/span&gt; &lt;span class=&quot;nl&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;result:&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionAlternative&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;alternative&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getAlternativesList&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(0, 153, 153);&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;Transcription: %s%n&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;alternative&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getTranscript&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;());&lt;/span&gt;
            &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Local 이나 Remote이거나 구분해서 RecognitionAudio 만들어 주는 부분&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;getRecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;IOException&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 파일이 GCS에 있는 경우&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;gs://&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setUri&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 파일이 로컬에 있는 경우&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Path&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Paths&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Files&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;readAllBytes&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;ByteString&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audioBytes&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;ByteString&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;copyFrom&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setContent&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audioBytes&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;결과&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;결과&lt;/h3&gt;&lt;div class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;
Transcription: how old is the Brooklyn Bridge

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;소스&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;소스&lt;/h3&gt;&lt;div class=&quot;language-java highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;com.google.api.gax.longrunning.OperationFuture&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;com.google.cloud.speech.v1.*&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;com.google.protobuf.ByteString&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.io.IOException&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Files&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Path&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.nio.file.Paths&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(85, 85, 85);&quot;&gt;java.util.List&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;SpeechApiTest&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;gs://myfiles-byjw/vr.flac&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;longRecognitionSpeech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 1분 이상의 오디오 파일일때, (** GCS에 올려서 이용해야 함)&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;longRecognitionSpeech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechClient&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechClient&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;


            &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 오디오 파일에 대한 설정부분&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setEncoding&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionConfig&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;AudioEncoding&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;FLAC&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setSampleRateHertz&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(0, 153, 153);&quot;&gt;16000&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setLanguageCode&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;en-US&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;getRecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Audio 파일에 대한 RecognitionAudio 인스턴스 생성&lt;/span&gt;

            &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Non-Blocking 으로 호출을 하며 긴 파일 일때는 LongRunningRecognizeResponse를 사용함&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;OperationFuture&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;LongRunningRecognizeResponse&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;LongRunningRecognizeMetadata&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt;
                    &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;longRunningRecognizeAsync&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;isDone&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;Waiting for response...&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(0, 153, 153);&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionResult&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getResultsList&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionResult&lt;/span&gt; &lt;span class=&quot;nl&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;result:&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;SpeechRecognitionAlternative&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;alternative&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getAlternativesList&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(0, 153, 153);&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;Transcription: %s\n&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;alternative&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;getTranscript&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;());&lt;/span&gt;
            &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;speech&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// Local 이나 Remote이거나 구분해서 RecognitionAudio 만들어 주는 부분&lt;/span&gt;
    &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 0, 0); font-weight: bold;&quot;&gt;getRecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;IOException&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 파일이 GCS에 있는 경우&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(221, 17, 68);&quot;&gt;&quot;gs://&quot;&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setUri&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(153, 153, 136); font-style: italic;&quot;&gt;// 파일이 로컬에 있는 경우&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Path&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Paths&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;kt&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: rgb(68, 85, 136); font-weight: bold;&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;Files&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;readAllBytes&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;ByteString&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audioBytes&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;ByteString&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;copyFrom&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;RecognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;newBuilder&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;setContent&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;audioBytes&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;box-sizing: border-box; white-space: nowrap; color: teal;&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;box-sizing: border-box; white-space: nowrap;&quot;&gt;recognitionAudio&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot; style=&quot;box-sizing: border-box; white-space: nowrap; font-weight: bold;&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-right: 0px; border-bottom: 0px; border-left: 0px; border-image: initial; border-top-style: solid; border-top-color: rgb(238, 238, 238); color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;h3 id=&quot;결과-1&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; line-height: 1.1; color: rgb(64, 64, 64); margin-top: 20px; margin-bottom: 10px; font-size: 24px;&quot;&gt;결과&lt;/h3&gt;&lt;div class=&quot;highlighter-rouge&quot; style=&quot;box-sizing: border-box; color: rgb(64, 64, 64); font-family: Lora, &amp;quot;Times New Roman&amp;quot;, serif; font-size: 20px;&quot;&gt;&lt;div class=&quot;highlight&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;pre class=&quot;highlight&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 6px 10px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); border-radius: 3px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;&quot;&gt;Waiting for response...
Waiting for response...
Waiting for response...
Waiting for response...
Waiting for response...
Waiting for response...
Transcription: it's okay so what am I doing here why am I here at GDC talking about VR video it's because I believe my favorite games I love games I believe in games my favorite games are the ones that are all about the stories I love narrative game design I love narrative based games and I think that when it comes to telling stories in VR bring together capturing the world with narrative based games and narrative based game design is going to unlock some of the killer apps and killer stories of the medium
Transcription: so I'm really here looking for people who are interested in telling us or two stories that a&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Google</category>
      <category>Speech</category>
      <category>Speech To Text</category>
      <category>text</category>
      <category>음성</category>
      <category>음성 텍스트 변환</category>
      <category>텍스트</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/29</guid>
      <comments>https://since.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 13 Sep 2018 17:41:16 +0900</pubDate>
    </item>
    <item>
      <title>웹 취약점 (RSA 알고리즘) 로그인 아이디, 패스워드 암호화</title>
      <link>https://since.tistory.com/28</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;웹 취약점 (RSA 알고리즘) 로그인 아이디, 패스워드 암호화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;해커로 부터 웹 사이트를 방어하는 일은 생각보다 까다롭고 귀찮은 작업입니다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;HTTPS를 적용한다고 하더라도 인증서 교환 방식, Proxy 방식등 여러 기법들을 이용해서 해커는 사용자의 중요한 정보(패스워드, 계좌번호, 개인정보 등)를 훔쳐가게 됩니다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;여기서 다룰 내용은 완벽하게 해커가 해킹을 하지 못하게 한다기 보다는 해커가 중요정보를 가져가는 행위를 조금더 복잡하고 어렵게 하기 위한 방법입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;결국, 암호화라는 방식도 언젠가는 복호화가 되기 마련입니다.(키가 업더라도...)&amp;nbsp;단, 복호화에 들어가는 시간이 얼마나 걸리냐의 문제겠지요.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;RSA는 비대칭 방식으로 암호화 하여 공개키(공개된 키)와, 개인키를 이용한 암호화 방식입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;사용자가 로그인 시 아이디, 패스워드를 RSA공개키로 암호화해서, 중간에 패킷 스니핑, 패킷 덤프를 하더라도 사용자가 입력한 아이디, 패스워드를 해석이 불가능 하게 만드는 방법 입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;b&gt;[구현 흐름도]&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; list-style: none; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;1) 서버&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; -&amp;gt; 서버측에서 RSA 공개키와 개인키(비밀키)를 생성하여, 개인키는 세션에 저장하고 공개키는 자바스크립트 로그인 폼이 있는 페이지로 출력한다.&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;2) 클라이언트&amp;nbsp; &amp;nbsp; -&amp;gt; 로그인폼은 자바스크립트가 실행되지 않는 환경에서는 발행(submit)이 되면 안된다.&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;3) 클라이언트&amp;nbsp; &amp;nbsp; -&amp;gt; 로그인폼에 사용자의 ID와 비밀번호를 넣고 발행을 누르면 자바스크립트가 이를 가로챈다.&lt;/p&gt;&lt;ol style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; list-style: none;&quot;&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;4) 클라이언트&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; 사용자 ID를 RSA로 암호화하여 화면에 안보이는 새로운 폼에 저장한다.&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;5) 클라이언트&amp;nbsp; &amp;nbsp; -&amp;gt; 비밀번호를 RSA로 암호화하여 화면에 안보이는 새로운 폼에 저장한다.&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;6) 서버&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; -&amp;gt; 이제 화면에 안보이는 해당 폼을 서버로 발행한다.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;7) 서버&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt; 서버측에서 세션에 저장된 RSA개인키로 암호화된 사용자ID와 비밀번호를 복호화한다.&lt;/li&gt;&lt;li style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;&quot;&gt;8) 서버&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; -&amp;gt; 데이터베이스/혹은 기타 저장소에 저장된 사용자 ID와 비밀번호가 일치하는지 확인한다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;저는 위에 방식과 sha256 해시 알고리즘을 이용해서 DB에 저장되는 패스워드 엮시 단방향 해시 값으로 저장을 했습니다.&lt;/p&gt;&lt;p&gt;데이터베이스(DB) 해킹 시 사용자의 패스워드를 알아볼 수 없도록 단방향 해시를 적용한 것입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[준비물]&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/9975474A5B9856AB12&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; style=&quot;vertical-align: middle;&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;/&gt;RSA.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;[소스]&lt;/b&gt;&lt;/p&gt;&lt;p&gt;1) 로그인 화면&amp;nbsp;(세션을 이용하여 공개키의 문자열을 개인키로 저장 합니다)&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;1010&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 1010px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 1009px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204);&quot;&gt;&lt;p&gt;@RequestMapping(value = &quot;/login.do&quot;, method = RequestMethod.GET)&lt;/p&gt;&lt;p&gt;@Description(&quot;로그인 페이지&quot;)&lt;/p&gt;&lt;p&gt;public String login(Locale locale, Model model, final HttpServletResponse response, final HttpServletRequest request, final HttpSession session) throws Exception {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;KeyPairGenerator generator = KeyPairGenerator.getInstance(&quot;RSA&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;generator.initialize(2048);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;KeyPair keyPair = generator.genKeyPair();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;KeyFactory keyFactory = KeyFactory.getInstance(&quot;RSA&quot;);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;PublicKey publicKey = keyPair.getPublic();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;PrivateKey privateKey = keyPair.getPrivate();&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;// 세션에 공개키의 문자열을 키로하여 개인키를 저장한다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;session.setAttribute(&quot;_RSA_WEB_Key_&quot;, privateKey);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;// 공개키를 문자열로 변환하여 JavaScript RSA 라이브러리 넘겨준다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RSAPublicKeySpec publicSpec = keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;String publicKeyModulus = publicSpec.getModulus().toString(16);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;String publicKeyExponent = publicSpec.getPublicExponent().toString(16);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;request.setAttribute(&quot;publicKeyModulus&quot;, publicKeyModulus);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;request.setAttribute(&quot;publicKeyExponent&quot;, publicKeyExponent);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;return &quot;/login&quot;;&lt;/p&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2) 로그인 화면 (javascript) 순서를 정확히 맞춰야 함. (RSA.zip 파일 참조)&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;1009&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 1009px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 1008px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&lt;font color=&quot;#1f1f1f&quot; face=&quot;맑은 고딕, malgun gothic, 돋움, dotum, AppleGothic, sans-serif&quot;&gt;&lt;b&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;c:url value=&quot;/resources/js/jsbn.js&quot;/&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#1f1f1f&quot; face=&quot;맑은 고딕, malgun gothic, 돋움, dotum, AppleGothic, sans-serif&quot;&gt;&lt;b&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;c:url value=&quot;/resources/js/rsa.js&quot;/&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#1f1f1f&quot; face=&quot;맑은 고딕, malgun gothic, 돋움, dotum, AppleGothic, sans-serif&quot;&gt;&lt;b&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;c:url value=&quot;/resources/js/prng4.js&quot;/&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#1f1f1f&quot; face=&quot;맑은 고딕, malgun gothic, 돋움, dotum, AppleGothic, sans-serif&quot;&gt;&lt;b&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;c:url value=&quot;/resources/js/rng.js&quot;/&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3) 로그인 화면 (html)&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;1009&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 1009px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 1008px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204);&quot;&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;label for=&quot;username&quot;&amp;gt;사용자ID : &amp;lt;input type=&quot;text&quot; id=&quot;username&quot; size=&quot;16&quot;/&amp;gt;&amp;lt;/label&amp;gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for=&quot;password&quot;&amp;gt;비밀번호 : &amp;lt;input type=&quot;password&quot; id=&quot;password&quot; size=&quot;16&quot; /&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;hidden&quot; id=&quot;rsaPublicKeyModulus&quot; value=&quot;&amp;lt;%=publicKeyModulus%&amp;gt;&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;hidden&quot; id=&quot;rsaPublicKeyExponent&quot; value=&quot;&amp;lt;%=publicKeyExponent%&amp;gt;&quot; /&amp;gt;&lt;/strong&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href=&quot;&amp;lt;%=request.getContextPath()%&amp;gt;/loginFailure.jsp&quot; onclick=&quot;validateEncryptedForm(); return false;&quot;&amp;gt;로그인&amp;lt;/a&amp;gt;&lt;/strong&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id=&quot;securedLoginForm&quot; name=&quot;securedLoginForm&quot; action=&quot;&amp;lt;%=request.getContextPath()%&amp;gt;/login&quot; method=&quot;post&quot; style=&quot;display: none;&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;hidden&quot; name=&quot;securedUsername&quot; id=&quot;securedUsername&quot; value=&quot;&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;hidden&quot; name=&quot;securedPassword&quot; id=&quot;securedPassword&quot; value=&quot;&quot; /&amp;gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/form&amp;gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;위 html처럼 작업 해도 되고, 저의 경우 Ajax 방식을 이요해서 별도의 form 처리는 하지 않았습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4) 로그인 버튼 클릭 시(submit)&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;964&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:964;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p&gt;function validateEncryptedForm() {&lt;/p&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var username = document.getElementById(&quot;username&quot;).value;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var password = document.getElementById(&quot;password&quot;).value;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!username || !password) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;ID/비밀번호를 입력해주세요.&quot;);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var rsaPublicKeyModulus = document.getElementById(&quot;rsaPublicKeyModulus&quot;).value;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var rsaPublicKeyExponent = document.getElementById(&quot;rsaPublicKeyExponent&quot;).value;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; submitEncryptedForm(username,password, rsaPublicKeyModulus, rsaPublicKeyExponent);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch(err) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(err);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;submitEncryptedForm&lt;/span&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;(username, password, rsaPublicKeyModulus, rsaPpublicKeyExponent) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var rsa = new RSAKey();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rsa.setPublic(rsaPublicKeyModulus, rsaPpublicKeyExponent);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 사용자ID와 비밀번호를 RSA로 암호화한다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var securedUsername = rsa.encrypt(username);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var securedPassword = rsa.encrypt(password);&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; var securedLoginForm = document.getElementById(&quot;securedLoginForm&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; securedLoginForm.securedUsername.value = securedUsername;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; securedLoginForm.securedPassword.value = securedPassword;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; securedLoginForm.submit();&lt;br /&gt;}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;중요한 부분은 bold 처리된 부분입니다. 사용자가 입력한 아이디, 패스워드 부분을 RSA로 암호화 해서 form submit 하는 부분 입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5) 암호화된 아이디, 패스워드 복호화(java)&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;964&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:964;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;/p&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws ServletException, IOException {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String securedUsername = request.getParameter(&quot;securedUsername&quot;);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String securedPassword = request.getParameter(&quot;securedPassword&quot;);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpSession session = request.getSession();&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrivateKey privateKey = (PrivateKey) session.getAttribute(&quot;&lt;/strong&gt;&lt;span style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif; font-weight: bold;&quot;&gt;__rsaPrivateKey__&lt;/span&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; session.removeAttribute(&quot;__rsaPrivateKey__&quot;); // 키의 재사용을 막는다. 항상 새로운 키를 받도록 강제.&lt;/strong&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (privateKey == null) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new RuntimeException(&quot;암호화 비밀키 정보를 찾을 수 없습니다.&quot;);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String username = decryptRsa(privateKey, securedUsername);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String password = decryptRsa(privateKey, securedPassword);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.setAttribute(&quot;username&quot;, username);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.setAttribute(&quot;password&quot;, password);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.getRequestDispatcher(&quot;/WEB-INF/views/login.jsp&quot;).forward(request, response);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ServletException(ex.getMessage(), ex);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String decryptRsa(PrivateKey privateKey, String securedValue) throws Exception {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;will decrypt : &quot; + securedValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cipher cipher = Cipher.getInstance(&quot;RSA&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] encryptedBytes = hexToByteArray(securedValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cipher.init(Cipher.DECRYPT_MODE, privateKey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] decryptedBytes = cipher.doFinal(encryptedBytes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String decryptedValue = new String(decryptedBytes, &quot;utf-8&quot;); // 문자 인코딩 주의.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return decryptedValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 16진 문자열을 byte 배열로 변환한다.&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static byte[] hexToByteArray(String hex) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hex == null || hex.length() % 2 != 0) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new byte[]{};&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] bytes = new byte[hex.length() / 2];&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; hex.length(); i += 2) {&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte value = (byte)Integer.parseInt(hex.substring(i, i + 2), 16);&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytes[(int) Math.floor(i / 2)] = value;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bytes;&lt;/span&gt;&lt;br style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&lt;span style=&quot;color: rgb(31, 31, 31); font-family: &amp;quot;맑은 고딕&amp;quot;, &amp;quot;malgun gothic&amp;quot;, 돋움, dotum, AppleGothic, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;결론적으론, 세션에 개인키를 저장하는 방식의 RSA 암호화 기법을 사용하므로 세션 해킹 기법을 이용한다면, 위에 언급한 RSA 방식도 안전하진 못하지만 세션 해킹 기법을 막기위한 token 기법과 동시에 적용 한다면, 만족한 형태의 보안 처리가 될 것 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CC인증을 하기 위해서 위에 내용은 필수이므로, 반드시 로그인 처리 시 적용을 해야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>웹 보안 (CC인증)</category>
      <category>CC인증</category>
      <category>RSA</category>
      <category>개인키</category>
      <category>공개키</category>
      <category>보안</category>
      <category>암호화</category>
      <category>웹취약점</category>
      <category>인증</category>
      <category>패스워드 보안</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/28</guid>
      <comments>https://since.tistory.com/28#entry28comment</comments>
      <pubDate>Wed, 12 Sep 2018 09:12:15 +0900</pubDate>
    </item>
    <item>
      <title>메이븐(MAVEN) RPM 플러그인으로 RPM 생성하기</title>
      <link>https://since.tistory.com/27</link>
      <description>&lt;h2 style=&quot;margin: 0px; padding: 0px; font-size: 1.2em; line-height: 1.2em; color: rgb(102, 102, 102); font-family: Dotum, Verdana, AppleGothic, sans-serif; text-align: center;&quot;&gt;메이븐(MAVEN) RPM 플러그인으로 RPM 생성하기&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;최근 수행한 프로젝트에서 스프링부트로 만든 어플리케이션의 최종 빌드 모습은 다음과 같았다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;li&gt;myapp.war&lt;/li&gt;&lt;li&gt;myapp-run.sh&lt;/li&gt;&lt;li&gt;conf/application.properties&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;myapp을 yum으로 설치해야 한다는 요구사항이 생겨서 위 파일들을 rpm 파일로 만들어야 할 일이 생겼다. 다행히 메이븐의&amp;nbsp;&lt;a href=&quot;http://www.mojohaus.org/rpm-maven-plugin/index.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;color: rgb(102, 102, 102);&quot;&gt;rpm-maven-plugin 플러그인&lt;/a&gt;을 사용하면 쉽게 rpm 파일을 만들 수 있다.&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;* 참고로, rpm-maven-plugin은 rpmbuild를 사용하므로 rpmbuild를 먼저 설치해야 rpm-maven-plugin이 올바르게 동작한다.&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;rpm-maven-plugin 설정 예제&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;다음은 rpm-maven-plugin의 설정 예제이다.&lt;/p&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; border: 1px solid rgb(193, 193, 193); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;lt;build&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;plugins&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;plugin&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;rpm-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;2.0.1&amp;lt;/version&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;executions&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;execution&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;phase&amp;gt;none&amp;lt;/phase&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goals&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;goal&amp;gt;rpm&amp;lt;/goal&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/goals&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/execution&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/executions&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;configuration&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;copyright&amp;gt;2016, MyCompany&amp;lt;/copyright&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;group&amp;gt;Development&amp;lt;/group&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;description&amp;gt;Maven Recipe: RPM Package.&amp;lt;/description&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;release&amp;gt;0&amp;lt;/release&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;autoRequires&amp;gt;false&amp;lt;/autoRequires&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;preinstallScriptlet&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;scriptFile&amp;gt;src/main/package/rpm/preinstall.sh&amp;lt;/scriptFile&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;fileEncoding&amp;gt;utf-8&amp;lt;/fileEncoding&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/preinstallScriptlet&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;defaultDirmode&amp;gt;755&amp;lt;/defaultDirmode&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;defaultFilemode&amp;gt;644&amp;lt;/defaultFilemode&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;defaultUsername&amp;gt;root&amp;lt;/defaultUsername&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;defaultGroupname&amp;gt;root&amp;lt;/defaultGroupname&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mappings&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;directory&amp;gt;/usr/local/myapp&amp;lt;/directory&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;location&amp;gt;${project.basedir}/target/myapp-${project.version}.war&amp;lt;/location&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;directory&amp;gt;/usr/local/myapp&amp;lt;/directory&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;filemode&amp;gt;755&amp;lt;/filemode&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;location&amp;gt;${project.basedir}/bin/myapp-run.sh&amp;lt;/location&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;directory&amp;gt;/usr/local/myapp/conf&amp;lt;/directory&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;location&amp;gt;${project.basedir}/conf&amp;lt;/location&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/source&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/sources&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mapping&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/mappings&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/plugin&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/plugins&amp;gt;&lt;/p&gt;&lt;p style=&quot;padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&amp;lt;mapping&amp;gt;에서 각 요소는 다음을 의미한다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;li&gt;&amp;lt;directory&amp;gt; : 파일 복사 위치. RPM 설치 과정에서 생성한다.&lt;/li&gt;&lt;li&gt;&amp;lt;filemode&amp;gt; : 파일의&amp;nbsp;권한 모드&lt;/li&gt;&lt;li&gt;&amp;lt;sources&amp;gt; : 해당 복사 위치에 넣을 대상&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;예를 들어, /usr/local/myapp 폴더가 존재하지 않으면 이 폴더를 생성하고, myapp-버전.war 파일을 이 폴더에 복사한다. 또한, 같은 위치에 myapp-run.sh 파일을 755 모드로 복사한다. 별도로 모드를 지정하지 않은 경우 &amp;lt;defaultDirmode&amp;gt;와&amp;nbsp;&amp;lt;defaultFilemode&amp;gt;에서 지정한 모드를 사용한다. 비슷하게 소유 계정과 그룹을 지정하지&amp;nbsp;지정하지 않으면&amp;nbsp;&amp;lt;defaultUsername&amp;gt;와&amp;nbsp;&amp;lt;defaultGroupname&amp;gt;에서 지정한 계정과 그룹을 사용한다.&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;설치 전에 필요한 계정을 생성하거나 기존에 이미 설치된 파일의&amp;nbsp;경로를 변경하는 등의 작업이 필요할 경우&amp;nbsp;&amp;lt;preinstallScriptlet&amp;gt;을 이용해서 해당 작업을 실행할 스크립트를 지정한다.&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;메이븐 명령어&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;이제 RPM 생성을 위한 메이븐 명령어를 실행할 차례다. &quot;rpm:rpm&quot; 골을 이용해서 메이븐을 실행하면 된다.&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px; border: 1px solid rgb(193, 193, 193); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;mvn clean package rpm:rpm&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(102, 102, 102); font-family: dotum; font-size: 12px;&quot;&gt;RPM 파일은&amp;nbsp;target/rpm/myapp/RPMS/noarch/myapp-버전-0.noarch.rpm 경로에 생긴다.&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>Clean</category>
      <category>install</category>
      <category>maven</category>
      <category>package</category>
      <category>rpm</category>
      <category>패키지</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/27</guid>
      <comments>https://since.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 7 Sep 2018 15:23:05 +0900</pubDate>
    </item>
    <item>
      <title>Apache Solr 쿼리</title>
      <link>https://since.tistory.com/26</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;Apache Solr 쿼리&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;검색 쿼리 parameter&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;b&gt;sort&lt;/b&gt;&amp;nbsp;&amp;nbsp;- 정렬과 관련된 파라미터&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[Example]&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;table class=&quot;__se_tbl_ext&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;721&quot; style=&quot;border-collapse: collapse; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; width: 541pt;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;216&quot; style=&quot;width: 162pt;&quot;&gt;&lt;col width=&quot;505&quot; style=&quot;width: 379pt;&quot;&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr height=&quot;23&quot; style=&quot;height: 17.25pt;&quot;&gt;&lt;td height=&quot;23&quot; class=&quot;xl65&quot; width=&quot;216&quot; style=&quot;word-break: break-all; font-size: 12pt; font-weight: 700; text-align: center; border: 1px solid windowtext; height: 17.25pt; width: 162pt;&quot;&gt;parameter&lt;/td&gt;&lt;td class=&quot;xl65&quot; width=&quot;505&quot; style=&quot;word-break: break-all; height: 17.25pt; font-size: 12pt; font-weight: 700; text-align: center; border-top: 1px solid windowtext; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-left: none; width: 379pt;&quot;&gt;description&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;sort=score desc&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;정확도를 높은데서 낮은데로 정렬한다.&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;sort=price asc&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;price필드를 오름차순 정렬&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;sort=inStock desc, price asc&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;inStock필드를 내림차순 정렬한 후 price 필드를 오름차순 정렬한다.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;b&gt;star&lt;/b&gt;t - 검색된 결과값중 몇번째일지 ( default : 0)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;b&gt;row&lt;/b&gt;&amp;nbsp;- 결과값을 얼마나 출력할지&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[Example]&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;table class=&quot;__se_tbl_ext&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;721&quot; style=&quot;border-collapse: collapse; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; width: 541pt;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;216&quot; style=&quot;width: 162pt;&quot;&gt;&lt;col width=&quot;505&quot; style=&quot;width: 379pt;&quot;&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr height=&quot;23&quot; style=&quot;height: 17.25pt;&quot;&gt;&lt;td height=&quot;23&quot; class=&quot;xl65&quot; width=&quot;216&quot; style=&quot;word-break: break-all; font-size: 12pt; font-weight: 700; text-align: center; border: 1px solid windowtext; height: 17.25pt; width: 162pt;&quot;&gt;parameter&lt;/td&gt;&lt;td class=&quot;xl65&quot; width=&quot;505&quot; style=&quot;word-break: break-all; height: 17.25pt; font-size: 12pt; font-weight: 700; text-align: center; border-top: 1px solid windowtext; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-left: none; width: 379pt;&quot;&gt;description&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;start=0&amp;amp;rows10&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;첫번쨰 문서부터 총 10개의 문서를 출력한다.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;b&gt;fq (Filter Query)&amp;nbsp;&lt;/b&gt;- 검색된 결과중 또 한번 쿼리에 부합하는 검색 결과를 찾는다. AND문과 다른점은 score(정확도)값에 영향을 주지 않는 것이다.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[Example]&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;만약 title 이라는 필드에 대해 실적으로 검색을 하여 두개의 문서가 나왔다고 하면&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;request&amp;nbsp;)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[url]/select?q=title:실적&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;result&amp;nbsp;)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;1)&amp;nbsp;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;attribute&quot; style=&quot;margin: 0px; padding: 0px; font-weight: bold; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;: &lt;/span&gt;&lt;span class=&quot;value&quot; style=&quot;margin: 0px; padding: 0px; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;&lt;span class=&quot;string&quot; style=&quot;margin: 0px; padding: 0px; color: green; background-repeat: no-repeat;&quot;&gt;&quot;실적 악화보다 더 무서운 '담합 낙인'..건설사 신음&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;2) &lt;/span&gt;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;attribute&quot; style=&quot;margin: 0px; padding: 0px; font-weight: bold; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;: &lt;/span&gt;&lt;span class=&quot;value&quot; style=&quot;margin: 0px; padding: 0px; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;&lt;span class=&quot;string&quot; style=&quot;margin: 0px; padding: 0px; color: green; background-repeat: no-repeat;&quot;&gt;&quot;1분기 항공여객 실적 2437만명, 전년 동기比 12.4%↑&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;request&amp;nbsp;)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[url]/select?q=title:실적&amp;amp;fq=title:건설사&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;result&amp;nbsp;)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;1)&amp;nbsp;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;attribute&quot; style=&quot;margin: 0px; padding: 0px; font-weight: bold; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;font-family: monospace; line-height: 19.2px; white-space: pre;&quot;&gt;&quot;: &lt;/span&gt;&lt;span class=&quot;value&quot; style=&quot;margin: 0px; padding: 0px; font-family: monospace; line-height: 19.2px; white-space: pre; background-repeat: no-repeat;&quot;&gt;&lt;span class=&quot;string&quot; style=&quot;margin: 0px; padding: 0px; color: green; background-repeat: no-repeat;&quot;&gt;&quot;실적 악화보다 더 무서운 '담합 낙인'..건설사 신음&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;정확도에 영향을 끼치지 않고 메인쿼리와 독립되게 캐시되어있어 속도향상에도 영향을 준다고 한다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;&lt;b&gt;fl (Field List) &lt;/b&gt;: 결과값의 필드를 제한을 둔다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;[Example]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;table class=&quot;__se_tbl_ext&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;721&quot; style=&quot;border-collapse: collapse; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; width: 541pt;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;216&quot; style=&quot;width: 162pt;&quot;&gt;&lt;col width=&quot;505&quot; style=&quot;width: 379pt;&quot;&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr height=&quot;23&quot; style=&quot;height: 17.25pt;&quot;&gt;&lt;td height=&quot;23&quot; class=&quot;xl65&quot; width=&quot;216&quot; style=&quot;word-break: break-all; font-size: 12pt; font-weight: 700; text-align: center; border: 1px solid windowtext; height: 17.25pt; width: 162pt;&quot;&gt;parameter&lt;/td&gt;&lt;td class=&quot;xl65&quot; width=&quot;505&quot; style=&quot;word-break: break-all; height: 17.25pt; font-size: 12pt; font-weight: 700; text-align: center; border-top: 1px solid windowtext; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-left: none; width: 379pt;&quot;&gt;description&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;id name price&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;id, name, price 필드의 값만 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;id,name,price&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;id, name, price 필드의 값만 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;id name,price&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;id, name, price 필드의 값만 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;id score&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;id필드 정확도 값만 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;*&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;정확도 제외한 전체 필드 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;* score&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;전체 필드와 정확도 리턴&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl66&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;[exaplain]&lt;/td&gt;&lt;td class=&quot;xl66&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;검색결과에 대한 정확도 등의 정보가 리턴&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font color=&quot;#008000&quot; face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;그리고 사용자 정의를 통해 결과필드를 커스터마이징 할 수 있는데 결과값을 필드나 함수등을 이용하여 변경할 수 있다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;[Example]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;request)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;fl=id,sales_price:price,secret_sauce:prod(price,popularity),why_score:[explain &lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; font-family: monospace;&quot;&gt;style=nl]&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; font-family: monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre; font-family: monospace;&quot;&gt;response)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;&quot;response&quot;:{&quot;numFound&quot;:2,&quot;start&quot;:0,&quot;docs&quot;:[
{
&quot;id&quot;:&quot;6H500F0&quot;,
&quot;secret_sauce&quot;:2100.0,
&quot;sales_price&quot;:350.0,
&quot;why_score&quot;:{
&quot;match&quot;:true,
&quot;value&quot;:1.052226,
&quot;description&quot;:&quot;weight(features:cache in 2) [DefaultSimilarity], result
of:&quot;,
&quot;details&quot;:[{&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;....&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;&lt;b&gt;debug &lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;debug=query : 오직 쿼리의 디버그 정보만 반환&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;debug=timing: 쿼리를 처리하는데 걸린시간에 대한 정보를 반환&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;debug=results: 검색결과에 대한 정확도정보를 반환한다. (fl=[explain] 같은)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;span style=&quot;line-height: 19.2px; white-space: pre;&quot;&gt;debug=all: 위의 모든 디버깅 정보를 반환한다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;b&gt;wt (Response Writer)&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;Reference에는 이런것들이 있다고 하는데 안되는게 몇개 있다&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;table class=&quot;__se_tbl_ext&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;721&quot; style=&quot;border-collapse: collapse; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; width: 541pt;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;216&quot; style=&quot;width: 162pt;&quot;&gt;&lt;col width=&quot;505&quot; style=&quot;width: 379pt;&quot;&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; width=&quot;216&quot; style=&quot;word-break: break-all; border: 1px solid windowtext; height: 16.5pt; width: 162pt;&quot;&gt;csv&lt;/td&gt;&lt;td class=&quot;xl65&quot; width=&quot;505&quot; style=&quot;word-break: break-all; height: 16.5pt; border-top: 1px solid windowtext; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-left: none; width: 379pt;&quot;&gt;CSVResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;json&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;JSONResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;php&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;PHPResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;phps&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;PHPSSerializedResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;python&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;PythonResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;ruby&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;RubyResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;smile&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;SmileResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;velocity&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;VelocityResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;xml&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;XMLResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;tr height=&quot;22&quot; style=&quot;height: 16.5pt;&quot;&gt;&lt;td height=&quot;22&quot; class=&quot;xl65&quot; style=&quot;word-break: break-all; width: 162pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-left: 1px solid windowtext; border-image: initial; height: 16.5pt; border-top: none;&quot;&gt;xslt&lt;/td&gt;&lt;td class=&quot;xl65&quot; style=&quot;word-break: break-all; height: 16.5pt; width: 379pt; border-right: 1px solid windowtext; border-bottom: 1px solid windowtext; border-image: initial; border-top: none; border-left: none;&quot;&gt;XSLTResponseWriter&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;[Example]&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; line-height: 1.5; color: rgb(138, 131, 126); font-family: 돋움; font-size: 12px; text-align: justify;&quot;&gt;wt=json&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;autosourcing-stub-extra&quot; style=&quot;position: absolute; opacity: 1; line-height: 1.5; zoom: 1;&quot;&gt;&lt;p style=&quot;margin-top: 11px; margin-right: 0px; margin-bottom: 7px; padding: 0px; line-height: 1.5; font-size: 12px; font-family: Dotum; font-style: normal; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>색인/Apache Solr</category>
      <category>query</category>
      <category>Solr</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/26</guid>
      <comments>https://since.tistory.com/26#entry26comment</comments>
      <pubDate>Thu, 9 Aug 2018 17:41:15 +0900</pubDate>
    </item>
    <item>
      <title>Linux에서 자바 어플리케이션 서버 실행 쉘(Shell) 스크립트</title>
      <link>https://since.tistory.com/25</link>
      <description>&lt;h1 style=&quot;text-align: center;&quot;&gt;Linux에서 자바 어플리케이션 서버 실행 쉘(Shell) 스크립트&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;JAVA로 작성한 jar파일을 데몬으로 돌려야할 때 필요한 쉘 스크립트 정리&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;기본적으로 java -jar 를 이용해 jar파일을 실행하는 것을 서비스 운영 모드로 동작하게 해주는(관리 측면 효율성) 쉘 스크립트이다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; color: rgb(85, 85, 85); letter-spacing: -0.5px; background-color: rgb(255, 255, 255);&quot;&gt;&lt;code class=&quot;sh hljs bash&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Nanum Gothic Coding&amp;quot;; font-size: 1em; padding: 0.5em; color: rgb(204, 204, 204); background: rgb(45, 45, 45); border-radius: 4px; display: block; overflow-x: auto;&quot;&gt;
&lt;span class=&quot;hljs-meta&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;#!/bin/sh&lt;/span&gt;
SERVICE_NAME=서비스명
PATH_TO_JAR=실행할 JAR 파일 path.jar
PID_PATH_NAME=./서비스명.pid
JAVA_OPT=&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;-Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m&quot;&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;in&lt;/span&gt;
    start)
        &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;Starting &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;if&lt;/span&gt; [ ! -f &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt; ]; &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;then&lt;/span&gt;
            nohup java -jar &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$JAVA_OPT&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PATH_TO_JAR&lt;/span&gt; &amp;gt;&amp;gt; /dev/null &amp;amp;
                        &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; $! &amp;gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; started ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;else&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; is already running ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;fi&lt;/span&gt;
    ;;
    stop)
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;if&lt;/span&gt; [ -f &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt; ]; &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;then&lt;/span&gt;
            PID=$(cat &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;);
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; stoping ...&quot;&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID&lt;/span&gt;;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; stopped ...&quot;&lt;/span&gt;
            rm &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;else&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; is not running ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;fi&lt;/span&gt;
    ;;
    restart)
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;if&lt;/span&gt; [ -f &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt; ]; &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;then&lt;/span&gt;
            PID=$(cat &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;);
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; stopping ...&quot;&lt;/span&gt;;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID&lt;/span&gt;;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; stopped ...&quot;&lt;/span&gt;;
            rm &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; starting ...&quot;&lt;/span&gt;
            nohup java -jar &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$JAVA_OPT&lt;/span&gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PATH_TO_JAR&lt;/span&gt; &amp;gt;&amp;gt; /dev/null &amp;amp;
                        &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; $! &amp;gt; &lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$PID_PATH_NAME&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; started ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;else&lt;/span&gt;
            &lt;span class=&quot;hljs-built_in&quot; style=&quot;box-sizing: border-box; color: rgb(249, 145, 87);&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: border-box; color: rgb(153, 204, 153);&quot;&gt;&quot;&lt;span class=&quot;hljs-variable&quot; style=&quot;box-sizing: border-box; color: rgb(242, 119, 122);&quot;&gt;$SERVICE_NAME&lt;/span&gt; is not running ...&quot;&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;fi&lt;/span&gt;
    ;;
&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: border-box; color: rgb(204, 153, 204);&quot;&gt;esac&lt;/span&gt;
&lt;/code&gt;
&lt;/pre&gt;&lt;p&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px;&quot;&gt;&lt;/p&gt;&lt;div style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px;&quot;&gt;이렇게 쉘 파일을 작성하고&lt;/div&gt;&lt;div style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;run.sh 라고 작성을 했다면&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;./run.sh start&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;./run.sh restart&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;./run.sh stop&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;으로 서버를 시작/재시작/중지 시킬 수 있다&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;(물론 실행하기 위해선 실행권한을 파일에 부여를 해야 한다)&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;run.sh 로 가정했을 때&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;root 권한을 받은 뒤&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;chmod 755 run.sh&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;명령어로 해당 쉘 스크립트에 실행 권한을 부여할 수 있다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;해당 프로세스 PID 정보는&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; background-color: rgb(238, 238, 238);&quot;&gt;PID_PATH_NAME&lt;/span&gt;&amp;nbsp;에 저장이 되며&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; background-color: rgb(238, 238, 238);&quot;&gt;JAVA_OPT&lt;/span&gt;&amp;nbsp;에 JVM 옵션을 지정할 수 있다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;현재 시작/재시작 시 /dev/null로 리다이렉트를 하고 있는데, 이를 log파일 이름으로 바꾸게 되면 현재 데몬 실행을 하는 로그를 남기게 된다.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(85, 85, 85); font-family: &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, 굴림, gulim, 돋움, dotum, &amp;quot;Microsoft NeoGothic&amp;quot;, &amp;quot;Droid sans&amp;quot;, sans-serif; font-size: 14px; letter-spacing: -0.5px; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; background-color: rgb(238, 238, 238);&quot;&gt;nohup java -jar -Dspring.profiles.active=prod $JAVA_OPT $PATH_TO_JAR &amp;gt;&amp;gt; daemon.log&lt;/span&gt;&amp;nbsp;와 같이 고치면 daemon.log에 현재 실행 로그가 남는다.&lt;/p&gt;</description>
      <category>JAVA</category>
      <category>jar</category>
      <category>java</category>
      <category>Linux</category>
      <category>Shell</category>
      <category>쉘</category>
      <category>스크립트</category>
      <author>영진은정아빠</author>
      <guid isPermaLink="true">https://since.tistory.com/25</guid>
      <comments>https://since.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 7 Aug 2018 11:09:42 +0900</pubDate>
    </item>
  </channel>
</rss>