<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>조르디 킴</title>
        <link>https://velog.io/</link>
        <description>Seeking to learn new things at all times.</description>
        <lastBuildDate>Sat, 16 Oct 2021 13:47:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>조르디 킴</title>
            <url>https://images.velog.io/images/jongjin_kim/profile/954327d3-23b5-4d4a-9f45-c4e7fdd2bf51/george_character.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 조르디 킴. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jongjin_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[QZ Tray: 버전 선택 가이드]]></title>
            <link>https://velog.io/@jongjin_kim/QZ-Tray-%EB%B2%84%EC%A0%84-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
            <guid>https://velog.io/@jongjin_kim/QZ-Tray-%EB%B2%84%EC%A0%84-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C</guid>
            <pubDate>Sat, 16 Oct 2021 13:47:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h5 id="이미지-출처-qz-tray">이미지 출처: <a href="https://qz.io">QZ Tray</a></h5>
</blockquote>
<h1 id="📘-qz-tray-버전-선택-가이드">📘 QZ Tray 버전 선택 가이드</h1>
<h2 id="1-시작하며">1. 시작하며</h2>
<ul>
<li>QZ Tray 에는 다양한 버전이 존재합니다.</li>
<li>그리고 이 버전에 따라서, 어떤 프로그램 혹은 언어 버전의 호환성이 나뉩니다.</li>
<li>오늘은 이 버전에 대해 간략하게 주목할 만한 변화에만 한에서 이야기 해보려고 합니다.</li>
<li>최신 업데이트를 보고 싶으시다면, <a href="https://github.com/qzind/tray/releases">자세한 버전 업데이트</a> 를 참고해 주세요.</li>
</ul>
<h2 id="2-버전별-자바-호환성-및-제공-기능-확인">2. 버전별 자바 호환성 및 제공 기능 확인</h2>
<h3 id="버전-설명">버전 설명</h3>
<h4 id="220-베타-버전">2.2.0: 베타 버전</h4>
<h4 id="214-자바-16-지원">2.1.4: 자바 16 지원</h4>
<h4 id="213-인쇄-상태-리포팅-기능-지원">2.1.3: 인쇄 상태 리포팅 기능 지원</h4>
<h4 id="212-파이어폭스-https-지원">2.1.2: 파이어폭스 https 지원</h4>
<h4 id="211-프린터-포트-정보-지원">2.1.1: 프린터 포트 정보 지원</h4>
<h4 id="210-html-다중-인쇄-및-고화질-인쇄">2.1.0: HTML 다중 인쇄 및 고화질 인쇄</h4>
<hr>
<h4 id="2012-">2.0.12: ..</h4>
<h4 id="2011-">2.0.11: ..</h4>
<h4 id="2010-open-jdk-11-지원--다크-모드-지원">2.0.10: Open JDK 11 지원 \ 다크 모드 지원</h4>
<h4 id="209-jdk-11-지원">2.0.9: JDK 11 지원</h4>
<h4 id="208-">2.0.8: ..</h4>
<h4 id="207-">2.0.7: ..</h4>
<h4 id="206-">2.0.6: ..</h4>
<h4 id="205-jdk-9-지원">2.0.5: JDK 9 지원</h4>
<p>&ast;&ast;&ast;
&ast;&ast;&ast;
&ast;&ast;&ast;
(이후는 워낙 초기 버전이라 포함하지 않았습니다.)</p>
<hr>
<h3 id="기본-자바-요구-버전--open-jdk-7-버전-이상">기본 자바 요구 버전:  (open) JDK 7 버전 이상</h3>
<hr>
<h2 id="3-마치며">3. 마치며</h2>
<p>오늘은 새로운 Qz Tray 를 사용하기 앞서 확인해야 할 버전 정보에 대해 간략하게 소개를 해 봤습니다.</p>
<p>어떤 버전을 사용할지 막막하신 분들에게 조금이나마 도움이 되었으면 합니다.</p>
<p>궁금하신 점이나, 오류 사항은 댓글에 남겨 주시면 성심 성의 껏 답변 드리겠습니다.</p>
<p>// 작성자 본인으로서, 무단으로 글을 퍼가거나 복제하는 것을 금합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[QZ Tray: 증명서 셀프 발급 (Self Signed Certificate)]]></title>
            <link>https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate</link>
            <guid>https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate</guid>
            <pubDate>Sat, 16 Oct 2021 13:46:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h5 id="이미지-출처-qz-tray-2010">이미지 출처: <a href="https://qz.io">QZ Tray-2.0.10</a></h5>
