<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>새로움 그리고 거나미스</title>
    <link>https://gunamis.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 10:50:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>거나미스</managingEditor>
    <image>
      <title>새로움 그리고 거나미스</title>
      <url>https://t1.daumcdn.net/cfile/tistory/240C754458DB4B7F22</url>
      <link>https://gunamis.tistory.com</link>
    </image>
    <item>
      <title>Tomcat9 400,505 redirect issues. ErrorReportValve</title>
      <link>https://gunamis.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat 9에서 에러페이지 리다이렉팅을 위하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Project내 Web.xml에 각각의 오류에 해당하는 error Page를 기술하였음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;error-page&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;lt;error-code&amp;gt;404&amp;lt;/error-code&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;lt;location&amp;gt;/noresource.os&amp;lt;/location&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/error-page&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;But.. 그러나... 두둥...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;400, 505에러에 대해서는 redirect가 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat 어느 버전부터인지는 확실하지 않지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ErrorValve 처리에 대한 구성이 바뀐듯 함&lt;/p&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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat의 ErrorReportValve를 오버라이드하여 CustomErrorReportValve를 생성해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Maven 사용을 가정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tomcat-catalina를 pom.xml에 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.tomcat&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;tomcat-catalina&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt; 10.0.27&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※관련된 library는 다음과 같음 (Maven을 오프라인으로 사용시 아래 모든 jar를 받아주자)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RCFyE/btsAmFF8pXr/tPMWDU5MUKwDAFONWOxRF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RCFyE/btsAmFF8pXr/tPMWDU5MUKwDAFONWOxRF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RCFyE/btsAmFF8pXr/tPMWDU5MUKwDAFONWOxRF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRCFyE%2FbtsAmFF8pXr%2FtPMWDU5MUKwDAFONWOxRF1%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;208&quot; height=&quot;346&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java 파일을 만들면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;package com.gunamis.config;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import java.io.BufferedWriter;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import java.io.IOException;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import java.io.Writer;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import java.io.OutputStreamWriter;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import org.apache.catalina.connector.Request;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import org.apache.catalina.connector.Response;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;import org.apache.catalina.valves.ErrorReportValve;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;public class CustomErrorReportValve extends ErrorReportValve {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; protected void report(Request request, Response reponse, Throwable t) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; StringBuilder sb = new StringBuilder();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.append(&quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;error&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;에러&amp;lt;br&amp;gt;Error!!!!&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 한글출력을 위하여 아래 2줄 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response.setContentType(&quot;text/html&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response.setCharacterEncoding(&quot;utf-8&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Writer writer = response.getReporter();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(writer != null) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.write(sb.toString());&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp; catch (Exception ex) {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;그리고 해당 Java파일만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Export하여 Jar파일 생성&lt;/span&gt;&lt;/b&gt;해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성하면 CustomErrorReprotValve.jar 가 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(상기 Maven의 jar가 하나라도 누락시 오류가 나니 오프라인에서는 모두 있는지 반드시 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이후 tomcat의&amp;nbsp;Server.xml에 다음 부분을 찾아 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단일 host를 가정함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Host name=&quot;localhost&quot; ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;b&gt;errorReportValveClass =&quot;com.gunamis.config.CustomErrorReportValve&quot;&lt;/b&gt;&lt;/span&gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/Host&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 톰캣 재시작.. 반드시 재시작..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면.. 400, 505에 대한 페이지는 Custom으로 처리됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <category>404</category>
      <category>505</category>
      <category>CustomErrorReportValve</category>
      <category>ErrorReportValve</category>
      <category>redirect</category>
      <category>tomcat9</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/200</guid>
      <comments>https://gunamis.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 14 Nov 2023 13:44:48 +0900</pubDate>
    </item>
    <item>
      <title>java Spring 8.2.2 2c.. 어쩌고 에러</title>
      <link>https://gunamis.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;more than &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;one&lt;span&gt; &lt;/span&gt;&lt;/span&gt;fragment..&amp;nbsp; 어쩌고 저쩌고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8.2.2 2c of 어쩌고 저쩌고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 관련 Library 중복으로 인한 내용으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Pom.xml에 중복 선언되어 있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. custom lib폴더에 중복으로 들어있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <category>8.2.2</category>
      <category>more than one fragment</category>
      <category>springmvc error</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/199</guid>
      <comments>https://gunamis.tistory.com/199#entry199comment</comments>
      <pubDate>Wed, 1 Nov 2023 14:54:35 +0900</pubDate>
    </item>
    <item>
      <title>Java. Patterh Match를 활용한 확장자 판단</title>
      <link>https://gunamis.tistory.com/198</link>
      <description>&lt;pre class=&quot;dart&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;String filename=&quot;aaa.pptx&quot;;