</blockquote>
<h1 id="📘-qz-tray-무료-증명서-발급-및-적용">📘 QZ Tray 무료 증명서 발급 및 적용</h1>
<h2 id="1-시작하며">1. 시작하며</h2>
<h3 id="11-문제-정의">1.1 문제 정의</h3>
<ul>
<li>필자가 맞닥드린 문제는 다음과 같다.</li>
</ul>
<blockquote>
<ul>
<li>성공적인 프로그램 설치 후, 프로그램 폴더 안에 있는 <strong>sample.html </strong> 웹 페이지 파일을 통해 테스트로 페이지를 출력하려고 시도 하자 다음과 같은 작업 확인 다이어로그가 띄워진다.
<img src="https://images.velog.io/images/jongjin_kim/post/dfa6234d-44b4-4852-95de-ae024a23caa1/qztray_cert_error.png" alt=""><h5 id="이미지-11_1-어떤-함수든-qz-tray를-사용하게-되면-매번-띄워지는-다이어로그">이미지 1.1_1: 어떤 함수든 QZ Tray를 사용하게 되면 매번 띄워지는 다이어로그</h5>
<img src="https://images.velog.io/images/jongjin_kim/post/3139a008-663d-4a01-bf48-5223099e9eb1/qztray_cert_error1.png" alt=""><h5 id="center이미지-11_2-certificate-information-을-누르면-출력됨center"><center>이미지 1.1_2: &#39;Certificate Information&#39; 을 누르면 출력됨</center></h5>
</li>
</ul>
</blockquote>
<h2 id="2-원하는-결과">2. 원하는 결과</h2>
<ul>
<li><p>이 작업을 통해서 우리 모두가 원하는 결과는 다음과 같다.</p>
</li>
<li><p>맨 처음 QZ Tray 에 사용자 증명서 정보와 함께 인증을 하고 해당 값을 기억할 수 있게 해주는 페이지를 볼 수 있게 해야 한다.</p>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/1478c1ae-4177-4b17-abae-2d28955b5a42/image.png" alt=""></p>
<h5 id="center이미지-2_1-인증-성공center"><center>이미지 2_1: 인증 성공</center></h5>
</blockquote>
</li>
<li><p>정상적인 인증이 완료되면, &#39;Certificate Information&#39; 을 클릭 했을 때 다음과 같은 화면을 볼 수 있어야 한다.</p>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/5638657c-8781-484d-b5f4-0cceb0a0a6ea/image.png" alt=""></p>
<h5 id="center이미지-2_2-인증-성공-인증-세부-사항center"><center>이미지 2_2: 인증 성공 인증 세부 사항</center></h5>
<p>자 그럼, 이제 증명서를 발급 하고 실 프로그램에 적용하는 방법을 알아보자.</p>
</blockquote>
</li>
</ul>
<h2 id="3-인증-방법">3. 인증 방법</h2>
<ul>
<li>먼저, 다운 받은 QZ Tray 의 바이너리 폴더를 재인증 하고 리컴파일 하기위해 다음과 같은 설치가 필요하다.<h3 id="31-사전-설치-작업">3.1. 사전 설치 작업</h3>
<blockquote>
<ol>
<li><strong>JDK 7 혹은 이상</strong> (14 이상은 QZ Tray 가 지원하지 않을 수 있음으로, <a href="https://github.com/qzind/tray/releases">여기</a>에서 QZ Tray 버전에 대한 Java 버전 지원을 확인한다.)<blockquote>
<ul>
<li>필자는 여기서 <a href="https://www.azul.com/downloads/">Azul Zulu Open JDK 11.0.x</a> 를 사용했다. (다운로드 링크 참고)</li>
</ul>
</blockquote>
</li>
<li><a href="https://ant.apache.org/bindownload.cgi">Apache Ant</a><blockquote>
<ul>
<li>설치 후 환경변수를 등록함으로 cmd/terminal 에서 &#39;ant --version&#39; 이 확인이 가능하게끔 준비한다.</li>
<li>필자 (윈도우) 다운로드 버젼: <a href="https://dlcdn.apache.org//ant/binaries/apache-ant-1.10.12-bin.zip">Apache Ant-1.10.12</a></li>
</ul>
</blockquote>
</li>
<li><a href="https://nsis.sourceforge.io/Download">NSIS 3.0x</a><blockquote>
<ul>
<li>리컴파일 시 Ant 와 함께 필요한 프로그램이다.</li>
</ul>
</blockquote>
</li>
<li>(선택사항) <a href="https://git-scm.com/download/win">Git</a><blockquote>
<ul>
<li>사이트 <a href="https://github.com/qzind/tray/tags">다운로드</a>에서 <a href="(https://github.com/qzind/tray/archive/refs/tags/v2.1.0.tar.gz)">.tar</a> 나 <a href="(https://github.com/qzind/tray/archive/refs/tags/v2.1.0.tar.gz)">.zip</a> 을 받거나,
git 설치후 &#39;git clone <a href="https://github.com/qzind/tray.git&#39;">https://github.com/qzind/tray.git&#39;</a> 을 해도 된다.</li>
</ul>
</blockquote>
</li>
<li><a href="https://nsis.sourceforge.io/Download">OpenSSL</a><blockquote>
<ul>
<li>QZ Tray 바이너리 소스코드를 재 컴파일 하기 전, 사용자를 위한 새로운 인증서를 만들기 위한 프로그램이다.</li>
<li>필자는 &#39;<a href="https://slproweb.com/download/Win64OpenSSL-3_0_0.msi">Win64 OpenSSL v3.0.0.msi</a>&#39; 를 다운받아 설치했다.</li>
</ul>
</blockquote>
</li>
</ol>
</blockquote>
</li>
</ul>
<h4 id="-다운-받은-qz-tray-2010-의-압축-파일의-해제-경로가-주-경로가-될-것이니-참고하여-경로를-지정하기-바란다">* 다운 받은 <strong>qz-tray-2.0.10 의 압축 파일의 해제 경로</strong>가 주 경로가 될 것이니, 참고하여 경로를 지정하기 바란다.</h4>
<h4 id="-필자는-cutilities-라는-경로-아래-모든-작업을-진행했다">* 필자는 <strong>C:\Utilities</strong> 라는 경로 아래 모든 작업을 진행했다.</h4>
<h3 id="32-인증-작업">3.2. 인증 작업</h3>
<ul>
<li>설치가 모두 완료 되었다면, cmd/terminal 을 열고 openssl 을 통해 암호 파일을 만든다.</li>
<li>해당 구문을 실행하는 곳이 암호 파일들이 생성될 곳 임으로, 위치를 지정하고 싶다면 cmd/terminal 에서 &#39;cd &#39; 명령어로 원하는 위치에서 입력하기 바란다.</li>
</ul>
<h4 id="321-암호키-생성">3.2.1. 암호키 생성</h4>
<pre><code class="language-cmd">openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 11499 -nodes</code></pre>
<blockquote>
<ul>
<li>key.pem 은 private key 의 값을 담을 파일명을 정의</li>
<li>cert.pem 은 certificate key 의 값을 담을 파일명을 정의</li>
<li>days 11499 는 입력 가능한 최댓값으로 5년 이다.</li>
</ul>
</blockquote>
<ul>
<li>위 명령어를 입력하고 아래의 값을 순서에 따라 입력한다. (아래는 필자가 입력한 값이다.)<blockquote>
<p>&#39;..+..+..........+.....+.+..................+..+.......+..+...+......+.+...+...........+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...&#39;
//// (--를 대체)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter &#39;.&#39;, the field will be left blank.
////
Country Name (2 letter code) [AU]: <strong>KR</strong>
State or Province Name (full name) [Some-State]: <strong>Seoul</strong>
Locality Name (eg, city) []: <strong>Seocho-gu</strong>
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <strong>AWS Ltd.</strong>
Organizational Unit Name (eg, section) []: <strong>IT</strong>
Common Name (e.g. server FQDN or YOUR name) []: <strong>*.aws.com</strong>
Email Address []: <strong><a href="mailto:dev.jongjinkim@gmail.com">dev.jongjinkim@gmail.com</a></strong></p>
<blockquote>
<ul>
<li><strong>중요!!</strong>: <strong>Common Name</strong> 을 입력할 때는, <strong>&#39;&ast;&#39;</strong> 과 같은 와일드 카드 포맷을 따라 다음과 같이 정의 하는데, 운영하는 웹 페이지의 도메인 명을 기준으로 해야한다.
예) &ast;.naver.com &ast;.google.com &ast;.velog.io &ast;.kakao.com</li>
</ul>
</blockquote>
</blockquote>
</li>
<li>위 작업을 마치면, 해당 폴더에 두개의 암호 파일이 생성된 것을 확인할 수 있다.</li>
<li>이제 생성된 파일에 대해 아래와 같은 암호문 변경을 진행한다.</li>
</ul>
<h4 id="322-암호키-변경">3.2.2. 암호키 변경</h4>
<pre><code class="language-cmd">openssl pkcs12 -inkey key.pem -in cert.pem -export -out privateKey.pfx</code></pre>
<blockquote>
<ul>
<li>여기서 입력하는 비밀번호는 안전한 비밀번호로 설정할 것을 권고.</li>
</ul>
</blockquote>
<h4 id="323-생성된-암호키를-활용한-리컴파일">3.2.3. 생성된 암호키를 활용한 리컴파일</h4>
<pre><code class="language-cmd">C:\Utilities\tray-2.0.10&gt; ant nsis -Dauthcert.use=&quot;C:\Utilities\cert.pem&quot;</code></pre>
<blockquote>
<h4 id="꼭-기억하세요">꼭 기억하세요.</h4>
<ol>
<li>필자는 위에서 설명한 것 처럼 ant 를 <strong>환경변수 등록</strong>을 해 놓았기에 &#39;ant&#39; 입력을 했습니다.</li>
<li>위 <strong>리컴파일 명령어를 실행 위치</strong>는, <strong>QZ Tray.zip/tar</strong> 파일을 다운 받고 압축 해제 한 <strong>경로 안</strong> 입니다.</li>
</ol>
</blockquote>
<h4 id="324-컴파일-작업이-결과-모니터링">3.2.4. 컴파일 작업이 결과 모니터링</h4>
<ul>
<li>컴파일 결과가 실패할 수 있으니 결과에서 &#39;&#39; 가 나왔는지 확인한다.</li>
<li>컴파일 완료 후 컴파일 작업 폴더 내 /out 폴더와 함께 안에 &#39;&#39; 가 아래와 같이 생성되었는지 확인한다.</li>
<li>소요시간은 컴퓨터의 성능에 따라 상이하며, 약 50s ~ 5m 정도 소요된다.  </li>
<li>처리 결과:<pre><code class="language-cmd">BUILD SUCCESSFUL
Total time: 1 minute 31 seconds</code></pre>
</li>
</ul>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/1b405884-1afb-4cb2-bebb-a30c79603489/image.png" alt=""></p>
<h5 id="center이미지-34_1-설치-성공-화면_1center"><center>이미지 3.4_1: 설치 성공 화면_1</center></h5>
</blockquote>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/788cb16d-5ccd-47c8-bbc4-8cc1f0a97025/image.png" alt=""></p>
<h5 id="center이미지-34_2-설치-성공-화면_2center"><center>이미지 3.4_2: 설치 성공 화면_2</center></h5>
<p>사진에서 보는 설치 응용 프로그램이 있어야 한다.</p>
</blockquote>
<h4 id="325-demo-파일을-통한-테스트">3.2.5. Demo 파일을 통한 테스트</h4>
<ol>
<li>새로 생성된 <strong>qz-tray-community-2.0.10.exe</strong> 를 설치한다.</li>
<li>설치가 완려되면 동일한 폴내에 있는 *<em>../dist/demo/&ast; *</em> 파일들을 가지고 테스트를 진행본다.</li>
<li><strong>sample.html</strong> 을 웹 브라우저로 열어본다.</li>
<li>열자마자 다음과 같은 화면을 보게 될거다.<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/c00520b3-d057-42b5-a3d1-7e70fe52010d/image.png" alt=""></p>
<h5 id="center이미지-325_1-허용되지-않은-사이트-center"><center>이미지 3.2.5_1: 허용되지 않은 사이트 </center></h5>
<ul>
<li>여기서 &#39;<strong>Allow</strong>&#39; 를 누르게 되면 이후에 모든 작업들에 대해서 계속 똑같은 확인 다이어로그가 나오게 된다.</li>
<li>방지하기 위해 &#39;Remember this decision&#39; 을 누르게 되면 &#39;Allow&#39; 버튼을 누를 수 없게 되는데 이부분을 이제 해소해 보자.<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/39b25983-3b5b-4912-b160-5ecfdb9ad0bb/image.png" alt=""></p>
</blockquote>
<h5 id="center이미지-325_2-인증-불가-center"><center>이미지 3.2.5_2: 인증 불가 </center></h5>
</li>
<li>Certificate information 을 눌러보면 아래와 같이 인증이 정상적으로 되지 않았음을 알 수 있다.
<img src="https://images.velog.io/images/jongjin_kim/post/82e46bf4-6fad-4858-b438-754a0577f58f/image.png" alt=""><h5 id="center이미지-325_3-인증-불가-세부-내용center"><center>이미지 3.2.5_3: 인증 불가 세부 내용</center></h5>
</li>
<li>Block 을 누르게 되면 사용자 삭제 후 &#39;Allow&#39; 를 통해 다시 등록 해줘야 하니 주의 하자.</li>
</ul>
</blockquote>
</li>
<li>2.5.5. 이 상태로는 아직까지 실무에 사용할 수 없고, 일반 설치 과정과 동일하게 했을 때와 같은 문제를 야기하기 때문에 다음으로 넘어가서 해소해보자.</li>
</ol>
<h4 id="326-인증-허용-작업">3.2.6. 인증 허용 작업</h4>
<ul>
<li>지금 현재 sample.html 이 있는 폴더에서 소스코드 몇가지를 조금 바꿔보자.</li>
</ul>
<ol>
<li><p>먼저 &#39;<a href="https://gist.github.com/tresf/f62aeb28d31d382fdb30cad11372d693">jsrsasign-all-min.js</a>&#39; 를 &#39;..\tray-2.0.10\out\dist\demo\js\dependencies&#39; 에 추가한다.</p>
</li>
<li><p>그리고 이제 sample.html 를 수정할 것인데, 먼저 앞서 추가한 js 파일을 html 에서 불러올 수 있도록 경로를 등록해 준다.</p>
<blockquote>
<ul>
<li>필자는 &#39;jsrsasign-all-min.js&#39; 의 소스코드를 가져와서 파일로 만든 후 프로젝트에 직접 등록 했다.
<img src="https://images.velog.io/images/jongjin_kim/post/1d558366-215f-4b70-9e7f-3db4f0117621/image.png" alt=""><h5 id="center이미지-326_1-jsrsasign-all-minjs-불러오기center"><center>이미지 3.2.6_1: jsrsasign-all-min.js 불러오기</center></h5>
</li>
<li>소스코드를 프로젝트에 담지 않고, 바로 가져오고 싶은사람은 아래와 같이 하면 된다.<pre><code class="language-javascript"></code></pre>
</li>
</ul>
</blockquote>
<script src="https://gist.github.com/tresf/f62aeb28d31d382fdb30cad11372d693.js"></script>
<blockquote>
<pre><code></code></pre></blockquote>
</li>
<li><p>마지막으로 &#39;sample.html&#39; 파일의 777 라인 정도 내려가면 setCettificatePromise() 라는 함수가 있는데, 여기부터 80 줄 정도 아래의 858 라인 launchQZ 직전까지의 코드를 아래의 코드로 전체 치환한다.</p>
<pre><code class="language-javascript">/// Authentication setup ///
 qz.security.setCertificatePromise(function(resolve, reject) {
     resolve(publicKey);
 });
 qz.security.setSignaturePromise(function(toSign) {
     return function(resolve, reject) {
         try {
             var pk = KEYUTIL.getKey(privateKey);
             var sig = new KJUR.crypto.Signature({
                 &quot;alg&quot;: &quot;SHA1withRSA&quot;
             });
             sig.init(pk);
             sig.updateString(toSign);
             var hex = sig.sign();
             // console.log(&quot;DEBUG: \n\n&quot; + stob64(hextorstr(hex)));
             resolve(stob64(hextorstr(hex)));
         } catch (err) {
             console.error(err);
             reject(err);
         }
     };
 });
});
</code></pre>
</li>
</ol>
<p>function strip(key) {
    if (key.indexOf(&#39;-----&#39;) !== -1) {
        return key.split(&#39;-----&#39;)[2].replace(/\r?\n|\r/g, &#39;&#39;);
    }
}</p>
<pre><code>
&gt;* 위 코드에서 publicKey 와 privateKey 는 맨 처음 생성한 암호키(cert.pem&amp;key.pem)의 내용이다.
&gt; * 변수대신 파일을 직접 열어 복사해 넣어도 정상 작동한다.

#### 3.2.7. 인증 여부 확인
* 위와 같이 모두 잘 따라 했다면, 적용 후 sample.html 을 열어 보았을 때, 더 이상 접근 허용 다이어로그가 뜨지 않을 것이다.
&gt; ![](https://images.velog.io/images/jongjin_kim/post/851082b1-38f0-40ab-bbea-00bba97694b4/image.png)
&gt; ##### &lt;center&gt;이미지 3.2.7_1: 인증 성공&lt;/center&gt;
&gt;![](https://images.velog.io/images/jongjin_kim/post/99c2ec1b-3e7c-46a6-814b-ce0616de938f/image.png)
&gt; ##### &lt;center&gt;이미지 3.2.7_2: 인증 세부 내역&lt;/center&gt;
***

## 4. 문제 해결
### 4.1. 똑같이 따라 했는데 인증 결과가 아직도 &#39;untrusted website&#39; 라고 뜹니다.
#### 예상 원인:
4.1.1. 암호 키 값이 정상적으로 소스코드에 입혀지지 않았을 수 있습니다. **소스 코드 재확인** 해보세요.
4.1.2. 설치 후 바로 sample.html 을 열어 보았다면, **의도치 않은 캐시나 허용되지 않은 증명서**를 통한 사용자 접근 기록이 존재할 수 있습니다. 아래와 같이 들어가서 확인 후 **사용자를 제거**해 보세요.
&gt; ![](https://images.velog.io/images/jongjin_kim/post/2e5196d3-1aee-4dba-8c44-cd580b30ec09/image.png)
&gt; ##### &lt;center&gt;이미지 4.1_1: QZ Tray 사용자 관리&lt;/center&gt;
&gt; ![](https://images.velog.io/images/jongjin_kim/post/2a742bfe-223b-4941-aace-abbf36d896e8/image.png)
&gt; ##### &lt;center&gt;이미지 4.1_2: QZ Tray 사용자 관리 내역&lt;/center&gt;
&gt; 이미지: 정상 인증된 계정입니다. (착오 없으시길 바랍니다.)(계정은 예시입니다.)
4.1.3. 일반적인 **인식 문제**일 수 있습니다. 방금 한 작업을 다시 한 번 빼먹은 것이 없는지 ** 암호키 생성 단계부터 다시** 해보세요.  

### 4.2. 리컴파일 중, 오류가 발생해요. &#39;nsis&#39; 를 찾을 수 없다고 나옵니다.
#### 예상 원인:
4.2.1. NSIS 를 잘 설치했는지 확인해 봅니다.
4.2.2. ANT 의 환경변수 설정이 잘 되어 있는지 확인해 봅니다.

## 5. 마치며
웹 서버가 구축된 환경에서 사용자(클라이언트)의 컴퓨터에 설치된 인쇄기를 통해 &#39;사용자의 아무런 개입 없이&#39; 혹은 &#39;최소한의 사용자 상호작용&#39; 만으로 인쇄가 되도록 하는 것은 생각보다 좀 처럼 간단하기만 한 일은 아니었습니다.

해당 기능을 구현하기 위해 QZ Tray 에 대한 존재를 먼저 알아야 했고, 이후에 해당 프로그램을 무료로 실 사이트에 적용하기 위한 방법을 찾기까지 많지만은 않은 외국 레퍼런스만을 공부하며 참고했어야 했습니다. (외국 레퍼런스를 검색해 보시면, 제가 정리한 글과 겹치는 부분이 있을 겁니다.)

설치하고 적용하는 과정은 생각보다 쉽습니다. 다만, 무료 버전에서는 QZ Tray 를 사용하여도 사용자의 직접적인 상호작용 없이 바로 인쇄를 할 수 있는 기능을 막아 놓았기 때문에, 이 부분을 원활하게 사용하기 위해 진행하는 작업을 적은 레퍼런스 속에서 해내기 쉽지 않았습니다.

정확히 말하면, 그냥 무작정 막아 놓았다는 개념보다는 원격 서버로 부터의 인쇄를 안전하기 위해 설정해 놓은 인증서를 무료로 발급해 주지 않는다는 점으로 하여금 무료 사용을 간접적으로 막아놓았다고 말하는게 맞겠네요. ([Self Sign Certificate 을 발급](https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate)하면 무료로 사용 가능합니다.)

비교적 수월하게 인증서를 발급받고 적용하여 안전하고 편리한 플러그 인을 사용하려면 QZ Tray 의 직접적인 도움을 받은 방법 (직접 제공 라이선스 및 인증서 발급 + 기술 지원)($ 500 ~ $2,500) 이 수월합니다.

제가 나름 열심히 찾아 보았을 때는 한글로 된 레퍼런스가 없었기에, 저 처럼 혹시 다른 분들도 이렇게 헤매시지 않을까 도움이 되고자 설치하여 무료로 이용할 수 있는 방법을 정리해서 공유 합니다.
(다만, 위 방법을 통해 상업적인 목적으로 이용할 시 발생하는 문제에 대해서는 아무런 책임을 지지 않음을 미리 양지 하시기 바랍니다.)

위에 방법을 시도 하고자 하시는 분들은, 서론에 소개된 목적을 통해 본인이 구현하고자 하는 기능을 정말로 충족시켜 주는 지를 먼저 확인하시고, 하나 하나 꼼꼼히 따라서 해보시기 바랍니다. 약간의 오차로 인해 전체가 작동하지 않을 수 있습니다.

궁금한 점, 시간이 지나 변경된 사항이 있거나, 잘못된 설명이나 해석이 있다면 편하게 댓글 남겨주시기 바랍니다.

// 작성자 본인으로서, 무단으로 글을 퍼가거나 복제하는 것을 금합니다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Direct Silent Print: QZ Tray 설치 가이드]]></title>
            <link>https://velog.io/@jongjin_kim/Direct-Silent-Print-QZ-Tray-%EC%84%A4%EC%B9%98-%EC%84%A4%EB%AA%85%EC%84%9C</link>
            <guid>https://velog.io/@jongjin_kim/Direct-Silent-Print-QZ-Tray-%EC%84%A4%EC%B9%98-%EC%84%A4%EB%AA%85%EC%84%9C</guid>
            <pubDate>Thu, 14 Oct 2021 06:02:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h5 id="이미지-출처-bubble--qz-tray">이미지 출처: <a href="https://bubble.io/plugin/qz-tray-printer-1601913456028x747002838217916400">.bubble</a> | <a href="https://qz.io">QZ Tray</a></h5>
</blockquote>
<h1 id="📘-qz-tray-설치-가이드">📘 QZ Tray 설치 가이드</h1>
<h2 id="1-시작하며">1. 시작하며</h2>
<h3 id="11-문제-정의">1.1 문제 정의</h3>
<ul>
<li>필자가 맞닥드린 문제는 아래와 같다.</li>
</ul>
<blockquote>
<ol>
<li>사용자가 몸을 사용하는 실무를 하는 동시에 웹 사이트(Spring Boot 로 클라우드 서버를 통해 배포)를 통해 반복적인 데이터를 기록하고 처리를 하며, 이에 따라 실제 인쇄물이 바로바로 나와야 한다.</li>
<li>이 때, 사용자가 전반적인 업무를 보다 효율적이고 반복적인 작업을 최소화 할 수 있게 해주기 위해서는 인쇄를 하는 과정을 대폭 간소화 시켜주면 된다.
<img src="https://images.velog.io/images/jongjin_kim/post/1b5e23fb-27f3-473a-9d45-aeae0b123129/problem_define_kr.png" alt=""><h5 id="center이미지-11-실무자의-전산-처리-업무-구조center"><center>이미지 1.1: 실무자의 전산 처리 업무 구조</center></h5>
</li>
</ol>
</blockquote>
<blockquote>
<h4 id="인쇄하는-과정을-간소화-시켜주지-않는다면">인쇄하는 과정을 간소화 시켜주지 않는다면...</h4>
<ul>
<li>실무자는 몸을 사용하는 업무를 하고, 전산을 기록하고 처리된 파일을 열어 직접 컴퓨터에 인쇄 명령을 내리는 작업을 업무를 수 없이 반복해야 한다. 이 과정을 좀 더 쉽고 간단하게 할 수 있게 실무자를 도와주자.</li>
</ul>
</blockquote>
<h4 id="111-사용자의-실무-중-고충">1.1.1. 사용자의 실무 중 고충</h4>
<ul>
<li><p>일반적으로, 문서나 이미지를 특히나 웹에서 인쇄 하고자 할 때는 항상 아래와 같은 유형의 사용자의 상호작용이 필수적으로 필요하다.</p>
<blockquote>
<ol>
<li>인쇄 버튼 -&gt; 인쇄 설정 페이지 -&gt; 인쇄</li>
<li>Ctrl + P -&gt; 인쇄 설정 페이지 -&gt; 인쇄</li>
<li>마우스 우클릭 -&gt; 인쇄 클릭 -&gt; 인쇄 설정 페이지 -&gt; 인쇄</li>
</ol>
</blockquote>
</li>
<li><p>하지만, 1)인쇄 설정 페이지에 들어가서 2)설정을 하고 3)인쇄 버튼을 누르는 수작업은 실제로 특정 작업을 반복하는 실무자에 입장에서는 매우 비효율적일 수 있다.</p>
<h2 id="2-해결-방안과-접근-방식">2. 해결 방안과 접근 방식</h2>
</li>
<li><p>전산 처리 중, 처리된 문서에 대한 즉각적인 인쇄 작업을 간소화 시켜주는 작업을 QZ Tray 라는 웹 브라우저 인쇄 플러그인 을 통해 진행해 보도록 하겠다.</p>
</li>
</ul>
<blockquote>
<h3 id="qz-tray-란">QZ Tray 란?</h3>
<ul>
<li>QZ Tray 는 브라우저 간 혹은 플랫폼 간의 특별한 인쇄 기능을 제공하는 플러그 인 이다.</li>
<li>이 플러그인을 통해 웹 사이트 내에서 사용자가 원하는 파일을 최소한의 상호작용으로 사용자의 로컬 인쇄기를 통해 출력할 수 있게 해주는 기능을 제공한다.</li>
<li>대부분의 인쇄 방식을 지원하지만, 반복적이고, 조금은 특수한 방식이 필요한 열전사 인쇄기 (Thermal Printer) 에 다양한 기능을 지원한다.</li>
</ul>
</blockquote>
<h4 id="-다음은-qz-tray-를-이용해-사용자의-전산-처리-과정을-최소화-하는-구도다">* 다음은 QZ Tray 를 이용해 사용자의 전산 처리 과정을 최소화 하는 구도다.</h4>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/8abd8d9a-6f63-457b-afa1-9c13826d0d0b/solution_kr.png" alt=""></p>
<h5 id="center이미지-21-qz-tray-도입-후-사용자-전산-업무-처리-구도center"><center>이미지 2.1: QZ Tray 도입 후 사용자 전산 업무 처리 구도</center></h5>
<ul>
<li>이미지에 적힌 숫자에 대한 설명은 다음과 같다. <blockquote>
<ol>
<li>사용자가 개인 컴퓨터에 설치된 인쇄기 정보를 가져온다.</li>
<li>가져온 인쇄기 정보를 QZ Tray 에 전달하고,</li>
<li>QZ Tray 는 해당 정보들을 전산 처리 서버에 전송한다.</li>
<li>전송받은 서버는 알맞은 전산 처리 후, 사용자가 인쇄해야 하는 정보를 QZ Tray 에 넘겨준다.</li>
<li>QZ Tray 는 사용자를 지나,</li>
<li>사용자의 컴퓨터에 설치된 인쇄기에 정보(EPL, ZPL, Base64 등 의 인코딩 방식 혹은 인쇄 언어)를 전달하여 출력한다.</li>
</ol>
</blockquote>
</li>
</ul>
</blockquote>
<hr>
<h2 id="3-대체-해결-방안">3. 대체 해결 방안</h2>
<ul>
<li>QZ Tray 를 원활하게 사용하기 까지의 과정은 그리 짧고 간단하지만은 않기에 위 방법을 사용하지 않아도 요구사항을 충족시켜줄 수 있다면 다음 소개된 대체 해결 방안들 중 적합한 것을 찾아 처리 할 수 있길 바란다. </li>
<li>다만, 필자와 유사한 상황에 놓인 개발자라면, 곧 이어 소개될 과정들을 통해 만족할 수 있는 결과를 얻어가길 바란다.</li>
</ul>
<h3 id="31-chrome-브라우저와-js-의-print-함수를-활용">3.1. Chrome 브라우저와 JS 의 Print() 함수를 활용</h3>
<ul>
<li>본 대체 해결 방안은, 앞서 이야기한 전형적인 사용자 상호작용 인쇄 방식을 그대로 유지하면서 자동화 하는 방법이다.<blockquote>
<h4 id="이해가-필요한-사항">이해가 필요한 사항</h4>
<ul>
<li>기본 JS 에서는 print() 라는 함수를 지원하고, 이 함수를 실행할 경우 대부분의 메이저 웹 프라우저에서는 사용자가 인쇄를 하기 앞서 추가적인 확인(상호작용)을 할 수 있는 다이어로그를 자동(&#39;마우스 우 클릭 + &quot;인쇄&quot; &#39; 혹은 ctrl + p 가 필요 없는)으로 띄워준다.</li>
<li>Chrome 에서는 인쇄하기를 눌렀을 때 나오는 사용자 다이어로그 창이 생성되었을 때, 자동으로 인쇄하기를 수행(인쇄 버튼을 눌러주는 것) 해 준다.
(다른 브라우저는 본 기능을 지원하는지 확인이 필요.)</li>
</ul>
</blockquote>
</li>
<li>이렇게 위 두가지 방법을 합치게 되면, 사용자는 인쇄하는 작업을 위해 따로 손을 댈 필요가 없어진다.</li>
<li>다만, 이 방법을 사용하게 되었을 때의 단점은 다음과 같이 파악될 수 있다.<blockquote>
<ol>
<li>한개 이상의 문서를 두개 이상의 파일을 통해 인쇄를 진행하게 된다면, 순차적인 작업이 될 수 있게 설정하는 것이 결코 효율적으로 되기 어렵다.<blockquote>
<h4 id="이유는">이유는...</h4>
<ul>
<li>첫 번째 파일의 인쇄가 끝이 나고 두번째 파일의 인쇄를 하고자 할 때, 첫 번째 파일의 인쇄가 언제 시작하고 언제 끝이 나는지에 대한 소요시간(인터넷 속도와 사용자 컴퓨터의 상태에 따라 상이)에 따른 처리 논리를 코드에 작성할 수 없다.</li>
<li>그로인해 특정한 고정 대기 시간 (ex 5초)을 잡고 순차적인 처리를 하면 사람의 손이 닿지 않고 처리가 되게 할 수 있지만, 속도는 사람이 처리하는 것 보다 느려지게 된다.</li>
</ul>
</blockquote>
</li>
</ol>
</blockquote>
</li>
</ul>
<h4 id="311-chrome-브라우저-자동-인쇄-처리-설정-및-사용-방법">3.1.1. Chrome 브라우저 자동 인쇄 처리 설정 및 사용 방법</h4>
<h4 id="312-js-의-print-함수-사용-예제">3.1.2. JS 의 print() 함수 사용 예제</h4>
<ul>
<li><p>Backend(Controller)-Spring Boot 에서 연산과 전산 처리를 하고, 인쇄하고자 하는 데이터를 Frontend(View)-JS 에 &#39;Base64&#39; 로 변환된 String 데이터 타입을 전달한다.</p>
</li>
<li><p>전달받은 데이터를 &#39;response&#39; 의 변수에 담아 처리하도록 하겠다.</p>
</li>
<li><p>Spring Boot Java Controller Code:</p>
<pre><code class="language-java">@ResponseBody
@PostMapping(value = &quot;/printLabel&quot;)
public String printLabel (HttpSession session,
  @RequestParam(value = &quot;label_url&quot;, required = false) String labelURL) 
  throws Exception {
      packingService.setPdf_base64_str(labelURL);

      HttpHeaders headers = new HttpHeaders();
      String fileName = &quot;label.pdf&quot;;
      headers.setContentType(MediaType.parseMediaType(&quot;application/pdf&quot;));
      headers.add(&quot;content-disposition&quot;, &quot;inline;filename=&quot; + fileName);
      headers.setCacheControl(&quot;must-revalidate, post-check=0, pre-check=0&quot;);

      String encodedString = packingService.getPdf_base64_str();
      return encodedString;
  }</code></pre>
</li>
<li><p>JS Code:</p>
<pre><code class="language-javascript">$.ajax({
      type: &#39;POST&#39;,
      url: &#39;/printLabel?label_url=&#39; + url,
      responseType: &#39;blob&#39;,
      success: function (response) {
          var byteCharacters = atob(response);
          console.log(byteCharacters.length)
          var byteNumbers = new Array(byteCharacters.length);
          for (var i = 0; i &lt; byteCharacters.length; i++) {
              byteNumbers[i] = byteCharacters.charCodeAt(i);
          }
          var byteArray = new Uint8Array(byteNumbers);
          var file = new Blob([byteArray], {type: &#39;application/pdf;base64&#39;});
          var fileURL = URL.createObjectURL(file);
          var wnd = window.open(fileURL);
          wnd.print();
          setTimeout(function() {
              wnd.close();
          }, 5000);
          // setTimeout... 5000 은 5초 후 인쇄할 문서를 끄는 명령어.
      }
  })</code></pre>
<h3 id="32-restful-api-와-java-의-로컬-인쇄-라이브러리-활용">3.2. Restful API 와 Java 의 로컬 인쇄 라이브러리 활용</h3>
</li>
<li><p>자바의 내장 라이브러리 <a href="https://docs.oracle.com/javase/8/docs/api/index.html?javax/print/package-summary.html">javax.print(문서 참고)</a> 라는 인쇄 기능이 있다. 이 기능을 활용하면 본인 컴퓨터의 프린터 정보를 읽고 원하는 정보를 출력할 수 있다. </p>
</li>
<li><p>다만, 인쇄하고자 하는 값이 본인 컴퓨터에 있는 것이 아닌, 원격 서버에서 정보를 처리하고 받아올 수 있는 경우에는 본인 컴퓨터만으로 원하는 정보의 문서를 인쇄할 수 없다.</p>
</li>
<li><p>이를 해결하기 위해서는 원격 서버와 안전하게 데이터 통신을 할 수 있는 Rest API 환경을 서버에 구축하고, 해당 API 를 호출해서 통신할 수 있는 사용자 컴퓨터에서의 어플리케이션이 필요하다.</p>
<blockquote>
<ul>
<li>본문에서 <strong>사용자 어플리케이션</strong>은, 사용자 컴퓨터에서 실행되는 runnable exe 프로그램 혹은 local web application 을 지칭한다.</li>
</ul>
</blockquote>
</li>
<li><p>이를 간단하게 시각화 한 이미지는 다음과 같다.</p>
<blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/35a5de2a-6f57-42c5-9d00-243c598d6672/rest_api_kr.png" alt=""></p>
<h5 id="center이미지-32_1-rest-api-와-사용자-어플리케이션-사용-구도center"><center>이미지 3.2_1: REST API 와 사용자 어플리케이션 사용 구도</center></h5>
</blockquote>
</li>
</ul>
<hr>
<h2 id="4-준비-사항">4. 준비 사항</h2>
<ul>
<li>본 포스트에서는 필자가 사용한 버전을 기준으로 작성했다.</li>
<li>웹 환경<blockquote>
<ul>
<li>Open JDK (Zulu) 11.0.12</li>
<li>Spring Boot 2.1.4</li>
<li>maven 3.8.2</li>
<li>freemarker</li>
</ul>
</blockquote>
</li>
<li>하드웨어<blockquote>
<ul>
<li><a href="http://xprinter.co.kr/">XPrinter DT108B (프린터 사 사이트)</a></li>
</ul>
</blockquote>
</li>
<li>인쇄 플러그인<blockquote>
<ul>
<li><a href="https://github.com/qzind/tray/releases/tag/v2.0.10">QZ Tray 2.0.10 (깃헙)</a></li>
</ul>
</blockquote>
</li>
</ul>
<h4 id="qz-tray-2010-을-선택한-이유-버전-정보-참고">Qz Tray 2.0.10 을 선택한 이유? (<a href="https://github.com/qzind/tray/releases">버전 정보 참고</a>)</h4>
<blockquote>
<h4 id="포스트를-작성하는-2021-10-26-기준">포스트를 작성하는 2021-10-26 기준,</h4>
<ul>
<li>버전 2.2.0 은 아직 <strong>안정성 문제</strong>가 확보되지 않음.</li>
<li>2.1.x 는 차후에 <strong>&#39;Self Sign Certificate&#39;</strong> 을 진행하는 과정에서 <strong>인증 요소가 약간 변경</strong> 되었음.<blockquote>
<p>21.10.23 기준) 2.1.x 버전도 <a href="https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate">이것</a>이 정상 작동하는 것을 확인.</p>
</blockquote>
</li>
<li>2.0.10 부터 <strong>Open JDK 11 버전을 지원</strong>하기 시작</li>
<li>자세한 버전별 정리는 <a href="https://velog.io/@jongjin_kim/QZ-Tray-%EB%B2%84%EC%A0%84-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C">여기</a>를 참고 바란다.</li>
</ul>
</blockquote>
<h4 id="권장-버전open-jdk-11-사용자-기준">권장 버전(Open JDK 11 사용자 기준):</h4>
<blockquote>
<p>QZ Tray Version &gt;= 2.0.10 &amp; &lt; 2.1.0</p>
</blockquote>
<hr>
<h2 id="5-설치-과정">5. 설치 과정</h2>
<h3 id="-설치-과정은-두가지로-나뉜다">* 설치 과정은 두가지로 나뉜다.</h3>
<h4 id="1-설치하고-인증-여부-상관-없이-테스트-용-설치">1. 설치하고 인증 여부 상관 없이 테스트 용 설치</h4>
<blockquote>
<ul>
<li>이 경우에는 <a href="https://github.com/qzind/tray/tags">여기</a> 에서 일반적인 &#39;다운로드&#39; 로 설치 프로그램을 다운받아 설치하고, 설치 폴더 ../demo 폴더에서 테스트를 진행한다.</li>
</ul>
</blockquote>
<h4 id="2-설치하고-인증-후-원활한-사용-용-설치">2. 설치하고 인증 후 원활한 사용 용 설치</h4>
<blockquote>
<ul>
<li>QZ Tray 를 프로젝트에 추가해서 좀 더 기능적인 기능을 구현하고 싶은 경우 이 방법을 권장한다.</li>
<li><a href="https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate">여기</a>를 참고하기 바란다.</li>
</ul>
</blockquote>
<hr>
<h2 id="6-오류-대처">6. 오류 대처</h2>
<h3 id="61-설치-후-samplehtml-로-테스트를-해-보았는데-untrustred-website-오류가-뜨면서-접근-허용-다이어로그가-계속-떠요">6.1. 설치 후 sample.html 로 테스트를 해 보았는데, &#39;untrustred website&#39; 오류가 뜨면서 접근 허용 다이어로그가 계속 떠요.</h3>
<blockquote>
<ul>
<li>이 문제는 <a href="https://velog.io/@jongjin_kim/QZ-Tray-%EC%A6%9D%EB%AA%85%EC%84%9C-%EC%85%80%ED%94%84-%EB%B0%9C%EA%B8%89-Self-Signed-Certificate">여기</a> 에서 다뤄 보겠습니다.</li>
</ul>
</blockquote>
<hr>
<h2 id="7-마치며">7. 마치며</h2>
<p>오늘은 새로운 Qz Tray 라는 툴에 대해 알아 보았습니다.</p>
<p>다음 시간에는 실무에서도 사용할 수 있게, 제한되어 있는 인증 이슈 관련해서 다뤄보도록 하겠습니다.</p>
<p>궁금하신 점이나, 오류 사항은 댓글에 남겨 주시면 성심 성의 껏 답변 드리겠습니다.</p>
<p>// 작성자 본인으로서, 무단으로 글을 퍼가거나 복제하는 것을 금합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL Workbench DB 서버 연결]]></title>
            <link>https://velog.io/@jongjin_kim/MySQL-Workbench-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%951</link>
            <guid>https://velog.io/@jongjin_kim/MySQL-Workbench-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%951</guid>
            <pubDate>Mon, 11 Oct 2021 13:46:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이미지 출처: <a href="https://www.mysql.com">MySQL</a></p>
</blockquote>
<h1 id="📘-mysql-workbench-사용-방법">📘 MySQL Workbench 사용 방법</h1>
<h2 id="✔-시작하며">✔ 시작하며</h2>
<ul>
<li>데이터 베이스(DB)에 연결하기에 앞서 본인의 컴퓨터 혹은 원격 클라우드 컴퓨터 등에 데이터 베이스를 설치해야 한다.</li>
</ul>
<hr>
<h2 id="✔-database-연결">✔ Database 연결</h2>
<h3 id="✔-필수-값-입력">✔ 필수 값 입력</h3>
<ol>
<li><p>설치가 완료된 MySQL Workbench 를 실행하고, 실행하면 다음과 같은 화면이 켜진 것을 확인한다.
<img src="https://images.velog.io/images/jongjin_kim/post/71fd9dea-0da0-4fa1-942f-cd65479c7f41/image.png" alt=""></p>
<blockquote>
<p>정상적으로 실행이 되었다면, &#39;MySQL Connections&#39; 옆에 &#39;+&#39; 버튼을 눌러 새로운 연결을 생성한다.</p>
</blockquote>
</li>
<li><p>&#39;+&#39; 버튼을 누르고 다음과 같은 새로운 창이 열리면, 다음과 같이 색칠된 부분만 신경써서 연결 객채를 생성해 준다.
<img src="https://images.velog.io/images/jongjin_kim/post/372d545a-60a2-46de-8b2b-3c8c51273a44/image.png" alt=""></p>
</li>
</ol>
<blockquote>
<ul>
<li>Connection Name: 연결 객체의 별칭으로, 연결 자체에는 직접적인 연관이 없음으로 내가 알고 구분하기 쉬운 이름을 지정한다. (영문 사용 권장)</li>
<li>Hostname: 기본값은 사진과 같은 &#39;127.0.0.1&#39; or &#39;localhost&#39; 이지만, 원격 서버의 경우 해당 원격 서버의 IP 를 입력해 준다.<blockquote>
<ul>
<li>공유기에 함께 연결되어 있는 로컬 서버: ex) 192.168.0.xxx<blockquote>
<ul>
<li>CMD 창을 열고 &#39;ipconfig&#39; 라고 입력 했을 때, 나오는 다음과 같은 IPv4 주소 값을 말한다.
<img src="https://images.velog.io/images/jongjin_kim/post/e000c262-1575-4cde-b3a5-a706bf6231f4/image.png" alt=""></li>
</ul>
</blockquote>
</li>
<li>물리적인 원격 서버: ex) 59.12.42.125<blockquote>
<ul>
<li>클라우드 기반 사용시, 해당 제공 서비스에서 IP 를 지정하고 관리할 수 있게 해준다.</li>
<li>물리적으로 독립된 일반 원격 컴퓨팅 서버의 경우, <a href="https://findip.kr/">여기</a> 를 접속하여 접속하는 컴퓨터의 공식 IP 를 알려준다. 
(링크가 유효하지 않을 경우, Google 에 &#39;my ip address&#39; 라고 검색해서 나온 상단 결과 사이트를 무작위로 들어가도 나온다.)</li>
</ul>
</blockquote>
</li>
</ul>
</blockquote>
</li>
<li>Port: MySQL 이외 다른 RDBMS 를 사용할 경우, 맞는 지정 Port 값을 사용해 줘야 한다. (MySQL 을 사용하므로 그대로 3306 을 사용한다.)</li>
<li>Username: 초기에 MySQL 을 설치할 때 지정해 줬던 사용자 명이나, 이후에 따로 권한 부여를 통해 RDBMS 계정을 추가한 사용자명을 입력하면 된다. 
(초기 슈퍼 사용자 명은 보통 root 로 통용 된다.)</li>
<li>Password ...Store in Vault: 사용자 명과 일치하는 비밀번호를 입력하면 된다.
<img src="https://images.velog.io/images/jongjin_kim/post/89b68d74-570b-42f4-8887-88b5e507d7ca/image.png" alt=""></li>
<li>Test Connection 버튼: 위의 값들이 모두 유효한 값으로 일치하면, 연결 검사가 정상적으로 끝난다. 
<img src="https://images.velog.io/images/jongjin_kim/post/323d2477-83b0-4b20-889d-456dfe4bc13d/image.png" alt=""></li>
</ul>
</blockquote>
<h4 id="✔-최종-연결-성공시">✔ 최종 연결 성공시,</h4>
<p><img src="https://images.velog.io/images/jongjin_kim/post/30e10d33-837e-4d62-9ebb-fc5aac7a0a91/image.png" alt=""></p>
<h4 id="✔-최종-연결-실패시">✔ 최종 연결 실패시,</h4>
<p><img src="https://images.velog.io/images/jongjin_kim/post/0aa3121f-31b6-4b53-8b5d-b1978bcb8355/image.png" alt=""></p>
<h3 id="✔-갑자기-연결-값들을-가린이유">✔ 갑자기 연결 값들을 가린이유?</h3>
<blockquote>
<ul>
<li>기존의 127.0.0.1 의 값으로 하다가, 필자의 연결 값들은 실제 원격 DB 기준으로 입력했기 때문에 보안상의 유출 문제 방지를 위해 가리게 되었다.</li>
</ul>
</blockquote>
<h3 id="✔-connection-test-시-뜨는-메시지는">✔ Connection Test 시 뜨는 메시지는?</h3>
<blockquote>
<ul>
<li>연결하려고하는 구축된 원격 DB Server 의 MySQL 버전과, MySQL Workbench 에서 연결하기 위해 사용하는 드라이버의 버전이 적합하게 호환되지 않는다는 주의 메시지 이다.
(주의 메시지 일뿐 직접적인 오류는 발생하지 않지만, 차후 이로인해 문제가 발생할 수는 있다.)</li>
</ul>
</blockquote>
<h3 id="✔-모든-값을-알맞게-입력해-줬음에도-왜-연결이-안되는-경우">✔ 모든 값을 알맞게 입력해 줬음에도 왜 연결이 안되는 경우</h3>
<blockquote>
<ul>
<li>입력한 사용자의 연결/접근 권한이 부족하거나 없어서 일 수 있다. <!--[(자세히)](https://velog.io/@jongjin_kim/MySQL-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95)  --></li>
<li>원격 서버의 경우, 방화벽으로 인한 연결 차단의 가능성을 결코 배제할 수 없다. <!--[(자세히)](https://velog.io/@jongjin_kim/MySQL-%EC%9B%90%EA%B2%A9-%EC%84%9C%EB%B2%84-IP-Whitelist-%EB%B0%8F-%EB%B0%A9%ED%99%94%EB%B2%BD-%ED%95%B4%EC%A0%9C) --></li>
<li>OK 버튼: DB 연결을 위한 연결 객체의 연결 가능 여부를 판단하지 않고, 일단 생성이 가능하지만 연결 검사 (Test Connection 에서 성공 후 이 버튼을 누르는 것을 권장한다.)</li>
</ul>
</blockquote>
<hr>
<h2 id="✔-마치며">✔ 마치며</h2>
<p>DB 서버와 연결하는 방법을 전혀 몰랐던 분들에겐 전반적인 가이드를, 연결 시도 중 낯선 오류를 맞닥뜨린 분들에겐 오류에 대한 해결책을 제공드릴 수 있었던 계기였으면 좋겠습니다.</p>
<p>궁금한 점, 시간이 지나 변경된 사항이 있거나, 잘못된 설명이나 해석이 있다면 편하게 댓글 남겨주시기 바랍니다.</p>
<p>이제는 연결을 성공적으로 완료했으니, 다음 포스트에서는 간단한 설정들과 기능들을 몇가지 소개하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL 워크벤치 설치]]></title>
            <link>https://velog.io/@jongjin_kim/MySQL-%EC%9B%8C%ED%81%AC%EB%B2%A4%EC%B9%98-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@jongjin_kim/MySQL-%EC%9B%8C%ED%81%AC%EB%B2%A4%EC%B9%98-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 11 Oct 2021 11:03:08 GMT</pubDate>
            <description><![CDATA[<p>이미지 출처: <a href="https://www.mysql.com">MySQL</a></p>
<h1 id="📘-mysql-workbench-설치">📘 MySQL Workbench 설치</h1>
<h2 id="✔-시작하며">✔ 시작하며</h2>
<ul>
<li>이번 시간에는 관계형 데이터 베이스에 접속하여 더 편하게 데이터 베이스와 질의하며 제어할 수 있게 도와주는 MySQL 워크벤치를 설치하고 간단하게 제어해 보려고 한다.<blockquote>
<p>MySQL 외에 다른 관계형 데이터 베이스를 해당 워크벤치에서 사용할 수 있지만, MySQL 에 특화되어 제공되는 툴이기에 MySQL 사용을 권장합니다.</p>
</blockquote>
</li>
</ul>
<p>시작 전 유의 사항:</p>
<ol>
<li>데이터 베이스: MySQL</li>
<li>데이터 베이스 엔진: InnoDB (자세한 사항은 따로 참고) (이번 시간에서는 크게 중요하진 않다.)</li>
<li>구동 운영체제: Windows 10 Home 64 bit</li>
<li></li>
</ol>
<blockquote>
<p>앞서 안내한 유의 사항과 크게 다른 점이 없다면, 설치하여 몇 가지 간단한 사용 방법을 파악할 때 큰 문제가 없을 것이다.</p>
</blockquote>
<h2 id="✔-설치-방법">✔ 설치 방법</h2>
<ol>
<li><p>먼저 mysql workbench 를 Google 에서 검색하여 제일 먼저 보이는 링크로 들어가게 되면 아래와 같은 페이지로 이동된다. <a href="https://dev.mysql.com/downloads/workbench/">(설치 페이지)</a>
<img src="https://images.velog.io/images/jongjin_kim/post/df763207-2d14-4a74-80a5-e28a0c705acf/image.png" alt=""></p>
</li>
<li><p>원하는 방식으로 쿠키 처리를 한 후, 바로 보이는 &#39;Download&#39; 버튼을 클릭하여 다운로드 한다. 
<img src="https://images.velog.io/images/jongjin_kim/post/4bf1770e-8220-426f-98ec-3895629016f8/image.png" alt=""></p>
</li>
<li><p>다운로드 버튼을 클릭하여 다음으로 넘어가면 로그인을 권장하지만, 
신경쓰지 말고 바로 다운로드를 진행한다.
<img src="https://images.velog.io/images/jongjin_kim/post/8a55de66-45c1-4ad8-aadb-8d25232595a0/image.png" alt=""></p>
</li>
<li><p>다운로드가 완료되면, 창을 열고 설치를 진행한다.
<img src="https://images.velog.io/images/jongjin_kim/post/bfd32868-d5d1-4a44-a4e8-05b93539808a/image.png" alt=""></p>
</li>
<li><p>다음으로 넘어가면 설치할 경로를 지정하라고 하지만, 필자는 따로 지정할 필요가 없기에 제안해주는 경로에 그대로 설치를 진행한다.
<img src="https://images.velog.io/images/jongjin_kim/post/a1b9f219-f9ed-4453-b71e-6c9ee9f44a10/image.png" alt=""></p>
</li>
<li><p>설치 유형은 완전(Complete) 판으로 진행한다. 사용자 지정(Custom) 판은 심화 사용자에게 권장한다고 안내되어 있다.
<img src="https://images.velog.io/images/jongjin_kim/post/5733f003-a4b8-42d2-b01a-e1fd99612992/image.png" alt=""></p>
</li>
<li><p>나머지 진행 버튼을 순차적으로 눌러주게되면 설치는 문제없이 완료가 된다.</p>
</li>
</ol>
<h2 id="✔-설치하는-과정에서-오류가-발생해요">✔ 설치하는 과정에서 오류가 발생해요.</h2>
<h3 id="➰-c-2019-redistributable-packaged">➰ ...C++ 2019 Redistributable Packaged...</h3>
<blockquote>
<ul>
<li>설치를 진행하려고 하니 다음과 같은 오류가 발생하면서 설치가 진행되지 않는다.
<img src="https://images.velog.io/images/jongjin_kim/post/91609660-a91d-4941-aa9f-3d921b4b541d/image.png" alt=""></li>
</ul>
</blockquote>
<blockquote>
<p>다음 두 방법 중 하나를 통해 이를 해결할 수 있다.</p>
</blockquote>
<blockquote>
<ol>
<li>아래 제공된 링크를 통해 Visual C++ 2019 를 퀵 설치 하거나,<blockquote>
<p>참고 가이드: <a href="https://support.microsoft.com/ko-kr/help/2977003/the-latest-supported-visual-c-downloads">링크</a> | for x64: <a href="https://aka.ms/vs/16/release/vc_redist.x64.exe">vc_redist.x64.exe</a></p>
</blockquote>
</li>
</ol>
</blockquote>
<blockquote>
<p>2 &#39;Download Prerequisites&#39; 를 누르고 설치에 필요한 파일을 사전 설치한다. 
<img src="https://images.velog.io/images/jongjin_kim/post/65ca2eb9-1105-4614-9d84-ee2049eadae2/image.png" alt=""></p>
</blockquote>
<h2 id="✔-마치며">✔ 마치며</h2>
<p>개발이 뭔줄도 모르는 초짜 입장에서는 모든 것이 낯설고, 어떻게 해야할지 갈피를 잡기 어렵습니다.</p>
<p>이 글을 통해서 조금이나마 손쉽게 진행하실 수 있었길 바랍니다.</p>
<p>성공적으로 잘 했다면 좋아요 한번씩 눌러주시길 바랍니다.</p>
<p>궁금한 점, 시간이 지나 변경된 사항이 있거나, 잘못된 설명이나 해석이 있다면 편하게 댓글 남겨주시기 바랍니다.</p>
<p>이제는 설치를 완료했으니, 다음 포스트에서는 연결 방법과 함께 간단한 설정들과 기능들을 몇가지 소개하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 시작하기: 설치]]></title>
            <link>https://velog.io/@jongjin_kim/Getting-Started-Python</link>
            <guid>https://velog.io/@jongjin_kim/Getting-Started-Python</guid>
            <pubDate>Mon, 04 Oct 2021 08:34:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>썸네일 이미지 출처:  Google Image</p>
</blockquote>
<h2 id="📘-파이썬-설치하기">📘 파이썬 설치하기</h2>
<h3 id="✔-시작하며">✔ 시작하며...</h3>
<p>오늘은 파이썬을 설치해 보려고 한다.</p>
<p>먼저, 아래의 링크에 접속하여 설치를 시작해 보자.</p>
<p><a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a></p>
<p>파이썬은 오픈소스로 누구나 자유롭게 다운로드 하여 사용할 수 있는 프로그래밍 언어다.</p>
<p>파이썬 다운로드 링크를 타고 들어가면 다양한 버전들을 확인할 수 있는데, 너무 오래되지도 최신이지도 않은 적당한 버젼을 다운로드 받아서 설치해보자.</p>
<h3 id="✔-버전-선택-고려-사항">✔ 버전 선택 고려 사항</h3>
<p>2.x.x 보다는 3.x.x 을 사용하는 것을 권장한다.</p>
<blockquote>
<ul>
<li>직접 사용해 보면 다양한 부분에서 3.x.x 버전 대에 비해 지원하지 않는 점이나,
사용 방식에서 차이가 나는 것을 확인할 수 있다.</li>
<li>다양한 라이브러리를 가져와서 사용할 때 또한, 3.x.x 가 더 유연한 확장성과 다양성을 보장한다.</li>
<li>하지만, 너무 최신 버전의 3.9.x 와 같은 버전의 사용은 타 라이브러리를 이용하는 측면에서 오히려 업데이트가 되어 있지 않아 호환성 문제가 발생할 수 있음으로, 이 또한 권장하지 않는다.</li>
</ul>
</blockquote>
<p><img src="https://images.velog.io/images/jongjin_kim/post/a6e41594-5dc4-4856-9d50-610fe914e2ad/image.png" alt=""></p>
<h4 id="✔-버전을-선택할-시-제일-중요하게-고려해야-할-것">✔ 버전을 선택할 시 제일 중요하게 고려해야 할 것:</h4>
<ol>
<li>Long Term Support (장기 지원) - 언제까지 해당 버젼에 대해 관리와 기술적인 지원이 적용될 것 인지를 확인 해야 한다.</li>
<li>Popularity (대중성) - 어떤 버전이 얼마나 많은 이들에게 사용되고 있는지에 따라, 각기 다른 라이브러리 호환성이 무시 못하게 영향을 미칠 수 있다.</li>
</ol>
<p>이제 정말 설치를 진행해 보자.
필자는 여기서 Python-3.7.9 버전을 설치해볼 것이다.</p>
<h3 id="✔-설치-과정">✔ 설치 과정</h3>
<ol>
<li>앞서 소개한 링크를 접속한다.
<img src="https://images.velog.io/images/jongjin_kim/post/b5efd25c-8e73-481a-b9b2-eac7ee7279e5/image.png" alt=""></li>
<li>스크롤을 내려 아래로 내려가면, 다양한 버전을 다운로드 할 수 있는 링크가 제공된다.
<img src="https://images.velog.io/images/jongjin_kim/post/399f20c7-c692-437e-8428-079979e4588c/image.png" alt=""></li>
<li>설치를 원하는 버전을 찾아 &#39;Download&#39; 를 클릭하여 설치 페이지로 이동한다.
<img src="https://images.velog.io/images/jongjin_kim/post/e2e7579c-d3b6-4dfd-98da-7868f5ff45c0/image.png" alt=""></li>
<li>이동 된 페이지 아래로 내려보면, 다운로드 할 수 있는 다양한 운영체제별 설치 파일들이 있는데, 이 중에서 필자는 &#39;Windows x86-64 executable installer&#39; 를 설치해 보려고 한다.
<img src="https://images.velog.io/images/jongjin_kim/post/a0a9e5ac-b059-4719-a37a-0ebdfc2d3a7e/image.png" alt=""></li>
</ol>
<ul>
<li>많은 설치 파일 중 위 파일을 선택한 이유:
1) 사용하는 컴퓨터가 Windows 10 Home 64 bit 다.
2) executable 설치 파일이 설치하기 간편하다.</li>
</ul>
<ol start="5">
<li>설치 파일 다운로드를 완료하면, 설치 파일을 실행해서 설치를 시작한다.
그냥 간단하게 설치하고 경로를 별로 신경쓰지 않으면 &#39;Install Now&#39; 를 통해 간편 설치를 진행하고, 추가 설정을 진행 할 경우 사진처럼 따라 설정을 하고 설치를 진행하면 된다.</li>
</ol>
<ul>
<li>추가 설정:
1) &#39;Add Python 3.7 to PATH&#39; 를 선택하고 설치하면, 차후에 CMD 를 통해 &#39;python&#39; 이라는 명령어만을 입력해도, 콘솔 환경에서 python 을 실행 해 볼 수 있다. (UI 없는 테스트 코딩 프로그램 실행할 때도 유용.)
2) &#39;Customize Installation&#39; 을 선택하여 설치하면, 경로와 제공되는 기능을 원하는 대로 설치할 수 있다. (자세한 설명은 다음 사진에서 설명하겠다.)
<img src="https://images.velog.io/images/jongjin_kim/post/01c40c68-0f7a-4d8e-9351-55d10fcd5007/image.png" alt=""></li>
</ul>
<ol start="6">
<li>다른 옵션들은 선택적으로 체크하고 설치를 진행하면 되지만, 하이라이트 된 pip 는 꼭 체크를 하고 설치를 진행해야 한다. (차후에 파이썬 라이브러리를 손쉽게 설치하기 위함.)
<img src="https://images.velog.io/images/jongjin_kim/post/44dac2cd-e07b-4bba-9553-bea647a91b8a/image.png" alt=""></li>
<li>&#39;Next&#39; 를 누르고 다음으로 넘어가면, 아래와 같은 상태일텐데, 이 때, 필자는 색칠된 부분을 체크하고 원하는 경로로 수정한 뒤 설치를 진행하겠다.</li>
</ol>
<ul>
<li>모든 사용자에게 설치를 하면, 다른 사용자로 컴퓨터 로그인을 해도 원활하게 사용할 수 있다.</li>
<li>경로를 좀 더 내가 찾기 쉬운 경로로 수정한다.</li>
<li>두번째 색칠된 &#39;Download debug binaries&#39; 는 VS 를 IDE 로 사용하여 개발을 할 경우 함께 설치하면 좋다.
<img src="https://images.velog.io/images/jongjin_kim/post/0422a4e4-9873-4d9a-8223-ca2eabc0a3b5/image.png" alt=""></li>
</ul>
<ol start="8">
<li>설치를 누르고 진행한다. 설치가 완료되면, 다음과 같은 화면이 나온다.
<img src="https://images.velog.io/images/jongjin_kim/post/14bbe1cf-0a10-4030-8efc-c0a5aef8214d/image.png" alt=""></li>
<li>설치가 정상적으로 되었는지 확인해보기 위해 CMD 창을 열어 파이썬을 실행해 보겠다.
정상적인 설치가 완료가 되면, 아래와 같이 명령어를 입력했을 때, 오류 없이 잘 출력이 되어야 한다. 
(필자는 이전에 먼저 설치하여 사용하고 있던 python 3.7.6 이 있음으로, 3.7.9 가 출력되지 않았다.)
<img src="https://images.velog.io/images/jongjin_kim/post/5cfb1263-ac33-4695-90af-158ae0d16fb9/image.png" alt=""></li>
<li>설치가 정상적으로 된 것을 확인했다면, 마지막으로 본격적인 파이썬 사용에 앞서 pip(라이브러리 설치 툴)를 업데이트 해주자.</li>
</ol>
<h3 id="✔-파이썬-라이브러리-이용-준비">✔ 파이썬 라이브러리 이용 준비</h3>
<pre><code class="language-cmd">pip install --upgrade pip
python -m pip install --upgrade pip</code></pre>
<h3 id="✔-cmd-를--실행하는-방법">✔ CMD 를  실행하는 방법</h3>
<ol>
<li>Win + R</li>
<li>cmd 입력 후 엔터
or</li>
<li>Window 키 입력후 cmd 검색 후 실행</li>
</ol>
<blockquote>
<p>Ctrl + Shift + Enter 를 누르면 관리자 권한으로 프로그램을 실행하는 꿀팁도 있으니, 참고하면 좋겠다.</p>
</blockquote>
<hr>
<h3 id="✔-마치며">✔ 마치며</h3>
<p>파이썬 설치를 해보고 싶은 입문자 분들이 이 글을 보고 손쉽게 파이썬 설치를 했으면 좋겠습니다.</p>
<p>성공적으로 파이썬 설치를 잘 했다면 좋아요 한번씩 눌러주시길 바랍니다.</p>
<p>궁금한 점, 시간이 지나 변경된 사항이 있거나, 잘못된 설명이나 해석이 있다면 편하게 댓글 남겨주세요.</p>
]]></description>
        </item>
    </channel>
</rss>