Pattern pt = Pattern.compile(&quot;(doc[x]*$|xls[x]*$|ppt[x]*$|pdf$|png$|jpg$|jpeg$|html$)&quot;,Pattern.CASE_INSENSITIVE);
Matcher match = pt.matcher(filename);
if(!match.find()) {
   // match.find()의 NOT인경우, 즉 위 해당 확장자가 아닌경우에 처리 할 내용
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/198</guid>
      <comments>https://gunamis.tistory.com/198#entry198comment</comments>
      <pubDate>Wed, 25 Oct 2023 14:48:51 +0900</pubDate>
    </item>
    <item>
      <title>NAXFA.COM 도메인 연결</title>
      <link>https://gunamis.tistory.com/196</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 연결..완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAXFA.COM ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 대표 도메인으로 gunamis.naxfa.com으로 연결 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2000초반부터 쓰던 별칭의도메인을 드디어.. 연결완료. ^^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NAxFA</category>
      <category>gunamis.naxfa.com</category>
      <category>http://gunamis.naxfa.com</category>
      <category>https://gunamis.naxfa.com</category>
      <category>NAXFA</category>
      <category>NAXFA.COM</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/196</guid>
      <comments>https://gunamis.tistory.com/196#entry196comment</comments>
      <pubDate>Tue, 10 Aug 2021 10:00:38 +0900</pubDate>
    </item>
    <item>
      <title>외부 참조 jar  포함 maven install</title>
      <link>https://gunamis.tistory.com/195</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;local-repository local repository file://${project.basedir}/lib com.xxxx&amp;lt;/groupId &amp;gt; base 1.0.0 system ${basedir}/lib/XXXX.jar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;project build-path : configure build path&lt;br /&gt;source : add folder : lib폴더 선택&lt;br /&gt;output folder : edit : lib폴더 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끗&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;plugins&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dust&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;&amp;lt;plugin&amp;gt;
   &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
   &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;
   &amp;lt;version&amp;gt;3.3.2&amp;lt;/version&amp;gt;
   &amp;lt;configuration&amp;gt;
      &amp;lt;webResources&amp;gt;
         &amp;lt;resource&amp;gt;
            &amp;lt;directory&amp;gt;${project.basedir}/lib&amp;lt;/directory&amp;gt;
            &amp;lt;targetPath&amp;gt;WEB-INF/lib&amp;lt;/targetPath&amp;gt;
         &amp;lt;/resource&amp;gt;
      &amp;lt;/webResources&amp;gt;
   &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/plugins&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;build&amp;gt;&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/195</guid>
      <comments>https://gunamis.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 30 Apr 2021 17:18:29 +0900</pubDate>
    </item>
    <item>
      <title>MAC os 카타리나(catalina) + Virtual Box</title>
      <link>https://gunamis.tistory.com/194</link>
      <description>&lt;p&gt;업데이트 이후 오류 발생&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;터미널에서 다음 명령어 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;$VBoxmanage setextradata global GUI/HidLedsSync 0&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오류 해결 됨&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>virtualbox #catalina #카타리나 #맥 #맥os</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/194</guid>
      <comments>https://gunamis.tistory.com/194#entry194comment</comments>
      <pubDate>Sat, 12 Oct 2019 20:32:50 +0900</pubDate>
    </item>
    <item>
      <title>YAML 문법 주의 사항 with AWX</title>
      <link>https://gunamis.tistory.com/193</link>
      <description>&lt;ol style=&quot;margin: 0px; color: rgb(23, 43, 77); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;li&gt;Indent&lt;ul style=&quot;margin: 0px; list-style-type: square;&quot;&gt;&lt;li&gt;들여쓰기 줄을 항상 맞춰야 한다&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;: 이후 띄어쓰기&lt;ul style=&quot;margin: 0px; list-style-type: square;&quot;&gt;&lt;li&gt;콜론 이후 띄어쓰지 않으면 문법 오류&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;: 이후 즉시 variable을 사용할 경우 ''로 래핑&lt;ul style=&quot;margin: 0px; list-style-type: square;&quot;&gt;&lt;li&gt;콜론 직후의&amp;nbsp;{}는 yaml에서 dictionary로 인식된다.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;AWX에서의 localhost ~와 ansible에서의 경로는 다르다.&lt;ul style=&quot;margin: 0px; list-style-type: square;&quot;&gt;&lt;li&gt;ansible에서의 ~는 /home/username 혹은 /root가 되지만, AWX에서는 /var/lib/awx/ (awx가 설치된 장소)이다.&lt;/li&gt;&lt;li&gt;~나 /를 사용한 절대 경로는 AWX에서 인식되지 않을 가능성 높음.&lt;/li&gt;&lt;li&gt;AWX에서의 현재 디렉토리 . 는 yml 파일이 존재하는 곳.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>AWX</category>
      <category>AWX</category>
      <category>yaml</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/193</guid>
      <comments>https://gunamis.tistory.com/193#entry193comment</comments>
      <pubDate>Wed, 2 Jan 2019 13:31:30 +0900</pubDate>
    </item>
    <item>
      <title>Django를 이용한 프로그래밍 #6 (with paramiko)</title>
      <link>https://gunamis.tistory.com/192</link>
      <description>&lt;ol style=&quot;margin: 10px 0px 0px; color: rgb(23, 43, 77); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;li&gt;paramiko를 활용하여 간단한 서버 사이드 호출 결과 화면 작성&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;화면에서 node IP, port, id, 패스워드를 입력하여 node에 접속 후 SSH를 통하여 명령어를 전송 후 화면에 표시&lt;/li&gt;&lt;li&gt;본 문서에서 사용한 명령어는 df -h 명령어를 사용하였음&lt;/li&gt;&lt;li&gt;보안관련 부분은 모두 제외 함 ( 패스워드 마킹, URL 삽입 해킹 등)&lt;/li&gt;&lt;li&gt;작성 화면&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C20E385D37F72727&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C20E385D37F72727&quot; width=&quot;600&quot; height=&quot;349&quot; filename=&quot;6-1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;결과 화면&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992D4A355D37F7392F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992D4A355D37F7392F&quot; width=&quot;600&quot; height=&quot;349&quot; filename=&quot;6-2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;준비 사항&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;paramiko 패키지 설치&lt;/li&gt;&lt;li&gt;#pip install paramiko&lt;/li&gt;&lt;li&gt;설치 후 확인&lt;/li&gt;&lt;li&gt;#pip show paramiko&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9941003D5D37F7540C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9941003D5D37F7540C&quot; width=&quot;600&quot; height=&quot;202&quot; filename=&quot;6-3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;위 내용 중 pip업그레이드는 본 문서와 별개이므로 패스 함 # 필요한 경우 업그레이드 해도 무방 함&lt;/li&gt;&lt;/ul&gt;Templates 수정 및 작성&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;Template 작성을 위한 디렉토리 이동&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 423px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99FCF3415D37F78630&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99FCF3415D37F78630&quot; width=&quot;423&quot; height=&quot;150&quot; filename=&quot;6-4.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;mainindex.html&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;사용자로부터 입력값을 전달 받는 화면&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;menu1.html&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;입력된 값으로 서버에서 paramiko를 활용하여 node에 접속 후 명령어를 실행하여 결과를 표시&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;mainindex.html 수정&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998E3D365D37F7BF2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998E3D365D37F7BF2C&quot; width=&quot;600&quot; height=&quot;563&quot; filename=&quot;6-5.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;form 화면은 기본적인 Javascript를 사용하였으며, 필요한 경우 JSON 방식으로 변경하여도 무방&lt;/li&gt;&lt;li&gt;{%csrf_token%}&amp;nbsp; &amp;nbsp;#Cross-site Request Forgery를 방지 하기 위함, Django에서 기본적으로 사용 됨&lt;br /&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;CSRF는 사이트간 위변조에 의한 해킹 방법으로 간단한 설명은&amp;nbsp;&lt;a class=&quot;external-link&quot; href=&quot;https://okky.kr/article/406000&quot; rel=&quot;nofollow&quot; style=&quot;color: rgb(0, 82, 204);&quot;&gt;https://okky.kr/article/406000&lt;/a&gt;&amp;nbsp;를 참조&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;menu1.html 작성&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 437px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995F843C5D37F7DE36&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995F843C5D37F7DE36&quot; width=&quot;437&quot; height=&quot;437&quot; filename=&quot;6-6.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;{% autoexcape off %} {{data}}&amp;nbsp;{% endautoescape %} 는 표시되는 데이터(data)에 들어있는 HTML 태그를 활성화 하기 위해 사용되는 예약어&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: rgb(51, 102, 255);&quot;&gt;{{data}}만 사용하는 경우와&amp;nbsp;{% autoexcape off %} {{data}}&amp;nbsp;{% endautoescape %}로 사용되는 경우에 대해서는 직접 확인하여 숙지 필요&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;views.py 수정&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;paramiko 사용을 위해 import 시킴&lt;/li&gt;&lt;li&gt;1 라인 : import paramiko&lt;/li&gt;&lt;li&gt;Template에서 action 실행시 받아줄 method를 작성&lt;/li&gt;&lt;li&gt;8 라인 ~ 55 라인 : def menu1(request): 에서 받아서 처리 됨&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 557px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99659F395D37F7FF32&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99659F395D37F7FF32&quot; width=&quot;557&quot; height=&quot;835&quot; filename=&quot;6-7.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;18 라인 ~ 22 라인 : 함수 내 지역변수 참조 오류를 피하기 위해 함수내 전역변수로 초기화&lt;/li&gt;&lt;li&gt;23 라인 ~ 27 라인 : request에서 post값을 받아오기 위해 처리&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;일반적으로 Django에서는 forms 개체를 사용하여 화면을 구성하며&lt;/li&gt;&lt;li&gt;이 경우 위 소스와는 틀린 방식으로 구현 됨&lt;/li&gt;&lt;li&gt;forms 클래스를 구현하여 작동하는 방식은 추후 다른 문서에서 작성 예정&lt;/li&gt;&lt;li&gt;request객체에는 POST를 비롯하여 GET 등 클라이언트로부터 넘어오는 값들이 들어 있음&lt;/li&gt;&lt;li&gt;오류 화면에서 넘어오는 값들을 모두 볼 수 있음&lt;/li&gt;&lt;li&gt;POST값으로 넘어오는 IP, PORT, USERID, PASSWORD를 각 변수에 할당&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;34 라인 ~ 50 라인 : paramiko를 활용하여 Node에 SSH 통신 연결&amp;nbsp;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;try: ... except: ... 를 활용하여 예외 처리 (예외 발생시 화면에 오류 표시)&lt;/li&gt;&lt;li&gt;40 라인 : df -h 명령어를 Node에서 실행&amp;nbsp;&lt;/li&gt;&lt;li&gt;41 라인 : 실행된 결과는 stdout에 저장되므로 stdout값을 data에 저장, 에러시 stderr에 저장 됨&amp;nbsp;&lt;/li&gt;&lt;li&gt;43 라인 ~ 44 라인 : 결과는 stdout에 \r\n 값으로 포함되므로 for 문장을 활용하여 1 라인씩 읽어들여 HTML태그(&amp;lt;P&amp;gt;...&amp;lt;/P&amp;gt;)로 씌움&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;55 라인 : 최종 작성된 context를 template(menu1.html)에 포함시켜 화면으로 전송&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;urls.py의 수정&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;사용자의 action에서 넘어오는 값을 받아 처리하도록 urls.py를 수정&lt;/li&gt;&lt;li&gt;action에 /menu1로 구성되어 있으므로&lt;/li&gt;&lt;li&gt;urls.py에 /menu1에 대한 액션시 받아들이는 함수 매핑&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 394px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B5D2395D37F8262F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B5D2395D37F8262F&quot; width=&quot;394&quot; height=&quot;289&quot; filename=&quot;6-8.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;6 라인 : menu1로 URL에서 넘어오는 경우 views.menu1 함수를 호출 하도록 설정&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;결과 확인&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;목표 화면이 나오는지 확인&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;추가 목표&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;다른 명령어를 수행하여 결과가 나오는지 확인&lt;/li&gt;&lt;li&gt;화면상에서 명령어를 입력받아 처리 후 화면에 표시되도록 설정&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python Django</category>
      <category>django</category>
      <category>Paramiko</category>
      <category>Python</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/192</guid>
      <comments>https://gunamis.tistory.com/192#entry192comment</comments>
      <pubDate>Wed, 2 Jan 2019 11:37:20 +0900</pubDate>
    </item>
    <item>
      <title>Django를 이용한 프로그래밍 #5</title>
      <link>https://gunamis.tistory.com/191</link>
      <description>&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(23, 43, 77); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;Templates(HTML)에서 사용되는 문법 편&lt;/p&gt;&lt;ol style=&quot;margin: 10px 0px 0px; color: rgb(23, 43, 77); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;li&gt;제어를 위한 문법&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% %} 의 기호를 사용&lt;/li&gt;&lt;li&gt;기본 문법은 Python을 따름&lt;/li&gt;&lt;li&gt;반복문&lt;br /&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% for data in datalist %}&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;{{data}}&lt;/li&gt;&lt;li&gt;{% endfor %}&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;비교문&lt;br /&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% if %}&lt;/li&gt;&lt;li&gt;{% elif %}&lt;/li&gt;&lt;li&gt;{% else %}&lt;/li&gt;&lt;li&gt;{% endif %}&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;값 저장&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% with var = data %}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;{{ var }} is storaged value&lt;/li&gt;&lt;li&gt;{% endwith %}&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;URL 하드 코딩을 방지&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% url %}&lt;/li&gt;&lt;li&gt;예) {% url 'namespace: view-name' arg1 arg2 %}&lt;/li&gt;&lt;li&gt;namespace는 urls.py에서 설정한 이름&lt;/li&gt;&lt;li&gt;view-name은 urls.py에서 설정한 URL패턴 이름&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;CSRF 공격 방지&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% csrf_token %}&amp;nbsp;&lt;/li&gt;&lt;li&gt;form x태그 윗줄에 삽입&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;사용자 정의 태그 및 필터 로딩&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{% load %}&lt;/li&gt;&lt;li&gt;예) {% load lib package.plib %}&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;변수를 위한 문법&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;{{ }} 기호를 사용&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;strong&gt;사용기호 주의 : AngularJS의 문법과 비슷함&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;{{ 변수명 }} 으로 사용되며, Django에서 내부의 내용을 출력&lt;/li&gt;&lt;li&gt;생성된 변수의 초기값은 빈 문자열 값&lt;/li&gt;&lt;li&gt;변수명에 . (dot)을 사용하면 다음 순서로 확인 과정을 거침&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;사전(Dic) 타입인지 확인&lt;/li&gt;&lt;li&gt;해당 속성인지 확인&lt;/li&gt;&lt;li&gt;리스트 타입인지 확인&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;필터&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;소문자로 변경&amp;nbsp;{{ str | lower }}&lt;/li&gt;&lt;li&gt;특수 문자 이스케이프&amp;nbsp;{{ str | escape }}&lt;/li&gt;&lt;li&gt;특정 갯수 문자 리턴&amp;nbsp;{{ str | truncatewords: 5}} 앞에서 5개 문자를 리턴 (개행문자 제거됨)&lt;/li&gt;&lt;li&gt;리스트 내용 합치기&amp;nbsp;{{ listdata | join : &quot; - &quot;}}&amp;nbsp; listdata의 내용을 - 으로 연결 시켜 리턴&lt;/li&gt;&lt;li&gt;변수 값 확인&amp;nbsp;{{ variable | default : &quot;None&quot;}}&lt;/li&gt;&lt;li&gt;변수 길이 리턴&amp;nbsp;{{ variable&amp;nbsp;| length }}&lt;/li&gt;&lt;li&gt;HTML 태그 제거&amp;nbsp;{{ str | striptags }}&lt;/li&gt;&lt;li&gt;변수값이 1이 아니면 접미사 붙임&amp;nbsp;&amp;nbsp;{{ variable | pluralize : &quot;s&quot; }}&amp;nbsp;&amp;nbsp;// 값에 따라 작업이 필요할경우 사용&lt;/li&gt;&lt;li&gt;합 연산&amp;nbsp;{{ variable | add:&quot;2&quot; }}&amp;nbsp;// 문자열의 경우 문자열 조합, 리스트는 리스트를 합침, 숫자는 더함&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;기타&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python Django</category>
      <category>django</category>
      <category>Python</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/191</guid>
      <comments>https://gunamis.tistory.com/191#entry191comment</comments>
      <pubDate>Wed, 2 Jan 2019 11:35:35 +0900</pubDate>
    </item>
    <item>
      <title>Django를 이용한 프로그래밍 #4</title>
      <link>https://gunamis.tistory.com/190</link>
      <description>&lt;ol style=&quot;margin: 0px; color: rgb(23, 43, 77); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;li&gt;Django의 templates(html)와 views.py를 이용하여 화면 생성&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 280px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A702385D37F91D34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A702385D37F91D34&quot; width=&quot;280&quot; height=&quot;153&quot; filename=&quot;4-1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;위와 같은 화면을 표시하기 위한 프로그램 작성 방법 설명&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;사전 설정&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;화면에 표현하기 위한 적당한 이미지 파일 생성&amp;nbsp;&lt;/li&gt;&lt;li&gt;생성된 이미지를 Django가 설치된 서버로 전송&lt;/li&gt;&lt;li&gt;개발환경에서 Static 파일(이미지, CSS 등 정적 파일 모두)을 화면에 표시하기 위해서는&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;반드시 settings.py 파일 내에서 DEBUG = True 로 설정&lt;/span&gt;&lt;/strong&gt;되어야 함&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;Django는 Development와 Production에 대한 설정 부분이 다소 혼동을 주므로 반드시 확인할 것&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;※※※※※※※※※※※※※※※※※※※※&amp;nbsp; 추후 settings.py에 대한 설명을 별도 페이지에서 작성 예정&amp;nbsp;※※※※※※※※※※※※※※※※※※※※&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;views.py와 Templates의 연결관계&lt;br /&gt;&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;Django는 Templates라는 것으로 화면을 구성할 수 있음&lt;/li&gt;&lt;li&gt;이러한 Templates에는 화면, Html파일을 정의하며, 이 부분은 대부분 staticfiles와는 별개로 사용된다&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;views.py 수정&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;main 디렉토리에 있는 views.py 파일을 다음과 같이 수정&lt;/li&gt;&lt;li&gt;from django.template import loader&amp;nbsp; &amp;nbsp; &amp;nbsp;# template를 읽어들이기 위해 사용&lt;/li&gt;&lt;li&gt;template = loader.get_template('mainindex.html')&amp;nbsp; &amp;nbsp;# mainindex.html파일을 loader로 읽어 template 객체에 저장&lt;/li&gt;&lt;li&gt;context =&amp;nbsp;{ 'username' : 'gunamis',&amp;nbsp;}&amp;nbsp; &amp;nbsp; &amp;nbsp; # username에 값을 넣어서 context를 생성&lt;/li&gt;&lt;li&gt;return HttpResponse(template.render(context, request))&amp;nbsp; &amp;nbsp; &amp;nbsp; # context를 template객체에 전달하여 최종 html을 생성하여 Http로 Response를 함&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 432px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9962CD395D37F95334&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9962CD395D37F95334&quot; width=&quot;432&quot; height=&quot;246&quot; filename=&quot;4-2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;mainindex.html 작성&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;templates 폴더를 확인 ( 없으면 생성 )&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995B31415D37F96C30&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995B31415D37F96C30&quot; width=&quot;400&quot; height=&quot;222&quot; filename=&quot;4-3.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;mainindex.html파일을 생성하여 아래와 같이 작성&lt;/li&gt;&lt;li&gt;{% load static %}&amp;nbsp; &amp;nbsp; &amp;nbsp;# static을 로드&amp;nbsp; &amp;nbsp;이미지 등 static 파일을 사용하기 위해 필요&lt;/li&gt;&lt;li&gt;{% static &quot;main.jpg&quot;%}&amp;nbsp; &amp;nbsp;# static에 명시된 디렉토리명으로 치환 됨, /static/main.jpg&lt;/li&gt;&lt;li&gt;HTML소스를 보면 다음과 같이 치환됨&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 396px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990C9D3F5D37F97D1F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990C9D3F5D37F97D1F&quot; width=&quot;396&quot; height=&quot;441&quot; filename=&quot;4-4.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;{% if username %}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# views.py에서 전달된 context 중 username이 있다면&lt;/li&gt;&lt;li&gt;{{ username }}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # username의 값으로 치환&lt;/li&gt;&lt;li&gt;{% endif %}&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # if문 종료&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 435px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9959BD3C5D37F98C07&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9959BD3C5D37F98C07&quot; width=&quot;435&quot; height=&quot;530&quot; filename=&quot;4-5.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;이미지 static 파일 위치&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;개발 모드에서 Django는 static 파일의 위치가 다소 특이 함&lt;/li&gt;&lt;li&gt;별도로 지정할 수 있을듯 하나, 본 문서에서는 기본 위치로 사용 함&lt;/li&gt;&lt;li&gt;./py36-venv/lib/python3.6/site-packages/django/contrib/admin/static/ 위치에 파일 저장 됨 (각 개인의 환경에 따라 상이 할 수 있음)&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9957593A5D37F9BA05&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9957593A5D37F9BA05&quot; width=&quot;600&quot; height=&quot;37&quot; filename=&quot;4-6.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;위 위치한 곳으로 main.jpg 파일을 업로드&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;urls.py 파일 수정&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;root의 urls.py 파일 수정&lt;/li&gt;&lt;li&gt;from django.conf import settings&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;# conf의 settings 파일을 사용하기 위해 선언&lt;/li&gt;&lt;li&gt;from django.conf.urls.static import static&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# static 사용을 위해 선언&lt;/li&gt;&lt;li&gt;]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # static 파일 사용을 위해 선언&lt;/li&gt;&lt;li&gt;settings.py 파일을 보면 다음과 같이 선언되어 있음&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 483px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992A573E5D37F9CC32&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992A573E5D37F9CC32&quot; width=&quot;483&quot; height=&quot;75&quot; filename=&quot;4-7.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper confluence-embedded-manual-size&quot; style=&quot;position: relative; display: inline-block; max-width: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;이 위치가&amp;nbsp;./py36-venv/lib/python3.6/site-packages/django/contrib/admin/static/의 위치 임&lt;/li&gt;&lt;li&gt;DEBUG = True로 반드시 변경&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&quot;&quot;&quot; ... &quot;&quot;&quot;는 python에서 여러줄 주석 처리 하는 방법 임&lt;/li&gt;&lt;li style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99822D3B5D37F9DA2B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99822D3B5D37F9DA2B&quot; width=&quot;600&quot; height=&quot;545&quot; filename=&quot;4-8.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;confluence-embedded-file-wrapper&quot; style=&quot;position: relative; display: inline-block; max-width: 100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;실행&lt;ul style=&quot;margin: 0px;&quot;&gt;&lt;li&gt;브라우저를 실행하여 확인&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python Django</category>
      <category>django</category>
      <category>Python</category>
      <author>거나미스</author>
      <guid isPermaLink="true">https://gunamis.tistory.com/190</guid>
      <comments>https://gunamis.tistory.com/190#entry190comment</comments>
      <pubDate>Wed, 2 Jan 2019 11:35:10 +0900</pubDate>
    </item>
  </channel>
</rss>