<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ForA's Dlog</title>
    <link>https://fora.tistory.com/</link>
    <description>Sound Designer / Music Composer / Computer Scientist / Illustrator</description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 07:01:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ForA</managingEditor>
    <image>
      <title>ForA's Dlog</title>
      <url>https://tistory1.daumcdn.net/tistory/3094207/attach/e5b3413fe7794f44afeb7ac4b72286f9</url>
      <link>https://fora.tistory.com</link>
    </image>
    <item>
      <title>[맞춤동영상 제거] 유튜브 알고리즘에서 벗어나는 방법</title>
      <link>https://fora.tistory.com/92</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfeRe5/btqBO8I7M5y/ynYhYEph9xkGCYDAnsw9w0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfeRe5/btqBO8I7M5y/ynYhYEph9xkGCYDAnsw9w0/img.jpg&quot; data-alt=&quot; 유튜브의 흔한 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfeRe5/btqBO8I7M5y/ynYhYEph9xkGCYDAnsw9w0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfeRe5%2FbtqBO8I7M5y%2FynYhYEph9xkGCYDAnsw9w0%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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; 유튜브의 흔한 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;유튜브를 보다 보면 원하지 않는 영상임에도 알고리즘에 의해 들어 갈 때가 있다.&lt;/p&gt;
&lt;p&gt;필자 또한 원하는 것만 보고싶지만 간혹 고양이라던가 고양이에 이끌려서.. 정신차리면 파충류를 보고있는 경우가 태반.&lt;/p&gt;
&lt;p&gt;혹시 크롬 확장프로그램에 이것만 제거할 방법이 있지않을까 찾아보니 역시 있었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1581241287545&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Remove YouTube Recommended Videos and More&quot; data-og-description=&quot;Hide YouTube related videos, comments, video suggestions wall, homepage recommendations, trending tab, and other distractions.&quot; data-og-host=&quot;chrome.google.com&quot; data-og-source-url=&quot;https://chrome.google.com/webstore/detail/remove-youtube-recommende/khncfooichmfjbepaaaebmommgaepoid&quot; data-og-url=&quot;https://chrome.google.com/webstore/detail/remove-youtube-recommende/khncfooichmfjbepaaaebmommgaepoid&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6zam7/hyERqlsgvp/sQgaYyAO4SGjfGdcAxSnO1/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/remove-youtube-recommende/khncfooichmfjbepaaaebmommgaepoid&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chrome.google.com/webstore/detail/remove-youtube-recommende/khncfooichmfjbepaaaebmommgaepoid&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6zam7/hyERqlsgvp/sQgaYyAO4SGjfGdcAxSnO1/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Remove YouTube Recommended Videos and More&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Hide YouTube related videos, comments, video suggestions wall, homepage recommendations, trending tab, and other distractions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;chrome.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&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;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAmaW/btqBSOCA3kW/VLK6FZAWkoWIhZnanFCKn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAmaW/btqBSOCA3kW/VLK6FZAWkoWIhZnanFCKn0/img.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 6.41.50.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;672&quot; style=&quot;width: 23.2472%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAmaW/btqBSOCA3kW/VLK6FZAWkoWIhZnanFCKn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAmaW%2FbtqBSOCA3kW%2FVLK6FZAWkoWIhZnanFCKn0%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;484&quot; height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HoR62/btqBTLMaLg6/elIMYusQ95sy4zmG72xpQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HoR62/btqBTLMaLg6/elIMYusQ95sy4zmG72xpQ0/img.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 6.36.27.png&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1088&quot; style=&quot;width: 75.59%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HoR62/btqBTLMaLg6/elIMYusQ95sy4zmG72xpQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHoR62%2FbtqBTLMaLg6%2FelIMYusQ95sy4zmG72xpQ0%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;2548&quot; height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한층 쾌적해진 유튜브를 사용해보도록 하자&lt;/p&gt;</description>
      <category>ETC/Information</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/92</guid>
      <comments>https://fora.tistory.com/92#entry92comment</comments>
      <pubDate>Sun, 9 Feb 2020 18:47:19 +0900</pubDate>
    </item>
    <item>
      <title>[Notion] 노션, 맥북 빨간 밑줄 (spell check) 없애기</title>
      <link>https://fora.tistory.com/91</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.10.png&quot; width=&quot;513&quot; height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zp2hI/btqwXeTnpJN/EIEDatmM5lSzOp5hW1aD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zp2hI/btqwXeTnpJN/EIEDatmM5lSzOp5hW1aD7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zp2hI/btqwXeTnpJN/EIEDatmM5lSzOp5hW1aD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzp2hI%2FbtqwXeTnpJN%2FEIEDatmM5lSzOp5hW1aD7K%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.10.png&quot; width=&quot;513&quot; height=&quot;433&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; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.47.png&quot; width=&quot;502&quot; height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA1xM1/btqwVFkxpZ1/4Lg5e7GfKtukxmjwN4mUh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA1xM1/btqwVFkxpZ1/4Lg5e7GfKtukxmjwN4mUh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA1xM1/btqwVFkxpZ1/4Lg5e7GfKtukxmjwN4mUh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA1xM1%2FbtqwVFkxpZ1%2F4Lg5e7GfKtukxmjwN4mUh1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.47.png&quot; width=&quot;502&quot; height=&quot;495&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.59.png&quot; width=&quot;340&quot; height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cshlS4/btqwWyY6v3e/ctpetlWFFP6293inrkdwak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cshlS4/btqwWyY6v3e/ctpetlWFFP6293inrkdwak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cshlS4/btqwWyY6v3e/ctpetlWFFP6293inrkdwak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcshlS4%2FbtqwWyY6v3e%2FctpetlWFFP6293inrkdwak%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.41.59.png&quot; width=&quot;340&quot; height=&quot;394&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;환경설정에서 키보드 -&amp;gt; 텍스트 -&amp;gt; 맞춤법 -&amp;gt; 설정&lt;/p&gt;
&lt;p&gt;본인이 맞춤법 검사를 하고싶지않은 언어를 선택해제 해주면&amp;nbsp;맥북의 모든 어플에서 빨간 밑줄이 사라진다.&lt;/p&gt;
&lt;p&gt;만약 노션에서 밑줄체크를 원하지않는 영역이 있다면 드래그 후 오른쪽 클릭시 Disabled SpellCheck를 선택해주면 그 영역만 빨간 밑줄이 사라진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.46.17.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M6Rf7/btqwVhEgAFR/50BDNkONuWsLKroeIuyqMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M6Rf7/btqwVhEgAFR/50BDNkONuWsLKroeIuyqMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M6Rf7/btqwVhEgAFR/50BDNkONuWsLKroeIuyqMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM6Rf7%2FbtqwVhEgAFR%2F50BDNkONuWsLKroeIuyqMk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-07-21 오후 12.46.17.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;</description>
      <category>ETC/Information</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/91</guid>
      <comments>https://fora.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 21 Jul 2019 12:59:33 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] JSP의 정의 및 실행 절차</title>
      <link>https://fora.tistory.com/89</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;JSP&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;: Java Server Page&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서버스크립트 (jsp, php, asp)&lt;/li&gt;
&lt;li&gt;자바 웹 어플리케이션&lt;/li&gt;
&lt;li&gt;브라우저 서비스(뷰)를 담당하는 한 페이지를 표현&lt;/li&gt;
&lt;li&gt;Servlet Container (Apache Tomcat)를 통해 실행&lt;/li&gt;
&lt;li&gt;HTML(Css,JavaScript)(클라이언트 스크립트/브라우저에서 실행)&lt;/li&gt;
&lt;li&gt;Java 코드(서버 스크립트/ JVM에서 실행)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JSP 실행절차&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;hello.jsp페이지 요청&lt;br /&gt;&amp;rArr; &lt;a href=&quot;http://ip:port/%5BContextRoot(%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%AA%85)%5D/%EA%B2%BD%EB%A1%9C/%ED%8E%98%EC%9D%B4%EC%A7%80%EB%AA%85&quot;&gt;http://ip:port/[ContextRoot(프로젝트명)]/경로/페이지명&lt;/a&gt;&lt;br /&gt;&amp;rArr; &lt;a href=&quot;http://localhost:8282/TomTest/0711/hello.jsp&quot;&gt;http://localhost:8282/TomTest/0711/hello.jsp&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jsp 페이지 존재유무 &amp;rArr; 없을시 404에러&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;매핑된 서블릿클래스 존재유무 &amp;rArr; 없을시 생성&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt; public class hello extends HttpServlet{
     public void init(){}
     public void service(HttpServletRequest request,
         HttpServletResponse response){
         out.print(&quot;JSP페이지에서 작성된 HTML&quot;);
     }
     public void destroy(){}
 }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컴파일(hello.class) 유무 -----무----&amp;gt; 컴파일&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;메모리 적재 유무 ----무----&amp;gt; 메모리 로딩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;최초 호출인 경우 init()메소드 호출&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;service()메소드 호출&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;JSP 기본태그&lt;/h2&gt;
&lt;p&gt;: JSP 페이지(.jsp) 내에서 자바코드를 식별하는 태그&lt;/p&gt;
&lt;pre class=&quot;mojolicious&quot;&gt;&lt;code&gt;//Declaraction(선언)
&amp;lt;%!     %&amp;gt; 
&amp;lt;%!
    멤버요소 (전역변수선언, 선언과 동시에 초기화,메소드 정의)
    int su;
    int su2=100;
    public void getMsg(){
        return &quot;Message&quot;;
    } //비권장. 메소드는 클래스 안에 넣고 호출하는걸 권장
%&amp;gt;

//Scriptlet(실행)
&amp;lt;%      %&amp;gt;
&amp;lt;%
    service()메소드 안의 자바코드(지역변수선언, 변수초기화, 메소드호출,조건문 반복문,주석(//))
    int su3;
    int su4 = 40;
    su = 10; //멤버변수 초기화
    su3 = 30; //지역변수 초기화

    if(조건식){}
    for(반복문){}
    System.out.println(&quot;mes&quot;);
%&amp;gt;


//Expression(표현식, 출력식) 
&amp;lt;%=     %&amp;gt; 
&amp;lt;%=
    브라우저에 출력하고자 하는 데이터 (데이터, 변수명, 연산자, 리턴메소드호출)
    (서블릿코드에서 out.print(데이터); 변환)
%&amp;gt;
&amp;lt;%= 2+3 %&amp;gt;
&amp;lt;%= &quot;안녕&quot; %&amp;gt;
&amp;lt;%= su %&amp;gt;
&amp;lt;%= getMsg() %&amp;gt;

//Comment(주석,설명문)
&amp;lt;%--  --%&amp;gt; 
주석 참고)
&amp;lt;!--  --&amp;gt; HTML 주석문
&amp;lt;!-- &amp;lt;%= new Date()&amp;gt; --&amp;gt;
// 자바코드가 실행되지만 브라우저상에는 주석처리되어 소스에서 볼수있음&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;자바스크립트 영역에서 사용&lt;/h3&gt;
&lt;pre class=&quot;mojolicious&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    var str = &quot;javascript&quot;;
&amp;lt;/script&amp;gt;

&amp;lt;%= str %&amp;gt; 
//자바스크립트 영역에 있던 값을 자바영역에서 사용불가

&amp;lt;% 
    int su=300 
    String str = &quot;내일&quot;;
%&amp;gt;
&amp;lt;script&amp;gt;
    document.write(&amp;lt;%= su %&amp;gt;); //  가능
    document.write(&amp;lt;%= str %&amp;gt;); // 불가
    document.write(&quot;&amp;lt;%= str %&amp;gt;&quot;); // 가능
&amp;lt;/script&amp;gt;

&amp;lt;body&amp;gt; 
    &amp;lt;%
         int sum=50;
         String name=&quot;gildong&quot;;
    %&amp;gt;
    &amp;lt;input type='text' name='username' value='&amp;lt;%= name%&amp;gt;'&amp;gt;
    &amp;lt;script&amp;gt;
         var str=&quot;홍길동&quot;;
         document.write(str);                (O)
         document.write(sum);                (X)
         document.write(&amp;lt;%= sum %&amp;gt;);         (O) document.write(50);
         document.write(&amp;lt;%= name %&amp;gt;);        (X) document.write(gildong);
         document.write('&amp;lt;%= name %&amp;gt;');      (O) document.write('gildong');
         var su=&amp;lt;%=sum%&amp;gt;;                    (O)  var su=50;
         document.write('이름='+ &amp;lt;%=name%&amp;gt;); (X) document.write('이름='+ gildong);
         document.write('이름=&amp;lt;%=name%&amp;gt;');   (O) document.write('이름=gildong');
    &amp;lt;/script&amp;gt;
    &amp;lt;%
         out.print(str);                     (XX)    
                 out.print('&amp;lt;script&amp;gt;document.write(str);&amp;lt;/script&amp;gt;'); (O)
    %&amp;gt;

  &amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/89</guid>
      <comments>https://fora.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 15 Jul 2019 20:11:27 +0900</pubDate>
    </item>
    <item>
      <title>[SourceTree] 원인불명 먹통 해결방법 (=&amp;gt;소스트리 완전삭제)</title>
      <link>https://fora.tistory.com/87</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Git 특강을 듣던 중 Eclipse에서 Team&amp;rarr; share project를 한 순간 소스트리가 먹통이 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;분명 커밋할 파일은 있는데 파일 상태에 커밋할 파일이 뜨지않는 상황&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;s.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEQH8E/btqwMJAqGPa/I0TOknk1geIKRzZTjft0XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEQH8E/btqwMJAqGPa/I0TOknk1geIKRzZTjft0XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEQH8E/btqwMJAqGPa/I0TOknk1geIKRzZTjft0XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEQH8E%2FbtqwMJAqGPa%2FI0TOknk1geIKRzZTjft0XK%2Fimg.png&quot; data-filename=&quot;s.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당사항을 찾아봤지만 스택오버플로우에서도 찾지못한 원인불명의 먹통이었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;결국 해결한 방법은 소스트리 완전삭제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;소스트리 삭제방법&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;프로그램 추가/제거에 있는 sourcetree를 삭제하고&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;C:\Users\%USERNAME%\AppData\Local\Atlassian\&quot;&amp;nbsp;&lt;/span&gt;경로에 있는 폴더를 삭제한 후&lt;/p&gt;
&lt;p&gt;다시 설치하면 제대로 설치를 할 수 있게 된다.&lt;/p&gt;
&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;이클립스를 설정하다 일어난 일이니 소스트리 프로그램 자체가 불안정한 것이라 판단하였다.&lt;/p&gt;
&lt;p&gt;아래 Atlassian 커뮤니티에 들어가보면 삭제도 제대로 안된다고 까이고있는 소스트리 회사를 볼 수 있다 ( )&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1563183316907&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://community.atlassian.com/t5/Sourcetree-questions/How-do-I-do-a-full-uninstall-of-SourceTree-in-windows-10/qaq-p/364214&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://community.atlassian.com/t5/Sourcetree-questions/How-do-I-do-a-full-uninstall-of-SourceTree-in-windows-10/qaq-p/364214&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ouMEk/hyBZYx2erV/nkkKAK3OdDDDlkZu7fet40/img.png?width=1100&amp;amp;height=480&amp;amp;face=0_0_1100_480,https://scrap.kakaocdn.net/dn/IrqV3/hyBZ6ixGAR/D0GvB4c7syCsKvkjobAf51/img.png?width=298&amp;amp;height=452&amp;amp;face=0_0_298_452');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;How do I do a full uninstall of SourceTree in windows 10&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;How do I do a full uninstall of SourceTree in windows 10? A simple uninstall through Control Panel leaves all the information I want to get rid off. When the program is reinstalled, all the bookmarks, repos, etc reappear. As I am working on Windows 10, the&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;community.atlassian.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC/Information</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/87</guid>
      <comments>https://fora.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 15 Jul 2019 18:38:20 +0900</pubDate>
    </item>
    <item>
      <title>[XML] DOM(Document Object Model)</title>
      <link>https://fora.tistory.com/84</link>
      <description>&lt;ul&gt;
&lt;li&gt;XML Parser(xml 문서내의 데이터를 분석하는 도구)&lt;/li&gt;
&lt;li&gt;Tree 기반 API&lt;/li&gt;
&lt;li&gt;Parsing 후에 메모리상에 문서 전체의 트리구조를 만들어 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7Ren/btqwHJ64G8c/p7yByaBDWsLTwHlt0J8ji1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7Ren/btqwHJ64G8c/p7yByaBDWsLTwHlt0J8ji1/img.png&quot; data-alt=&quot;https://blog.scrapinghub.com/2016/10/27/an-introduction-to-xpath-with-examples&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7Ren/btqwHJ64G8c/p7yByaBDWsLTwHlt0J8ji1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7Ren%2FbtqwHJ64G8c%2Fp7yByaBDWsLTwHlt0J8ji1%2Fimg.png&quot; data-filename=&quot;4.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://blog.scrapinghub.com/2016/10/27/an-introduction-to-xpath-with-examples&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NodeList (DOM에 포함된 엘리먼트 집단)&lt;/li&gt;
&lt;li&gt;속성은 NodeList에 포함되지 못하여 NamedNodeMap 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;DOM API&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;메모리상의 데이터에 대한 프로그램&lt;/li&gt;
&lt;li&gt;Document, Element, Node&lt;/li&gt;
&lt;li&gt;NodeList, NamedNodeMap&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;    &amp;lt;books&amp;gt;
        &amp;lt;book&amp;gt;
            &amp;lt;title&amp;gt;Java&amp;lt;/title&amp;gt;
            &amp;lt;author&amp;gt;hong&amp;lt;/author&amp;gt;
        &amp;lt;/book&amp;gt;
        &amp;lt;book&amp;gt;
            &amp;lt;title&amp;gt;Python&amp;lt;/title&amp;gt;
            &amp;lt;author&amp;gt;sim&amp;lt;/author&amp;gt;
        &amp;lt;/book&amp;gt;
    &amp;lt;/books&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Node&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XML문서를 구성하는 모든 요소를 상징하는 객체이다.&lt;/li&gt;
&lt;li&gt;모든 객체의 공통적인 특성을 모아 놓은 추상화된 객체라고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;알아야할 메소드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;노드 정보를 얻거나 정하는(get,set) 메소드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;    nodeType     (1~12 --&amp;gt; ELEMENT_NODE ... TEXT_NODE)
    nodeName     (태그이름, 속성이름)
    nodeValue    (속성값, 텍스트값, 주석문값)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;조작(추가,삭제,수정) 메소드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;    appendChild    //자식추가
    insertBefore   //중간에 자식추가
    removeChild    //자식삭제
    replaceChild   //자식교환&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;관계(부모,자식) 메소드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;    parent
    child
    sibling&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Document&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XML문서의 Root Element의 바로 위에 위치하며, 문서 전체의 Root객체 역할을 한다.&lt;/li&gt;
&lt;li&gt;일종의 가상 객체라고 할 수 있다.&lt;/li&gt;
&lt;li&gt;위치 불변 : rootElement 바로 위(부모)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;    getDocumentElement()     // 루트엘리먼트를 얻을수있는 메소드

    createElement(&quot;태그명&quot;);  // 생성관련 메소드
    createAttribute
    createText
    createCDATASection

    Element getElementById(String 아이디값);
    NodeList getElementByTagName(String 태그명);&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Element&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XML문서에서 가장 중요하고 기본이 되는 단위(Unit)&lt;/li&gt;
&lt;li&gt;속성관련 메소드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;    hasAttribute
    getAttribute(속성명)
    setAttribute(속성명,속성값) ==&amp;gt;태그내에 새로운 속성 생성
    removeAttribute(속성명)     =&amp;gt; 태그내에 존재하는 속성 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NodeList&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DOM트리에 표현되는 노드들을 저장하는 객체&lt;/li&gt;
&lt;li&gt;단, Attribute 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;    length           ==&amp;gt;저장된 전체 노드수
    Node item(index) ==&amp;gt;저장된 노드 한개 얻어오기&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NamedNodeMap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;특정태그 (엘리먼트)에 속한 속성들을 저장하는 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;    length           ==&amp;gt;저장된 속성 노드수
    Node item(index) ==&amp;gt;저장된 속성 한개 얻어오기&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DOM Parser 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DocumentBuilder를 이용해 Document를 생성해 사용한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/84</guid>
      <comments>https://fora.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 10 Jul 2019 19:17:50 +0900</pubDate>
    </item>
    <item>
      <title>[XML] XML 자주쓰이는 문법 정리</title>
      <link>https://fora.tistory.com/83</link>
      <description>&lt;ul&gt;
&lt;li&gt;Well-formed(잘 구성된) xml 문서&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;문서 안에 최소 한개 이상의 element를 가져야함&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;문서 전체를 감싸는 단 한 개의 엘리먼트(Root Element)가 존재해야 함&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt; &amp;lt;A/ &amp;gt;
 &amp;lt;B/ &amp;gt; 
 ==&amp;gt; X

 &amp;lt;root&amp;gt;
 &amp;lt;A/ &amp;gt;
 &amp;lt;B/ &amp;gt;
 &amp;lt;/root&amp;gt; 
 ==&amp;gt; O. root 이름은 변경 가능&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;시작 태그가 있다면 그것에 매핑되는 끝태그가 반드시 존재해야 함&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt; 태그종류)
                 -시작태그 &amp;lt;PERSON&amp;gt;
                 -끝태그   &amp;lt;/PERSON&amp;gt;
                 -빈태그   &amp;lt;PERSON/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xml은 대소문자를 구분함 (참고: HTML은 태그명에 대소문자 구분 안함)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;엘리먼트는 포함관계가 꼬이면 안됨&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt; &amp;lt;a&amp;gt;
         &amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;
         &amp;lt;c&amp;gt;&amp;lt;/c&amp;gt;
 &amp;lt;/a&amp;gt;
 ==&amp;gt; O. b,c 엘리먼트(자식)는 a엘리먼트(부모)에 포함됨
              b와 c는 형제관계(sibling)

 &amp;lt;a&amp;gt;
         &amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;
         &amp;lt;c&amp;gt;
 &amp;lt;/a&amp;gt;
 &amp;lt;/c&amp;gt;
 ==&amp;gt; X. a,c 엘리먼트: 누가 부모이고 자식인지 알 수 없음&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xml선언은 전체 생략가능하나 선언하는 것을 권장.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt; &amp;lt;?xml version='1.0' encoding=&quot;UTF-8&quot; ?&amp;gt;
                                         ----------------
                                         현재 작성되는 XML문서내에 다국어를 사용하겠음.&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;- version속성은 생략불가
- 반드시 version속성을 먼저, encoding속성을 나중에 기술
- 속성값은 ' '(작은 따옴표) 또는 &quot; &quot;(큰 따옴표) 사용
- `&amp;lt;?xml` 앞에 공백(whitespace)을 쓰면 절대 안됨&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;
&lt;p&gt;태그의 내용(content)에 제한된 문자가 있음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;amp; , &amp;lt; , ]]&amp;gt;&lt;/code&gt; 사용불가&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;해결책) 제한된 문자를 &lt;code&gt;replace()&lt;/code&gt; 메소드로 변환 혹은 CDATA 섹션을 사용&lt;/p&gt;
&lt;p&gt;replace('&amp;lt;','%lt;')&lt;/p&gt;
&lt;![CDATA[ 데이터 문자만 표현하는 영역 ]]&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;속성값에 제한된 문자 &lt;code&gt;&amp;amp; , &amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i&gt;CDSect*&lt;/i&gt; : Character Data Section. 문자 데이터를 표현하는 영역&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;속성값은 반드시 인용부호(작은, 큰따옴표)를 사용해야함&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt; HTML의 경우)
 &amp;lt;table border=1 bgcolor=yellow&amp;gt;&amp;lt;/table&amp;gt; =&amp;gt; O

 XML의 경우)
 &amp;lt;table border=1 bgcolor=yellow&amp;gt;&amp;lt;/table&amp;gt; =&amp;gt; X
 &amp;lt;table border='1' bgcolor=&quot;yellow&quot;&amp;gt;&amp;lt;/table&amp;gt; =&amp;gt; O&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;서로 다른 속성은 반드시 공백을 통해 구분&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주석문(설명문, comment)에 제한된 문자&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!--' ((Char - '-') | ('-' (Char - '-')))* '--&amp;gt;
-------------
&amp;lt;!-- 설명문 --&amp;gt;
&amp;lt;!-- comment   --&amp;gt;   (O)
&amp;lt;!-- com-ment  --&amp;gt;  (O)
&amp;lt;!-- com-me-nt --&amp;gt;  (O)
&amp;lt;!-- com--ment --&amp;gt;  (X)
&amp;lt;!-- com- -ment --&amp;gt;  (O)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;document&lt;/h3&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;prolog element Misc*&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;XML문서의구성 &amp;rArr; 선언 엘리먼트 기타* &amp;rArr; 선언과 엘리먼트가 반드시 존재하여야함&lt;/p&gt;
&lt;h3&gt;prolog&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;XMLDecl? Misc* (doctypedec1 Misc*)?&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;XMLDecl&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;'&amp;lt;?xml' VersionInfo EncodingDecl? SDDecl? S? '?&amp;gt;'
                      &amp;lt;?xml version ='1.0' ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;버전은 생략 불가, 인코딩과 SD선언은 생략가능.&lt;br /&gt;전체 정의시 순서 지킬것&lt;br /&gt;&amp;rArr; &lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Misc&lt;/h3&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;Comment | PI | S&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Character Reference&lt;/h3&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;(#x20 | #x9 | #xD | #xA)+
----- ---- --- ----
space tab CR LF&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CharData&lt;/h3&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;[^&amp;lt;&amp;amp;]* - ([^&amp;lt;&amp;amp;]* ']]&amp;gt;' [^&amp;lt;&amp;amp;]*)
제외문자=&amp;gt; '&amp;lt;' , '&amp;amp;' , ']]&amp;gt;' // 예약된문자이기 때문&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/83</guid>
      <comments>https://fora.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 10 Jul 2019 19:13:40 +0900</pubDate>
    </item>
    <item>
      <title>[XML] XML 정의 및 구조</title>
      <link>https://fora.tistory.com/82</link>
      <description>&lt;p&gt;: e&lt;b&gt;X&lt;/b&gt;tensible &lt;b&gt;M&lt;/b&gt;arkup &lt;b&gt;L&lt;/b&gt;anguage (부가적인 마크업 언어)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XML &amp;rArr; 데이터 저장방식. Standard Text Data&lt;/li&gt;
&lt;li&gt;어떤 플랫폼에서나 읽을 수 있는 포맷 제공, 고정된 형식이 아닌 확장이 가능한 언어&lt;/li&gt;
&lt;li&gt;태그를 사용자가 직접 정의할 수 있으며 그 태그를 다른사람들이 사용하도록 할 수 있다. 다른언어를 기술하기 위한 언어, 즉 메타언어이다.&lt;/li&gt;
&lt;li&gt;마크업: 원래의 내용에 특별한, 또는 추가적인 정보를 표시하는 모든 것을 의미.&lt;br /&gt;예) 밑줄, 색상, 폰트의 변화, 번호매기기 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;XML 문서구조 형태&lt;/h2&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;[XML선언]
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; 

[DTD]
&amp;lt;!DOCTYPE root[
    &amp;lt;!ELEMENT root(#PCDATA)&amp;gt;]&amp;gt; 

[도큐먼트 인스턴스]
-- 엘리먼트 컨텐트
&amp;lt;시작태그&amp;gt;내용(데이터)&amp;lt;/끝태그&amp;gt; 
&amp;lt;사람나이&amp;gt;23&amp;lt;/사람나이&amp;gt;

-- 속성값
&amp;lt;시작태그 속성명=&quot;속성값&quot;&amp;gt; 
&amp;lt;빈태그 속성명=&quot;속성값&quot;&amp;gt;
&amp;lt;사람 이름=&quot;나길동&quot;&amp;gt; //나길동:데이터 , 이름:데이터에 대한 설명&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;엘리먼트 컨텐트 : 태그명이 데이터에 대한 설명&lt;/li&gt;
&lt;li&gt;속성값: 속성명이 데이터에 대한 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;b&gt;DTD&lt;/b&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Document Type Definition (문서 원형 정의) &amp;rArr; 문서 작성 규칙&lt;/li&gt;
&lt;li&gt;XML 문서 내에 출현할 엘리먼트, 속성의 종류, 순서, 데이터의 종류를 정의&lt;/li&gt;
&lt;li&gt;XML 문서 구성시 선택적 사항이다.&lt;/li&gt;
&lt;li&gt;XML 문서는 DTD를 포함하는지의 여부에 따라 구조적으로 정확한 문서인지, 또는 완전한 형식의 문서인지로 구분된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;XML Schema&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DTD와 같은 개념. 업그레이드된 DTD&lt;br /&gt;&amp;rArr; 여러 자료형을 정의할 수 있다.( 사용자 정의 자료형 )&lt;br /&gt;&amp;rArr; 태그의 출현 횟수를 정의하는 것이 편리&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;객체의 클래스 특성을 정의하는 것으로, XML의 경우 스키마란 문서가 마크업되는 방식에 대한 정의를 뜻함&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XML문서의 형식: 문서 내에 어떤 태그와 속성을 사용할 것인지 정의)&lt;/p&gt;
&lt;p&gt;선언위치)&lt;br /&gt;-DTD&lt;/p&gt;
&lt;!--?xml version=&quot;1.0&quot;?--&gt;
&lt;p&gt;DTD선언위치&lt;/p&gt;
&lt;p&gt;-XMLSchema&lt;/p&gt;
&lt;!--?xml version=&quot;1.0&quot;?--&gt;
&lt;p&gt;&amp;lt;root 스키마선언&amp;gt;&lt;/p&gt;
&lt;p&gt;예) DTD를 통해 태그 내에 자식태그 &lt;a&gt;가 최소 1번, 최대 5번 출현하는 것을 정의&lt;/a&gt;&lt;/p&gt;
&amp;lt;!ELEMENT root (a,a?,a?,a?,a?)&amp;gt;
&lt;p&gt;=&amp;gt; Schema에서는 속성 minOccurs=&quot;1&quot; maxOccurs=&quot;5&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주의) DTD 혹은 XMLSchema를 동시에 선언할 수 없다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;확장자.xsd 사용, XML문법을 사용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;작성법)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;simpleType : 태그내의 자료형(숫자, 문자, 날짜) 정의&lt;/li&gt;
&lt;li&gt;complexType :태그내의 자식요소 정의&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;적격(Well-Formed)문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;어떤 문서가 하나의 XML 문서로 간주되는데 필요한 최소한의 필수조건들의 집합을 의미.&lt;/li&gt;
&lt;li&gt;문법에 맞춘 문서. DTD를 가지지 않을 수도 있는 문서&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;유효한(Valid) 문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;적격문서보다 더 엄격한 조건들을 준수해야함.&lt;/li&gt;
&lt;li&gt;모든규칙을 따르고, 반드시 DTD를 가져야 하며 해당 XML 문서에 연관된 DTD 정의를 지켜야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;태그(엘리먼트) 정의&lt;/h3&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;lt;!ELEMENT 태그명 (자식요소에대한 표현)&amp;gt;

&amp;lt;!ELEMENT person (x)&amp;gt;
=&amp;gt; &amp;lt;person&amp;gt; &amp;lt;x/&amp;gt; &amp;lt;/person&amp;gt; //유효한 문서
=&amp;gt; &amp;lt;person&amp;gt; &amp;lt;x/&amp;gt; &amp;lt;x/&amp;gt; &amp;lt;/person&amp;gt; //규칙 어김. 유효하지 않은 문서

&amp;lt;!ELEMENT person (x|y)&amp;gt;
=&amp;gt; x / y

&amp;lt;!ELEMENT person (x,y)&amp;gt;
=&amp;gt; x y

&amp;lt;!ELEMENT person x,y?&amp;gt;
=&amp;gt; x y / x

&amp;lt;!ELEMENT person (x,y)?&amp;gt;
=&amp;gt; x y / x / y / 전체생략가능 &lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;x/&amp;gt;&lt;/code&gt; &amp;rArr; 빈태그&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;lt;!ELEMENT person (#PCDATA|TweetyElem|SylvesterElem)*&amp;gt;//순서에 상관없이. 생략가능
=&amp;gt; &amp;lt;!ELEMENT person (#PCDATA|name|age)*&amp;gt;

&amp;lt;!ELEMENT person EMPTY&amp;gt;
&amp;lt;!ELEMENT person ANY&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#PCDATA&lt;/code&gt; : 문자데이터를 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EMPTY&lt;/code&gt; : 내용이 없는것을 표시&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ANY&lt;/code&gt; : 어떠한 종류의 내용도 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;속성 정의&lt;/h3&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;&amp;lt;!ATTRIBUTE 속성명 자료형&amp;gt; ==&amp;gt;오류발생.속성은 엘리먼트에 종속적이기 때문에 엘리먼트와 함께 정의해야함 

&amp;lt;!ATTLIST 태그명 
                                속성명1 속성자료형 추가특성
                                속성명2 속성자료형 추가특성
                                속성명3 속성자료형 추가특성&amp;gt;

&amp;lt;!ATTLIST mycar is_blue (yes|no) &quot;yes&quot;
                                brandname ID #REQUIRED
                                description CDATA #IMPLIED&amp;gt;

=&amp;gt;문서적용
&amp;lt;root&amp;gt;
    &amp;lt;mycar is_blue=&quot;no&quot; brandname=&quot;gia&quot; description=&quot;beautiful car&quot;/&amp;gt;
&amp;lt;/root&amp;gt;

&amp;lt;root&amp;gt;
    &amp;lt;mycar is_blue=&quot;yo&quot; brandname=&quot;5gia&quot; description=&quot;beautiful car&quot;/&amp;gt;
&amp;lt;/root&amp;gt;
=&amp;gt; 에러. 자바 연동시 SAXParseException 발생&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;XML Namespace&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;이름 충돌 방지&lt;/li&gt;
&lt;li&gt;URI로 식별되는 이름들의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSV&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;콤마를 구분자로 하는 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;XML문서 Parser(분석기)&lt;/h2&gt;
&lt;h3&gt;DOM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;방식: tree(메모리) 기반 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SAX&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;방식: event(사건) 기반 분석&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/82</guid>
      <comments>https://fora.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 10 Jul 2019 19:07:12 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] PreparedStatement 사용 장단점 및 예시</title>
      <link>https://fora.tistory.com/81</link>
      <description>&lt;h2&gt;Statement&lt;/h2&gt;
&lt;p&gt;(java.sql.Statement)&lt;/p&gt;
&lt;p&gt;: executeQuery(&amp;quot;DQL문&amp;quot;), excecuteUpdate(&amp;quot;DML문&amp;quot;)메소드를 실행하는 시점에 파라미터로 SQL문을 DB에 전달한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점 : 사용된 SQL문 전체를 명확히 알 수 가 있어서 디버깅이 쉽다.&lt;/li&gt;
&lt;li&gt;단점 : 조건값이 틀린 많은 수의 SQL문을 반복 실행하게 되는 경우, DB서버에서 모두 새롭게 PARSING되어야 하므로 부하가 생길수 있다. SQL Injection에 취약.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    //SQL injection 예)
    //데이터 전달: a&amp;#39; 1=1 --
    SELECT count(*) FROM membership WHERE id = &amp;#39;a&amp;#39; or 1=1 --&amp;#39; AND pass=&amp;#39;1234&amp;#39;;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;PreparedStatement&lt;/h2&gt;
&lt;p&gt;(java.sql.PreparedStatement)&lt;/p&gt;
&lt;p&gt;: 커넥션에서 생성하면서 SQL문이 DB에 전송되어진다. Statement클래스를 상속하고 있음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: bind변수를 사용하여 DB서버에서 파싱된 SQL을 재사용하게 만듬으로, 반복적인 다량의 SQL수행시 성능상 이득이 있다. 반복 루프를 통해서 하나의 SQL문에 변수값만 입력하며 반복 실행 할 수 있음.&lt;br&gt;★ SQL injection예방의 방법이 될 수 있다.&lt;br&gt;따옴표와 콤마의 조합 그리고 자료형에 신경쓰지 않아도 됨.&lt;br&gt;사용자가 입력한 (sql구문) 데이터가 변경될 염려가 없다.&lt;/li&gt;
&lt;li&gt;단점: 오류발생 시, 변수에 입력되는 값을 알 수 없어서 디버깅이 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    int cnt;

    String sql = &amp;quot;INSERT INTO person VALUES (?,?,?,?)&amp;quot;; //?: 바인드변수
    stmt = conn.prepareStatement(sql); //(데이터가 빠진) sql문 전송
        //?의 수만큼 설정
    //stmt.set자료형(물음표인덱스1~,설정데이터);// ?(바인드변수)에 대한 데이터 설정
        stmt.setInt(1, 1);
        stmt.setString(2, name);
        stmt.setInt(3, 13);
        stmt.setString(4, &amp;quot;학생&amp;quot;);

    rs = stmt.executeUpdate(); // rs: 전역변수에 선언한 ResultSet
    // 주의: 이미 prepareStatement에서 sql문을 전송했으므로 execute() 메소드 내에 sql 기입하면 안됨.
    if(rs.next()) {
        cnt= rs.get자료형(&amp;quot;컬럼명&amp;quot;);
    }
    return cnt; //메소드 리턴&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;예제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;//(이름패턴)회원 정보 조회
public ArrayList&amp;lt;MembershipVO&amp;gt; findByName(String name) {
    connect(); //드라이브 연결 메소드
    ArrayList&amp;lt;MembershipVO&amp;gt; list = new ArrayList&amp;lt;MembershipVO&amp;gt;();
    try {
        String sql=&amp;quot;SELECT id,name,ssn1,ssn2,phone,addr,job FROM membership &amp;quot;
                + &amp;quot;WHERE name LIKE ?&amp;quot;; //setString 해준 순간 &amp;#39;&amp;#39;가 자동 생성되기에 &amp;#39;&amp;#39;표기없이 ?만 기재
        stmt = conn.prepareStatement(sql);//sql문 전송
          stmt.setString(1, &amp;quot;%&amp;quot;+name+&amp;quot;%&amp;quot;);//&amp;#39;%홍%&amp;#39;
        rs=stmt.executeQuery();//sql문 실행요청. ResultSet rs

        while(rs.next()) {//행얻기
            //열데이터 얻기
            MembershipVO vo = new MembershipVO();
            //7개의 관련있는 속성데이터를 묶어주기 위해 사용.
            vo.setId(rs.getString(&amp;quot;id&amp;quot;));
            vo.setName(rs.getString(&amp;quot;name&amp;quot;));
            vo.setSsn1(rs.getInt(&amp;quot;ssn1&amp;quot;));
            vo.setSsn2(rs.getInt(&amp;quot;ssn2&amp;quot;));
            vo.setPhone(rs.getString(&amp;quot;phone&amp;quot;));
            vo.setAddr(rs.getString(&amp;quot;addr&amp;quot;));
            vo.setJob(rs.getString(&amp;quot;job&amp;quot;));            
            list.add(vo);
        }//while
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        disconnect(); //드라이브 비연결 메소드
    }
    return list;
}//findAll&lt;/code&gt;&lt;/pre&gt;</description>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/81</guid>
      <comments>https://fora.tistory.com/81#entry81comment</comments>
      <pubDate>Wed, 10 Jul 2019 19:04:55 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] Properties 사용법 및 사용예시</title>
      <link>https://fora.tistory.com/80</link>
      <description>&lt;h3&gt;Properties&lt;/h3&gt;
&lt;p&gt;: 속성데이터(문자열, text)를 담는 클래스&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Properties pro = new Properties();&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;데이터 저장(입력)&lt;/h3&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;pro.setProperty(String key, String value);

pro.setProperty(&quot;k1&quot;,&quot;길동&quot;);
pro.setProperty(&quot;k2&quot;,&quot;라임&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;key: 저장 또는 검색을 위한 값(유일한 값)&lt;/li&gt;
&lt;li&gt;value: 저장하고자 하는 문자열(text) 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;데이터 출력(조회)&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;System.out.println(&quot;k1=&quot;+pro.getProperty(&quot;k1&quot;));
System.out.println(&quot;k2=&quot;+pro.getProperty(&quot;k2&quot;));

// 키값을 모르는 경우
Eumeration enu = pro.propertyNames();&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Enumeration: 열거형 인터페이스&lt;/li&gt;
&lt;li&gt;enu = [k1, k2, k3,...]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;properties 파일로부터 속성데이터 얻기&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;* properties 파일작성

형식) 속성이름 = 속성데이터
구분자) 서로 다른 속성을 라인으로 구분
주의) '=' 보통 앞과 뒤에 공백을 주지 않는다

--test.properties 파일

name =gildong
age =13
job =\uD559\uC0DD

try {
            pro.load(new FileReader(&quot;src/j0610/test.properties&quot;));
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        System.out.println(&quot;이름: &quot;+pro.getProperty(&quot;name&quot;));
        System.out.println(&quot;나이: &quot;+pro.getProperty(&quot;age&quot;));
        System.out.println(&quot;직업: &quot;+pro.getProperty(&quot;job&quot;));
        System.out.println(&quot;etc: &quot;+pro.getProperty(&quot;etc&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Properties 사용예시&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DAO&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Data Access Object&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB 접근을 위한 DB전용 객체&lt;/li&gt;
&lt;li&gt;각 메소드에는 sql문 실행에 관련된 코드들로 구성 하는것이 가장 이상적&lt;/li&gt;
&lt;li&gt;CRUD 작업실행하는 메소드를 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;DTO&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Data Transfer Object ||&amp;nbsp;&lt;b&gt;VO&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Value Object&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;계층간 데이터교환을 위한 자바빈즈&lt;/li&gt;
&lt;li&gt;VO(Value Object)라는 단어를 많이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;파일 구성&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Control&lt;/b&gt; : Controller.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Model&lt;/b&gt; : PersonDTO.java , PersonDAO.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;View&lt;/b&gt; : InputForm.java, MainView.java, UpForm.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conn 폴더&lt;/b&gt; : conn.properties&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;CONN&lt;/h1&gt;
&lt;h3&gt;conn.properties&lt;/h3&gt;
&lt;p&gt;: DB 연결정보 저장&lt;/p&gt;
&lt;pre id=&quot;code_1562752933839&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver=oracle.jdbc.driver.OracleDriver 
url=jdbc:oracle:thin:@localhost:1521:xe 
user=scott password=tiger&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1&gt;MODEL&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;테이블 이름, 혹은 조인된 도메인명 오른쪽에 역할 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PersonDTO&lt;/h2&gt;
&lt;p&gt;: 속성 정의, 자바빈즈 역할&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public Person(int no, String name, int age, String job) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PersonDAO&lt;/h2&gt;
&lt;p&gt;: DB 관련된 일 전담&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CRUD 작성 (CREATE, READ, UPDATE, DELETE)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Connection 작업&lt;/li&gt;
&lt;li&gt;Statement stmt 객체생성 (sql 작성, 실행)&lt;br /&gt;ResultSet rs 객체생성 (조회된 결과 저장)&lt;br /&gt;rs.next() rs.get자료형('컬럼명')&lt;/li&gt;
&lt;li&gt;DB자원반환 (Connection 반환)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PersonDAO:: DB Connect , disConnect&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;Connection conn;
Statement  stmt;

private void connect() {
      try {
        conn = DriverManager.getConnection(pro.getProperty(&quot;url&quot;),pro);
    } catch (SQLException e) {
        e.printStackTrace();
    }   
  }//connect

  private void disConnect() {
      try {
            //연결끊기(DB자원반환)
            if(conn != null)conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
}//disconnect
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: 객체생성&lt;/h3&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;Properties pro;

public PersonDAO() {
   try {
    pro = new Properties();    //속성 무
       pro.load(new FileReader(&quot;conn/conn.properties&quot;));//속성 4개 적재            
       Class.forName(pro.getProperty(&quot;driver&quot;));

   } catch (Exception e) {
    e.printStackTrace();
  }
}//생성자&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: SELECT&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;public Person select(int no) {// 한 개의 Person정보 얻어오기 --&amp;gt; 수정폼
        connect();
        try {
            stmt = conn.createStatement();
            String sql = &quot;SELECT name,age,job FROM person WHERE no =&quot; + no;
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                // rs.get~()
                Person p = new Person(no, rs.getString(&quot;name&quot;), rs.getInt(&quot;age&quot;), rs.getString(&quot;job&quot;));
                return p;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disConnect();
        }
        return null;
    }// select

    public ArrayList&amp;lt;Person&amp;gt; selectAll() {// 모든 Person 정보 얻어오기
        connect();
        ArrayList&amp;lt;Person&amp;gt; list = new ArrayList&amp;lt;Person&amp;gt;();

        try {
            stmt = conn.createStatement();
            String sql = &quot;SELECT no,name,age,job FROM person ORDER BY no&quot;;
            rs = stmt.executeQuery(sql);
            while (rs.next()) {

                /*
                 * String name = rs.getString(&quot;name&quot;); int age = rs.getInt(&quot;age&quot;); String job =
                 * rs.getString(&quot;job&quot;); Person person = new Person(0,name,age,job);
                 * list.add(person);
                 */
                list.add(new Person(rs.getInt(&quot;no&quot;), rs.getString(&quot;name&quot;), rs.getInt(&quot;age&quot;), rs.getString(&quot;job&quot;)));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disConnect();
        }
        return list;
    }// ArrayList&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: INSERT&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;public boolean insert(자바빈즈) {}
public boolean insert(Person p) {}
public void insert(Person p) {}

public boolean insert(Person p) {
  connect();
  try {
    stmt = conn.createStatement();
      String sql=&quot;insert into person (no,name,age,job) values &quot;
              //+ &quot;(1, '홍길동' , 13 , '학생' )&quot;;
             + &quot;(person_seq.nextval, '&quot;+p.getName()+&quot;' , &quot;+p.getAge()
              +&quot; , '&quot;+p.getJob()+&quot;' )&quot;;
      System.out.println(&quot;추가SQL==&amp;gt; &quot;+ sql);
      stmt.executeUpdate(sql);//DB에게 입력요청
      return true;

  } catch (SQLException e) {
    e.printStackTrace();
  } finally {
      disconnect();
  }

  return false;
}//insert&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: UPDATE&lt;/h3&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;public boolean update(Person p) {
        connect();
        try {
            stmt = conn.createStatement();
            String sql = &quot;UPDATE person SET age=&quot; + p.getAge() + &quot;, job='&quot; + p.getJob() + &quot;' WHERE no=&quot;+p.getNo();
            System.out.println(&quot;수정 sql=&quot;+sql);
            int t = stmt.executeUpdate(sql);
            System.out.println(&quot;수정행:&quot;+t);
            if(t==1) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disConnect();
        }
        return false;
    }// update&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;VIEW&lt;/h1&gt;
&lt;p&gt;InputForm.java&lt;br /&gt;MainView.java&lt;br /&gt;UpForm.java&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;CONTROL&lt;/h1&gt;
&lt;h2&gt;Controller&lt;/h2&gt;
&lt;p&gt;: 전체 프로그램에 대한 흐름 제어 역할&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;사용자 요청 분석 (예: 어떤 버튼을 눌렀는지)&lt;/li&gt;
&lt;li&gt;사용자 입력 데이터 얻어오기 (예: 입력폼 또는 수정폼을 통해 입력된 데이터)&lt;/li&gt;
&lt;li&gt;★모델객체생성(예: PersonDAO)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;메소드호출&lt;/li&gt;
&lt;li&gt;결과값 (리턴값) 얻기, 저장, 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;페이지(뷰) 호출 (예: 메인(JTable) ----&amp;gt; 입력폼)&lt;/li&gt;
&lt;li&gt;선택사항) 유효성 검사(valid check)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;사용자가 입력한 데이터에 대한.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터베이스에서도 데이터 무결성을 위한 유효성 검사&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;    public void actionPerformed(ActionEvent e) {  
    Object ob = e.getSource();//action이벤트를 발생시킨 이벤트 소스의 주소 얻기

    if(ob==mainView.bt_insert) {//1.메인뷰 : 입력버튼 ==&amp;gt; 분석: 입력폼요청!!


      //4.메인뷰  ---&amp;gt; 입력폼   이동!! 
       mainView.setVisible(false);
       form.setVisible(true);


    }else if(ob==form.bt_submit) {//1.입력폼: 입력버튼 ==&amp;gt; 분석: DB입력 요청!!

       //2. 입력데이터 얻기
       String name = form.tf_name.getText();
       String age = form.tf_age.getText();
       String job = form.tf_job.getText();

       //세개의 변수를  p변수로 정의하기(한개의 변수명으로 정의하기)
       Person p = new Person(0, name, Integer.parseInt(age), job);

       //3. 모델 객체생성
       PersonDAO dao = new PersonDAO();
         dao.insert(p);


    }

    }//actionPerformed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/80</guid>
      <comments>https://fora.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 10 Jul 2019 19:03:05 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] JDBC 프로그래밍</title>
      <link>https://fora.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqQeLZ/btqwD2tTQIp/gInxC5uNx7fe5ofknmRFz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqQeLZ/btqwD2tTQIp/gInxC5uNx7fe5ofknmRFz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqQeLZ/btqwD2tTQIp/gInxC5uNx7fe5ofknmRFz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqQeLZ%2FbtqwD2tTQIp%2FgInxC5uNx7fe5ofknmRFz0%2Fimg.png&quot; data-filename=&quot;2.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;JDBC 관련클래스&lt;/h2&gt;
&lt;p&gt;: java.sql 패키지&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DriverManager&lt;/b&gt;&lt;br /&gt;: JVM에서 JDBC전체를 관리하는 클래스. Driver등록, Connection 연결작업 등&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;br /&gt;: DB를 만드는 Vendor(Oracle, MS-SQL, MYSQL등)을 implements하여 자신들의 DB를 연결할 수 있는 class를 만드는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Connection&lt;/b&gt;&lt;br /&gt;: DB와 연결성을 갖는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Statement&lt;/b&gt;&lt;br /&gt;: SQL문을 실행하는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ResultSet&lt;/b&gt;&lt;br /&gt;: 조회된 결과 데이터를 갖는 인터페이스&lt;/p&gt;
&lt;h2&gt;JDBC 프로그래밍&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;제품군 선택 (Oracle, Mysql, MS-SQL 등)&lt;/li&gt;
&lt;li&gt;연결객체 생성 (Connection)&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;필요요소&lt;/b&gt;]&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;DB서버의 주소&lt;/li&gt;
&lt;li&gt;포트번호(0~63353개.한피시 안에서 서비스 종류를 판별하기 위해 사용)&lt;/li&gt;
&lt;li&gt;연결계정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;실행객체 생성 (Statement)&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;관련요소&lt;/b&gt;]&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;SQL문 작성&lt;/li&gt;
&lt;li&gt;SQL문 실행요청&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;결과객체 생성 (ResultSet)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;행단위 데이터얻기&lt;/li&gt;
&lt;li&gt;열 데이터 뽑기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kW4M7/btqwD3lZDNp/tKlSdgVwcxUd59yYGskYH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kW4M7/btqwD3lZDNp/tKlSdgVwcxUd59yYGskYH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kW4M7/btqwD3lZDNp/tKlSdgVwcxUd59yYGskYH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkW4M7%2FbtqwD3lZDNp%2FtKlSdgVwcxUd59yYGskYH1%2Fimg.png&quot; data-filename=&quot;3.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;드라이브 로딩 Driver loading (DB제품군 선택)&lt;/h3&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;    Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
    // Class.forName(&quot;클래스명&quot;);
    // Class.forName(&quot;패키지명.드라이버클래스명&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ClassNotFoundException 오류발생. try-catch문 혹은 예외처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;연결객체 생성 Connection (특정 DB서버연결)&lt;/h3&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;    Connection conn = DriverManager.getConnection(url, user, password);

    String url = &quot;jdbc:oracle:thin:@localhost:1521:xe&quot;; // &quot;localhost&quot; == &quot;127.0.0.1 == 내 pc
    String user = &quot;scott&quot;;
    String password = &quot;tiger&quot;;
    //conn = DriverManager.getConnection(&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;,&quot;scott&quot;,&quot;tiger&quot;);

    System.out.println(&quot;DB연결 성공&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;url :접속DB ip, port번호, sid&lt;/li&gt;
&lt;li&gt;user: 접속계정&lt;/li&gt;
&lt;li&gt;pwd: 접속계정에 대한 비밀번호&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;실행객체 생성 Statement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQL문 (DML, DQL 실행가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;    Statement stmt = conn.createStatement();

    //실행요청
    int t = stmt.executeUpdate(sql); //DML 실행
    int t = stmt.executeQuery(sql);  //DQL 실행&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;DML 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;    // 테이블 dept_copy에서 10번부서를 삭제
        String sql = &quot;DELETE FROM dept_copy WHERE deptno=10&quot;;

    // --SQL문 실행요청
        int t = stmt.executeUpdate(sql); // 삭제시점
        System.out.println(&quot;T=&quot; + t); //t: 수정 또는 삭제된 행의 갯수
        if (t &amp;gt; 0) {
            System.out.println(&quot;삭제성공&quot;);// t==&amp;gt; 삭제(또는 수정)된 행의 갯수
        }

        --테이블 dept_copy에서 20번, 30번 부서를 삭제하시오(삭제성공메세지 출력)
        sql = &quot;DELETE FROM dept_copy WHERE deptno IN(20,30)&quot;;
        t = stmt.executeUpdate(sql);
        System.out.println(&quot;T=&quot; + t);

        if (t &amp;gt; 0) {
            System.out.println(&quot;삭제성공&quot;);
        } else {
            System.out.println(&quot;삭제실패&quot;);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;결과객체 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ResultSet : 조회된 결과(행열데이터)를 저장&lt;/li&gt;
&lt;li&gt;DQL 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;    //조회요청, 조회된 결과값(행열데이터) 리턴
    ResultSet rs = Statement명.executeQuery(sql); //리턴값 ResultSet
    //1. 행단위 데이터 얻기
    rs.next(); //boolean값 리턴. 행 반환시 true 
    if(rs.next()){} // 0번 또는 1번 출력시. WHERE절에 primary key 비교
    while(rs.next()){} //조회된 행의 갯수가 2행이상이 예상되어질 때

    //2. 얻어온 행 안에서 개별 열데이터 얻기
    rs.get자료형(columnIndex); // 칼럼번호
    rs.get자료형(columnLabel); // 이름, 별명

    // 20번 부서의 부서번호, 부서명, 부서위치를 출력하시오
    sql = &quot;SELECT deptno, dname, loc FROM dept WHERE deptno=20&quot;;

    ResultSet rs = stmt.executeQuery(sql);
    rs.next();
    int deptno = rs.getInt(1); // 첫번째 칼럼데이터
    String dname = rs.getString(2);// 두번째 칼럼데이터
    String loc = rs.getString(3);// 세번째 칼럼데이터
    System.out.println(deptno + dname + loc);
    System.out.println(&quot;=======&quot;);

    sql = &quot;SELECT deptno, dname name, loc FROM dept&quot;;
    rs = stmt.executeQuery(sql);
    while(rs.next()) { //rs.next가 while 소괄호 안에서 실행됨
    //rs.getInt(1)    rs.getString(2) 숫자 표기가능
        deptno = rs.getInt(&quot;deptno&quot;); 
        dname = rs.getString(&quot;name&quot;);
        loc = rs.getString(3);
        System.out.println(deptno +&quot;\t&quot;+ dname +&quot;\t&quot;+ loc);
    } &lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;JDBC AutoCommit 설정&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;    conn.setAutoCommit(false); //기본값 true
    conn.commit();
    conn.rollback();&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;conn.close()&lt;/h3&gt;
&lt;p&gt;:연결끊는 객체&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB는 데이터 공유를 위해 사용&lt;/li&gt;
&lt;li&gt;Connection은 유한개&amp;rArr; 다른사람을 위해 사용한 연결객체는 반환&lt;/li&gt;
&lt;li&gt;DB자원: Connection 생성&amp;rarr; Statement 생성 &amp;rarr; ResultSet생성&lt;/li&gt;
&lt;li&gt;DB자원 반환은 역순으로 해주면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;    if(rs != null) rs.close();   
    if(stmt != null) stmt.close();   
    if(conn != null) conn.close();

    // if문 사용안할시 NullPoineException 오류발생&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connection만 끊어주면 Statement와 ResultSet도 자동적으로 끊김&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/79</guid>
      <comments>https://fora.tistory.com/79#entry79comment</comments>
      <pubDate>Wed, 10 Jul 2019 18:53:57 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 내장함수 , 배열, JSON</title>
      <link>https://fora.tistory.com/78</link>
      <description>&lt;h2&gt;내장함수&lt;/h2&gt;
&lt;p&gt;: 자주 사용되는 함수를 레퍼런스 없이 사용하게 만든 것&lt;/p&gt;
&lt;h3&gt;eval(&amp;quot;형식을 갖는 문자열&amp;quot;)&lt;/h3&gt;
&lt;p&gt;: Object 반환(JSON) JavaScript Object Notation &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--JSON 형식
var v = { name: value, age: value2 }
v.name
v.age

var v2 = &amp;#39;{name:value, age: value}&amp;#39;
&amp;#39;name=&amp;#39;+v2.name //undefined
var v3 = eval(&amp;quot;(&amp;quot;+v2+&amp;quot;)&amp;quot;) 
&amp;#39;name=&amp;#39;+v2.name //value&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;ParseInt, ParseFloat&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;var c = &amp;#39;3.14&amp;#39;;
var d = 300;

&amp;#39;c+d=&amp;#39;+(c+d); // 3.14300
&amp;#39;c+d=&amp;#39;+((parseInt(c)+d); // 303
&amp;#39;c+d=&amp;#39;+((parseFloat(c)+d); // 303.14&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;isNaN(데이터)&lt;/h3&gt;
&lt;p&gt;: 데이터 전체가 숫자조합이 아닌 경우 true 리턴. Not a Number &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var e = &amp;#39;15a&amp;#39;;
isNaN(e)//true&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;escape(데이터)&lt;/h3&gt;
&lt;p&gt;: 2바이트 문자를 16진수로 변환&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;escape(&amp;quot;a123@&amp;quot;)
escape(&amp;quot;홍길동&amp;quot;) // 16진수로 표현됨&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;unescape(데이터)&lt;/h3&gt;
&lt;p&gt;: 16진수를 문자로 변환&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unescape(16진수데이터) &lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;HTML에서 함수 호출&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;button&amp;quot; onclick=&amp;quot;gildong()&amp;quot; value=&amp;quot;gilgil&amp;quot;&amp;gt;
&amp;lt;button onclick=&amp;quot;gildong()&amp;quot;&amp;gt;gilgil2&amp;lt;/button&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href=&amp;quot;javascript:gildong()&amp;quot;&amp;gt;gilgil3&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;a href=&amp;quot;javascript: 자바스크립트 코드&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;on접두사&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input type=&amp;#39;button&amp;#39; value=&amp;#39;버튼&amp;#39; onclick=&amp;quot;자바스크립트 코드&amp;quot;&amp;gt;
===&amp;gt; 주로 함수 호출. 버튼을 클릭했을때&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;onfocus : 포커스가 들어왔을때&lt;br&gt;onblur : 포커스를 잃었을때&lt;br&gt;onchange : select태그에서 선택을 바꾸었을때&lt;br&gt;onkeydown : 키보드를 눌렀을때&lt;br&gt;onkeyup : 키보드 땠을때&lt;br&gt;onmouseover : 마우스가 진입했을때, 엘리먼트위에 올려졌을때&lt;br&gt;onmouseout : 마우스가 나갔을때&lt;br&gt;onmousedown : 마우스를 클릭했을때&lt;/p&gt;
&lt;h3&gt;자바스크립트 배열&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트 배열은 여러 자료형을 입력받을 수 있다. (비권장)&lt;/li&gt;
&lt;li&gt;가변길이 배열이다.&lt;/li&gt;
&lt;li&gt;집합을 표현할 때 {}를 사용하지않고 []를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    var myArray = new Array(5)
    myArray[0] = 1
    myArray[1] = &amp;quot;2&amp;quot;
    myArray[2] = true
    myArray[3] = new Date()

    var myArray2 = [1,2,3,4,5]

    for(i=0; i&amp;lt;myArray.length; i++){ //전체데이터 출력
        document.write(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;+myArray[i])
    }&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;JSON&lt;/h3&gt;
&lt;p&gt;: JavaScript Object Notation (자바스크립트 객체를 표현하는 방법)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;{} 표기는 JSON 표현&lt;/li&gt;
&lt;li&gt;자바의 Map 또는 Properties와 비슷 (key, value 쌍으로 데이터 저장)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    var 변수명 = {key:value, key:value, ...} // key: 변수, value: 데이터

    var person = {name:&amp;#39;홍길동&amp;#39;, age:13 , job:&amp;#39;학생&amp;#39; , etc:[100,200,300]}

    //사용방법: 변수명.key명
    person.name //홍길동
    person.age
    person.job

    person.etc[1] //200

    var person = [ {name:&amp;quot;honggil&amp;quot;, age:13 , job:&amp;quot;student&amp;quot;},
                               {name:&amp;quot;honggil&amp;quot;, age:13 , job:&amp;quot;student&amp;quot;},
                                 {name:&amp;quot;honggil&amp;quot;, age:13 , job:&amp;quot;student&amp;quot;} ]
    for(var i=0; i&amp;lt;person.length; i++){
        var p = person[i]
        document.write(p.name + p.age + p.job)
    }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Web develop/Javascript</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/78</guid>
      <comments>https://fora.tistory.com/78#entry78comment</comments>
      <pubDate>Sat, 22 Jun 2019 18:01:37 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 자바스크립트, 자바와 차이점 부분 위주 정리</title>
      <link>https://fora.tistory.com/77</link>
      <description>&lt;h2&gt;JavaScript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;웹브라우저에서 실행되는 프로그램이다&lt;/li&gt;
&lt;li&gt;HTML문서내에서 실행(html에 종속적이다,브라우저에서 실행된다!!)&lt;/li&gt;
&lt;li&gt;HTML문서(정적페이지) &amp;rarr; JavaScript적용 (동적페이지)&lt;/li&gt;
&lt;li&gt;HTML문서를 통해 입력된 데이터를 얻어오고 데이터에 대한 유효성 검사를 할 때 사용.&lt;/li&gt;
&lt;li&gt;HTML문서에 대한 조작(태그,속성,스타일)&lt;/li&gt;
&lt;li&gt;자바스크립트를 왜(어디서) 사용하는가?&lt;/li&gt;
&lt;li&gt;문서 조작(태그와 속성)&lt;br /&gt;=&amp;gt; 조작에 필요한 데이터가 외부에 존재한다면(현재HTML없을시) Ajax를 사용!!&lt;/li&gt;
&lt;li&gt;유효성 검사(서버에게 데이터를 보내기 전에 검사)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;자바의 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;서버 스크립트&lt;/li&gt;
&lt;li&gt;JVM에서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;자바스크립트의 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트(사용자, 브라우저) 스크립트&lt;/li&gt;
&lt;li&gt;브라우저에서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;JavaScript 문법&lt;/h2&gt;
&lt;h3&gt;자바스크립트 선언 위치&lt;/h3&gt;
&lt;p&gt;HTML문서내에 포함되어서 실행. (HTML문서내의 어떤 위치라도 정의 가능)&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;head&amp;gt;
&amp;lt;script&amp;gt;
변수선언, 함수정의
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;script&amp;gt;함수호출&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;자바스크립트 파일&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;자료형을 선언, 정의하지 않는다&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;var su; //변수선언
su=2000; //number
su=&quot;strin&quot;; //String타입
su=true; //boolean 타입
su = new Date(); //Date 타입&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;자바스크립트에서의 문자열(text) 표현&lt;/h3&gt;
&lt;p&gt;:작은 따옴표와 큰 따옴표를 구분 없이 사용. 전혀 차이가 없음&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;name1= &quot;홍길동&quot;; (O)
name2= '길라임'; (O)
name3= &quot;김주원'; (X)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;세미콜론 생략가능&lt;/h3&gt;
&lt;p&gt;: 자바스크립트는 구분자, 종결자 역할을 하는 ';'을 생략하는 것이 가능.&lt;br /&gt;&amp;rArr;이유: 라인(줄바꿈)을 통해 서로 다른 문장을 구분하기 때문&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;name='길동'
age=13
==&amp;gt; (O)

name=&quot;라임&quot; age=15
==&amp;gt; (X)

name=&quot;주원&quot;; age=17
==&amp;gt; (O)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;문자열 비교&lt;/h3&gt;
&lt;p&gt;자바의 경우&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;&quot;java&quot;.equals(&quot;JAVA&quot;) ==&amp;gt; (O) 문자열 내용 비교
&quot;java&quot; == &quot;JAVA&quot; ==&amp;gt; (O) 메모리 주소 비교&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자바스크립트의 경우&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;&quot;javascript&quot;.equals(&quot;JAVASCRIPT&quot;) ==&amp;gt; (X) 에러발생
&quot;javascript&quot; == &quot;JAVASCRIPT&quot;      ==&amp;gt; (O) 문자열 내용 비교&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;'==' 연산자 와 '==='연산자&lt;/h3&gt;
&lt;p&gt;'=='연산자: 데이터 내용만 비교&lt;/p&gt;
&lt;p&gt;'==='연산자: 자료형 비교, 내용비교를 같이하는 엄격한 연산자&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;100 == '100' ---&amp;gt;true //내용만 같다면 자동형변환 해서 비교
100 === '100' ---&amp;gt;false //내용,자료형 비교 (자료형이 다르면 false)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;조건문&lt;/h3&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;if(조건식){
    조건식의 결과가 참일 때 실행할 문장;
}
---&amp;gt;실행할 문장이 한개였을때 영역괄호{}는 생략가능

if(조건식){
    조건식의 결과가 참일 때 실행할 문장;
}else{
    조건식의 결과가 거짓일 때 실행할 문장;
}

if(조건식1){
    조건식1의 결과가 참일 때 실행할 문장;
}else if(조건식2){
    조건식1의 결과가 거짓이고!!
    조건식2의 결과가 참일 때 실행할 문장;
}else{
    조건식1,2의 결과가 거짓일 때 실행할 문장;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;if문에서 자바와 차이점&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;if(조건식 ==&amp;gt; boolean, 숫자, 객체){ //자바는 boolean값만 조건식

}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;숫자: 0인 수(false), 0아닌 수(true)로 구분&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;객체: 브라우저에서 지원되는 객체인지 아닌지 판별.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;---&amp;gt; 변수에 값이 존재하는지 판단.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;존재하는 객체(문자열, 브라우저가 지원하는 객체) ---&amp;gt; true&lt;br /&gt;null, undefined(초기화되지 않은변수) ---&amp;gt; false&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;    if(0){ //0은 false. 0이 아닌 수는 true
      document.write(&quot;if&quot;);
    else{
      document.write(&quot;else&quot;);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;빈문자열 체크&lt;/h3&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;str.length == 0 //str.length() X
str == '' // 더 많이사용함&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;str.length() : 에러발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;알림창&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;alert(&quot;time&quot;);//메세지창 출력
confirm(&quot;this&quot;);//확인대화상자: 삭제전 '확인'에서 많이 사용
prompt(&quot;whit&quot;); //입력창&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;함수(메소드) 정의&lt;/h3&gt;
&lt;p&gt;자바의 경우&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;void hello(String name, int age){}
int hello(String name, int age){return 100;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자바스크립트의 경우&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function hello(name, age){}
function hello(name, age){return 100;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자바스크립트 함수형식&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function 함수명(){
}  -----&amp;gt; return; 생략가능

function 함수명(변수명1, 변수명2){

  return &quot;리턴데이터&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;※주의: 자바스크립트의 함수는 오버로딩을 제공하지 않음&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;function hello(){
안녕
}

hello(); 호출 ----&amp;gt; 안녕

function hello(){
씬짜오
}
==&amp;gt; 에러가 발생하지 않는다

hello(); 호출 ----&amp;gt; 씬짜오

function hello(name){
봉쥬르
}
==&amp;gt; 에러가 발생하지 않는다

hello(); 호출 ----&amp;gt; 봉쥬르
hello('나길동'); ----&amp;gt; 봉쥬르
hello('나길동',13); ----&amp;gt; 봉쥬르&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;함수호출시 매개변수(인자)의 갯수와 상관없이 함수명만 일치하면 호출 가능&lt;/li&gt;
&lt;li&gt;같은 영역(파일)에 동일한 이름의 함수가 여러개 존재한다면(인자의 갯수는 상관없이) 제일 아래에 있는 함수로 overwrite됨&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web develop/Javascript</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/77</guid>
      <comments>https://fora.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 22 Jun 2019 17:59:21 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] Swing에서 중복아이디 체크하기 (PrepareStatement 사용)</title>
      <link>https://fora.tistory.com/75</link>
      <description>&lt;h3&gt;중복확인 JButton 클릭시&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;    -------View---------
    public JButton bt_checkId;
    public JTextField tf_id;

    --------Model(DAO)----------
    public boolean findExistID(String id)
    {
        connect();
        try {
            String sql = &quot;SELECT count(*) cnt FROM membership WHERE id=?&quot;;
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                int cnt = rs.getInt(&quot;cnt&quot;);
                if (cnt &amp;gt; 0) {
                    return true;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect();
        }
        return false;
    }//find

    --------Controller-------------
    MemberDAO dao = new MemberDAO();
    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object ob = e.getSource();
        if(ob==joinForm.bt_checkId){
            if(dao.findExistId(joinForm.tf_id.getText())){ //이미 저장된 아이디 존재
                JOptionPane.showMessageDialog(joinForm,&quot;사용중인아이디&quot;);
                joinForm.tf_id.setText(&quot;&quot;);
                return;
            }else {
                JOptionPane.showMessageDialog(joinForm,&quot;사용가능아이디&quot;);
            }
        }
    }//actionPerformed&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;KeyListener 사용하여 중복체크&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;    -------View---------
    public JTextField tf_id;
    public JLabel la_id_check;

    tf_id = new JTextField();
    la_id_check = new JLabel();
    la_id_check.setText(&quot;사용가능&quot;);
    --------Model(DAO)----------
    public boolean findExistID(String id)
    { 
        connect();
        try {
            String sql = &quot;SELECT count(*) cnt FROM membership WHERE id=?&quot;;
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                int cnt = rs.getInt(&quot;cnt&quot;);
                if (cnt &amp;gt; 0) {
                    return true;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect();
        }
        return false;
    }//find

    --------Controller-------------
    MemberDAO dao = new MemberDAO();

    joinForm.tf_id.addKeyListener(new KeyAdapter(){//KeyAdapter: 인터페이스
        public void keyReleased(KeyEvent e){ //키를 떼었을때 (값을 얻어올 수 있음)
            MembershipDAO dao = new MembershipDAO();
            if(dao.findExistId(joinForm.tf_id.getText())){//중복된 아이디라면
                joinForm.la_id_check.setForegrounde(Color.RED);
                joinForm.la_id_check.setText(&quot;이미 사용&quot;);
            }else {
                joinForm.la_id_check.setForegrounde(Color.BLUE);
                joinForm.la_id_chekc.setText(&quot;사용 가능 아이디&quot;);
            }
      }
    });

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object ob = e.getSource();
        if(ob==joinForm.bt_checkId){
            if(dao.findExistId(joinForm.tf_id.getText())){ //이미 저장된 아이디 존재
                JOptionPane.showMessageDialog(joinForm,&quot;사용중인아이디&quot;);
                joinForm.tf_id.setText(&quot;&quot;);
                return;
            }else {
                JOptionPane.showMessageDialog(joinForm,&quot;사용가능아이디&quot;);
            }
        }
    }//actionPerformed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jdbc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsi1lH/btqwb2fyuxb/SN6Z2hhzpjBJTDVAXRkRYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsi1lH/btqwb2fyuxb/SN6Z2hhzpjBJTDVAXRkRYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsi1lH/btqwb2fyuxb/SN6Z2hhzpjBJTDVAXRkRYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsi1lH%2Fbtqwb2fyuxb%2FSN6Z2hhzpjBJTDVAXRkRYK%2Fimg.png&quot; data-filename=&quot;jdbc.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;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/75</guid>
      <comments>https://fora.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 19 Jun 2019 00:01:34 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] Prepared Statement 사용법 및 사용예제</title>
      <link>https://fora.tistory.com/74</link>
      <description>&lt;h2&gt;Statement&lt;/h2&gt;
&lt;p&gt;(java.sql.Statement)&lt;/p&gt;
&lt;p&gt;: executeQuery(&quot;DQL문&quot;), excecuteUpdate(&quot;DML문&quot;)메소드를 실행하는 시점에 파라미터로 SQL문을 DB에 전달한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;장점 : 사용된 SQL문 전체를 명확히 알 수 가 있어서 디버깅이 쉽다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단점 : 조건값이 틀린 많은 수의 SQL문을 반복 실행하게 되는 경우, DB서버에서 모두 새롭게 PARSING되어야 하므로 부하가 생길수 있다. SQL Injection에 취약.&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;  //SQL injection 예)
  //데이터 전달: a' 1=1 --
  SELECT count(*) FROM membership WHERE id = 'a' or 1=1 --' AND pass='1234';&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PreparedStatement&lt;/h2&gt;
&lt;p&gt;(java.sql.PreparedStatement)&lt;/p&gt;
&lt;p&gt;: 커넥션에서 생성하면서 SQL문이 DB에 전송되어진다. Statement클래스를 상속하고 있음&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;장점: bind변수를 사용하여 DB서버에서 파싱된 SQL을 재사용하게 만듬으로, 반복적인 다량의 SQL수행시 성능상 이득이 있다. 반복 루프를 통해서 하나의 SQL문에 변수값만 입력하며 반복 실행 할 수 있음.&lt;br /&gt;&lt;br /&gt;★ SQL injection예방의 방법이 될 수 있다.&lt;br /&gt;따옴표와 콤마의 조합 그리고 자료형에 신경쓰지 않아도 됨.&lt;br /&gt;사용자가 입력한 (sql구문) 데이터가 변경될 염려가 없다.&lt;/li&gt;
&lt;li&gt;단점: 오류발생 시, 변수에 입력되는 값을 알 수 없어서 디버깅이 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;    int cnt;

    String sql = &quot;INSERT INTO person VALUES (?,?,?,?)&quot;; //?: 바인드변수
    stmt = conn.prepareStatement(sql); //(데이터가 빠진) sql문 전송
        //?의 수만큼 설정
    //stmt.set자료형(물음표인덱스1~,설정데이터);// ?(바인드변수)에 대한 데이터 설정
        stmt.setInt(1, 1);
        stmt.setString(2, name);
        stmt.setInt(3, 13);
        stmt.setString(4, &quot;학생&quot;);

    rs = stmt.executeUpdate(); // rs: 전역변수에 선언한 ResultSet
    // 주의: 이미 prepareStatement에서 sql문을 전송했으므로 execute() 메소드 내에 sql 기입하면 안됨.
    if(rs.next()) {
        cnt= rs.get자료형(&quot;컬럼명&quot;);
    }
    return cnt; //메소드 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;사용 예제&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;    //(이름패턴)회원 정보 조회
    public ArrayList&amp;lt;MembershipVO&amp;gt; findByName(String name) {
        connect(); //드라이브 연결 메소드
        ArrayList&amp;lt;MembershipVO&amp;gt; list = new ArrayList&amp;lt;MembershipVO&amp;gt;();
        try {
            String sql=&quot;SELECT id,name,ssn1,ssn2,phone,addr,job FROM membership &quot;
                    + &quot;WHERE name LIKE ?&quot;; //setString 해준 순간 ''가 자동 생성되기에 ''표기없이 ?만 기재
            stmt = conn.prepareStatement(sql);//sql문 전송
              stmt.setString(1, &quot;%&quot;+name+&quot;%&quot;);//'%홍%'
            rs=stmt.executeQuery();//sql문 실행요청. ResultSet rs

            while(rs.next()) {//행얻기
                //열데이터 얻기
                MembershipVO vo = new MembershipVO();
                //7개의 관련있는 속성데이터를 묶어주기 위해 사용.
                vo.setId(rs.getString(&quot;id&quot;));
                vo.setName(rs.getString(&quot;name&quot;));
                vo.setSsn1(rs.getInt(&quot;ssn1&quot;));
                vo.setSsn2(rs.getInt(&quot;ssn2&quot;));
                vo.setPhone(rs.getString(&quot;phone&quot;));
                vo.setAddr(rs.getString(&quot;addr&quot;));
                vo.setJob(rs.getString(&quot;job&quot;));            
                list.add(vo);
            }//while
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            disconnect(); //드라이브 비연결 메소드
        }
        return list;
    }//findAll&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jdbc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY710t/btqv81bkry2/5sBx3p7zeK1pCJvZlLFNQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY710t/btqv81bkry2/5sBx3p7zeK1pCJvZlLFNQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY710t/btqv81bkry2/5sBx3p7zeK1pCJvZlLFNQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY710t%2Fbtqv81bkry2%2F5sBx3p7zeK1pCJvZlLFNQ0%2Fimg.png&quot; data-filename=&quot;jdbc.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;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/74</guid>
      <comments>https://fora.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 19 Jun 2019 00:00:14 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] Properties MVC 사용예제 (+Swing)</title>
      <link>https://fora.tistory.com/73</link>
      <description>&lt;h3&gt;파일 구성&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Control&lt;/b&gt; : Controller.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Model&lt;/b&gt; : PersonDTO.java , PersonDAO.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;View&lt;/b&gt; : InputForm.java, MainView.java, UpForm.java&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conn 폴더&lt;/b&gt; : conn.properties&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;MODEL&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;테이블 이름, 혹은 조인된 도메인명 오른쪽에 역할 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PersonDTO&lt;/h2&gt;
&lt;p&gt;: 속성 정의, 자바빈즈 역할&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public Person(int no, String name, int age, String job) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PersonDAO&lt;/h2&gt;
&lt;p&gt;: DB 관련된 일 전담&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CRUD 작성 (CREATE, READ, UPDATE, DELETE)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Connection 작업&lt;/li&gt;
&lt;li&gt;Statement stmt 객체생성 (sql 작성, 실행)&lt;br /&gt;ResultSet rs 객체생성 (조회된 결과 저장)&lt;br /&gt;rs.next() rs.get자료형('컬럼명')&lt;/li&gt;
&lt;li&gt;DB자원반환 (Connection 반환)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PersonDAO:: DB Connect , disConnect&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;    private void connect() {
          try {
            conn = DriverManager.getConnection(pro.getProperty(&quot;url&quot;),pro);
        } catch (SQLException e) {
            e.printStackTrace();
        }   
      }//connect

      private void disConnect() {
          try {
                //연결끊기(DB자원반환)
                if(conn != null)conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }//disconnect
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: 객체생성&lt;/h3&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;    Connection conn;
    Statement  stmt;

    Properties pro;

    public PersonDAO() {
       try {
        pro = new Properties();    //속성 무
           pro.load(new FileReader(&quot;conn/conn.properties&quot;));//속성 4개 적재            
           Class.forName(pro.getProperty(&quot;driver&quot;));

       } catch (Exception e) {
        e.printStackTrace();
      }
    }//생성자&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;con.properties 파일&lt;/h3&gt;
&lt;pre id=&quot;code_1560869688550&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- conn.properties : DB 연결정보 저장

    # conn/conn.properties

    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:xe
    user=아이디
    password=비번&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: SELECT&lt;/h3&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;    public Person select(int no) {// 한 개의 Person정보 얻어오기 --&amp;gt; 수정폼
            connect();
            try {
                stmt = conn.createStatement();
                String sql = &quot;SELECT name,age,job FROM person WHERE no =&quot; + no;
                rs = stmt.executeQuery(sql);
                if (rs.next()) {
                    // rs.get~()
                    Person p = new Person(no, rs.getString(&quot;name&quot;), rs.getInt(&quot;age&quot;), rs.getString(&quot;job&quot;));
                    return p;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                disConnect();
            }
            return null;
        }// select

        public ArrayList&amp;lt;Person&amp;gt; selectAll() {// 모든 Person 정보 얻어오기
            connect();
            ArrayList&amp;lt;Person&amp;gt; list = new ArrayList&amp;lt;Person&amp;gt;();

            try {
                stmt = conn.createStatement();
                String sql = &quot;SELECT no,name,age,job FROM person ORDER BY no&quot;;
                rs = stmt.executeQuery(sql);
                while (rs.next()) {

                    /*
                     * String name = rs.getString(&quot;name&quot;); int age = rs.getInt(&quot;age&quot;); String job =
                     * rs.getString(&quot;job&quot;); Person person = new Person(0,name,age,job);
                     * list.add(person);
                     */
                    list.add(new Person(rs.getInt(&quot;no&quot;), rs.getString(&quot;name&quot;), rs.getInt(&quot;age&quot;)
                    , rs.getString(&quot;job&quot;)));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                disConnect();
            }
            return list;
        }// ArrayList&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: INSERT&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;    public boolean insert(자바빈즈) {}
    public boolean insert(Person p) {}
    public void insert(Person p) {}

    public boolean insert(Person p) {
      connect();
      try {
        stmt = conn.createStatement();
          String sql=&quot;insert into person (no,name,age,job) values &quot;
                  //+ &quot;(1, '홍길동' , 13 , '학생' )&quot;;
                 + &quot;(person_seq.nextval, '&quot;+p.getName()+&quot;' , &quot;+p.getAge()
                  +&quot; , '&quot;+p.getJob()+&quot;' )&quot;;
          System.out.println(&quot;추가SQL==&amp;gt; &quot;+ sql);
          stmt.executeUpdate(sql);//DB에게 입력요청
          return true;

      } catch (SQLException e) {
        e.printStackTrace();
      } finally {
          disconnect();
      }

      return false;
    }//insert&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PersonDAO:: UPDATE&lt;/h3&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;    public boolean update(Person p) {
            connect();
            try {
                stmt = conn.createStatement();
                String sql = &quot;UPDATE person SET age=&quot; + p.getAge() + &quot;, job='&quot; 
                + p.getJob() + &quot;' WHERE no=&quot;+p.getNo();
                System.out.println(&quot;수정 sql=&quot;+sql);
                int t = stmt.executeUpdate(sql);
                System.out.println(&quot;수정행:&quot;+t);
                if(t==1) {
                    return true;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                disConnect();
            }
            return false;
        }// update&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;VIEW&lt;/h1&gt;
&lt;p&gt;InputForm.java&lt;br /&gt;MainView.java&lt;br /&gt;UpForm.java&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Controller&lt;/h2&gt;
&lt;p&gt;: 전체 프로그램에 대한 흐름 제어 역할&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;사용자 요청 분석 (예: 어떤 버튼을 눌렀는지)&lt;/li&gt;
&lt;li&gt;사용자 입력 데이터 얻어오기 (예: 입력폼 또는 수정폼을 통해 입력된 데이터)&lt;/li&gt;
&lt;li&gt;★모델객체생성(예: PersonDAO)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;메소드호출&lt;/li&gt;
&lt;li&gt;결과값 (리턴값) 얻기, 저장, 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;페이지(뷰) 호출 (예: 메인(JTable) ----&amp;gt; 입력폼)&lt;/li&gt;
&lt;li&gt;선택사항) 유효성 검사(valid check)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;사용자가 입력한 데이터에 대한.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터베이스에서도 데이터 무결성을 위한 유효성 검사&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;   public void actionPerformed(ActionEvent e) {
   Object ob = e.getSource();//action이벤트를 발생시킨 이벤트 소스의 주소 얻기

   if(ob==mainView.bt_insert) {//1.메인뷰 : 입력버튼   ==&amp;gt; 분석: 입력폼요청!!
      //4.메인뷰  ---&amp;gt; 입력폼   이동!! 
       mainView.setVisible(false);
       form.setVisible(true);
   }else if(ob==form.bt_submit) {//1.입력폼: 입력버튼 ==&amp;gt; 분석: DB입력 요청!!

       //2. 입력데이터 얻기
       String name = form.tf_name.getText();
       String age = form.tf_age.getText();
       String job = form.tf_job.getText();

       //세개의 변수를  p변수로 정의하기(한개의 변수명으로 정의하기)
       Person p = new Person(0, name, Integer.parseInt(age), job);

       //3. 모델 객체생성
       PersonDAO dao = new PersonDAO();
         dao.insert(p);
   }

   }//actionPerformed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jdbc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuTiQ/btqv9tk6aiB/gKbjA6jCAIC9Opck2mh2wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuTiQ/btqv9tk6aiB/gKbjA6jCAIC9Opck2mh2wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuTiQ/btqv9tk6aiB/gKbjA6jCAIC9Opck2mh2wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuTiQ%2Fbtqv9tk6aiB%2FgKbjA6jCAIC9Opck2mh2wk%2Fimg.png&quot; data-filename=&quot;jdbc.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;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/73</guid>
      <comments>https://fora.tistory.com/73#entry73comment</comments>
      <pubDate>Tue, 18 Jun 2019 23:56:58 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] Properties 객체 사용방법(저장, 출력, 데이터얻기)</title>
      <link>https://fora.tistory.com/72</link>
      <description>&lt;h3&gt;Properties&lt;/h3&gt;
&lt;p&gt;: 속성데이터(문자열, text)를 담는 클래스&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Properties pro = new Properties();&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;DAO&lt;/b&gt; : Data Access Object
&lt;ul&gt;
&lt;li&gt;DB 접근을 위한 DB전용 객체&lt;/li&gt;
&lt;li&gt;각 메소드에는 sql문 실행에 관련된 코드들로 구성 하는것이 가장 이상적&lt;/li&gt;
&lt;li&gt;CRUD 작업실행하는 메소드를 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DTO&lt;/b&gt; : Data Transfer Object&lt;br /&gt;VO : Value Object
&lt;ul&gt;
&lt;li&gt;계층간 데이터교환을 위한 자바빈즈&lt;/li&gt;
&lt;li&gt;VO(Value Object)라는 단어를 많이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;데이터 저장(입력)&lt;/h3&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;pro.setProperty(String key, String value);

pro.setProperty(&quot;k1&quot;,&quot;길동&quot;);
pro.setProperty(&quot;k2&quot;,&quot;라임&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;key: 저장 또는 검색을 위한 값(유일한 값)&lt;/li&gt;
&lt;li&gt;value: 저장하고자 하는 문자열(text) 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;데이터 출력(조회)&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;System.out.println(&quot;k1=&quot;+pro.getProperty(&quot;k1&quot;));
System.out.println(&quot;k2=&quot;+pro.getProperty(&quot;k2&quot;));

// 키값을 모르는 경우
Eumeration enu = pro.propertyNames();&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Enumeration: 열거형 인터페이스&lt;/li&gt;
&lt;li&gt;enu = [k1, k2, k3,...]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;properties 파일로부터 속성데이터 얻기&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;* properties 파일작성

형식) 속성이름 = 속성데이터
구분자) 서로 다른 속성을 라인으로 구분
주의) '=' 보통 앞과 뒤에 공백을 주지 않는다

--test.properties 파일

name =gildong
age =13
job =\uD559\uC0DD&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;try {
            pro.load(new FileReader(&quot;src/j0610/test.properties&quot;));
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        System.out.println(&quot;이름: &quot;+pro.getProperty(&quot;name&quot;));
        System.out.println(&quot;나이: &quot;+pro.getProperty(&quot;age&quot;));
        System.out.println(&quot;직업: &quot;+pro.getProperty(&quot;job&quot;));
        System.out.println(&quot;etc: &quot;+pro.getProperty(&quot;etc&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jdbc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwzO5y/btqv9sGybPu/hk1FF0aAeiAQ5KZSgsqMik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwzO5y/btqv9sGybPu/hk1FF0aAeiAQ5KZSgsqMik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwzO5y/btqv9sGybPu/hk1FF0aAeiAQ5KZSgsqMik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwzO5y%2Fbtqv9sGybPu%2Fhk1FF0aAeiAQ5KZSgsqMik%2Fimg.png&quot; data-filename=&quot;jdbc.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;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/72</guid>
      <comments>https://fora.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 18 Jun 2019 23:44:34 +0900</pubDate>
    </item>
    <item>
      <title>[JDBC] JDBC 관련클래스, 프로그래밍 순서 (Connection, Statement, ResultSet)</title>
      <link>https://fora.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvIDQ/btqv95xv2XK/vDMXlVMlrRjQmnXJ18xXV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvIDQ/btqv95xv2XK/vDMXlVMlrRjQmnXJ18xXV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvIDQ/btqv95xv2XK/vDMXlVMlrRjQmnXJ18xXV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyvIDQ%2Fbtqv95xv2XK%2FvDMXlVMlrRjQmnXJ18xXV0%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;h2&gt;JDBC 관련클래스&lt;/h2&gt;
&lt;p&gt;: java.sql 패키지&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DriverManager&lt;/b&gt;&lt;br /&gt;: JVM에서 JDBC전체를 관리하는 클래스. Driver등록, Connection 연결작업 등&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;br /&gt;: DB를 만드는 Vendor(Oracle, MS-SQL, MYSQL등)을 implements하여 자신들의 DB를 연결할 수 있는 class를 만드는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Connection&lt;/b&gt;&lt;br /&gt;: DB와 연결성을 갖는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Statement&lt;/b&gt;&lt;br /&gt;: SQL문을 실행하는 인터페이스&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ResultSet&lt;/b&gt;&lt;br /&gt;: 조회된 결과 데이터를 갖는 인터페이스&lt;/p&gt;
&lt;h2&gt;JDBC 프로그래밍&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;제품군 선택 (Oracle, Mysql, MS-SQL 등)&lt;/li&gt;
&lt;li&gt;연결객체 생성 (Connection)&lt;br /&gt;[&lt;b&gt;필요요소&lt;/b&gt;]&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;DB서버의 주소&lt;/li&gt;
&lt;li&gt;포트번호(0~63353개.한피시 안에서 서비스 종류를 판별하기 위해 사용)&lt;/li&gt;
&lt;li&gt;연결계정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;실행객체 생성 (Statement)&lt;br /&gt;[&lt;b&gt;관련요소&lt;/b&gt;]&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;SQL문 작성&lt;/li&gt;
&lt;li&gt;SQL문 실행요청&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;결과객체 생성 (ResultSet)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;행단위 데이터얻기&lt;/li&gt;
&lt;li&gt;열 데이터 뽑기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1. 드라이브 로딩 Driver loading (DB제품군 선택)&lt;/h3&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
// Class.forName(&quot;클래스명&quot;);
// Class.forName(&quot;패키지명.드라이버클래스명&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ClassNotFoundException 오류발생. try-catch문 혹은 예외처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 연결객체 생성 Connection (특정 DB서버연결)&lt;/h3&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;    Connection conn = DriverManager.getConnection(url, user, password);

    String url = &quot;jdbc:oracle:thin:@localhost:1521:xe&quot;; // &quot;localhost&quot; == &quot;127.0.0.1 == 내 pc
    String user = &quot;scott&quot;;
    String password = &quot;tiger&quot;;
    //conn = DriverManager.getConnection(&quot;jdbc:oracle:thin:@localhost:1521:xe&quot;,&quot;scott&quot;,&quot;tiger&quot;);

    System.out.println(&quot;DB연결 성공&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;url&lt;/b&gt; :접속DB ip, port번호, sid&lt;/li&gt;
&lt;li&gt;&lt;b&gt;user&amp;nbsp;&lt;/b&gt;: 접속계정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pwd&amp;nbsp;&lt;/b&gt;: 접속계정에 대한 비밀번호&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 실행객체 생성 Statement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQL문 (DML, DQL 실행가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;    Statement stmt = conn.createStatement();

    //실행요청
    int t = stmt.executeUpdate(sql); //DML 실행
    int t = stmt.executeQuery(sql);  //DQL 실행&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;DML 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;    // 테이블 dept_copy에서 10번부서를 삭제
        String sql = &quot;DELETE FROM dept_copy WHERE deptno=10&quot;;

    // --SQL문 실행요청
        int t = stmt.executeUpdate(sql); // 삭제시점
        System.out.println(&quot;T=&quot; + t); //t: 수정 또는 삭제된 행의 갯수
        if (t &amp;gt; 0) {
            System.out.println(&quot;삭제성공&quot;);// t==&amp;gt; 삭제(또는 수정)된 행의 갯수
        }

        --테이블 dept_copy에서 20번, 30번 부서를 삭제하시오(삭제성공메세지 출력)
        sql = &quot;DELETE FROM dept_copy WHERE deptno IN(20,30)&quot;;
        t = stmt.executeUpdate(sql);
        System.out.println(&quot;T=&quot; + t);

        if (t &amp;gt; 0) {
            System.out.println(&quot;삭제성공&quot;);
        } else {
            System.out.println(&quot;삭제실패&quot;);
        }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 결과객체 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ResultSet : 조회된 결과(행열데이터)를 저장&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DQL 작업&lt;/p&gt;
&lt;p&gt;조회요청, 조회된 결과값(행열데이터) 리턴&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;  ResultSet 변수명 = Statement명.executeQuery(sql); //리턴값 ResultSet
  //1. 행단위 데이터 얻기
  rs.next(); //boolean값 리턴. 행 반환시 true 
  if(rs.next()){} // 0번 또는 1번 출력시. WHERE절에 primary key 비교
  while(rs.next()){} //조회된 행의 갯수가 2행이상이 예상되어질 때&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;얻어온 행 안에서 개별 열데이터 얻기&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;  rs.get자료형(columnIndex); // 칼럼번호
  rs.get자료형(columnLabel); // 이름, 별명

  // 20번 부서의 부서번호, 부서명, 부서위치를 출력하시오
  sql = &quot;SELECT deptno, dname, loc FROM dept WHERE deptno=20&quot;;

  ResultSet rs = stmt.executeQuery(sql);
  rs.next();
  int deptno = rs.getInt(1); // 첫번째 칼럼데이터
  String dname = rs.getString(2);// 두번째 칼럼데이터
  String loc = rs.getString(3);// 세번째 칼럼데이터
  System.out.println(deptno + dname + loc);
  System.out.println(&quot;=======&quot;);

  sql = &quot;SELECT deptno, dname name, loc FROM dept&quot;;
  rs = stmt.executeQuery(sql);
  while(rs.next()) { //rs.next가 while 소괄호 안에서 실행됨
  //rs.getInt(1)    rs.getString(2) 숫자 표기가능
      deptno = rs.getInt(&quot;deptno&quot;); 
      dname = rs.getString(&quot;name&quot;);
      loc = rs.getString(3);
      System.out.println(deptno +&quot;\t&quot;+ dname +&quot;\t&quot;+ loc);
  } &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;AutoCommit 설정&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;    conn.setAutoCommit(false); //기본값 true
    conn.commit();
    conn.rollback();&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;conn.close()&lt;/h3&gt;
&lt;p&gt;:연결끊는 객체&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DB는 데이터 공유를 위해 사용&lt;/li&gt;
&lt;li&gt;Connection은 유한개&amp;rArr; 다른사람을 위해 사용한 연결객체는 반환&lt;/li&gt;
&lt;li&gt;DB자원: Connection 생성&amp;rarr; Statement 생성 &amp;rarr; ResultSet생성&lt;/li&gt;
&lt;li&gt;DB자원 반환은 역순으로 해주면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;    if(rs != null) rs.close();   
    if(stmt != null) stmt.close();   
    if(conn != null) conn.close();

    // if문 사용안할시 NullPoineException 오류발생&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connection만 끊어주면 Statement와 ResultSet도 자동적으로 끊김&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jdbc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WNs7D/btqwajWA7SL/FI3PYu2yISw1kka9eG4ack/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WNs7D/btqwajWA7SL/FI3PYu2yISw1kka9eG4ack/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WNs7D/btqwajWA7SL/FI3PYu2yISw1kka9eG4ack/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWNs7D%2FbtqwajWA7SL%2FFI3PYu2yISw1kka9eG4ack%2Fimg.png&quot; data-filename=&quot;jdbc.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;</description>
      <category>Web develop/JDBC_XML</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/71</guid>
      <comments>https://fora.tistory.com/71#entry71comment</comments>
      <pubDate>Tue, 18 Jun 2019 23:42:30 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 트리거(Trigger) 형식 및 사용예제</title>
      <link>https://fora.tistory.com/70</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;트리거(Trigger)&lt;/h1&gt;
&lt;p&gt;: 방아쇠를 당기는것. 사건이 발생했을 때 특정 영역 수행&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이벤트 처리(~했을 때 수반되는 처리)&lt;/li&gt;
&lt;li&gt;특정테이블에 이벤트(insert, delete, update)가 발생했을 시 다른테이블에 연관된 내용을 변경하도록 하는 일&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;트리거 형식&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    CREATE [OR REPLACE] TRIGGER 트리거명
        (BEFORE | AFTER) (INSERT | DELETE | UPDATE) --이벤트(사건발생)
        ON 테이블명 --이벤트가 발생하는 테이블
        [FOR EACH ROW] --실행될 문장 행에 각각 적용
        [WHEN 조건식]
        BEGIN
            --이벤트 발생시 실행할 문장(주로 DML) =&amp;gt; 이벤트 처리부
    END;
    /&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;트리거 사용예제&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    CREATE OR REPLACE TRIGGER welcome
        AFTER INSERT ON emp2 --emp2테이블에서 행입력이 발생했다면
        FOR EACH ROW
        BEGIN
            DBMS_OUTPUT.PUT_LINE('환영합니다');
    END;
    /

    INSERT INTO emp2 VALUES (7000,'길동',20); -- INSERT시 트리거 실행
    INSERT INTO emp2 VALUES (7001,'라임',10);&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;바인드변수&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;매개변수, 전달변수, PL/SQL에서는 변수명 앞에 ':'을 붙여서 사용&lt;/li&gt;
&lt;li&gt;:new - 새로 입력(INSERT, UPDATE)된 데이터&lt;/li&gt;
&lt;li&gt;:old - 기존 데이터(이미 저장되어있는 데이터)&lt;br /&gt;&amp;rArr; begin~end에서 사용법 ) :new.컬럼명 , :old.컬럼명&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;사용예제&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    CREATE OR REPLACE TRIGGER welcome
        AFTER INSERT ON emp2 --emp2테이블에서 행입력이 발생했다면
        FOR EACH ROW
        BEGIN
            DBMS_OUTPUT.PUT_LINE('['||:new.ename||']'||'님의 입사를 환영합니다');
    END;
    /

    --문제) 사원테이블 emp3에 사원정보가 empno, ename, sal, hiredate 입력되었을 때 
    --급여테이블(salary[no,sal])에 그 사원에 대한 급여정보가 자동으로 입력되도록 트리거를 생성하시오

    create or replace trigger sal_info
        after insert on emp3 
        for each row
        begin
           insert into salary (no,sal)
                      values (salary_seq.nextval,  :new.sal);  
        end;
        /

    INSERT INTO emp3 VALUES (7004,'초초',3000,sysdate);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;트리거 활용 테이블 만들기&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 상품테이블
    CREATE TABLE 상품(
        상품코드 CHAR(4) CONSTRAINT 상품_pk PRIMARY KEY,
        상품명 VARCHAR2(15) NOT NULL,
        제조사 VARCHAR2(15),
        소비자가격 NUMBER,
        재고수량 NUMBER DEFAULT 0
    );

    -- 입고테이블
    CREATE TABLE 입고(
    입고번호 NUMBER CONSTARINT 입고_pk PRIMARY KEY,
    상품코드 CHAR(4) CONSTRAINT 입고_fk REFERENCES 상품(상품코드),
    입고일자 DATE DEFAULT SYSDATE,
    입고수량 NUMBER,
    입고단가 NUMBER,
    입고금액 NUMBER
    );

    -- 입고시퀀스 생성
    CREATE SEQUENCE 입고_seq 
        START WITH 1
        INCREMENT BY 1
        NOCYCLE
        NOCACHE;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;-- 상품테이블에 정보입력
    insert into 상품(상품코드, 상품명, 제조사, 소비자가격) values ('a001','마우스','삼성','1000');
    insert into 상품(상품코드, 상품명, 제조사, 소비자가격) values ('a002','키보드','LG','2000');
    insert into 상품(상품코드, 상품명, 제조사, 소비자가격) values ('a003','모니터','샤오미','5000');

    -- 입력트리거 (입고테이블에 상품이 입력되었을 때 재고수량 증가)
    예) 입고테이블에 키보드가 10개 입고되었을 때 자동으로 상품테이블의 'A002'상품의 재고가 0-&amp;gt;10으로 변경

    CREATE OR REPLACE TRIGGER produce_insert
    AFTER INSERT ON 입고
    FOR EACH ROW
    BEGIN
        UPDATE 상품 SET 재고수량 = :new.입고수량 + 재고수량
        WHERE 상품코드 = :new.상품코드; 
    END;
    /

    -- 입고테이블/ 입고번호, 상품코드, 입고일자, 입고수량, 입고단가, 입고금액
    INSERT INTO 입고 (입고번호, 상품코드, 입고수량, 입고단가, 입고금액) VALUES (입고_seq.nextval, 'a002', 10, 1000, 10000);

    -- 수정트리거 (입고테이블에 상품의 입고수량이 변경되었을때 상품테이블의 재고수량 변경)
    CREATE OR REPLACE TRIGGER product_update
    AFTER UPDATE ON 입고
    FOR EACH ROW
    BEGIN
        UPDATE 상품 SET 재고수량 = :old.재고수량 - :old.입고수량 + :new.입고수량
        WHERE 상품코드 = :new.상품코드;
    END;
    /

    UPDATE 입고 SET 입고수량 = 40 WHERE 입고번호 = 2;

    -- 삭제트리거 
    CREATE OR REPLACE TRIGGER product_delete
    AFTER DELETE ON 입고 --이벤트: 입고테이블에서 삭제 발생시
    FOR EACH ROW
    BEGIN
       UPDATE 상품 SET 재고수량 = 재고수량 - :old.입고수량 WHERE 상품코드 = :new.상품코드;
    END;
    /
    DELETE FROM 입고 WHERE 입고번호=2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gntb4/btqv7Qfuctm/s2JRyrKSNfILkNGCpMuw2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gntb4/btqv7Qfuctm/s2JRyrKSNfILkNGCpMuw2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gntb4/btqv7Qfuctm/s2JRyrKSNfILkNGCpMuw2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGntb4%2Fbtqv7Qfuctm%2Fs2JRyrKSNfILkNGCpMuw2k%2Fimg.png&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/70</guid>
      <comments>https://fora.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 16 Jun 2019 15:22:18 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 패키지(Package) 선언, 실행방법 및 사용예제</title>
      <link>https://fora.tistory.com/69</link>
      <description>&lt;h1&gt;패키지(Package)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;동일한 프로시저명 또는 함수명을 구분 (NameSpace 개념)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    --------------패키지 선언-------------------
    CREATE OR REPLACE PACKAGE 패키지명 
    IS
        정의될 저장프로시저와 저장함수 
    END;
    /

    --------------패키지 실행(body)-------------
    CREATE OR REPLACE PACKAGE BODY 패키지명 
    IS
        저장프로시저와 저장삼후 정의
    END;
    /

    --실행 
    EXEC[UTE] 패키지명.저장프로시저명;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;패키지 사용예제&lt;/h2&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;
    ----------------------패키지 선언-------------------------------------
    create or replace package encore
    is
       procedure del_ename(delEname varchar2);
       function call_bonus(vename emp.ename%type) return number;
    end;
    /
    ----------------------패키지 실행(body)-------------------------------
    create or replace package body encore
    is
        -- 특정사원(이름) 삭제 프로시저
        procedure del_ename(delEname varchar2)
        is

        begin    
            delete from emp3
            where ename= delEname;
            commit;
            dbms_output.put_line('#'||delEname||'사원이 삭제되었습니다');
       end; 

       -- 특정사원의 보너스 얻는 함수
       function call_bonus(vename emp.ename%type)
          return number
          is
            sal emp.sal%type;
            bonus   number;
          begin
              select sal into sal
              from emp
              where ename = vename;  
              -- 보너스 계산
              bonus := sal*2;
       return bonus;    
       end;   
    end;
    /

    --실행
    exec encore.del_ename('FORD');

    variable bonus NUMBER;
    exec encore.vsll_nonud('KING');
    print bonus;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9hghK/btqv5XfMHmk/vdknl0xiEA9nWfmiuZAeHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9hghK/btqv5XfMHmk/vdknl0xiEA9nWfmiuZAeHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9hghK/btqv5XfMHmk/vdknl0xiEA9nWfmiuZAeHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9hghK%2Fbtqv5XfMHmk%2Fvdknl0xiEA9nWfmiuZAeHK%2Fimg.png&quot; data-filename=&quot;다운로드.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/69</guid>
      <comments>https://fora.tistory.com/69#entry69comment</comments>
      <pubDate>Sun, 16 Jun 2019 15:16:49 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 커서 (CURSOR) 형식, FOR문에 사용하는 커서, ORA-01422 에러</title>
      <link>https://fora.tistory.com/68</link>
      <description>&lt;h3&gt;CURSOR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SELECT의 결과가 2개행 이상일 때 명시적으로 사용&lt;/li&gt;
&lt;li&gt;2개 행 이상을 출력하는 SELECT문을 저장하는 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    declare 
        --변수선언, 커서정의
        CURSOR 커서명 IS SELECT문장;
    begin
        OPEN 커서명; -- 커서 사용선언
            FETCH 커서명 INTO 변수명 --커서 사용. 데이터 1행 인출
        CLOSE 커서명; -- 커서 사용중지
    end;
    /

    declare
            CURSOR cur IS SELECT deptno,dname,loc FROM dept;
            vdept dept%rowtype; -- 테이블을 구성하는 모든 컬럼 참조
        begin
            OPEN cur;
                dbms_output.put_line('부서번호/부서명/위치');
                LOOP 
                    FETCH cur INTO vdept; 
                    EXIT WHEN cur%notfound; --커서를 통해 인출된 행이 없다면
                    dbms_output.put_line(vdept.deptno || '/' || vdept.dname || '/' || vdept.loc);
                END LOOP;
                CLOSE cur;
        end;
    /&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;변수명 테이블%rowtype; &amp;mdash;&amp;gt; 특정테이블이 갖는 모든 컬럼에 정의된 자료형 참조&lt;/li&gt;
&lt;li&gt;EXIT WHEN cur%notfound; &amp;mdash;&amp;gt; 인출되는 행이 없을시 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;커서사용 안할시 발생되는 에러&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;declare
    vdeptno dept.deptno%type;
    vdname dept.dname%type;
    vloc dept.loc%type;
    begin
        SELECT deptno,dname,loc INTO vdeptno,vdname,vloc FROM dept;

    end;
/
--에러발생&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ORA-01422: exact fetch returns more than requested number of rows&lt;/li&gt;
&lt;li&gt;-&amp;gt; 에러발생 (요구된 것(1행)보다 더 많은 수의 행(2행이상)을 추출했다는 에러)&lt;/li&gt;
&lt;li&gt;조회(SELECT)결과가 2개 이상일 때 해결 &amp;rarr; &lt;b&gt;CURSOR&lt;/b&gt; 또는 &lt;b&gt;LOOP&lt;/b&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;FOR문에서 커서 사용&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE dept_member(vdeptno emp.deptno%type)
  IS
      CURSOR cur IS SELECT empno, ename, sal, to_char(hiredate,'yyyy&quot;년&quot; mm&quot;월&quot; dd&quot;일&quot;' ) AS hiredate
      FROM emp WHERE deptno = vdeptno;
            cnt NUMBER := 0;
  begin
      DBMS_OUTPUT.PUT_LINE('사원번호/사원명/급여/입사일');
            /*
            OPEN cur; 
            FETCH cur; 
            CLOSE cur; --&amp;gt; FOR문으로 변환 
            */
      FOR vemp IN cur 
          LOOP
              dbms_output.put_line(vemp.empno || '/' || vemp.ename || '/' || 
                                          vemp.sal || '/' || vemp.hiredate );
                            cnt := cnt+1;
          END LOOP;
                    dbms_output.put_line('총 인원은 '||cnt||'명 입니다.');
end;
/

-- 호출
EXEC dept_member(30);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5kSsb/btqv80nWRbP/dFKACVY7i1Fmh8y9KAxRgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5kSsb/btqv80nWRbP/dFKACVY7i1Fmh8y9KAxRgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5kSsb/btqv80nWRbP/dFKACVY7i1Fmh8y9KAxRgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5kSsb%2Fbtqv80nWRbP%2FdFKACVY7i1Fmh8y9KAxRgk%2Fimg.png&quot; data-filename=&quot;다운로드.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/68</guid>
      <comments>https://fora.tistory.com/68#entry68comment</comments>
      <pubDate>Sun, 16 Jun 2019 15:15:05 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 저장함수(Stored Function) 형식 및 사용방법</title>
      <link>https://fora.tistory.com/67</link>
      <description>&lt;h3&gt;저장함수&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Procedure와 달리 실행(함수호출)후 결과를 되돌려 받을 수 있는 &lt;code&gt;return 데이터;&lt;/code&gt; 를 반드시 명시해야 함
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;  CREATE [OR REPLACE] FUNCTION 함수명(매개변수 선언)
      RETURN 자료형
      IS
          변수선언
      BEGIN
          (순차적으로)실행할 SQL문
          RETURN 데이터;
  END;
  /&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;사용법&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;CREATE FUNTION~ (함수를 DB에 저장) &amp;mdash; 함수 생성&lt;/li&gt;
&lt;li&gt;VARIABLE 바인드변수명 자료형; &amp;mdash; 변수 선언&lt;/li&gt;
&lt;li&gt;EXEC[UTE] :바인드변수명 := 함수명() &amp;mdash; 함수호출, 결과값 저장&lt;/li&gt;
&lt;li&gt;PRINT 바인드변수명; &amp;mdash; 저장 값 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;    자바와 비교한 참고)
    void hello(String name){
        System.out.println(&quot;안녕,&quot;+name);
    } -----&amp;gt; Stored Procedure (리턴키워드 없고)
    String hi( ){
         return &quot;좋은 하루~!!&quot;;
      }
     -----&amp;gt; Stored Function (리턴키워드 있고)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문제) 특정사원에게 보너스를 지급하려고 하는데 급여의 200%에 해당하는 비용을 지급하려 한다.&lt;br /&gt;이 보너스 금액을 FUNTION을 통해 구하시오 + 보너스비율&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;    CREATE OR REPLACE FUNCTION call_bonus(vename emp.ename%type)
        RETURN NUMBER
        IS
            vsal emp.sal%type;
            bonus NUMBER;
        BEGIN
         SELECT sal INTO vsal FROM emp WHERE ename = vename;
         bonus := vsal *2;
         RETURN bonus;
    END;
    /

    variable bonus number; --리턴받을 변수 선언
    execute :bonus := call_bonus('SMITH');
    print bonus;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnJDjR/btqv5WgWmLy/gvEA5k3th3fkf1CQvw35R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnJDjR/btqv5WgWmLy/gvEA5k3th3fkf1CQvw35R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnJDjR/btqv5WgWmLy/gvEA5k3th3fkf1CQvw35R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnJDjR%2Fbtqv5WgWmLy%2FgvEA5k3th3fkf1CQvw35R1%2Fimg.png&quot; data-filename=&quot;다운로드.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/67</guid>
      <comments>https://fora.tistory.com/67#entry67comment</comments>
      <pubDate>Sun, 16 Jun 2019 15:11:21 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 저장 프로시저 (Stored Procedure) 형식, 사용 예제</title>
      <link>https://fora.tistory.com/66</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;자주 사용되는 DML, DQL을 모듈화(독립적인 객체) 시켜서 DB에 저장하였다가 필요할 때 호출해서 사용&lt;/li&gt;
&lt;li&gt;서로 연관있는 DML과 DQL을 연결해서 실행하는 단위&lt;/li&gt;
&lt;li&gt;JAVA의 메소드. 함수와 같음&lt;/li&gt;
&lt;li&gt;[IN|OUT]&lt;br /&gt;IN은 안으로 데이터를 받는 매개변수의 의미,&lt;br /&gt;OUT은 데이터를 내보내는 리턴의 역할. OUT 사용시 호출 &amp;rArr; execute 프로시저명(인자, :변수명)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;프로시저 생성 및 실행방법&lt;/h2&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;    CREATE [OR REPLACE] PROCEDURE 프로시저명(변수명 [IN|OUT] 자료형, 변수명 자료형) 
    --자료형은 타입만 기재 (ex. 변수명 VARCHAR2)
    IS
        실행부 BEGIN에서 사용할 변수선언;
    BEGIN
        --초기화, SQL문, 함수호출, 절차적 요소(조건문, 반복문)
        실행할 문장1;
        실행할 문장2;
    END;
    /

    -- CREATE [OR REPLACE] PROCEDURE 프로시저명 --매개변수가 없을시엔 소괄호 생략

    -- &amp;lt;실행방법&amp;gt;
    -- 매개변수가 있는 함수(OUT) 호출시
    EXEC[UTE] 프로시저명(인자);
        variable 변수명 자료형;
        PRINT 변수명; -- 저장된 값 출력

    -- 매개변수가 없는 함수(IN) 호출시
    EXEC[UTE] 프로시저명;
    EXEC[UTE] 프로시저명();&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;프로시저 사용 예제&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;기본적인 프로시저 사용방법&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;  create or replace PROCEDURE del_dept(delNo number)
      IS
      BEGIN
          delete from dept3
          WHERE deptno=delNo;
          DBMS_OUTPUT.PUT_LINE('#삭제수행 완료');
      END;

  EXECUTE del_dept(20); --실행문&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;매개변수 OUT의 리턴값이 존재하는 프로시저&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;  create or replace PROCEDURE del_dept(delNo IN number, tomorrow OUT varchar2)
      IS
      BEGIN
          delete from dept3
          WHERE deptno=delNo;
          DBMS_OUTPUT.PUT_LINE('#삭제수행 완료');
                  commit;
                  SELECT TO_CHAR(sysdate+1,'yy/mm/dd') INTO tomorrow FROM dual;
      END;

  variable tomorrow varchar2(15) --리턴값을 받을 변수 선언
  EXEC del_dept(40, :tomorrow);
  print tomorrow; --리턴값 확인&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;삭제와 조건문 if를 사용한 프로시저&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;  create or replace PROCEDURE del_ename(delName IN varchar2)
      IS
          vcount NUMBER;
      BEGIN
          DELETE FROM emp3
          WHERE ename = delName;
          SELECT count(*) INTO vcount FROM emp3;
                  if()
          then DBMS_OUTPUT.PUT_LINE(delName||' 사원이 삭제되었고 총 사원수는 '|| vcount||'명 입니다.');
                  else
          end if;
                  commit;
      END;

  EXECUTE del_ename('SMITH');&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;사원이름 존재유무 확인 프로시저&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;  create or replace PROCEDURE del_ename(delName IN varchar2)
      IS
          existN NUMBER;
          vcount NUMBER;
      BEGIN
          SELECT count(ename) INTO existN FROM emp3 WHERE ename = delName;

          if(existN = 0)        
          then 
              SELECT count(*) INTO vcount FROM emp3;
              DBMS_OUTPUT.PUT_LINE(delName||' 사원은 존재하지않고 총 사원수는 '|| vcount||'명 입니다.');
          else
                DELETE FROM emp3 WHERE ename = delName;
                SELECT count(*) INTO vcount FROM emp3;
                DBMS_OUTPUT.PUT_LINE(delName||' 사원이 삭제되었고 총 사원수는 '|| vcount ||'명 입니다.');
          end if;
          commit;
      END;

  EXECUTE del_ename('SMITH');&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;위의 코드 개선. if then과 else의 select문을 한번만 정의해서 출력&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;  del_ename('ADAMS'), del_ename('adams') 상관없이 사원삭제

  create or replace procedure del_ename(delEname varchar2)
  is
   -- 변수선언
     total number;
     cnt   number;
  begin

     --사원이름 존재 유(1)무(0) 조회
     select count(ename) into cnt
     from emp3
     where upper(ename) = upper(delEname);

     select count(*) into total
          from emp3;

     --if cnt=0
     if cnt&amp;gt;0
       then /*존재한다면*/
          delete from emp3
          where lower(ename)= lower(delEname);    
          commit;
          dbms_output.put_line('#'||delEname||'사원이 삭제되었고 총 사원수는 '||
                    (total-1)||'명 입니다!!');
       else
          dbms_output.put_line('#'||delEname||'사원은 존재하지않고 총 사원수는 '||
                    total||'명 입니다!!');
     end if;
  end;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SELECT절에서 데이터가 선택되지 않은것은 null이 아닌 no select로 아예 행이 없는것을 의미함&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x2L0u/btqv8Y4J1FK/jdX2lDKd39pzALxjmZFdnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x2L0u/btqv8Y4J1FK/jdX2lDKd39pzALxjmZFdnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x2L0u/btqv8Y4J1FK/jdX2lDKd39pzALxjmZFdnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx2L0u%2Fbtqv8Y4J1FK%2FjdX2lDKd39pzALxjmZFdnk%2Fimg.png&quot; data-filename=&quot;다운로드.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/66</guid>
      <comments>https://fora.tistory.com/66#entry66comment</comments>
      <pubDate>Sun, 16 Jun 2019 15:07:15 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] PL/SQL 반복문 형식 (LOOP, FOR, 다중 FOR문,WHILE)</title>
      <link>https://fora.tistory.com/65</link>
      <description>&lt;h2&gt;LOOP&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;LOOP
    반복실행할 문장1;
    반복실행할 문장2;
    반복실행할 문장3;
    EXIT [WHEN 조건식];
END LOOP;

-- 1~10까지 출력
declare
    i NUMBER := 0;
    begin
    LOOP
            i := i+1;
              dbms_output.put_line(i);
        EXIT WHEN i=10;
        END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;FOR&lt;/h2&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;FOR 변수 IN [REVERSE] 최소값..최대값
LOOP
    반복 실행할 문장;
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;REVERSE : 최소값 최대값이 반대로 명시됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    -- 안녕하세요 10번 출력
    declare
        begin
            FOR i IN 1..10
            LOOP
                dbms_output.put_line('안녕하세요'||i);
            END LOOP;
    END;
    /&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;다중 FOR문&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;-- 3~5단 출력
declare
    begin
      FOR i IN 3..5
      LOOP
        dbms_output.put_line('&amp;lt;'||i||'단&amp;gt;');
        FOR j IN 1..9
        LOOP
            dbms_output.put_line(i||'*'||j||'='||i*j);
        END LOOP;
      END LOOP;
END;
/


-- 구구단 입력후 gugudan 테이블에 저장
declare
    begin
      FOR dan IN 3..5
      LOOP
        FOR i IN 1..9
        LOOP
        INSERT INTO gugudan (dan,i,result) VALUES (dan,i,i*dan);
        END LOOP;
      END LOOP;
END;
/&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;WHILE&lt;/h2&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;WHILE 조건식
LOOP
    반복실행할 문장;
END LOOP;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;다운로드.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUGIjY/btqv5VvzQme/xAoiGC7VUKmIKC21PUydhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUGIjY/btqv5VvzQme/xAoiGC7VUKmIKC21PUydhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUGIjY/btqv5VvzQme/xAoiGC7VUKmIKC21PUydhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUGIjY%2Fbtqv5VvzQme%2FxAoiGC7VUKmIKC21PUydhK%2Fimg.png&quot; data-filename=&quot;다운로드.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/65</guid>
      <comments>https://fora.tistory.com/65#entry65comment</comments>
      <pubDate>Sun, 16 Jun 2019 14:55:35 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] PL/SQL 조건문 형식 및 사용예제 (if문, if~else문, if~elif~else문)</title>
      <link>https://fora.tistory.com/64</link>
      <description>&lt;h2&gt;if문&lt;/h2&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;    if (조건식) --소괄호 생략가능
        then  -- 시작을 표현
            조건식이 참일 때 실행할 문장;
    end if; -- 끝을 표현&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;cal&quot;&gt;&lt;code&gt;    declare
        su1 number;
        su2 number := 20;
    begin
        su1 := 23;

        if(su1&amp;gt;su2)
            then dbms_output.put_line('작다!!');
        end if;

        if(su1&amp;lt;su2)
            then dbms_output.put_line('크다!!');
        end if;
    end;
    /&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;su1 := 13; &amp;mdash;&amp;gt; := 대입연산자&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;if~else문&lt;/h2&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;    if 조건식 
        then 조건식 결과가 참일 때 실행할 문장;
        else 조건식 결과가 거짓일 때 실행할 문장;
    end if;

    --
    declare 
        c emp.comm%type;
        vename emp.ename%type;
        begin
            SELECT comm,ename INTO c,vename
            FROM emp WHERE empno = 7788;
            if(c NOT IN(0,null))
                then dbms_output.put_line(vename||'은 커미션 '||c||'을 받습니다');
                else dbms_output.put_line(vename||'은 커미션을 받지않습니다');
            end if;
        end;
    /

    declare 
        vcomm  emp.comm%type;
        vename emp.ename%type;
        vempno emp.empno%type;
        vsal       emp.sal%type;
        begin
            SELECT comm,ename,empno,sal INTO vcomm,vename,vempno,vsal
            FROM emp WHERE empno = 7788;
            if(vcomm NOT IN(0,null))
                then dbms_output.put_line(vename||'은 연봉 '|| vsal*12+vcomm ||'을 받습니다');
                else dbms_output.put_line(vename||'은 연봉 '|| vsal*12 ||'을 받습니다');
            end if;
        end;
    /&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;if~elsif~else문&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;if (조건식1)  
    then 조건식1 참일때 실행할 문장;  
    elsif (조건식2)  
        then 조건식1이 거짓이고 2가 참일때 실행할 문장;  
    elsif (조건식3)  
        then 조건식1,2가 거짓이고 3이 참일때 실행할 문장;  
    else 조건식 1,2,3이 거짓일때 실행할 문장;  
end if;

--
declare
    vename  emp.ename%type;
    vdeptno emp.deptno%type;
    vempno  emp.empno%type;
    vdname  dept.dname%type;
    begin
        vempno := 7654;
        SELECT ename, deptno INTO vename, vdeptno
        FROM emp WHERE empno=vempno;
    if(vdeptno = 10) 
        then vdname := 'ACCOUNTING';
    elsif(vdeptno = 20) 
        then vdname := 'RESEARCH';
    elsif(vdeptno = 30)
        then vdname := 'SALES';
    else vdname := 'OPERATIONS';
    end if;
    dbms_output.put_line(vempno||' 사번의 '||vename||' 사원은 '||vdname||' 부서에서 일한다.');
end;
/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AHqKu/btqv8lTmOEh/W6S8OoCRrsrFmSeiJ6a8SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AHqKu/btqv8lTmOEh/W6S8OoCRrsrFmSeiJ6a8SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AHqKu/btqv8lTmOEh/W6S8OoCRrsrFmSeiJ6a8SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHqKu%2Fbtqv8lTmOEh%2FW6S8OoCRrsrFmSeiJ6a8SK%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/64</guid>
      <comments>https://fora.tistory.com/64#entry64comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:52:49 +0900</pubDate>
    </item>
    <item>
      <title>[Notion] 인생 최고의 노트앱, 노션. 크레딧으로 1년 무료로 사용하기</title>
      <link>https://fora.tistory.com/63</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;275&quot; height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmX4t/btqv7qnMpj1/b12O2ec5a1K1WTcjO4Kb4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmX4t/btqv7qnMpj1/b12O2ec5a1K1WTcjO4Kb4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmX4t/btqv7qnMpj1/b12O2ec5a1K1WTcjO4Kb4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmX4t%2Fbtqv7qnMpj1%2Fb12O2ec5a1K1WTcjO4Kb4K%2Fimg.png&quot; width=&quot;275&quot; height=&quot;287&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;h3&gt;노션과 만나다&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;에버노트 1년 약정이 끝나가던 어느 날 온갖 버그에 불만을 품고 대체 할 만한 메모 프로그램을 찾고있었다. 사실 별로 큰 기대는 안하고 있던 중 발견한 녀석. 사용한지 30분만에 결제를 결정했고, 현재는 나의 메인 노트앱이 되었다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h3&gt;노션 기능 간단한 소개&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;629&quot; height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pty5k/btqv5VhLCwa/MBkjxbfBxsjCS5JbCsA2ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pty5k/btqv5VhLCwa/MBkjxbfBxsjCS5JbCsA2ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pty5k/btqv5VhLCwa/MBkjxbfBxsjCS5JbCsA2ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpty5k%2Fbtqv5VhLCwa%2FMBkjxbfBxsjCS5JbCsA2ok%2Fimg.png&quot; width=&quot;629&quot; height=&quot;766&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;b&gt;&amp;lt;대시보드&amp;gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;위 사진은 내가 정리 해 놓은 대시보드이다. 노션을 효율적으로 사용하기 위해 가장 첫 페이지에 본인이 자주 사용하는 블럭들을 모아놓고 사용하는 사람들이 많이 있었다. 실제로 사용해 본 결과 굉장히 편리하고, 본인이 원하는 이미지와 커버, 기능들을 추가할 수 있기에 꾸미기 좋아하는 사람들에게 정말 최고가 아닐까 싶었다. (무엇보다 엄청 예쁘다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boC2mY/btqv7f7TaYk/eYziRnWOKS9SBib0VzVVzk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boC2mY/btqv7f7TaYk/eYziRnWOKS9SBib0VzVVzk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boC2mY/btqv7f7TaYk/eYziRnWOKS9SBib0VzVVzk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/boC2mY/btqv7f7TaYk/eYziRnWOKS9SBib0VzVVzk/img.gif&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;b&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&amp;lt;블록&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;사진, 텍스트, 페이지가 '블록'이란 것으로 나뉘어져 있는데 이것들은 내가 원하는 대로 위치를 설정하고 아이콘을 달고 색을 입힐 수 있다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;notion.gif&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM6DB9/btqv7DHdI87/5mMlFTrzOnIGJmffPtCJFk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM6DB9/btqv7DHdI87/5mMlFTrzOnIGJmffPtCJFk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM6DB9/btqv7DHdI87/5mMlFTrzOnIGJmffPtCJFk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cM6DB9/btqv7DHdI87/5mMlFTrzOnIGJmffPtCJFk/img.gif&quot; data-filename=&quot;notion.gif&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;b&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;lt;슬래시&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;노션에서 '/' 슬래시를 입력하면 위와같이 리스트가 나오게 된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;직접 스크롤하여 선택해도 되지만 슬래시를 치고 code, image, file 등과 같이 입력하여 직접 검색도 가능하다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;use-case-screenshot-database.gif&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eoi8Q/btqv8nDFBsR/DQMMv7YaXVj6o681KYysC0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eoi8Q/btqv8nDFBsR/DQMMv7YaXVj6o681KYysC0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eoi8Q/btqv8nDFBsR/DQMMv7YaXVj6o681KYysC0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Eoi8Q/btqv8nDFBsR/DQMMv7YaXVj6o681KYysC0/img.gif&quot; data-filename=&quot;use-case-screenshot-database.gif&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;b&gt;&amp;lt;템플릿&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;스프레드시트와 같은 테이블 템플릿을 만들 수 있고, 그것의 뷰를 Calendar로 설정하여 언제 데이터를 등록했는 지 눈으로 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;use-case-screenshot-task.gif&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qdLWd/btqv7gFH0Pr/cRkNkcz1cvQE7az7IVmKS1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qdLWd/btqv7gFH0Pr/cRkNkcz1cvQE7az7IVmKS1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qdLWd/btqv7gFH0Pr/cRkNkcz1cvQE7az7IVmKS1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/qdLWd/btqv7gFH0Pr/cRkNkcz1cvQE7az7IVmKS1/img.gif&quot; data-filename=&quot;use-case-screenshot-task.gif&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;b&gt;&amp;lt;트렐로!&amp;gt;&amp;nbsp;&lt;/b&gt;&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj5UtG/btqv6DHZg1S/EynUWMXqiUCrO8Ix3GhC50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj5UtG/btqv6DHZg1S/EynUWMXqiUCrO8Ix3GhC50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj5UtG/btqv6DHZg1S/EynUWMXqiUCrO8Ix3GhC50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj5UtG%2Fbtqv6DHZg1S%2FEynUWMXqiUCrO8Ix3GhC50%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;b&gt;&amp;lt;메모 공유&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Copy Link를 사용하여 다른사람들에게 메모장을 공유할 수 있다. 아래는 직접 공유링크를 가져온 SQL 필기노트&lt;/p&gt;
&lt;figure id=&quot;og_1560600206191&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.notion.so/70367bda8cbf49eea1d3fc8b06bbefdd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.notion.so/foravnote/SQL-70367bda8cbf49eea1d3fc8b06bbefdd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2Mqyb/hyBBzxEL6H/H2S7I90WTCJkE2HMwm1pa0/img.jpg?width=510&amp;amp;height=765&amp;amp;face=0_0_510_765');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;SQL&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;A new tool for teams &amp;amp; individuals that blends everyday work apps into one.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmN8vA/btqv8ncDxyX/KPpFwVLO58mPxNRbCkhFEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmN8vA/btqv8ncDxyX/KPpFwVLO58mPxNRbCkhFEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmN8vA/btqv8ncDxyX/KPpFwVLO58mPxNRbCkhFEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmN8vA%2Fbtqv8ncDxyX%2FKPpFwVLO58mPxNRbCkhFEk%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;b&gt;&amp;lt;Quick Find&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;원래는 티스토리에서 필기한 것들을 바로 올렸었는데 이 기능때문에 노션에 정리를 먼저하고 티스토리에 올리게 되었다. ctrl + p를 누르면 Quick Find 기능이 실행되는데 단어 하나만 검색해도 내가 작성했던 모든 메모에서 그 단어를 찾아준다. 찾고싶을 때 바로 찾을 수있는 굉장히 강력한 기능.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1560775958582&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.notion.so/8b1afafe5dbb4929aabccbdc53355c97&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.notion.so/Notion-8b1afafe5dbb4929aabccbdc53355c97&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Notion 키보드 및 마크다운 단축키&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;노션 단축키를 활용해 Notion를 더욱 편하게 사용해봅시다. Notion 단축키.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;b&gt;&amp;lt;Mark Down 마크다운&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;마크다운으로 글을 작성하면 즉시 변경시켜준다.모든 마크다운 언어가 아닌 간단한 문법위주만 있지만 글을 쓰기에는 충분하다. 위의 글을 참고하여 숙지하면 노션 인생에 꽃이 필 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;노션 1년 무료로 사용하기&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjnKtw/btqv5VWrZPj/uByKcSjiH3dm8ukoWKVYb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjnKtw/btqv5VWrZPj/uByKcSjiH3dm8ukoWKVYb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjnKtw/btqv5VWrZPj/uByKcSjiH3dm8ukoWKVYb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjnKtw%2Fbtqv5VWrZPj%2FuByKcSjiH3dm8ukoWKVYb0%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/c1L4r4/btqv7POeSyB/QUOLOz3Ilkmfi1ZRbxeOG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1L4r4/btqv7POeSyB/QUOLOz3Ilkmfi1ZRbxeOG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1L4r4/btqv7POeSyB/QUOLOz3Ilkmfi1ZRbxeOG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1L4r4%2Fbtqv7POeSyB%2FQUOLOz3Ilkmfi1ZRbxeOG0%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 style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노션의 Setting &amp;amp; Members에 들어가면 Earn Credit&lt;/li&gt;
&lt;li&gt;들어가보면 미션이 있는데 이 미션들을 깨면 26달러를 받을 수 있다. 쉬운 미션들이라 10분이면 해결할 수 있을것이다.&lt;/li&gt;
&lt;li&gt;그리고나서 22달러를 지불해야 하는데 노션을 가입할 때 친구추천을 받고 가입하면 10달러를 더 받고 12달러 결제가 남는다.&lt;/li&gt;
&lt;li&gt;주변 지인들 3명에게 추천하면 한명당 5달러를 받고 1년을 무료로 사용할 수 있다. &lt;br /&gt;(본인은 노션이 너무 좋아서 10명에게 추천하였다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;추천하여 받을 수 있는 최대금액은 200달러라고 한다. (가능하다면.. 최대.. 4년까지도 무료로 사용할 수 있다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;노션 사용에 도움되는 사이트&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1560601058315&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.notion.so/1ad7ccbc41a44298814a4820d4acb14e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.notion.so/Notion-1ad7ccbc41a44298814a4820d4acb14e&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cCwq45/hyBBKFWWdT/U6yj0VfacISVpJNAgMHESK/img.png?width=510&amp;amp;height=510&amp;amp;face=0_0_510_510');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Notion 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;성원에 힘입어 한글판 노션 가이드 책이 출판되었습니다. 감사합니다. (_ _)&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1560601140400&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.notion.so/674b1f37f11f43f28ba3819eaaf5f86c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.notion.so/Notion-Contents-674b1f37f11f43f28ba3819eaaf5f86c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cHytRu/hyBBKFW1cs/ILYGpVa1h0nn1wwxyZvKC0/img.png?width=510&amp;amp;height=510&amp;amp;face=0_0_510_510');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Notion Contents&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Last Update : 2019.05.31&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;위에서 얘기한 기능들은 정말 일부분에 불과하다.&lt;/p&gt;
&lt;p&gt;많은 사람들이 노션과 만나서 윤택한 생활을 즐겼으면 하는 바람이다.&lt;/p&gt;</description>
      <category>ETC/Information</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/63</guid>
      <comments>https://fora.tistory.com/63#entry63comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:50:24 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] SEQUENCE 사용법 (+ORACLE 11g에서 사용시 설정하는법)</title>
      <link>https://fora.tistory.com/62</link>
      <description>&lt;h3&gt;SEQUENCE&lt;/h3&gt;
&lt;p&gt;: 자동번호 부여&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;숫자값이 일정한 규칙에 의해서 연속적으로 자동증가.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE SEQUENCE sequence\_name
                              [INCREMENT BY] 증가치
                              [START WITH] 초기값
                              [MAXVALUE n|NOMAXVALUE]
                              [MINVALUE|NOMINVALUE]
                              [CYCLE|NOCYCLE]
                              [CACHE|NOCACHE];&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;테이블에 종속적이지 않다(테이블과 독립적)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;maxvalue&lt;/b&gt; : 시퀀스가 가질 수 있는 최대값 지정.&lt;br /&gt;nomaxvalue일 경우 ascending순서일 경우 10의 27승&lt;br /&gt;descending일 경우 -1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;minvalue&lt;/b&gt; : 시퀀스가 가질 수 있는 최소값 지정.&lt;br /&gt;nominvalue일 경우 ascending 1&lt;br /&gt;descending 10의 26승으로 설정.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;cache&lt;/b&gt; : 메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본값은 20.&lt;br /&gt;nocache는 메모리 상에서 시퀀스를 관리하지 않음.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;시퀀스명.nextval ==&amp;gt; 발생된 번호값(그다음)  
시퀀스명.currval ==&amp;gt; 현재 번호값&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE SEQUENCE test\_seq; --기본 1부터 시작해서 1씩 증가되는 숫자값  
DROP SEQUENCE test\_seq;

CREATE SEQUENCE test\_seq START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE;

-- 자동번호(숫자) 얻어오기  
SELECT test\_seq.nextval FROM dual;

-- 현재숫자 보기(조회)  
SELECT test\_seq.currval FROM dual;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;테이블에 적용&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE dept3 AS SELECT * FROM dept WHERE 1=0;

INSERT INTO dept3 (dname,loc) VALUES ('기획부', '강남');

SELECT MAX(deptno) FROM dept3; --30번 부서
SELECT deptno FROM dept3; 

-- 시퀀스 객체 사용
CREATE SEQUENCE dept3_seq START WITH 10 
                                                    INCREMENT BY 10
                                                    NOCYCLE
                                                    NOCACHE;

-- 시퀀스 적용된 부서번호 생성
INSERT INTO dept3 VALUES (dept3_seq.nextval, '영업부', '서초');
INSERT INTO dept3 VALUES (dept3_seq.nextval, '기획부', '강남');
INSERT INTO dept3 VALUES (dept3_seq.nextval, '개발부', '오노');&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Oracle 11g에서 시퀀스 사용시 세팅할 사항&lt;/h3&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;deferred_segment_creation=true(기본값) ===&amp;gt; false로 변경

alter system set deferred_segment_creation=false;    
ORA-01031: insufficient privileges ==&amp;gt; 권한불충분

SQL&amp;gt; conn system/oracle      
Connected.

SQL&amp;gt; alter system set deferred_segment_creation=false;
System altered.

SQL&amp;gt; conn scott/tiger
Connected.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byQ3TS/btqv7pblsE6/15PdPiSiXURkjbKdCZcJuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byQ3TS/btqv7pblsE6/15PdPiSiXURkjbKdCZcJuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byQ3TS/btqv7pblsE6/15PdPiSiXURkjbKdCZcJuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyQ3TS%2Fbtqv7pblsE6%2F15PdPiSiXURkjbKdCZcJuK%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/62</guid>
      <comments>https://fora.tistory.com/62#entry62comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:48:37 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 제약조건 설명 및 사용법 (NOT NULL, UNIQUE, PK, FK, CHECK)</title>
      <link>https://fora.tistory.com/61</link>
      <description>&lt;h3&gt;: 무결성 제약조건&lt;/h3&gt;
&lt;p&gt;테이블에 부적절한 자료가 입력(INSERT, UPDATE) 되는 것을 방지하기 위해서 테이블 생성할 때&lt;br /&gt;각 컬럼에 대해서 정의하는 여러가지 규칙. (테이블 생성 후 컬럼에 규칙정의하는 것도 가능)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;NOT NULL&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;해당 컬럼값으로 NULL을 허용하지 않음&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;b&gt;UNIQUE&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;테이블내에서 해당 컬럼값은 항상 유일무이한 값을 가질 것&lt;/li&gt;
&lt;li&gt;중복을 허용하지 않음&lt;/li&gt;
&lt;li&gt;중복데이터는 방지, NULL의 중복은 방지하지 못함&lt;/li&gt;
&lt;li&gt;ADD NOT NULL은 불가능&lt;br /&gt;=&amp;gt;테이블 내의 모든 컬럼은 특별한 설정(NOT NULL또는 PRIMARY KEY)을 하지 않았을 경우 NULL값이 기본으로 설정되어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PRIMARY KEY (기본키, 주키)&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;해당 컬럼값은 반드시 존재해야 하고 유일해야 한다는 조건&lt;/li&gt;
&lt;li&gt;NOT NULL과 UNIQUE 조건을 동시에 만족함&lt;/li&gt;
&lt;li&gt;테이블 내에서 서로 다른 행을 구분하기 위해서 사용&lt;/li&gt;
&lt;li&gt;한 테이블 내에 단 한개의 primary key만 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FOREIGN KEY (외래키, 참조키)&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;해당 컬럼의 값이 타컬럼의 값을 참조해야만 함&lt;/li&gt;
&lt;li&gt;즉, 참조되는 컬럼에 존재하지 않는 값은 입력 불가&lt;/li&gt;
&lt;li&gt;참조하는 테이블에서 설정 (예: 사원테이블의 deptno에 참조키 설정)&lt;/li&gt;
&lt;li&gt;참조되는 쪽 테이블(부서테이블)&lt;/li&gt;
&lt;li&gt;NULL값 허용(단, NULL이 아닐경우 참조테이블에 있는 데이터가 입력되어야함)&lt;/li&gt;
&lt;li&gt;참조되는 컬럼은 반드시 UNIQUE 또는 PRIMARY KEY 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CHECK&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;해당 컬럼에 저장 가능한 데이터 값의 범위나 사용자 조건을 지정&lt;/li&gt;
&lt;li&gt;특정 범위 내의 데이터만 입력&lt;/li&gt;
&lt;li&gt;정해진 데이터만 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;DEPT(자식테이블) &amp;rArr; EMP(부모테이블)&lt;br /&gt;deptno는 DEPT 테이블의 PK이며 EMP 테이블 안에서 FK의 역할을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;INSERT INTO emp (empno, ename, deptno)  
VALUES(7787,'길동',30); -- 실행. 30번 존재.

INSERT INTO emp (empno, ename, deptno)  
VALUES(7787,'길동',50); -- 에러발생. 50번 미존재&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;제약조건 설정&lt;/h2&gt;
&lt;h3&gt;1. 컬럼레벨 정의방법&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;컬럼레벨: 제약조건의 명시를 테이블 생성시 컬럼정의와 함께함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    CREATE TABLE 테이블명(
        컬럼명 자료형 CONSTRAINT_TYPE
    );


    ------------ [ NOT NULL ] -----------
        empno number(4) NOT NULL

    INSERT INTO emp2 (ename,sal) VALUES ('라임', 2000); 
    --에러발생. COLUMN에 empno을 지정하지않으면 자동으로 NULL값 입력


    ------------ [ UNIQUE ] -------------
        empno number(4) UNIQUE

    INSERT INTO emp2 VALUES (7000,'길동');
    INSERT INTO emp2 VALUES (7002,'길동');
    INSERT INTO emp2 VALUES (7002,'길동');
    --에러발생. empno는 UNIQUE 제약조건이 있기에 7002 중복 불가


    ------------ [ PRIMARY KEY ] -------------
        empno number(4) PRIMARY KEY

    CREATE TABLE dept2(
        deptno NUMBER(2) primary key,
    --dname VARCHAR2(15) primary key, 에러발생. PK는 한개만 적용가능
        location VARCHAR2(15)
    );

    ALTER TABLE dept2 ADD CONSTRAINT dept_pk PRIMARY KEY (deptno, dname);
    --&amp;gt;TABLE ALTERED (deptno와 dname을 조합한 한개의 PK 설정)

    INSERT INTO dept2 VALUES (10,'영업부','서울');
    -- INSERT INTO dept2 VALUES (10,'기획부','서울'); 에러발생. deptno는 PK
    -- INSERT INTO dept2 VALUES (null,'재무부','서울'); 에러발생
    INSERT INTO dept2 VALUES (20,'영업부','서울');


    ------------ [ FOREIGN KEY ] -------------
    --&amp;gt; 컬럼레벨
    CREATE TABLE 테이블(
        컬럼명 자료형 [CONSTRAINT 제약명] REFERENCES 참조테이블명(참조컬럼명);
        deptno NUMBER(2) REFERENCES dept(deptno);
    );

    --&amp;gt; 테이블레벨
    CREATE TABLE 테이블명(
        컬럼명1 자료형,
        컬럼명2 자료형,
        컬럼명3 자료형,
        CONSTRAINT 제약명 FOREIGN KEY (컬럼명2) REFERENCES 참조테이블명 (참조컬럼명)
    --&amp;gt; FOREIGTN KEY (deptno) REFERENCES dept (deptno) 
    );

    --&amp;gt; 테이블 생성 끝난 후 추가
    ALTER TABLE 테이블명
    ADD [CONSTRAINT 제약명] FOREIGN KEY (컬럼명) REFERENCES 참조테이블명(참조컬럼명);


    ------------ [ CHECK ] -------------
    CHECK (조건식)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1_2. 제약 이름지정&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE 테이블명(
    컬럼명 자료형 [CONSTRAINT 제약명] 제약타입 
);

CREATE TABLE dept2(
    deptno NUMBER(2) CONSTRAINT dept2_pk primary key,
    dname VARCHAR2(15),
    location VARCHAR2(15)
);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 테이블 레벨 정의 방법&lt;/h3&gt;
&lt;p&gt;: 전체 컬럼선언이 끝나고 난 후&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;CREATE TABLE emp2(
    empno NUMBER(4),
    ename VARCHAR2(15),
    CONSTRAINT emp2_uk UNIQUE (empno)
); &lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 제약 추가&lt;/h3&gt;
&lt;p&gt;: 이미 테이블 객체가 만들어진 상태에서 제약 추가&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 ADD [CONSTRAINT 제약명] PRIMARY KEY (컬럼명);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 제약 삭제&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;--1
ALTER TABLE 테이블명 DROP CONSTRAINT 제약명;

--2
ALTER TABLE 테이블명 DROP PRIMARY KEY;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 제약 수정&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 MODIFY 컬럼명 [CONSTRAINT 제약명] NOT NULL | NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;* 문제풀이&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;    --문제1 emp3테이블을 새롭게 생성(empno, ename, sal, deptno) 
    --      dept3테이블을 dept테이블 참조하는 서브쿼리를 통해 생성(전체구조, 데이터)하시오.
    CREATE TABLE emp3 (
    empno NUMBER(4), 
    ename VARCHAR2(15), 
    sal NUMBER(7,2), 
    deptno NUMBER(4) PRIMARY KEY
    ); 
    CREATE TABLE dept3 AS SELECT * FROM dept;

    --문제2 emp3테이블의 deptno가 dept3테이블의 deptno를 참조하도록 (unique사용)
    ALTER TABLE dept3 ADD CONSTRAINT dept3_un Unique (deptno);
    ALTER TABLE emp3 ADD CONSTRAINT emp3_fk FOREIGN KEY (deptno) REFERENCES dept3(deptno);
    -- emp가 자식, dept가 부모가됨

    -- 문제3 dept3테이블의 unique제약을 삭제하고 deptno에 primary key 제약 설정
    ALTER TABLE emp3 DROP CONSTRAINT emp3_fk;
    ALTER TABLE dept3 DROP CONSTRAINT dept3_un;
    ALTER TABLE dept3 ADD CONSTRAINT dept3_pk PRIMARY KEY (deptno); 
    ALTER TABLE emp3 ADD CONSTRAINT emp3_fk FOREIGN KEY (deptno) REFERENCES dept3(deptno);

    -&amp;gt; CASCADE 사용
    ALTER TABLE dept3 DROP CONSTRAINT dept3_uk CASCADE;

    -- 문제4 제약조건 설정
    CREATE TABLE emp4 (
        empno NUMBER(4) PRIMARY KEY, 
        ename VARCHAR2(15) DEFAULT '이름', 
        sal NUMBER(7,2) CHECK (sal BETWEEN 500 AND 1000),
        mgr VARCHAR2(5) NOT NULL,
        deptno NUMBER(4) CONSTRAINT emp4_fk REFERENCES dept3(deptno),
        gender VARCHAR2(5) CHECK (gender IN('M','F')) -- (gender = 'M' OR gender='F')
    );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJq7VL/btqv7pWIsua/bxvkBw25tObq2PJSh4vV20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJq7VL/btqv7pWIsua/bxvkBw25tObq2PJSh4vV20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJq7VL/btqv7pWIsua/bxvkBw25tObq2PJSh4vV20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJq7VL%2Fbtqv7pWIsua%2FbxvkBw25tObq2PJSh4vV20%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/61</guid>
      <comments>https://fora.tistory.com/61#entry61comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:45:57 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] TOP-N 사용 예제</title>
      <link>https://fora.tistory.com/60</link>
      <description>&lt;ul&gt;
&lt;li&gt;ROWID: 주소로서 row가 실제로 저장되어있는 공간을 표시&lt;/li&gt;
&lt;li&gt;ROWNUM: 번호로서 row의 주소 순서대로 출력되어짐.&lt;/li&gt;
&lt;li&gt;출력되는&amp;nbsp;행에&amp;nbsp;대해&amp;nbsp;첫&amp;nbsp;행부터&amp;nbsp;순차적인&amp;nbsp;번호를&amp;nbsp;부여&amp;nbsp;(1,2,3,...)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    SELECT empno, ename, sal, rownum FROM emp; 
    SELECT empno, ename, rownum FROM emp WHERE rownum &amp;lt;= 3;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    -- 문제) 가장 많은 급여를 받는사람 
    SELECT empno, ename, sal  --실행 3
    FROM emp                  --실행 1
    WHERE ROWNUM &amp;lt;=3          --실행 2
    ORDER BY sal DESC;        --실행 4
    /* 
    ORDER BY로 내림차순 해주었으나 ORDER BY는 마지막에 실행되기에 
    오름차순된 결과에서 ROWNUM이 출력된다 
    */

    -- 쿼리문 사용으로 다시 실행
    SELECT empno, ename, sal  --실행 2
    FROM( SELECT empno, ename, sal FROM emp ORDER BY sal DESC) --실행 1
    WHERE rownum BETWEEN 1 AND 3; --실행 3

    -- 문제) 가장 오래된 사원 3명
    SELECT empno, ename, hiredate 
    FROM (SELECT empno, ename, hiredate FROM emp ORDER BY hiredate ASC)
    WHERE rownum BETWEEN 1 AND 3;

    -- 문제) 급여를 4번째로 많이받는 사원부터 6번째까지 
    SELECT empno, ename, sal 
    FROM (SELECT empno, ename, sal FROM emp ORDER BY sal desc) 
    WHERE rownum BETWEEN 4 AND 6; 
    --&amp;gt; 조회결과 없음. rownum은 항상 1부터 1씩 증가하는 값을 카운트해야함 

    --&amp;gt; 해결: rownum을 먼저 1부터 출력하게 하고 그 결과에서 중간번호(1아닌 값)을 조회
    SELECT empno, ename, sal
    FROM (SELECT empno, ename, sal, rownum rb 
        FROM (SELECT empno, ename, sal
            FROM emp ORDER BY sal desc) --1차: 정렬
    ) --2차: 출력된 행에 1부터 순차적인 번호를 부여
    WHERE rb BETWEEN 4 AND 6;
    -- 별명 부여시 
    WHERE salNum.rownum BETWEEN 4 AND 6;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRIAtZ/btqv7DUKmPs/X9C705kRQNZKP3Azqr6vv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRIAtZ/btqv7DUKmPs/X9C705kRQNZKP3Azqr6vv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRIAtZ/btqv7DUKmPs/X9C705kRQNZKP3Azqr6vv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRIAtZ%2Fbtqv7DUKmPs%2FX9C705kRQNZKP3Azqr6vv0%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/60</guid>
      <comments>https://fora.tistory.com/60#entry60comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:42:33 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] VIEW 형식 및 사용법</title>
      <link>https://fora.tistory.com/59</link>
      <description>&lt;p&gt;VIEW : 물리적인 테이블을 근거한 논리적인 &lt;b&gt;가상테이블&lt;/b&gt;&lt;br /&gt;(가상: 실질적으로 데이터를 저장하고 있지 않는다.)&lt;br /&gt;&amp;rArr; 독립적인 테이블은 아니다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;기본테이블에 대한 하나의 쿼리문(text를 저장하는 객체)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;자주 사용되는 복잡하고 긴 쿼리문을 저장하는 객체&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;특정컬럼만 보여지게끔 하여 보안을 목적으로 사용. 제한적인 데이터 조회&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;뷰는 기준테이블을 참조하는(바라보는) 논리적인 테이블이기에 기준테이블 수정시&lt;br /&gt;같이 변동된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;형식  
CREATE VIEW 뷰이름;

옵션  
CREATE \[OR REPLACE\] \[FORCE|NOFORCE\] VIEW 뷰이름 \[별명\] AS SELECT\_statement  
\[WITH CHECK OPTION \[CONSTRAINT 제약명\]\]  
\[WITH READ ONLY \[CONSTRAINT 제약명\]\];&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OR REPLACE : 존재하지 않는 뷰는 새로 생성하고 존재하는 뷰의 경우에는 text내용만 변경&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FORCE | NOFORCE : 강제 실행&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WITH READ ONLY : DML 불가능, 뷰만 사용가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WITH CHECK OPTION: 조건식에 위반되는 추가, 수정을 제한함&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;--FROM view를 통해 조회  
CREATE VIEW emp\_copy AS SELECT \* FROM emp;  
SELECT empno, ename, sal, deptno FROM emp\_copy WHERE deptno=30;

--추가는 emp(Table)에서, 조회는 emp\_copy(view)  
INSERT INTO emp(empno, ename, sal, deptno) VALUES (8000,'홍길',3000,30);

--뷰 삭제  
DROP VIEW emp\_copy;

--테이블 행 삭제  
CREATE VIEW emp30 AS SELECT empno, ename, sal FROm emp WHERE deptno=30;  
DELETE FROM emp WHERE empno=8000;

--OR REPLACE  
CREATE OR REPLACE VIEW emp30  
AS SELECT empno, ename, sal FROm emp WHERE deptno=30;

-- abc테이블(존재하지 않는 테이블)의 모든 컬럼을 조회하는 뷰 생성  
CREATE OR REPLACE VIEW abc\_view AS SELECT \* FROM abc;  
-- 에러발생. 존재하지않는 뷰

CREATE OR REPLACE FORCE VIEW abc\_view AS SELECT \* FROM abc;  
-- FORCE 강제실행되어 Warning에러는 발생하지만 뷰객체는 생성

-- 뷰객체에 포함되지않은 컬럼 실행시  
SELECT mgr FROM emp30;  
-- 에러발생&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DBMS에서는 user들이 만드는 객체에 대해 '시스템테이블'을 만들어 관리&lt;/p&gt;
&lt;p&gt;select view_name, text from user_views;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;뷰에 대한 DML&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 뷰를통한 삭제
DELETE FROM emp30 WHERE empno = 7900; 

-- 뷰를 통한 입력
INSERT INTO emp30 VALUES (8000,'나길',3000,30);
INSERT INTO emp30 VALUES (400,'나모',2000,20);

-- 뷰를 통한 수정
UPDATE emp30 SET sal = 9999;

-- 뷰를통한 뷰 생성
CREATE OR REPLACE VIEW emp30 
AS SELECT empno,ename,sal,deptno FROM emp_copy WHERE deptno=30;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WITH READ ONLY: 사용시 읽기전용. DML 불가&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE VIEW emp20 AS SELECT empno, ename, sal, deptno  
FROM emp\_copy WHERE deptno=20 WITH READ ONLY;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;뷰에 별명주기&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE OR REPLACE VIEW emp20 (사원번호, 사원명, 급여, 부서번호) 
AS SELECT empno, ename, sal, deptno FROM emp_copy WHERE deptno=20;

--SELECT empno, ename FROM emp20;  
--&amp;gt; 별명지정시 컬럼명을 별명으로만 사용해야함

SELECT 사원번호, 사원명 FROM emp20;

-- ADAMS 사원 -&amp;gt; 10번부서로
UPDATE emp20 SET 부서번호 = 10 WHERE 사원번호 = 7876;
-- 김유신 사원을 30번부서에 추가
INSERT INTO emp20 VALUES (8004,'김유신',2000,30);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;WITH CHECK OPTION: deptno=20(조건식)에 위반되는 추가, 수정을 제한함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE OR REPLACE VIEW emp20 (사원번호, 사원명, 급여, 부서번호)  
AS SELECT empno, ename, sal, deptno FROM emp\_copy WHERE deptno=20 WITH CHECK OPTION;

--에러발생. deptno=20에 위배됨  
UPDATE emp20 SET 부서번호=10 WHERE 사원번호=7902;  
INSERT INTO emp20 VALUES (8006,'손오공',2000,30);  
--실행  
INSERT INTO emp20 VALUES(8006,'손오공',2000,20);&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;INLINEVIEW&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;서브쿼리문에서 바깥쪽 SELECT문의 FROM절에 사용된 서브쿼리문&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;내부에 사용되는 서브쿼리는 별칭이 부여, 이렇게 부여된 별칭이 뷰처럼 사용&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;SELECT .... =&amp;gt; 메인쿼리  
(SELECT...) =&amp;gt; 서브쿼리  
FROM ....(SELECT... =&amp;gt; 서브쿼리, 인라인 뷰  
) Alias  
WHERE (SELECT...) =&amp;gt; 서브쿼리&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qN1fE/btqv7PUWGLI/jM3M3XRiyMHUYlKZlrv4Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qN1fE/btqv7PUWGLI/jM3M3XRiyMHUYlKZlrv4Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qN1fE/btqv7PUWGLI/jM3M3XRiyMHUYlKZlrv4Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqN1fE%2Fbtqv7PUWGLI%2FjM3M3XRiyMHUYlKZlrv4Pk%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/59</guid>
      <comments>https://fora.tistory.com/59#entry59comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:41:23 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] CASCADE 사용법 및 예제</title>
      <link>https://fora.tistory.com/58</link>
      <description>&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE emp5(
    deptno NUMBER(2) REFERENCES 참조테이블명(참조컬럼명) ON DELETE CASCADE

ALTER TABLE dept3 DROP CONSTRAINT dept3_uk CASCADE;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DELETE CASCADE 사용시 자동으로 관련된 모든 FK를 먼저 삭제해줌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;부모 (부서)테이블에서 특정 번호(예:10번 부서)를 삭제했을 때&lt;br /&gt;자식 (사원)테이블에서 10번 부서에 근무하는 사원들을 삭제&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE emp5(
  deptno NUMBER(2) REFERENCES 참조테이블명(참조컬럼명) ON DELETE SET NULL
);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;DELETE SET NULL 사용시 부모 (부서)테이블에서 특정 번호(예:10번 부서)를 삭제했을 때&lt;br /&gt;자식 (사원)테이블에서 10번 부서에 근무하는 사원들의 deptno를 null값으로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CASCADE 예제&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;
       drop table dept5;
       create table dept5
       as select * from dept;

       alter table dept5
       add constraint dept5_pk primary key (deptno);

       ------------------------------------------------
       drop table emp5;
       create table emp5
       (
          empno   number(4),
          ename   varchar2(15),
          sal     number(7,2),
          deptno  number(2)  constraint emp5_fk references dept5(deptno) on delete cascade
       );


       insert into emp5 (empno,ename,sal,deptno)
       select empno,ename,sal,deptno from emp;                

       ## 부모 테이블의 10번 부서 삭제 ##
       select count(*) from emp5;        ---&amp;gt; 14명 사원           
       delete from dept5 where deptno=10;   ---&amp;gt; 1행(10번부서) 삭제

       select count(*) from emp5;        ---&amp;gt; 11명 사원 (10번부서의 사원들도 함께 삭제 되었음)   

     테스트2)
       alter table emp5
       drop constraint emp5_fk;

       drop table dept5;
       create table dept5
       as select * from dept;

       alter table dept5
       add constraint dept5_pk primary key (deptno);

       ------------------------------------------------
       drop table emp5;
       create table emp5
       (
          empno   number(4),
          ename   varchar2(15),
          sal     number(7,2),
          deptno  number(2)  constraint  emp5_fk references dept5(deptno) on delete set null
       );  

       insert into emp5 (empno,ename,sal,deptno)
       select empno,ename,sal,deptno from emp;                

       ## 부모 테이블의 10번 부서 삭제 ##
       select count(*) from emp5;        ---&amp;gt; 14명 사원           
       delete from dept5 where deptno=10;   ---&amp;gt; 1행(10번부서) 삭제

       select count(*) from emp5;   ---&amp;gt; 14명 사원 (10번부서의 사원들의 deptno가 null로 변경됨)

    SQL&amp;gt; select empno, ename, sal, deptno
         from emp5
         where deptno is null;

         EMPNO ENAME                                 SAL     DEPTNO
    ---------- ------------------------------ ---------- ----------
          7782 CLARK                                2450
          7839 KING                                 5000
          7934 MILLER                               1300&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTuALA/btqv8m5OA4K/tBPVpLrxFYZ9WlK8TjnpZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTuALA/btqv8m5OA4K/tBPVpLrxFYZ9WlK8TjnpZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTuALA/btqv8m5OA4K/tBPVpLrxFYZ9WlK8TjnpZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTuALA%2Fbtqv8m5OA4K%2FtBPVpLrxFYZ9WlK8TjnpZ0%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/58</guid>
      <comments>https://fora.tistory.com/58#entry58comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:37:58 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 서브쿼리 , 다중행 서브쿼리 연산자</title>
      <link>https://fora.tistory.com/57</link>
      <description>&lt;h3&gt;SUB QUERY&lt;/h3&gt;
&lt;p&gt;: 특정 테이블에서 검색된 결과를 다른 테이블에 전달하여&lt;br /&gt;새로운 결과를 검색할 때 사용&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- JAMES 사원이 근무하는 부서이름 출력
SELECT deptno FROM emp WHERE ename='JAMES'; --&amp;gt; 30번 부서 근무
SELECT dname FROM dept WHERE deptno = 30; --&amp;gt; 부서명 SALES
서브쿼리 사용
SELECT dname FROM dept WHERE deptno = --&amp;gt; 메인쿼리
(SELECT deptno FROM emp WHERE ename='JAMES'); --&amp;gt;서브쿼리

SELECT dname FROM (SELECT dname,loc FROM dept); 
-- 테이블명에도 객체로 사용가능. 인라인뷰라고 불림&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;다중행 서브쿼리&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;서브쿼리의 결과행이 여러개(2개 행 이상)&lt;/li&gt;
&lt;li&gt;반드시 다중 행 연산자 (Multiple Row Operator)와 함께 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;다중 행 연산자&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;IN&lt;/b&gt; : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ANY,SOME&lt;/b&gt; : 메인쿼리의 비교조건이 서브쿼리의 결과와 하나이상 일치하면&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ALL&lt;/b&gt; : 메인쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치하면 참.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;EXISTS&lt;/b&gt; : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;-- IN
SELECT ename, sal, deptno FROM emp
WHERE deptno IN(SELECT deptno FROM emp WHERE sal &amp;gt;= 3000);

-- 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에 근무하는 
-- 사원들의 사원명, 급여, 부서번호를 출력하시오.
-- ALL 

SELECT ename, sal FROM emp 
WHERE sal &amp;gt; ALL(SELECT sal FROM emp WHERE deptno = 30);

=&amp;gt; ALL 대신 MAX함수 사용
SELECT ename, sal FROM emp 
WHERE sal &amp;gt; (SELECT MAX(sal) FROM emp WHERE deptno = 30);

-- 문제) SCOTT와 급여가 동일하거나 더 많이 받는 사원의 이름과 급여출력
SELECT ename, sal FROM emp 
WHERE sal &amp;gt;= (SELECT sal FROM emp WHERE ename='SCOTT') AND ename != 'SCOTT';

--2500 sal의 SCOTT 추가 이후
insert into emp (empno, ename, sal)values (8888, 'SCOTT', 2500);

--2500 이상의 사원정보 / ANY사용
SELECT ename, sal FROM emp WHERE sal &amp;gt;= ANY(SELECT sal FROM emp WHERE ename='SCOTT');

--3000 이상의 사원정보 / ALL사용
SELECT ename, sal FROM emp WHERE sal &amp;gt;= ALL(SELECT sal FROM emp WHERE ename='SCOTT');


SELECT * FROM dept WHERE exists(SELECT * FROM emp where 1=1);
/*
데이터 존재유무에 따라 SELECT, DELETE, UPDATE, INSERT시 
제어하는 역할로 사용
1=0 이면 거짓이기에 출력하지않음
*/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLN62H/btqv7ph8rPV/ht6h8dHCz2doMvfzNRhNy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLN62H/btqv7ph8rPV/ht6h8dHCz2doMvfzNRhNy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLN62H/btqv7ph8rPV/ht6h8dHCz2doMvfzNRhNy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLN62H%2Fbtqv7ph8rPV%2Fht6h8dHCz2doMvfzNRhNy1%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/57</guid>
      <comments>https://fora.tistory.com/57#entry57comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:35:45 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] ORACLE JOIN &amp;amp; ANCI JOIN</title>
      <link>https://fora.tistory.com/56</link>
      <description>&lt;h2&gt;ORACLE JOIN&lt;/h2&gt;
&lt;h3&gt;CROSS JOIN&lt;/h3&gt;
&lt;p&gt;특정한 조건(WHERE)을 주지 않는다면 조인시 각 테이블이 갖는 행의 수를&lt;br /&gt;곱한 형태의 결과가 출력&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT ename, dname FROM emp,dept;--&amp;gt; 결과행 56행&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;EQUI JOIN&lt;/h3&gt;
&lt;p&gt;조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치하는 행을&lt;br /&gt;WHERE로 연결하여 결과를 생성하는 조인&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT ename, sal, loc FROM emp, dept 
WHERE emp.deptno = dept.deptno and loc ='NEW YORK';

SELECT ename, TO_CHAR(hiredate,'yyyy/mm/dd') hiredate, dname FROM emp, dept
WHERE emp.deptno = dept.deptno and dname = 'ACCOUNTING';

SELECT ename, dname, job FROM emp, dept 
WHERE emp.deptno = dept.deptno and job='MANAGER';&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;NON-EQUI JOIN&lt;/h3&gt;
&lt;p&gt;특정 범위 내에 있는 값을 조회하기 위해 (대소)비교연산자 사용&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT empno, ename, sal, grade, dnameFROM emp, dept, salgrade
WHERE ename = 'ALLEN' AND emp.deptno = dept.deptno 
AND sal between losal AND hisal ORDER BY sal;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SELF JOIN&lt;/h3&gt;
&lt;p&gt;마치 같은 테이블이 두개인 것처럼 자기 자신테이블과 조인하는 것&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT e1.empno, e1.ename, e1.sal,e1.mgr, e2.ename FROM emp e1,emp e2 
WHERE e1.ename='SCOTT' and e1.mgr = e2.empno;

SELECT e1.ename, e2.ename FROM emp e1, emp e2
WHERE e1.ename = 'SCOTT' ande1.deptno = e2.deptno;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;OUTER JOIN&lt;/h3&gt;
&lt;p&gt;테이블 조인 중 한쪽테이블에 존재하지 않는 데이터로 인해서 출력되지 않는 행을 출력하고 싶을 때 사용'(+)' 기호 사용&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;(전체사원)각 사원의 이름과 그 사원의 직속 상사이름을 출력하시오
SELECT e1.ename 사원명, e2.ename 직속상사명 FROM emp e1, emp e2 
WHERE e1.mgr = e2.empno(+);&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ANSI JOIN (9i부터)&lt;/h2&gt;
&lt;p&gt;=&amp;gt; DBMS 종류와 상관없이 실행되는 표준 조인&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;ANSI Cross JOIN&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT empno, ename, dname FROM emp CROSS JOIN dept;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;ANSI Inner Join&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;테이블 사이에 inner join 사용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;동등 조건식 ON(조건절) 뒤에 사용 (생략불가)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WHERE절 추가하는 것 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ON절에 동등비교와 추가적인 조건식을 기술 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;USING(공통컬럼명) //ON절 대신 사용&lt;br /&gt;단, USING절 사용시 특정 테이블이 아닌 USING절에서 정의한 deptno 컬럼명만 사용&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT empno, ename, dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;

SELECT empno, ename, dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno  
WHERE ename = 'JAMES';

SELECT empno, ename, dname FROM emp INNER JOIN dept USING(deptno);  
SELECT empno, ename, emp.deptno, dname FROM emp INNER JOIN dept USING(deptno);  
--에러발생&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;b&gt;NATURAL JOIN&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;두 테이블이 갖는 컬럼중 공통된 이름의 컬럼을 동등조건해줌
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT empno, ename, dname FROM emp NATURAL JOIN dept;  
SELECT empno, ename, dname FROM emp NATURAL JOIN dept WHERE ename = 'ADAMS';&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;b&gt;ANSI OUTER JOIN&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;조건에 맞지 않아도 해당하는 행을 출력하고 싶을 때 사용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LEFT OUTER JOIN: 조인문의 왼쪽에 있는 테이블의 모든 결과를 가져 온 후&lt;br /&gt;오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;조건절은 ON 사용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LEFT RIGHT FULL 사용시 OUTER 생략가능&lt;/p&gt;
&lt;p&gt;FROM 테이블명1 (LEFT | RIGHT | FULL) [OUTER] JOIN 테이블명2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlAiDu/btqv7C9pudf/MVOsvqQ3JfJkuH031k1f4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlAiDu/btqv7C9pudf/MVOsvqQ3JfJkuH031k1f4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlAiDu/btqv7C9pudf/MVOsvqQ3JfJkuH031k1f4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlAiDu%2Fbtqv7C9pudf%2FMVOsvqQ3JfJkuH031k1f4K%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/56</guid>
      <comments>https://fora.tistory.com/56#entry56comment</comments>
      <pubDate>Sat, 15 Jun 2019 20:33:52 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] CASE 함수 사용예제 (Simple / Searched)</title>
      <link>https://fora.tistory.com/52</link>
      <description>&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;CASE WHEN 조건식1 THEN 결과데이터1
	WHEN 조건식2 THEN 결과데이터2
		WHEN 조건식3 THEN 결과데이터3
			ELSE 결과데이터
END

SELECT empno, ename, deptno, 
    CASE WHEN deptno=10 THEN 'ACCOUNTING'
             WHEN deptno=20 THEN 'RESEARCH'
             WHEN deptno=30 THEN 'SALES'
             ELSE 'OPERATIONS' 
    END 부서명,
    CASE WHEN mod(empno,2)=0 THEN '짝수'
             WHEN mod(empno,2)=1 THEN '홀수'
    END 사원번호 FROM emp;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Simple case expression&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT t.id, CASE t.color WHEN 1 THEN 'RED'
                                    WHEN 2 THEN 'BLUE'
                                  WHEN 3 THEN 'GREEN'
                                    ELSE 'NoColor' END AS Color
FROM test t;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Searched case expression&lt;/h3&gt;
&lt;pre class=&quot;vhdl&quot;&gt;&lt;code&gt;SELECT t.id, CASE WHEN t.color= 1 THEN 'RED'
                                    WHEN t.color= 2 THEN 'BLUE'
                                  WHEN t.color= 3 THEN 'GREEN'
                                    ELSE 'NoColor' END AS Color
FROM test t;

- 색상이 있는 것 또는 색상이 없는 것으로 보길 원한다면 

*Searched Case문 사용시
SELECT t.id, CASE WHEN t.color IS NULL THEN 'No Color' ELSE 'Colored' END IsColred
FROM test t;

*Simple Case문 사용시
--&amp;gt; 단순 케이스문에서는 컬럼값과 WHEN값을 비교연산하기에 NULL과는 연산이 불가능하여 무조건 ELSE값만 나오게된다.
SELECT t.id, CASE t.color WHEN NULL THEN 'No Color' ELSE 'Colored' END IsColred
FROM test t;

--&amp;gt; 따라서 Simple case문에서 사용할방법. NVL, ISNULL 사용
SELECT t.id, CASE NVL(t.color,-10) WHEN -10 THEN 'No Color' ELSE 'Colored' END IsColred
FROM test t;

SELECT t.id, CASE ISNULL(t.color,-10) WHEN -10 THEN 'No Color' ELSE 'Colored' END IsColred
FROM test t;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SYmGM/btqv5VotFhH/5l81KRmKMuaGPOL9wsJe8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SYmGM/btqv5VotFhH/5l81KRmKMuaGPOL9wsJe8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SYmGM/btqv5VotFhH/5l81KRmKMuaGPOL9wsJe8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSYmGM%2Fbtqv5VotFhH%2F5l81KRmKMuaGPOL9wsJe8K%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/52</guid>
      <comments>https://fora.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 29 May 2019 17:24:43 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE]  그룹함수, DECODE 함수</title>
      <link>https://fora.tistory.com/51</link>
      <description>&lt;p&gt;: 집계 함수&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전체데이터를 그룹별로 구분하여 통계적인 결과를 구하기 위해 사용&lt;/li&gt;
&lt;li&gt;결과값은 항상 단행&lt;/li&gt;
&lt;li&gt;그룹함수와 단순컬럼은 함께 사용하는 것이 불가능&lt;br /&gt;(만약 그룹함수와 함께 사용하고자 하는 컬럼이 그룹으로 묶여질 수 있다면&lt;br /&gt;group by절과 함께 사용하는 것이 가능)&lt;/li&gt;
&lt;li&gt;NULL은 결과값에서 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GROUP BY / HAVING&lt;/h3&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;group by(그룹을 묶을 수 있는) 컬럼명
group by deptno--&amp;gt; (10번부서의 사원들) , (20번 부서의 사원들), (30번 부서의 사원들)

having (그룹에 대한) 조건식--&amp;gt; group by와 반드시 함께 사용
having deptno = 10 --3개의 그룹중 10번부서의 사원들만
having avg(sal) &amp;gt;= 2000 -- 10번, 20번, 30번 부서 각각의 평균 급여를 비교&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;그룹함수 종류&lt;/h3&gt;
&lt;p&gt;SUM(총합), AVG(평균), COUNT(행갯수), MIN(최소값), MAX(최대값),&lt;br /&gt;STDDEV(표준편차), VARIANCE(분산)&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- COUNT. 모든 행의 갯수 구하기
SELECT COUNT(*) FROM emp;

-- MIN. 오래된 날짜 구하기
SELECT MIN(TO_CHAR(hiredate,'yyyy-mm-dd')) 오래된입사일 from emp;

-- AVG. 평균급여 출력
SELECT deptno, avg(sal) FROM emp GROUP BY deptno HAVING avg(sal)&amp;gt;=2000;

--  SELECT empno, ename, sal FROM emp WHERE AVG(sal)&amp;lt;sal;
--&amp;gt; 에러발생. group function. WHERE절에서는 그룹함수 사용 불가

SELECT deptno, AVG(sal) FROM emp WHERE sal&amp;gt;=1000 
GROUP BY deptno HAVING AVG(sal)&amp;gt;=2000;
-- 서브쿼리사용
SELECT empno, ename, sal FROM emp WHERE sal&amp;gt;= (SELECT avg(sal) FROM emp);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;그룹함수와 일반컬럼 사용&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;select count(*) from emp;   (O)
select deptno, count(*) from emp;  (X)
select deptno, count(*) from emp group by deptno;  (O)
select decode(1,2,3), count(*) from emp;  (X)
select decode(1,2,3), count(*) from emp group by decode(1,2,3);  (O)&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;DECODE 함수&lt;/h1&gt;
&lt;pre id=&quot;code_1560489587649&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECODE (컬럼명,
비교데이터1, 결과데이터1,
비교데이터2, 결과데이터2,
비교데이터3, 결과데이터3 ...)
							
SELECT empno, ename, deptno, decode(deptno,
10,'ACCOUNTING',
20,'RESEARCH',
30,'SALES',
40,'OPERATIONS') 부서명 FROM emp ;

-- deptno 홀짝 구분
SELECT empno, ename, deptno, decode(mod(empno,2),
0,'짝수',
1,'홀수') 사원번호 FROM emp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnSA2x/btqv5fOkgph/1wHIKY40JP4LrjBvQRh8z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnSA2x/btqv5fOkgph/1wHIKY40JP4LrjBvQRh8z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnSA2x/btqv5fOkgph/1wHIKY40JP4LrjBvQRh8z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnSA2x%2Fbtqv5fOkgph%2F1wHIKY40JP4LrjBvQRh8z1%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/51</guid>
      <comments>https://fora.tistory.com/51#entry51comment</comments>
      <pubDate>Wed, 29 May 2019 12:09:20 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 검색, 스택과 큐 실습 (자바)</title>
      <link>https://fora.tistory.com/50</link>
      <description>&lt;h2&gt;03. 검색&lt;/h2&gt;
&lt;h3&gt;03-1. 검색 알고리즘&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;선형 검색: 무작위로 늘어놓은 데이터 모임에서 검색을 수행&lt;/li&gt;
&lt;li&gt;이진 검색: 일정한 규칙으로 늘어놓은 데이터 모임에서 아주 빠른 검색을 수행&lt;/li&gt;
&lt;li&gt;해시법 : 추가, 삭제가 자주 일어나는 데이터 모임에서 아주 빠른 검색을 수행 (체인법/오픈 주소법)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;=&amp;gt; 용도나 목적, 실행속도, 자료구조 등을 고려하여 알고리즘을 선택하여야 함&lt;/p&gt;
&lt;h3&gt;03-2. 선형 검색&lt;/h3&gt;
&lt;p&gt;실습 3-1&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/c8yOUV/btqvC5xLcUe/YD9G9x5vF9u26Hn9t8wnt0/img.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;실습 3-3 / 보초법 사용&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/c2kWxY/btqvC7h29QJ/aMznbZ6lg5YSXTadjmQ8J1/img.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;03-3. 이진 검색&lt;/p&gt;
&lt;p&gt;=&amp;gt; 요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색하는 알고리즘&lt;/p&gt;
&lt;p&gt;실습 3-4&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/cEAyto/btqvEFZduPB/7edG22qwaQy2g9eqWS42bK/img.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;04. 스택과 큐&lt;/h2&gt;
&lt;h3&gt;&lt;b&gt;스택&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;: 데이터를 일시적으로 저장하기 위해 사용하는데이터 입력 순서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;LIFO&lt;/b&gt;(Last In First Out)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;push: 데이터를 넣는 작업&lt;/li&gt;
&lt;li&gt;pop: 데이터를 꺼내는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;508&quot; height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDPFY/btqv7YDUydE/J36I7IF2VQYWM31dEOkZHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDPFY/btqv7YDUydE/J36I7IF2VQYWM31dEOkZHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDPFY/btqv7YDUydE/J36I7IF2VQYWM31dEOkZHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDPFY%2Fbtqv7YDUydE%2FJ36I7IF2VQYWM31dEOkZHk%2Fimg.png&quot; width=&quot;508&quot; height=&quot;234&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://muckycode.blogspot.com/2015/01/stack.html&quot;&gt;https://muckycode.blogspot.com/2015/01/stack.html&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;스택 만들기&lt;/h3&gt;
&lt;p&gt;예외클래스를 생성하고 생성자에는 스택 본체용 배열을 생성하는 등 준비작업을 수행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;603&quot; height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odrt2/btqv5Wnhvk1/dJ4F29mckubqLYTTavFNy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odrt2/btqv5Wnhvk1/dJ4F29mckubqLYTTavFNy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odrt2/btqv5Wnhvk1/dJ4F29mckubqLYTTavFNy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fodrt2%2Fbtqv5Wnhvk1%2FdJ4F29mckubqLYTTavFNy1%2Fimg.png&quot; width=&quot;603&quot; height=&quot;476&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;530&quot; height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyTR9/btqv7QlOCl6/5MXOJu2nQ4kkriUPfeXWL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyTR9/btqv7QlOCl6/5MXOJu2nQ4kkriUPfeXWL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyTR9/btqv7QlOCl6/5MXOJu2nQ4kkriUPfeXWL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpyTR9%2Fbtqv7QlOCl6%2F5MXOJu2nQ4kkriUPfeXWL1%2Fimg.png&quot; width=&quot;530&quot; height=&quot;340&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;스택 팝, 피크 메소드 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;705&quot; height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccgzeE/btqv8nwG1eQ/z04NKEKbPOCudWYgAGb1eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccgzeE/btqv8nwG1eQ/z04NKEKbPOCudWYgAGb1eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccgzeE/btqv8nwG1eQ/z04NKEKbPOCudWYgAGb1eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccgzeE%2Fbtqv8nwG1eQ%2Fz04NKEKbPOCudWYgAGb1eK%2Fimg.png&quot; width=&quot;705&quot; height=&quot;241&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;667&quot; height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ccgT/btqv8nKd8g6/YfCTXd79a5cKWy98Cca2s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ccgT/btqv8nKd8g6/YfCTXd79a5cKWy98Cca2s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ccgT/btqv8nKd8g6/YfCTXd79a5cKWy98Cca2s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ccgT%2Fbtqv8nKd8g6%2FYfCTXd79a5cKWy98Cca2s1%2Fimg.png&quot; width=&quot;667&quot; height=&quot;703&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;h2&gt;05. 큐&lt;/h2&gt;
&lt;p&gt;: 데이터를 일시적으로 쌓아 두기 위한 자료구조. 예)마트에서 계산을 기다리는 대기열&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FIFO(First In First Out). 스택과는 달리 선입선출을 한다.&lt;/li&gt;
&lt;li&gt;인큐(enqueue) :데이터를 넣는 작업&lt;/li&gt;
&lt;li&gt;디큐(dequeue): 데이터를 꺼내는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;533&quot; height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MHGQO/btqv6DVeG5O/C9GbPefb5f1iSL9brjbRj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MHGQO/btqv6DVeG5O/C9GbPefb5f1iSL9brjbRj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MHGQO/btqv6DVeG5O/C9GbPefb5f1iSL9brjbRj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHGQO%2Fbtqv6DVeG5O%2FC9GbPefb5f1iSL9brjbRj0%2Fimg.png&quot; width=&quot;533&quot; height=&quot;177&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;h3&gt;링버퍼&lt;/h3&gt;
&lt;p&gt;: 배열요소를 앞쪽으로 옮기지 않는 큐. 배열의 처음이 끝과 연결되었다고 보는 자료구조이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프런트: 첫번째 요소&lt;/li&gt;
&lt;li&gt;리어: 마지막 요소&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;386&quot; height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdcHY/btqv7ZQmcyo/7QkrxDowg2vkY5M02aoyo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdcHY/btqv7ZQmcyo/7QkrxDowg2vkY5M02aoyo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdcHY/btqv7ZQmcyo/7QkrxDowg2vkY5M02aoyo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdcHY%2Fbtqv7ZQmcyo%2F7QkrxDowg2vkY5M02aoyo0%2Fimg.png&quot; width=&quot;386&quot; height=&quot;234&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;h3&gt;링버퍼 활용&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;692&quot; height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHmnB8/btqv7YRrLkM/lHsLOxKHA3qp9gHj2J3Gr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHmnB8/btqv7YRrLkM/lHsLOxKHA3qp9gHj2J3Gr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHmnB8/btqv7YRrLkM/lHsLOxKHA3qp9gHj2J3Gr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHmnB8%2Fbtqv7YRrLkM%2FlHsLOxKHA3qp9gHj2J3Gr1%2Fimg.png&quot; width=&quot;692&quot; height=&quot;508&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web develop/Algorithm</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/50</guid>
      <comments>https://fora.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 29 May 2019 00:30:14 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 날짜 함수 , 형변환 함수</title>
      <link>https://fora.tistory.com/49</link>
      <description>&lt;h1&gt;날짜함수&lt;/h1&gt;
&lt;h3&gt;SYSDATE&lt;/h3&gt;
&lt;p&gt;: 현재 날짜 구하기&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT sysdate 현재날짜 from dual;
SELECT sysdate+1 내일날짜, sysdate-1 어제날짜, sysdate+7 일주일후 FROM dual;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MONTHS_BETWEEN&lt;/h3&gt;
&lt;p&gt;: 날짜와 날짜 사이의 개월을 계산해 주는 함수&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;MONTHS_BETWEEN(최근DATE, 오래전DATE)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ADD_MONTHS&lt;/h3&gt;
&lt;p&gt;: 특정날짜에 개월을 더한 날짜 계산&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;ADD_MONTHS(특정날짜,개월수)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;LAST_DAY&lt;/h2&gt;
&lt;p&gt;: 월의 마지막 날짜를 계산&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT last_day(sysdate) &quot;이번 달 마지막날짜&quot; from dual;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;NEXT_DAY&lt;/h3&gt;
&lt;p&gt;: 특정날짜 후의 첫 요일의 날짜를 계산&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT NEXT_DAY(sysdate,'월') from dual;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;형변환 함수&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb9DYz/btqv6C1UIwo/YETbEA7ufEmntTddHJCf01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb9DYz/btqv6C1UIwo/YETbEA7ufEmntTddHJCf01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb9DYz/btqv6C1UIwo/YETbEA7ufEmntTddHJCf01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb9DYz%2Fbtqv6C1UIwo%2FYETbEA7ufEmntTddHJCf01%2Fimg.png&quot; data-filename=&quot;1.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1560485151203&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TO_DATE =&amp;gt; 입력포맷
TO_CHAR =&amp;gt;출력포맷

TO_CHAR(number|date)
TO_CHAR(number|date, 'format')&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DATE FORMAT&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coMAFv/btqv2IW2YN3/9CAUkrBeNRZPy9b0Emd9ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coMAFv/btqv2IW2YN3/9CAUkrBeNRZPy9b0Emd9ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coMAFv/btqv2IW2YN3/9CAUkrBeNRZPy9b0Emd9ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoMAFv%2Fbtqv2IW2YN3%2F9CAUkrBeNRZPy9b0Emd9ZK%2Fimg.png&quot; data-filename=&quot;2.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT TO_CHAR(sysdate,'yyyy-mm-dd') FROM dual;
SELECT TO_CHAR(sysdate,'yyyy&quot;년&quot;mm&quot;월&quot;dd&quot;일&quot;') FROM dual; 
// 약속되지 않은 포맷 큰따옴표로 지정
SELECT TO_CHAR(sysdate,'yyyy&quot;년 &quot;mm&quot;월 &quot;dd&quot;일 &quot;hh24&quot;시 &quot;mi&quot;분 &quot;ss&quot;초 &quot;dy&quot;요일&quot;') 
오늘날짜 FROM dual;
SELECT sysdate - TO_DATE('2019/04/08') FROM dual //날짜 계산&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbJfgx/btqv6DgNyr4/tLdk1mYTc576iQCJTr25GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbJfgx/btqv6DgNyr4/tLdk1mYTc576iQCJTr25GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbJfgx/btqv6DgNyr4/tLdk1mYTc576iQCJTr25GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbJfgx%2Fbtqv6DgNyr4%2FtLdk1mYTc576iQCJTr25GK%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/49</guid>
      <comments>https://fora.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 28 May 2019 19:31:24 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] 숫자 함수, 문자 함수</title>
      <link>https://fora.tistory.com/48</link>
      <description>&lt;h2&gt;숫자함수&lt;/h2&gt;
&lt;h3&gt;ROUND 함수&lt;/h3&gt;
&lt;p&gt;: 반올림 (4이하는 버리고 5이상은 올림)&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;round(기준데이터);  
round(기준데이터,소수점이하 자릿수 표현);

SELECT round(45.5) FROM dual; // 46  
SELECT round(45.573,2) FROM dual; // 45.57&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;TRUNC 함수&lt;/h3&gt;
&lt;p&gt;: 버림함수&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;trunc(기준데이터);  
trunc(기준데이터,소수점이하 자릿수 표현);

SELECT trunc(45.56) FROM dual; //45  
SELECT trunc(45.577,2) FROM dual; //45.57&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;FLOOR 함수&lt;/h3&gt;
&lt;p&gt;: 소수점 이하 버림함수 (실수 -&amp;gt; 정수)&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;floor(기준데이터);

SELECT floor(45.56) FROM dual; // 45  
SELECT floor(45.577,2) FROM dual; //에러&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MOD 함수&lt;/h3&gt;
&lt;p&gt;: 나머지 구하기&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;mod(A,B) : A를 B로 나눈 나머지

SELECT mod(10,5) from dual; //0  
SELECT mod(10,3) from dual; //1  
SELECT mod(10,11) from dual;//10

mod(empno,2)=0; //짝수  
mod(empno,2)=1; //홀수&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;문자함수&lt;/h2&gt;
&lt;h3&gt;UPPER&lt;/h3&gt;
&lt;p&gt;: 대문자&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT upper('Welcome to oracle') FROM dual;
--&amp;gt; WELCOME TO ORACLE&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;LOWER&lt;/h3&gt;
&lt;p&gt;: 소문자&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT lower('Welcome to oracle') FROM dual;
--&amp;gt; welcome to oracle&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;INITCAP&lt;/h3&gt;
&lt;p&gt;: 이니셜에 대한 대문자 변환&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT initcap('Welcome to ORACLE') FROM dual;
--&amp;gt; Welcome To Oracle
SELECT empno, initcap(ename) FROM emp WHERE deptno = 30&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;LENGTH&lt;/h3&gt;
&lt;p&gt;: 문자열 길이(문자갯수)&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT length('OracleSQL') FROM dual;
--&amp;gt; 9
SELECT lengthb('Oracle') FROM dual; --byte 저장공간
--&amp;gt; 6
SELECT lengthb('나길동') FROM dual;
--&amp;gt; 9&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;INSTR&lt;/h3&gt;
&lt;p&gt;: 특정문자가 출현하는 위치를 얻어오는 함수 (자바의 indexOf('a'))&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;instr(기준데이터, 특정문자)instr(기준데이터, 특정문자, 시작인덱스, 출현횟수)

SELECT instr('welcome to oracle', 'o') FROM dual; -- 첫번째 'o'=&amp;gt; 5
select instr('welcome to oracle', 'o', 1, 2) --두번째 'o'=&amp;gt; 10&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SUBSTR&lt;/h3&gt;
&lt;p&gt;: 문자열 일부분 추출, 부분 문자열 얻기&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;substr(기준문자열, 시작인덱스, 부분문자열 갯수)

SELECT substr('welcome to oracle', 12, 6) FROM dual; 
-- 12번째 문자부터 6개의 문자 얻어오기&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;LPAD/RPAD&lt;/h3&gt;
&lt;p&gt;: 오른쪽/왼쪽 정렬 후 왼쪽/오른쪽 공백에 특정 문자 채우기&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;lpad(기준문자열, 전체길이, 채울문자)rpad(기준문자열, 전체길이, 채울문자)

SELECT lpad('oracle', 10, '#' ) FROM dual;
--&amp;gt; ####oracle
SELECT rpad('oracle', 10, '#' ) FROM dual;
--&amp;gt; oracle####&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;LTRIM/RTRIM&lt;/h3&gt;
&lt;p&gt;: 왼쪽/오른쪽(연속된) 공백 또는 (연속된) 특정문자 제거&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT length(ltrim(' oracle')) FROM dual; 
-- oracle 6
SELECT length(ltrim('aaaaoracle','a')) FROM dual; 
-- oracle 6 //'a' 특정문자 제거&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;TRIM&lt;/h3&gt;
&lt;p&gt;: 좌우의 연속된 공백을 제거해 주는 함수&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT length(trim(' oracle ')) FROM dual; 
-- oracle 6&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oN4km/btqv7pPX445/6fBrDHRZNezNcP6ULiAvr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oN4km/btqv7pPX445/6fBrDHRZNezNcP6ULiAvr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oN4km/btqv7pPX445/6fBrDHRZNezNcP6ULiAvr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoN4km%2Fbtqv7pPX445%2F6fBrDHRZNezNcP6ULiAvr1%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/48</guid>
      <comments>https://fora.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 28 May 2019 17:23:59 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 기본 알고리즘, 기본 자료구조 실습 (자바)</title>
      <link>https://fora.tistory.com/47</link>
      <description>&lt;h3&gt;&lt;b&gt;&lt;span&gt;01. 기본 알고리즘&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;b&gt;&lt;span&gt;01-1. 알고리즘이란?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;알고리즘&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 문제를 해결하기 위한 것으로 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;순차적 구조로 문제를 해결하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;실습 1-1/ 세 값의 최댓값 구하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPoesP/btqvAfH4tS7/Tjos9j3x3uSnoNY4McHq20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPoesP/btqvAfH4tS7/Tjos9j3x3uSnoNY4McHq20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPoesP/btqvAfH4tS7/Tjos9j3x3uSnoNY4McHq20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPoesP%2FbtqvAfH4tS7%2FTjos9j3x3uSnoNY4McHq20%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 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;실습 1-3/ 조건 판단과 분기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Osv5P/btqvDjIovir/xkW8kLxQ0OQnMr4VJ2S3m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Osv5P/btqvDjIovir/xkW8kLxQ0OQnMr4VJ2S3m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Osv5P/btqvDjIovir/xkW8kLxQ0OQnMr4VJ2S3m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOsv5P%2FbtqvDjIovir%2FxkW8kLxQ0OQnMr4VJ2S3m0%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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;787&quot; height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzvfw/btqvCJ8DCdK/CplSR5dpxAKSWr1jOtuWgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzvfw/btqvCJ8DCdK/CplSR5dpxAKSWr1jOtuWgK/img.png&quot; data-alt=&quot;출처:&amp;amp;amp;nbsp; https://algorithmkorea.weebly.com/50508442564753251608-496924943646020.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzvfw/btqvCJ8DCdK/CplSR5dpxAKSWr1jOtuWgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmzvfw%2FbtqvCJ8DCdK%2FCplSR5dpxAKSWr1jOtuWgK%2Fimg.png&quot; width=&quot;787&quot; height=&quot;674&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;출처:&amp;nbsp; https://algorithmkorea.weebly.com/50508442564753251608-496924943646020.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;01-2. 반복&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;실습 1-6/ 양수만 입력하여 1부터 n까지의 합 구하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfJ9La/btqvBNwT4Ui/7LVSuYylkkqJPreNSTKXZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfJ9La/btqvBNwT4Ui/7LVSuYylkkqJPreNSTKXZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfJ9La/btqvBNwT4Ui/7LVSuYylkkqJPreNSTKXZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfJ9La%2FbtqvBNwT4Ui%2F7LVSuYylkkqJPreNSTKXZ1%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 1C-2/ 드모르간 법칙&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Yrlf/btqvAASQSsj/70TpvIEY8AuaZQ78TLjxO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Yrlf/btqvAASQSsj/70TpvIEY8AuaZQ78TLjxO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Yrlf/btqvAASQSsj/70TpvIEY8AuaZQ78TLjxO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Yrlf%2FbtqvAASQSsj%2F70TpvIEY8AuaZQ78TLjxO0%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 1-8 / 직각 이등변 삼각형 별 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBMQaz/btqvAf2vpa0/oTddA81fuJxl1oqm38Q0t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBMQaz/btqvAf2vpa0/oTddA81fuJxl1oqm38Q0t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBMQaz/btqvAf2vpa0/oTddA81fuJxl1oqm38Q0t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBMQaz%2FbtqvAf2vpa0%2FoTddA81fuJxl1oqm38Q0t0%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;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;02. 기본 자료구조&lt;/b&gt;&lt;/h3&gt;
&lt;h4&gt;&lt;b&gt;02-1. 배열&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;자료구조&lt;/b&gt;: 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계. 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 2-4 / 배열 요소의 최댓값 구하기 +평균값&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xtVbz/btqvBppucc5/y1AW0VKKKpzmL6SPk4ZUB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xtVbz/btqvBppucc5/y1AW0VKKKpzmL6SPk4ZUB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xtVbz/btqvBppucc5/y1AW0VKKKpzmL6SPk4ZUB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxtVbz%2FbtqvBppucc5%2Fy1AW0VKKKpzmL6SPk4ZUB0%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 2-6 / 두 값의 교환, 역순으로 정렬&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkcVF/btqvAf9eMRe/aI0pE06kADOFj4MpAFTc01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkcVF/btqvAf9eMRe/aI0pE06kADOFj4MpAFTc01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkcVF/btqvAf9eMRe/aI0pE06kADOFj4MpAFTc01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvkcVF%2FbtqvAf9eMRe%2FaI0pE06kADOFj4MpAFTc01%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 2-7/ 두 배열의 비교&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AswgU/btqvBoYu0Vu/e0NUQ3aSQORV63SjWjYRJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AswgU/btqvBoYu0Vu/e0NUQ3aSQORV63SjWjYRJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AswgU/btqvBoYu0Vu/e0NUQ3aSQORV63SjWjYRJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAswgU%2FbtqvBoYu0Vu%2Fe0NUQ3aSQORV63SjWjYRJ1%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 2-9 / 소수구하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cASFpy/btqvAQunujh/k8LHDfPARWBTaaxZwxTGP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cASFpy/btqvAQunujh/k8LHDfPARWBTaaxZwxTGP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cASFpy/btqvAQunujh/k8LHDfPARWBTaaxZwxTGP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcASFpy%2FbtqvAQunujh%2Fk8LHDfPARWBTaaxZwxTGP0%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실습 2-13 / 한 해의 경과일 수 구하기&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfFl7/btqvCfNv37N/nwEHFkthhdGLPCG5jDYeS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfFl7/btqvCfNv37N/nwEHFkthhdGLPCG5jDYeS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfFl7/btqvCfNv37N/nwEHFkthhdGLPCG5jDYeS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvfFl7%2FbtqvCfNv37N%2FnwEHFkthhdGLPCG5jDYeS1%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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web develop/Algorithm</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/47</guid>
      <comments>https://fora.tistory.com/47#entry47comment</comments>
      <pubDate>Tue, 28 May 2019 00:28:42 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] SELECT절 (실행순서, 연산자, WHERE, ORDER BY)</title>
      <link>https://fora.tistory.com/46</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;[실행순서]&lt;/h3&gt;
&lt;p&gt;2 FROM&lt;/p&gt;
&lt;p&gt;3 WHERE&lt;/p&gt;
&lt;p&gt;4 GROUP BY&lt;/p&gt;
&lt;p&gt;5 HAVING&lt;/p&gt;
&lt;p&gt;1 SELECT&lt;/p&gt;
&lt;p&gt;6 ORDER BY&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT 컬럼명 --&amp;gt; 전체 열 중 원하는 열만 선택: 열 제어
FROM 테이블명
WHERE 조건식; --&amp;gt; 전체 행 중 원하는 행만 선택: 행 제어&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;조건식에 사용되는 연산자의 종류&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/ldzbz/btqvwMrgk7F/FHXa19YYJcMYY0XXNPJEK1/img.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;문자 비교&lt;/h3&gt;
&lt;pre class=&quot;vbnet&quot;&gt;&lt;code&gt;컬럼명 LIKE 'pattern'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pattern 예약문자=&amp;gt; % (0~n개) , _(단 1개)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IN 연산자&lt;/h3&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;컬럼명 IN (value_list)
SELECT empno, ename, comm FROM emp WHERE comm IN (300,500,400);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;BETWEEN AND 연산자&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;컬럼명 BETWEEN a AND b; --&amp;gt; a이상 b이하&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;IS NULL , IS NOT NULL&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;컬럼명 IS NULL -- 컬럼명 = NULL 할 시 선택되는 행 X
컬럼명 IS NOT NULL&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;연산자의 우선순위&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/1O2t8/btqvwm7HCE2/Ldw0k95EW8rxmFC7KRbO3K/img.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;WHERE 300&amp;gt;500 AND 1&amp;lt;3 OR 1&amp;lt;2;   --&amp;gt; 출력 O
WHERE 300&amp;gt;500 AND (1&amp;lt;3 OR 1&amp;lt;2); --&amp;gt; 출력 X
WHERE (300&amp;gt;500 AND 1&amp;lt;3) OR 1&amp;lt;2; --&amp;gt; 출력 O&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;NVL&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;NVL(null값이 예상되는 컬럼명, null값을 대체할 데이터) 
-- 두 값의 자료형은 같아야함

SELECT empno, ename, NVL(comm,0) FROM emp; --null값 0으로 대체&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;ORDER BY절&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;정렬하여 출력 (=sort)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ASC : 오름차순 (Ascending/기본값)DESC: 내림차순 (Decending)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1560484130581&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 컬럼명 FROM 테이블명 WHERE 조건식 ORDER BY 컬럼명 [DESC/ASC];

SELECT empno, ename, sal FROM emp ORDER BY sal DESC , ename ASC;
-- 1차정렬 컬럼명, 2차정렬 컬럼명&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxAT9V/btqv7geEqAg/FOkfrJu5t8YfsdbHS6Xfsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxAT9V/btqv7geEqAg/FOkfrJu5t8YfsdbHS6Xfsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxAT9V/btqv7geEqAg/FOkfrJu5t8YfsdbHS6Xfsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxAT9V%2Fbtqv7geEqAg%2FFOkfrJu5t8YfsdbHS6Xfsk%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/46</guid>
      <comments>https://fora.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 27 May 2019 17:36:20 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] 알고리즘 입문에 도움이 된, 도움이 될 사이트</title>
      <link>https://fora.tistory.com/44</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;박트리님 - 알고리즘 공부, 어떻게 해야하나요?&lt;/p&gt;
&lt;figure id=&quot;og_1558798234219&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://baactree.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://baactree.tistory.com/52&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Bj7AB/hyBi2HLwxL/lHORSGWQbMwetK5LSKo7Hk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;알고리즘 공부, 어떻게 해야하나요?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;오랜만에 정상적인 포스팅을 쓴다. 메일로 가장 많이 물어 보는 질문들이 [알고리즘 공부 어떻게 해야하나요? 어떻게 하셨어요? 뭘 공부해야 할 지 모르겠어요.] 와 같은 질문들이다. 위 질문에 가장 심플한 답변..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;baactree.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;Yena Choi님 - 알고리즘 공부 시작 방법과 순서&lt;/p&gt;
&lt;figure id=&quot;og_1558798257909&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://blog.yena.io/studynote/2018/11/14/Algorithm-Basic.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://blog.yena.io/studynote/2018/11/14/Algorithm-Basic.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ieR8u/hyBi04fWu5/aCpEQjFtYm4VkxzbfmaD00/img.png?width=1613&amp;amp;height=925&amp;amp;face=0_0_1613_925,https://scrap.kakaocdn.net/dn/bqMHN1/hyBiUiC6LN/AxgTLkFLpoLFZbR4SSlz9K/img.png?width=1297&amp;amp;height=932&amp;amp;face=0_0_1297_932,https://scrap.kakaocdn.net/dn/nQISS/hyBiZdcH95/j4Cx2nafZSTxigd55RBYZ0/img.png?width=864&amp;amp;height=786&amp;amp;face=0_0_864_786');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Algorithm] 알고리즘 공부 시작 방법 및 순서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;초보자 입장에서 알고리즘 공부를 시작하고 싶어서 뭐부터 해야 좋을지 조사하다가, 자료가 좀 모여서 포스트를 작성하게 됐다. 완전 심도 있게 학습한다기보단 공부할 것 체크리스트 정도가 되겠다. 알고리즘? 주위의 개발자들을 둘러보면, 막 입사한 주니어 개발자부터 연차가 살짝 쌓인 개발자까지 이 말버릇을 가지고 있다. &amp;ldquo;아 알고리즘 공부 해야되는데.&amp;rdquo; 그들은 당장 회사의 실무를 처리해야 하는 입장이니, 알고리즘처럼 코드의 효율성을 높이는 공부는 자연스레 순위가&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;blog.yena.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;리브레 위키 - 알고리즘 기초&lt;/p&gt;
&lt;figure id=&quot;og_1558798353200&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://librewiki.net/wiki/%EC%8B%9C%EB%A6%AC%EC%A6%88:%EC%88%98%ED%95%99%EC%9D%B8%EB%93%AF_%EA%B3%BC%ED%95%99%EC%95%84%EB%8B%8C_%EA%B3%B5%ED%95%99%EA%B0%99%EC%9D%80_%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://librewiki.net/wiki/%EC%8B%9C%EB%A6%AC%EC%A6%88:%EC%88%98%ED%95%99%EC%9D%B8%EB%93%AF_%EA%B3%BC%ED%95%99%EC%95%84%EB%8B%8C_%EA%B3%B5%ED%95%99%EA%B0%99%EC%9D%80_%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_%EA%B8%B0%EC%B4%88&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GGc6g/hyBiVIEqgL/uVNPMBHZhxGK9nKchmVm7K/img.png?width=500&amp;amp;height=297&amp;amp;face=0_0_500_297');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;수학인듯 과학아닌 공학같은 컴퓨터과학/알고리즘 기초&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;librewiki.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유튜브 엔지니어 대한민국&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6Iq5iMCVsXA&quot;&gt;https://www.youtube.com/watch?v=6Iq5iMCVsXA&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=6Iq5iMCVsXA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c9Q5fz/hyBiZqJD7F/JW00kxXl7lGq456EsOqra0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-original-url=&quot;https://www.youtube.com/watch?v=6Iq5iMCVsXA&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/6Iq5iMCVsXA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;VisuAlgo 사이트 - 알고리즘 시각화&lt;/p&gt;
&lt;figure id=&quot;og_1558798469970&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://visualgo.net/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://visualgo.net/ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;VisuAlgo - 영상을 통한 자료구조와 알고리즘의 시각화 (한국어판) (Korean)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;VisuAlgo is free of charge for Computer Science community on earth. If you like VisuAlgo, the only payment that we ask of you is for you to tell the existence of VisuAlgo to other Computer Science students/instructors that you know =) via Facebook, Twitter&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;visualgo.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web develop/Algorithm</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/44</guid>
      <comments>https://fora.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 26 May 2019 00:36:06 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] TCL</title>
      <link>https://fora.tistory.com/43</link>
      <description>&lt;h2&gt;Transaction (트랜잭션)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터 처리의 한 단위&lt;/li&gt;
&lt;li&gt;오라클에서 발생하는 여러 개의 SQL 명령문(DML)들을 하나의 논리적인 작업단위로 처리&lt;/li&gt;
&lt;li&gt;하나의 트랜잭션은 ALL- Or- Nothing 방식으로 처리&lt;/li&gt;
&lt;li&gt;목적: 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구시키기 위해서&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;트랜잭션 제어 명령어&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;COMMIT;  
ROLLBACK; 
SAVEPOINT sp1;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;COMMIT&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령어.&lt;/li&gt;
&lt;li&gt;커밋하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝남&lt;/li&gt;
&lt;li&gt;트랜잭션이 발생하는 경우 새롭게 생성되거나 갱신된 데이터들이 물리적으로 영구히 저장됨&lt;/li&gt;
&lt;li&gt;DDL (CREATE , DROP, ALTER, RENAME, TRUNCATE)은 AutoCommit&lt;/li&gt;
&lt;li&gt;정상적인 종료시에도 commit작업을 수행. 예) exit종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;ROLLBACK&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;저장되지 않은 모든 데이터 변경사항(DML)을 취소하고 현재의 트랜잭션을 끝내라는 명령&lt;/li&gt;
&lt;li&gt;트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로 되돌려지는 것&lt;/li&gt;
&lt;li&gt;이전상태로 되돌아가 지금까지 수행했던 데이터베이스의 변경을 모두 무효화&lt;/li&gt;
&lt;li&gt;비정상적인 종료시 rollback 작업을 수행. 예) 우측 상단 X버튼 클릭시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SAVEPOINT 저장점명;&lt;/code&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;SAVEPOINTx&lt;/b&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1560483923830&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 20번 부서와 40번 부서를 삭제
    DELETE FROM dept3 WHERE deptno IN(20,40);
    
    -- 30번 부서의 이름을 '영업부'로 변경. (DML)
    UPDATE dept3 SET dname='영업부' WHERE deptno = 30;
    
    -- 되돌리기
    ROLLBACK; 
    ====&amp;gt; 트랜잭션 시작 &amp;lt;=====
    
    -- 10, 20, 30번 부서를 삭제
    DELETE FROM dept3 WHERE deptno IN(10,20,30);
    
    -- 물리적인 반영(DML을 실제 DataBase에 적용)
    COMMIT;
    ====&amp;gt; 트랜잭션 끝 &amp;lt;=====
    ====&amp;gt; 트랜잭션 시작 &amp;lt;=====
    ROLLBACK; 
    
    DELETE FROM dept4 WHERE deptno=30;
    SAVEPOINT sp1;
    DELETE FROM dept4 WHERE deptno=10;
    SAVEPOINT sp2;
    DELETE FROM dept4 WHERE deptno=40;
    
    ROLLBACK to sp2; --40번을 지우기 전
    ROLLBACK to sp1; --10번을 지우기 전
    ROLLBACK         --30번을 지우기 전
    
    -- ROLLBACK to sp2; 에러발생. 이미 작업취소한 내용을 다시 할 수 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ryrni/btqv7hq4E6k/v5DO5SOMWLgsXaHbAfmbj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ryrni/btqv7hq4E6k/v5DO5SOMWLgsXaHbAfmbj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ryrni/btqv7hq4E6k/v5DO5SOMWLgsXaHbAfmbj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fryrni%2Fbtqv7hq4E6k%2Fv5DO5SOMWLgsXaHbAfmbj1%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/43</guid>
      <comments>https://fora.tistory.com/43#entry43comment</comments>
      <pubDate>Fri, 24 May 2019 17:31:52 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] DML</title>
      <link>https://fora.tistory.com/42</link>
      <description>&lt;p&gt;: Data Manipulation Language (데이터 조작어)&lt;/p&gt;
&lt;p&gt;종류) INSERT(입력), DELETE(삭제), UPDATE(수정, 재입력)&lt;/p&gt;
&lt;p&gt;=&amp;gt; 행단위 실행&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;INSERT&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;: 테이블에 (행) 데이터를 추가 (최초 입력)&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;INSERT&amp;nbsp;INTO&amp;nbsp;테이블명 (컬럼명1, 컬럼명2, 컬럼명3)
VALUES&amp;nbsp;(데이터1, 데이터2, 데이터3);
INSERT INTO 테이블명 VALUES (데이터1, 데이터2, 데이터3);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;테이블명 뒤에 컬럼명을 생략하는 경우 테이블 구조에 있는 순서에 따라&lt;br /&gt;전체 컬럼명이 명시된 것으로 간주&lt;/li&gt;
&lt;li&gt;명시된 컬럼의 갯수와 데이터 갯수는 반드시 일치. 칼럼의 순서에 맞는 자료형 데이터가 와야함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;b&gt;ORACLE에서 NULL값 입력방법&lt;/b&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;컬럼명을 명시하지 않는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    INSERT INTO dept3 (deptno, dname) VALUES (50, '개발부');  
    --&amp;gt; 명시되지 않은 loc 컬럼에 NULL값&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;데이터가 들어가는 자리에 직접 NULL을 명시&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    INSERT INTO dept3 (deptno, dname, loc) VALUES (60, '기획부', NULL);&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;데이터가 들어가는 자리에 ''를 입력
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;INSERT INTO 테이블명 (컬럼명1, 컬럼명2, 컬럼명3)
VALUES (데이터1, 데이터2, 데이터3);
INSERT INTO 테이블명 VALUES (데이터1, 데이터2, 데이터3);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;NULL값 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT dname FROM dept3 WHERE loc IS NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;서브쿼리로 행 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;INSERT INTO 테이블명 [(컬럼명)] 서브쿼리;
INSERT INTO dept4 SELECT * FROM dept;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;다중테이블에 다중 로우(행) 입력&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;INSERT ALL
INTO 테이블명1 VALUES (COL1, COL2, COL3) 
INTO 테이블명2 VALUES (COL4, COL5, COL6)
INTO 테이블명3 VALUES (COL7, COL8, COL9)
SELECT COL1, COL2, COL3, COL4, COL5, COL6, COL7, COL8, COL9
FROM 테이블명;

INSERT ALL 
INTO emp_hir VALUES (empno, ename, hiredate) 
INTO emp_mgr VALUES (empno, ename, mgr) 
SELECT empno, ename, hiredate, mgr 
FROM emp WHERE deptno = 30;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;조건 (WHEN)에 의해 다중테이블에 다중 로우 입력하기&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;WHEN 조건식 THEN 실행할 문장

INSERT ALL WHEN hiredate &amp;gt;= to_date('1982/01/01') 
THEN INTO emp_hir2 VALUES (empno, ename, hiredate) 
WHEN sal&amp;gt;=2000 THEN INTO emp_sal VALUES (empno, ename, sal) 
SELECT empno, ename, hiredate, sal FROM emp;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;:기존 데이터에 대한 수정, 갱신, 재입력&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;UPDATE 테이블명 SET 컬럼명 = (변경할)데이터 , 
                                    컬럼명2 = (변경할)데이터 [WHERE 조건식]&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;UPDATE와 DELETE문을 실행하기 전 반드시 WHERE절 사용을 고려하자. 만약 WHERE절을 사용하지 않는다면 전체행에 대한 수정 또는 삭제가 실행되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;    UPDATE dept3 SET loc = '서울' WHERE deptno = 10;  
    UPDATE emp3 SET sal = sal + sal/10 WHERE deptno = 30;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;b&gt;서브쿼리를 이용한 데이터 수정&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;dname, loc / 20&amp;lt;=40번

UPDATE dept4 SET dname = (SELECT dname FROM dept WHERE deptno=40), 
loc = (SELECT loc FROM dept WHERE deptno=40) WHERE deptno=20;

=&amp;gt; UPDATE dept4 SET (dname,loc) = (SELECT dname, loc 
FROM dept WHERE deptno=40 ) WHERE deptno=20;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;: (행 단위)데이터 삭제명령어&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DELETE [FROM] 테이블명 -- 전체행 삭제
[WHERE 조건식]; --특정행 삭제

DELETE emp3 WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES');&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;&lt;b&gt;MERGE&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;: 합병(병합). 구조가 같은 두개의 테이블을 하나의 테이블로 합치는 기능&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존에 존재하는 행이 있다면 새로운 값으로 갱신(UPDATE) 되고&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;존재하지 않는 행이 있다면 새로운 행으로 추가(INSERT) 해라&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;MERGE INTO 기준테이블명 별명 
USING 참조테이블명 별명 ON (매칭조건식)
WHEN MACHED THEN 업데이트문
WHEN NOT MACHED THEN 추가문;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRWClT/btqv8lZ8OuV/U50ekvkY2wAGf2qwfZS4F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRWClT/btqv8lZ8OuV/U50ekvkY2wAGf2qwfZS4F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRWClT/btqv8lZ8OuV/U50ekvkY2wAGf2qwfZS4F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRWClT%2Fbtqv8lZ8OuV%2FU50ekvkY2wAGf2qwfZS4F1%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/42</guid>
      <comments>https://fora.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 23 May 2019 17:34:23 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] DDL</title>
      <link>https://fora.tistory.com/41</link>
      <description>&lt;p&gt;: Data Definition Language (데이터 정의어)&lt;/p&gt;
&lt;p&gt;종류) CREATE, DROP, ALTER, RENAME, TRUNCATE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DDL은 AUTO Commit을 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CREATE&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE 테이블명(
    컬럼명1 자료형(길이),
    컬럼명2 자료형(길이),
    컬럼명3 자료형(길이)
);

CREATE TABLE emp2( 
    empno number(4)
);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이미 존재하는 테이블명(객체명)과 같은 이름은 생성불가&lt;/li&gt;
&lt;li&gt;식별자 규칙에 따라 테이블명 설정 (숫자 첫글자 X, 예약어 X, 특수문자X 등등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;데이터 타입&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;CHAR&lt;/b&gt; : 주어진 크기만큼 고정길이의 문자 저장 1바이트2000바이트&lt;/p&gt;
&lt;p&gt;&lt;b&gt;VARCHAR2&lt;/b&gt; : 주어진 크기만큼 가변길이의 문자 저장 1바이트4000바이트&lt;/p&gt;
&lt;p&gt;&lt;b&gt;NUMBER(p[,s])&lt;/b&gt; : 정밀도와 스케일로 표현되는 숫자. 바이트수 생략 가능&lt;br /&gt;&lt;b&gt;NUMBER(7,2)&lt;/b&gt; : 전체 자릿수 7, 소숫점 이하 2자리까지 표현&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;no number(7,2) --&amp;gt; 12345.67
입력=&amp;gt; 12345 (O)
입력=&amp;gt; 123456 (X)
입력=&amp;gt; 12345.678 (O) --&amp;gt; 저장: 12345.68 (반올림)
입력=&amp;gt; 99999.992 (O)
입력=&amp;gt; 99999.995 (X) --&amp;gt; 저장: 10000000.00 (범위초과)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DATE : 날짜 형식 저장&lt;/p&gt;
&lt;p&gt;TIMESTAMP : DATE형의 확장된 형태&lt;/p&gt;
&lt;p&gt;BLOB : 대용량의 바이너리 데이터를 저장, 최대 4GB&lt;/p&gt;
&lt;p&gt;CLOB : 대용량의 텍스트 데이터를 저장, 최대 4GB&lt;/p&gt;
&lt;p&gt;BFILE : 대용량의 바이너리 데이터를 파일형태로 저장, 최대 4GB&lt;/p&gt;
&lt;h3&gt;서브쿼리를 이용한 테이블 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;기존테이블의 구조(컬럼, 자료형)와 행 데이터를 복사&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;제약(constraint)은 복사에서 제외&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 전체 복사
    CREATE TABLE 테이블명 AS 서브쿼리;
    CREATE TABLE emp4 as SELECT * FROM emp;

    -- 원하는 컬럼과 행만 복사
    CREATE TABLE emp3 AS SELECT empno, ename, job FROM emp WHERE deptno = '30';

    -- 테이블 구조만 복사 (데이터 x)
    CREATE TABLE emp4 AS SELECT * FROM emp WHERE 1=0;  //WHERE에 조건식 FALSE 대입&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ALTER&lt;/h2&gt;
&lt;p&gt;: 컬럼추가, 컬럼삭제, 컬럼의 자료형, 바이트 수를 변경&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;컬럼 추가&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ADD (추가컬럼명 자료형)  
ALTER TABLE emp4 ADD (email VARCHAR2(20));  
==&amp;gt; Table altered&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컬럼 수정&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;MODIFY (기존컬럼명 자료형)  
ALTER TABLE emp4 MODIFY (email VARCHAR2(30));&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컬럼 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 DROP COLUMN 컬럼명;  
ALTER TABLE emp4 DROP COLUMN email;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컬럼 이름변경&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 RENAME COLUMN 기존컬럼명 TO 새컬럼명&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컬럼 사용안함&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER TABLE 테이블명 SET UNUSED 컬럼명

UNUSED 설정된 컬럼들 삭제  
DROP UNUSED COLUMN&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DROP&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;테이블 객체 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DROP TABLE 테이블명;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RENAME&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;테이블 이름변경&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;RENAME 기존테이블명 TO 변경테이블명;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TRUNCATE&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;테이블의 전체 데이터 지우기&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;주의: TRUNCATE 명령어를 통해 삭제된 데이터는 ROLLBACK 불가능(DDL은 AutoCommit)&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;TRUNCATE TABLE 테이블명;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYXliM/btqv6CPLvBY/ELSxfkVWWuagkKPtcXL7lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYXliM/btqv6CPLvBY/ELSxfkVWWuagkKPtcXL7lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYXliM/btqv6CPLvBY/ELSxfkVWWuagkKPtcXL7lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYXliM%2Fbtqv6CPLvBY%2FELSxfkVWWuagkKPtcXL7lK%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/41</guid>
      <comments>https://fora.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 22 May 2019 17:22:37 +0900</pubDate>
    </item>
    <item>
      <title>[SQL/ORACLE] SQL 문법 종류 (DDL, DML, DCL, DQL, TCL)</title>
      <link>https://fora.tistory.com/40</link>
      <description>&lt;h2&gt;SQL&lt;/h2&gt;
&lt;p&gt;: Structured Query Language (구조적인 질의어)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관계형 데이터베이스의 ANSI표준언어&lt;/li&gt;
&lt;li&gt;여러줄 실행, 종결문자필요 (;)&lt;/li&gt;
&lt;li&gt;키워드 단축 불가 (ex. SELECT =&amp;gt; SEL)&lt;/li&gt;
&lt;li&gt;버퍼에 마지막 명령문 저장&lt;/li&gt;
&lt;li&gt;대소문자 구분 없음 (단, 데이터를 표시할 때는 반드시 대소문자를 구분함)sElEct eName, 'Gildong', 'gildong'FROM eMp;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;데이터 정의어(DDL)&lt;/b&gt;: Data Definition Language
&lt;ul&gt;
&lt;li&gt;데이터베이스 관리자나 응용프로그래머가 데이터베이스의 논리적인 구조를 정의하기 위한 언어.&lt;/li&gt;
&lt;li&gt;DDL에서 data =&amp;gt; Object(ex/table,view,sequence,trigger)에 대한 정의&lt;/li&gt;
&lt;li&gt;명령어: CREATE(추가), DROP(삭제), ALTER(특성변경), RENAME(이름변경), TRUNCATE(객체제거)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 조작어(DML)&lt;/b&gt;: Data Manipulation Language
&lt;ul&gt;
&lt;li&gt;데이터베이스에 저장된 데이터를 조작(추가,삭제,수정)하기 위해 사용하는 언어&lt;/li&gt;
&lt;li&gt;명령어: INSERT(추가), DELETE(삭제), UPDATE(수정)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 제어어(DCL)&lt;/b&gt;: Data Control Language
&lt;ul&gt;
&lt;li&gt;데이터베이스에 대한 접근 권한 부여등의 데이터베이스 시스템의 관리를 위한 목적으로 사용되는 언어&lt;/li&gt;
&lt;li&gt;명령어: GRANT(권한 부여/ - TO 이름), REVOKE(권한 회수/ - FROM 이름)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 질의어(DQL)&lt;/b&gt;: Data Query Language
&lt;ul&gt;
&lt;li&gt;검색,조회 명령어&lt;/li&gt;
&lt;li&gt;명령어: SELECT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트랜잭션 제어어(TCL)&lt;/b&gt;: Transaction Control Language
&lt;ul&gt;
&lt;li&gt;논리적인 (DML)작업단위의 묶음&lt;/li&gt;
&lt;li&gt;예를들어 은행에 들어가서 ATM기기를 사용하고 밖으로 나오기까지의 전체작업을 한묶음으로 묶어놓은 것. 예기치 못한 상황이 발생했을 때 예외처리&lt;/li&gt;
&lt;li&gt;명령어: COMMIT, ROLLBACK, SAVEPOINT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;sql스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDndgn/btqv5W8Oo6j/9VRBkO8cVeJY9Sh0qkpMi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDndgn/btqv5W8Oo6j/9VRBkO8cVeJY9Sh0qkpMi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDndgn/btqv5W8Oo6j/9VRBkO8cVeJY9Sh0qkpMi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDndgn%2Fbtqv5W8Oo6j%2F9VRBkO8cVeJY9Sh0qkpMi0%2Fimg.png&quot; data-filename=&quot;sql스터디.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;</description>
      <category>Web develop/SQL</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/40</guid>
      <comments>https://fora.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 22 May 2019 17:08:25 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 프로그램 실행시간 비교</title>
      <link>https://fora.tistory.com/33</link>
      <description>&lt;p&gt;&lt;b&gt;System.currentTimeMills();&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행시간을 기록하는 기능&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;public class StringBufferPerformanceTest{
    public static void main(String[] args){
        // (1) String의 +연산을 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)
        long startTime1 = System.currentTimeMillis();
        String str=&quot;&quot;;
        for(int i=0;i&amp;lt;10000;i++){
            str=str+&quot;*&quot;;
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime1 = System.currentTimeMillis();

        // (2) StringBuffer를 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)                
        long startTime2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i&amp;lt;10000;i++){
            sb.append(&quot;*&quot;);
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime2 = System.currentTimeMillis();

        // 방법(1)과 방법(2)가 걸린 시간을 비교합니다.
        long duration1 = endTime1-startTime1;
        long duration2 = endTime2-startTime2;

        System.out.println(&quot;String의 +연산을 이용한 경우 : &quot;+ duration1);
        System.out.println(&quot;StringBuffer의 append()을 이용한 경우 : &quot;+ duration2);
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자바스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXhUr/btqv3tLWvar/Xeset5efMZChVZqxKNBkcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXhUr/btqv3tLWvar/Xeset5efMZChVZqxKNBkcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXhUr/btqv3tLWvar/Xeset5efMZChVZqxKNBkcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXhUr%2Fbtqv3tLWvar%2FXeset5efMZChVZqxKNBkcK%2Fimg.png&quot; data-filename=&quot;자바스터디.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;</description>
      <category>Web develop/JAVA</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/33</guid>
      <comments>https://fora.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 6 May 2019 15:38:50 +0900</pubDate>
    </item>
    <item>
      <title>[독서/ 웹을 지탱하는 기술] 2부.URI</title>
      <link>https://fora.tistory.com/32</link>
      <description>&lt;h1&gt;&lt;b&gt;URI의 스펙&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URI(Uniform Resource Identifier)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유니폼 리소스 식별자&lt;/li&gt;
&lt;li&gt;리소스를 통일적으로 식별하는 ID&lt;/li&gt;
&lt;li&gt;URI 구문&lt;/li&gt;
&lt;li class=&quot;markdown&quot;&gt;&lt;code&gt;  ex ) http://blog.example.com/entrise/1](http://blog.example.com/entrise/1

  - URI Scheme: http
  - host: [blog.examples.com](http://blog.examples.com/)
  - pass: /entries/1

  ex) http://fora:pass@blog.example.com:8000/search?q=test&amp;amp;edbug=true#n10
  - URI Scheme: http
  - 사용자 정보: fora:pass
  - host: [blog.example.com](http://blog.example.com/)
  - 포트번호: 8000
  - 패스: /search
  - 쿼리 파라미터: q=test&amp;amp;debug=true
  - URI 프래그먼트: #n10&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;절대 경로와 상대경로&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b76U2s/btqv6C3bI0A/4GCAkKKmZkEsl4kvBw8LK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b76U2s/btqv6C3bI0A/4GCAkKKmZkEsl4kvBw8LK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b76U2s/btqv6C3bI0A/4GCAkKKmZkEsl4kvBw8LK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb76U2s%2Fbtqv6C3bI0A%2F4GCAkKKmZkEsl4kvBw8LK1%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;738&quot; height=&quot;386&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZIcRf/btqv7poN3dn/cQG6XqV7VCDb4G4Yum7pK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZIcRf/btqv7poN3dn/cQG6XqV7VCDb4G4Yum7pK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZIcRf/btqv7poN3dn/cQG6XqV7VCDb4G4Yum7pK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZIcRf%2Fbtqv7poN3dn%2FcQG6XqV7VCDb4G4Yum7pK1%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;734&quot; height=&quot;590&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;절대 경로/URI&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS의 파일시스템에서는 루트에서부터 전체경로를 기술한 것.&lt;/li&gt;
&lt;li&gt;주소라고 많이 불림&lt;/li&gt;
&lt;li&gt;외부 사이트의 파일을 불러올 때는 절대경로를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상대 경로/URI&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;홈페이지 내부의 파일을 불러올 때는 상대경로를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URL&lt;/b&gt;: Uniform Resource Locator (리소스의 위치를 나타냄)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URN&lt;/b&gt;: Uniform Resource Name (리소스의 이름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URI&lt;/b&gt; = URL + URN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URI&lt;/b&gt;: Uniform Resource Identifier (리소스를 식별)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스에 도메인명과는 독립된 이름을 붙일 수 있다. ex) urn:isbn:023475&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URI의 설계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 URI =&amp;gt; 변하지 않는 Cool URI.&lt;/li&gt;
&lt;li&gt;버너스-리 says &amp;ldquo;URI는 변하지 않아야한다. 변하지 않는 URI야말로 최고의 URI다&quot;&lt;/li&gt;
&lt;li&gt;프로그래밍 언어에 의존적인 확장자와 경로를 포함하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://example.com/servlet/LoginServlet -&amp;gt; 좋지못한 URI. 시스템을 서블릿에서 PHP로 바꾼 순간 변경이 된다. 대문자도 주의해야 할 점&lt;/li&gt;
&lt;li&gt;어떤 특정 언어에(pl, servlet 등등) 의존하는 문자열을 URI에 포함시키면 그 언어를 변경하자마자 그 URI를 사용할 수 없게된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메서드명과 세션ID를 포함하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://example.com/Login.do?action=showPage No&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URI는 리소스를 표현하는 명사로 한다.&lt;/li&gt;
&lt;li&gt;http://example.com/login 최종적으로 구현하는 로그인 URI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URI 설계 테크닉&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확장자로 표현을 지정한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pl, cgi등의 구현에 의존하는 확장자는 좋지 않고 리소스의 표현을 지정하는 확장자는 좋다.&lt;/li&gt;
&lt;li&gt;예를들어 콘텐트 네고시에이션의 경우, 한국어 이용자가 영어판 프레스릴리스를 가져오기 위해 브라우저 설정을 따로 변경 해 주어야 한다. 간단히 접근하기 위해서는 릴리스 언어를 명시적으로 지정한 다음 다음과 같은 URI를 사용하면 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://example.com/2019/press.ko&lt;/li&gt;
&lt;li&gt;http://example.com/2019/press.en&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매트릭스 URI&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI는 &amp;lsquo;/&amp;lsquo;를 사용해 계층을 표현할 수 있다. 하지만 모든 정보를 계층적으로 관리할 수 없기에 다차원정보, 지도같은 것은 매트릭스 URI를 사용한다.&lt;/li&gt;
&lt;li&gt;매트릭스 URI는 계층구조를 표현하는 슬래시 대신에 각각의 파라미터를 세미콜론이나 콤마로 구분해 리소스를 표현한다.&lt;/li&gt;
&lt;li&gt;세미콜론은 파라미터의 순서가 의미를 가지지 않는 경우&lt;/li&gt;
&lt;li&gt;콤마는 파라미터의 순서가 의미를 가지는 경우 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://example.com/map/lat=35.705471;lng=139.751898&lt;/li&gt;
&lt;li&gt;http://example.com/map/35.705471,139.751898&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위도를 표시한 예.&lt;/li&gt;
&lt;li&gt;URI의 중요성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI는 리소스의 이름이다&lt;/li&gt;
&lt;li&gt;수명이 길다&lt;/li&gt;
&lt;li&gt;브라우저가 어드레스 란에 표시한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web develop</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/32</guid>
      <comments>https://fora.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 3 May 2019 17:33:06 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 자바 MVC 패턴 (Model, View, Controller)</title>
      <link>https://fora.tistory.com/31</link>
      <description>&lt;h3&gt;&lt;b&gt;model1&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;구분없이 필요한 내용들(절차적인요소들)을 프로그래밍)&lt;/li&gt;
&lt;li&gt;주먹구구식. 작은 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;b&gt;model2&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;내용,형식에 따라서 파일을 분류해서 프로그래밍/ MVC)&lt;/li&gt;
&lt;li&gt;나누는 기법. 여러명이 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Model2구조&lt;/h1&gt;
&lt;h3&gt;Model(모델)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;데이터와 관련된 일. 저장, 가공, 등등&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;비즈니스로직과 관련된 부분 처리&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터베이스 관련로직 구현&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSP Beans, EJB Component&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;애플리케이션의 데이터를 표현&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;  class Calculator{
      public int plus(int su1, int su2){
          return su1+su2;
      }
  } //데이터를 가공 처리

  int result = plus(2,3);

  class Person{
       String name;
       int age;
       String job;
   }// 서로 관련있는 속성을 클래스로 묶음 : JavaBeans

   class DBTest{
       public void insert(){
       }
   }//DB access하는 클래스&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View(뷰)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;사용자에게 알맞은 화면을 보여주는 역할 수행.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSP, CustomTag&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;데이터를 시각적으로 표현하는 것&lt;/p&gt;
&lt;p&gt;역할)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;결과값 출력&lt;/li&gt;
&lt;li&gt;사용자 요구(버튼클릭: 음료수가 먹고싶다.)&lt;/li&gt;
&lt;li&gt;사용자 데이터 입력.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Controller(컨트롤러)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Model과 View를 연결해주기 위한 매개체&lt;/li&gt;
&lt;li&gt;사용자가 View(GUI)를 통해 입력을 하면 Model(데이터)을 변경해 주는것&lt;/li&gt;
&lt;li&gt;애플리케이션의 흐름제어나 사용자의 처리요청을 구현&lt;/li&gt;
&lt;li&gt;사용자인증, 보안설정이라든지전체 애플리케이션에 영향을 미치는 요소구현&lt;/li&gt;
&lt;li&gt;Servlet&lt;/li&gt;
&lt;li&gt;Model과 View는 나눠서, 본인일에 전념할 수 있도록 컨트롤해준다.&lt;br /&gt;장점) 객체지향, 비용절감, 유지보수, 업무분담&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;컨트롤러의 역할&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;(뷰를 통해 전달된) 사용자의 요청 분석 ex) &lt;code&gt;if(ob==bt_new){}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(사용자가)입력한 데이터 얻어오기 ex) &lt;code&gt;tf.getText();&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;모델클래스 객체생성 ex) &lt;code&gt;Calculator c = new Calculator();&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;메소드 호출 c.plus(2,3);&lt;/li&gt;
&lt;li&gt;리턴된 데이터를 저장 &lt;code&gt;int result = c.plus(2,3);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;페이지 이동(화면 하나), 이동할 페이지(프레임) 선택 ex) &lt;code&gt;f1.setVisible(false); f2.setVisible(true);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;유효성 검사 (Valid Check) [선택사항]&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Swing MVC 예시(심플계산기)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;뷰 CalcView.java : 계산기 폼&lt;/li&gt;
&lt;li&gt;모델 Calculator.java : 더하기, 빼기, 곱하기, 나누기 기능&lt;/li&gt;
&lt;li&gt;컨트롤러 CalcController.java : 전체 프로그램 제어 (main()메소드 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MODEL&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;CalcView view;

public CalcController() {
    view = new CalcView();

    view.bt_calc.addActionListener(this);
}//CaclController

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==view.bt_calc) {//1. 계산을 요청했다면
        //2. 계산에 필요한 데이터 얻기
        String su1Str = view.tf_su1.getText();
        String su2Str = view.tf_su2.getText();
        String oper = view.cb_oper.getSelectedItem().toString();

        //5. 유효성검사
        if(!su1Str.matches(&quot;[0-9]+&quot;)||!su2Str.matches(&quot;[\\d]+&quot;)) {
            view.la_result.setText(&quot;숫자만 입력하세요&quot;);
            return;
        }else if (oper.equals(&quot;/&quot;)&amp;amp;&amp;amp;su2Str.equals(&quot;0&quot;)) {
            view.la_result.setText(&quot;0으로 나눌 수 없습니다.&quot;);
            return;
        }

        //3. 모델객체 생성
        Calculator calc = new Calculator(Integer.parseInt(su1Str),Integer.parseInt(su2Str),oper);

        String result = calc.getResultstr();
        //3-2 변수에 저장 //3-1 메소드호출

        view.la_result.setText(result);
        view.reset(); //입력숫자 초기화 메소드
    }//if
}

public static void main(String[] args) {
    new CalcController();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;VIEW&lt;/h3&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;public class CalcView extends JFrame {

    public JTextField tf_su1, tf_su2;
    public JComboBox&amp;lt;String&amp;gt; cb_oper;
    public JButton bt_calc;
    public JLabel la_result;

    JPanel panel;


    public CalcView() {
        setTitle(&quot;Simple Calculator&quot;);//이름설정

        //컴포넌트 초기화 및 설정
        tf_su1 = new JTextField(5); //5 = 너비지정
        tf_su2 = new JTextField(5);

        cb_oper = new JComboBox();
            cb_oper.addItem(&quot;+&quot;);
            cb_oper.addItem(&quot;-&quot;);
            cb_oper.addItem(&quot;*&quot;);
            cb_oper.addItem(&quot;/&quot;);

        bt_calc = new JButton(&quot;계산&quot;);
        la_result = new JLabel();

        //레이아웃
        setLayout(new FlowLayout());

        panel = new JPanel();
        panel.add(tf_su1);
        panel.add(cb_oper);
        panel.add(tf_su2);
        panel.add(bt_calc);

        add(panel);
        add(la_result);

        setBounds(300,200,300,120);
        setVisible(true);
        setResizable(false);//프레임 재설정 X
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void reset() {
        tf_su1.setText(&quot;&quot;);
        tf_su2.setText(&quot;&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Model&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;public class Calculator { 
//(사칙연산관련) 기능정의. 모델(데이터관련) 클래스. 보통 결과데이터를 리턴 

    private int su1;
    private int su2;
    private String oper;

    private int result; //사칙연산 결과를 담을 변수

    public Calculator(int su1, int su2, String oper) {
        this.su1 = su1;
        this.su2 = su2;
        this.oper = oper;
        choice();
    }

    private void choice() {
        if(oper.equals(&quot;+&quot;)) plus();
        else if(oper.equals(&quot;-&quot;)) minus();
        else if(oper.equals(&quot;*&quot;)) multi();
        else if(oper.equals(&quot;/&quot;)) div();
    }//choice

    public void plus() {
        result = su1+su2;
    };
    public void minus() {
        result = su1-su2;
    };
    public void multi() {
        result = su1*su2;        
    };
    public void div() {
        result = su1/su2;    
    };

    //최종 결과값 리턴
    public String getResultstr() {
        return &quot;결과값:&quot;+su1+oper+su2+&quot;=&quot;+result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자바스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYnrh/btqv164J1lU/XIo06biqk8fmz4J3Vpdlsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYnrh/btqv164J1lU/XIo06biqk8fmz4J3Vpdlsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYnrh/btqv164J1lU/XIo06biqk8fmz4J3Vpdlsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYnrh%2Fbtqv164J1lU%2FXIo06biqk8fmz4J3Vpdlsk%2Fimg.png&quot; data-filename=&quot;자바스터디.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;</description>
      <category>Web develop/JAVA</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/31</guid>
      <comments>https://fora.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 3 May 2019 14:38:18 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 자바Swing 숫자야구게임 예제</title>
      <link>https://fora.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;579&quot; height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9h2OA/btqv2IWPj53/DiaqmNhTqrW3bLJg8qWULK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9h2OA/btqv2IWPj53/DiaqmNhTqrW3bLJg8qWULK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9h2OA/btqv2IWPj53/DiaqmNhTqrW3bLJg8qWULK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9h2OA%2Fbtqv2IWPj53%2FDiaqmNhTqrW3bLJg8qWULK%2Fimg.png&quot; width=&quot;579&quot; height=&quot;488&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;pre id=&quot;code_1560439728722&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NumBaseballGame extends JFrame implements ActionListener {
    	JButton bt_new, bt_clear, bt_answer, bt_exit;
    	JTextArea ta;
    	JTextField tf;
    	JLabel lb;
    	JScrollPane scroll_bar;
    	JPanel pnl_text, pnl_text_area, pnl_text_field;
    	JPanel pnl_button;
    
    	int[] baseballRandNum;
    	int[] baseballAnswer;
    	int cnt, ballCnt, strikeCnt;
    	Random rand;
    
    	public NumBaseballGame() {
    		// Game 진행 초기화
    		baseballRandNum = new int[3];
    		baseballAnswer = new int[3];
    		cnt = 0;
    		ballCnt = 0;
    		strikeCnt = 0;
    		rand = new Random();
    
    		// title
    		setTitle(&quot;숫자야구게임&quot;);
    
    		// 버튼 초기화
    		bt_new = new JButton(&quot;새게임&quot;);
    		bt_clear = new JButton(&quot;지우기&quot;);
    		bt_answer = new JButton(&quot;정답&quot;);
    		bt_exit = new JButton(&quot;나가기&quot;);
    
    		// textArea초기화 + 스크롤 붙이기
    		ta = new JTextArea();
    		ta.setEditable(false);// textArea에 직접입력 불가
    
    		scroll_bar = new JScrollPane(ta);
    		scroll_bar.setBorder(new BevelBorder(BevelBorder.LOWERED));
    
    		// textField초기화 + 라벨 초기화
    		tf = new JTextField(40);
    		tf.setEditable(false);// 최초에 입력 불가
    
    		lb = new JLabel(&quot;입력: &quot;);
    
    		// 레이아웃 초기화
    		pnl_text = new JPanel();
    		pnl_text_area = new JPanel();
    		pnl_text_field = new JPanel();
    
    		pnl_button = new JPanel();
    
    		// 화면구성
    		// 좌측화면 구성
    		pnl_text_field.setLayout(new FlowLayout());
    		pnl_text_field.add(lb);
    		pnl_text_field.add(tf);
    		pnl_text_field.setBackground(Color.orange);
    
    		pnl_text_area.setLayout(new BorderLayout(10, 10));
    		pnl_text_area.add(&quot;North&quot;, new JLabel());
    		pnl_text_area.add(&quot;South&quot;, new JLabel());
    		pnl_text_area.add(&quot;East&quot;, new JLabel());
    		pnl_text_area.add(&quot;West&quot;, new JLabel());
    		pnl_text_area.add(&quot;Center&quot;, scroll_bar);
    		pnl_text_area.setBackground(Color.orange);
    
    		pnl_text.setLayout(new BorderLayout(10, 10));
    		pnl_text.add(&quot;Center&quot;, pnl_text_area);
    		pnl_text.add(&quot;South&quot;, pnl_text_field);
    		pnl_text.setBackground(Color.orange);
    
    		// 우측화면 구성
    		pnl_button.setLayout(new GridLayout(7, 1, 40, 40));
    		pnl_button.add(new JLabel());
    		pnl_button.add(bt_new);
    		pnl_button.add(bt_clear);
    		pnl_button.add(bt_answer);
    		pnl_button.add(bt_exit);
    		pnl_button.setBackground(Color.orange);
    
    		// 전체화면 구성
    		setLayout(new BorderLayout());
    		add(&quot;Center&quot;, pnl_text);
    		add(&quot;East&quot;, pnl_button);
    
    		// 화면 보이기
    		setBounds(300, 300, 600, 500);
    		setVisible(true);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    		// 연결자, 최초 상태 호출
    		defaultState();
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		Object obj = e.getSource();
    		if (obj instanceof JButton)
    			customButtonAction(obj);
    		else
    			customTextAction(obj);
    	}//handler end
    	
    	public void defaultState() {
    		// 연결자(감시자)
    		bt_new.addActionListener(this);
    		bt_clear.addActionListener(this);
    		bt_answer.addActionListener(this);
    		bt_exit.addActionListener(this);
    		
    		tf.addActionListener(this);
    		
    		// 최초 상태
    		bt_clear.setEnabled(false);
    		bt_answer.setEnabled(false);
    	}//defaultState end
    
    	public void customButtonAction(Object obj) {
    		if (obj == bt_new) {
    			tf.setEditable(true);
    			bt_clear.setEnabled(true);
    			bt_answer.setEnabled(true);
    			cnt = 0;// 정답입력 횟수 초기화
    			for (int i = 0; i &amp;lt; baseballRandNum.length; i++) {
    				int randNum = rand.nextInt(10);
    				if (i == 1 &amp;amp;&amp;amp; randNum == baseballRandNum[i - 1]
    					|| i == 2 &amp;amp;&amp;amp; randNum == baseballRandNum[i - 1]
    					|| i == 2 &amp;amp;&amp;amp; randNum == baseballRandNum[i - 2]) {
    					--i;
    					continue;
    				}
    				baseballRandNum[i] = randNum;
    			}
    		} else if (obj == bt_clear) {
    			bt_clear.setEnabled(false);
    			ta.setText(&quot;&quot;);
    		} else if (obj == bt_answer) {
    			ta.append(&quot;정답은 &quot; + baseballRandNum[0] + baseballRandNum[1] + baseballRandNum[2] + &quot;입니다!\n&quot;);
    			bt_answer.setEnabled(false);// 정답출력후 정답 버튼 비활성화
    			tf.setEditable(false);
    			return;
    		} else if (obj == bt_exit) {
    			System.exit(0);
    		} // JButton 동작
    	}//customButtonAction end
    
    	public void customTextAction(Object obj) {
    		if (obj == tf) {
    			ballCnt = 0;// 볼 횟수 매번 초기화
    			strikeCnt = 0;// 스트라이크 횟수 매번 초기화
    
    			String answerStr = tf.getText();
    			// if(!answerStr.matches(&quot;[0-9][0-9][0-9]&quot;)){
    			if (!answerStr.matches(&quot;[\\d]{3}&quot;)) {
    				JOptionPane.showMessageDialog(this, &quot;세자리숫자를 입력해주세요&quot;);
    				tf.setText(&quot;&quot;);
    				return;
    			} // 세자리 숫자 제외의 입력 방지
    
    			int answerNum = Integer.parseInt(answerStr);
    			baseballAnswer[0] = answerNum / 100;
    			baseballAnswer[1] = (answerNum % 100) / 10;
    			baseballAnswer[2] = answerNum % 10;
    
    			for (int i = 0; i &amp;lt; baseballAnswer.length - 1; i++) {
    				for (int j = i + 1; j &amp;lt; baseballAnswer.length; j++) {
    					if (baseballAnswer[i] == baseballAnswer[j]) {
    						JOptionPane.showMessageDialog(this, &quot;중복되지 않는 숫자를 입력해주세요&quot;);
    						tf.setText(null);
    						return;
    					}
    				}
    			} // 세자리수 중복 방지
    
    			cnt++;//숫자입력후 게임진행횟수 증가
    			
    			for (int i = 0; i &amp;lt; baseballRandNum.length; i++) {
    				for (int j = 0; j &amp;lt; baseballAnswer.length; j++) {
    					if (baseballRandNum[i] == baseballAnswer[j]) {
    						if (i == j)
    							strikeCnt++;
    						else
    							ballCnt++;
    					}
    				}
    			} // 스트라이크 볼 측정
    
    			if (strikeCnt == 3) {
    				ta.append(&quot;축하합니다~!!^^&quot; + baseballAnswer[0] + baseballAnswer[1]
    						+ baseballAnswer[2] + &quot;는 정답입니다!\n&quot;);
    				// 게임종료후 버튼, 텍스트 필드 비활성화
    				tf.setEditable(false);
    				bt_answer.setEnabled(false);
    				tf.setText(&quot;&quot;);// textField 비우기
    				return;
    			} // 스트라이크 달성
    
    			ta.append(cnt + &quot;회 : &quot; + baseballAnswer[0] + baseballAnswer[1] + baseballAnswer[2]);
    			ta.append(&quot; : &quot; + ballCnt + &quot;볼 &quot; + strikeCnt + &quot;스트라이크\n&quot;);
    
    			tf.setText(&quot;&quot;);// textField 비우기
    		} // textField 동작
    	}//customTextAction end
    
    	public static void main(String[] args) {
    		new NumBaseballGame();
    	}
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자바스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VRRo5/btqv6EL3tLd/qwcja9OngQvOFB6TUK2Y40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VRRo5/btqv6EL3tLd/qwcja9OngQvOFB6TUK2Y40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VRRo5/btqv6EL3tLd/qwcja9OngQvOFB6TUK2Y40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVRRo5%2Fbtqv6EL3tLd%2Fqwcja9OngQvOFB6TUK2Y40%2Fimg.png&quot; data-filename=&quot;자바스터디.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;</description>
      <category>Web develop/JAVA</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/30</guid>
      <comments>https://fora.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 2 May 2019 19:13:38 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 자바 Swing Event 사용 및 예제</title>
      <link>https://fora.tistory.com/29</link>
      <description>&lt;ul&gt;
&lt;li&gt;순수 자바언어로 구성&lt;/li&gt;
&lt;li&gt;운영체제에 상관없이 동일한 컴포넌트 지원&lt;/li&gt;
&lt;li&gt;javax.swing.*; // x:extension(확장)&lt;/li&gt;
&lt;li&gt;AWT와 비교하여 첫글자가 'J'로 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;MouseEvent&lt;/h1&gt;
&lt;p&gt;Mouse의 움직임 -&amp;gt; 이벤트. 여러 컴포넌트에 공통적으로 적용할 수 있는 이벤트&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;public class MouseEventTest extends JFrame implements MouseListener{}

@Override
    public void mouseClicked(MouseEvent e) {
    //컴포넌트를 클릭했을때 실행 
    }

    @Override
    public void mousePressed(MouseEvent e) {
    //컴포넌트를 눌렀을때 실행
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    //컴포넌트를 클릭하지않고 떼어냈을때 실행
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    //컴포넌트 위에 커서를 올렸을때 실행
    }

    @Override
    public void mouseExited(MouseEvent e) {
    //커서가 컴포넌트 위에서 나갔을 때 실행 
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;NullLayout&lt;/h1&gt;
&lt;p&gt;: 컨테이너에 부착되는 컴포넌트는 위치(x,y)와 사이즈(가로,세로) 설정&lt;/p&gt;
&lt;pre class=&quot;x86asm&quot;&gt;&lt;code&gt;setLayout(null);
bt.setBounds(80,50,100,100);

//bt.setBounds(int x,int y,int width, int height);
//bt.setLocation(int x,int y);
//bt.setSize(int width, int height); ==&amp;gt; location, size 합쳐서 bounds&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;br /&gt;그 외 사용 문법&lt;/h1&gt;
&lt;h3&gt;Swing의 String문자열 안에 HTML 태그 사용&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;bt = new JButton(&quot;&amp;lt;html&amp;gt;&amp;lt;font size=20 color=red face=궁서체&amp;gt;버어어튼&amp;lt;/font&amp;gt;&amp;lt;/html&amp;gt;&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;x버튼 클릭시 프로그램 종료&lt;/h3&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;폼을 닫았을 때 메인뷰로 이동(windowClosing 사용)&lt;/h3&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;private void eventUp(){

form.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e){
        form.setVisible(false);
        mainView.setVisible(true);
    }
}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ImageIcon 클래스를 사용해서 이미지 삽입하기&lt;/h3&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;ImageIcon icon = new ImageIcon(&quot;image/leftRollover.gif&quot;); //경로는 대소문자구분 x

//JCheckBox(String text, Icon icon);
cb1 = new JCheckBox(&quot;첫번째체크박스&quot;,icon);
    cb1.setRolloverIcon(icon);//체크박스 위에 마우스가 놓여졌을 때 
    cb1.setSelectedIcon(icon2);//체크박스가 선택되었을때&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;패널 타이틀과 패널에 음영주기&lt;/h3&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;panel.setBorder(new TitledBorder(&quot;패널타이틀&quot;));
panel.setBorder(new BevelBorder(BevelBorder.RAISED));//양각
panel.setBorder(new BevelBorder(BevelBorder.LOWERED));//음각&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Swing ItemMoveTest 예제&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cts0v1/btqv3JAYe4p/JqJGd2LumHfU3ddTeWSsJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cts0v1/btqv3JAYe4p/JqJGd2LumHfU3ddTeWSsJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cts0v1/btqv3JAYe4p/JqJGd2LumHfU3ddTeWSsJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcts0v1%2Fbtqv3JAYe4p%2FJqJGd2LumHfU3ddTeWSsJ1%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;pre id=&quot;code_1560531898379&quot; class=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ItemMoveTest extends JFrame implements ActionListener{

  JList&amp;lt;String&amp;gt; left_list, right_list;
  JTextField left_tf, right_tf;
  JButton bt_right,bt_right_all,bt_left,bt_left_all;

  JPanel leftp, centerp, rightp;
  JScrollPane left_scrol, right_scrol; 
//JFrame에서는 스크롤이 지원안되기에 JScrollPane으로 따로 지정을 해주어야 함.보통 JList, JTextArea, JTable과 함께 쓴다.

  Vector&amp;lt;String&amp;gt; leftV;
  Vector&amp;lt;String&amp;gt; rightV;

  public ItemMoveTest() {

      // ======list의 Vector 데이터 지정=====
      leftV = new Vector&amp;lt;String&amp;gt;();
      rightV = new Vector&amp;lt;String&amp;gt;();

      left_list = new JList&amp;lt;String&amp;gt;();
      left_scrol = new JScrollPane(left_list);

      right_list = new JList&amp;lt;String&amp;gt;();
      right_scrol = new JScrollPane(right_list);

      //===== Component 선언======
      left_tf = new JTextField();
      right_tf = new JTextField();

      bt_right = new JButton(&quot;▷&quot;);
      bt_right_all = new JButton(&quot;▶&quot;);
      bt_left = new JButton(&quot;◁&quot;);
      bt_left_all = new JButton(&quot;◀&quot;);

      //===== Panel =====
      leftp = new JPanel();
          leftp.setLayout(new BorderLayout());
          leftp.add(&quot;Center&quot;,left_scrol);//스크롤바가 있는 JList붙이기
          leftp.add(&quot;South&quot;,left_tf);        

      rightp = new JPanel();
          rightp.setLayout(new BorderLayout());
          rightp.add(&quot;Center&quot;,right_scrol);
          rightp.add(&quot;South&quot;,right_tf);        

      centerp = new JPanel();
          centerp.setBackground(Color.YELLOW);
          centerp.setLayout(new GridLayout(6,3,10,10));
          centerp.add(new JLabel());centerp.add(new JLabel());centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_right);     centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_right_all); centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_left);    centerp.add(new JLabel());
          centerp.add(new JLabel());centerp.add(bt_left_all);centerp.add(new JLabel());
          // JLabel의 공백을 이용하여 위치를 지정한 것이지만 비효율적. 나중에 Null레이아웃을 사용

      //=====SET ======
      setTitle(&quot;Item움직이기&quot;);
      setLayout(new GridLayout(1,3));
      add(leftp);
      add(centerp);
      add(rightp);

      setSize(600, 300);
      setVisible(true);
      setDefaultCloseOperation(EXIT_ON_CLOSE);

      eventUp();
  }//생성자

  private void eventUp() { //이벤트 소스 등록
    // ====BUTTON ====
        bt_left.addActionListener(this);//bt_left에 액션을 감지하다가 핸들러 호출.
        bt_left_all.addActionListener(this);
        bt_right.addActionListener(this);
        bt_right_all.addActionListener(this);

    //텍스트필드
        left_tf.addActionListener(this);
        right_tf.addActionListener(this);            
  }//eventup

  @Override
  public void actionPerformed(ActionEvent e) {//핸들러
      //액션: 버튼누르기, 텍스트필드에 enter입력

      Object ob = e.getSource(); 
      //이벤트 발생시킨 이벤트소스의 주소 얻기

      if(ob==left_tf) {
          String str = left_tf.getText();

          if(str.trim().contentEquals(&quot;&quot;)) { //str이 공백이라면
              left_tf.setText(&quot;&quot;);
              return;
          }

          leftV.add(str);//벡터에 담고
          left_list.setListData(leftV);// 벡터데이터를 JList에 반영
          left_tf.setText(&quot;&quot;);//원본 삭제

      }else if(ob == right_tf) {
          String str = right_tf.getText();

          if(str.trim().length()&amp;lt;1) {
              right_tf.setText(&quot;&quot;);
              return;
          }
          rightV.add(str);
          right_list.setListData(rightV);

          right_tf.setText(&quot;&quot;);
      }
      if (ob == bt_right) {
          String str = left_list.getSelectedValue();

          if(str == null) {
              JOptionPane.showMessageDialog(this, &quot;이동할 아이템 선택&quot;);
              return;
          }

          rightV.add(str);
          right_list.setListData(rightV);

          leftV.remove(str);
          left_list.setListData(leftV);

      }else if (ob == bt_right_all) {
          for(int i = 0; i&amp;lt;leftV.size();i++) {
              rightV.add(leftV.get(i));
          }

          leftV.clear();
          //leftV.removeAll();

          //각 리스트에 변경된 벡터내용 추가
          left_list.setListData(leftV);
          right_list.setListData(rightV);
      }else if(ob == bt_left) {
          String str = right_list.getSelectedValue();
          if(str == null) {
              JOptionPane.showMessageDialog(this, &quot;이동할 아이템 선택&quot;);
              return;
          }

          leftV.add(str);
          left_list.setListData(leftV);

          rightV.remove(str);
          right_list.setListData(rightV);

      }else if(ob == bt_left_all) {
          for(int i = 0; i&amp;lt;rightV.size();i++) {
              leftV.add(rightV.get(i));
          }

          rightV.clear();

          right_list.setListData(rightV);
          left_list.setListData(leftV);
      }
  }//Action

  public static void main(String[] args) {
      new ItemMoveTest();
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;자바스터디.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqzMs/btqv5W0tBzO/760efVoFVuJ28vESsCkZv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqzMs/btqv5W0tBzO/760efVoFVuJ28vESsCkZv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqzMs/btqv5W0tBzO/760efVoFVuJ28vESsCkZv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqzMs%2Fbtqv5W0tBzO%2F760efVoFVuJ28vESsCkZv1%2Fimg.png&quot; data-filename=&quot;자바스터디.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;</description>
      <category>Web develop/JAVA</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/29</guid>
      <comments>https://fora.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 2 May 2019 10:37:00 +0900</pubDate>
    </item>
    <item>
      <title>[생활코딩] 정규표현식</title>
      <link>https://fora.tistory.com/28</link>
      <description>&lt;h4&gt;기본 패턴 / 문자&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 340px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 30px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 30px;&quot;&gt;정규표현식&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 30px; text-align: left;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 31px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 31px;&quot;&gt;^who (캐럿)&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 31px; text-align: left;&quot;&gt;
&lt;p&gt;&lt;b&gt;who&lt;/b&gt; is who&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;문자열의&amp;nbsp;시작을&amp;nbsp;표현하며&amp;nbsp;who&amp;nbsp;문자로&amp;nbsp;시작됨을&amp;nbsp;의미함&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 31px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 31px;&quot;&gt;who$ (달러)&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 31px; text-align: left;&quot;&gt;
&lt;p&gt;who is &lt;b&gt;who&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;문자열의 끝을 표현하며 who 문자로 끝남을 의미함&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 48px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 48px;&quot;&gt;\&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 48px; text-align: left;&quot;&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;역슬래쉬 Escape. 기호 뒤에 따라오는 문자를 정규표현식이 아닌 단순한 문자로 바꿔주는 역할&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;\$ (문자 $)&lt;/p&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;^\$(문자열 시작에오는 $)&lt;/p&gt;
&lt;p style=&quot;font-size: 0.94em;&quot;&gt;\$$ (문자열 끝에오는 $)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 31px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 31px;&quot;&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 31px; text-align: left;&quot;&gt;
&lt;p&gt;&lt;b&gt;How do you do&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;모든 문자를 가리키는 기호&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 78px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 78px;&quot;&gt;......&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; text-align: left; height: 78px;&quot;&gt;
&lt;p&gt;&lt;b&gt;How do&lt;/b&gt;(/)&lt;b&gt; you d&lt;/b&gt;o&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;문자에서 여섯개로 묶은 부분&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 31px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 31px;&quot;&gt;[ ]&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 31px; text-align: left;&quot;&gt;
&lt;p&gt;How do you do?&lt;/p&gt;
&lt;p&gt;[oyu] -&amp;gt; 문자에서 o,y,u를 찾아줌&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;[dH]. -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Ho&lt;/b&gt;w&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;do&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;yo&lt;/b&gt;u&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;do&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;[]는 문자로 취급받기에&lt;/p&gt;
&lt;p&gt;'.'이 붙으며 2개의 문자를 묶는다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[owy][yow]&lt;/p&gt;
&lt;p&gt;H&lt;b&gt;ow&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;do&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;yo&lt;/b&gt;u do?&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 20px;&quot;&gt;[ - ]&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 20px; text-align: left;&quot;&gt;
&lt;p&gt;[C-Ka-d2-6]&lt;/p&gt;
&lt;p&gt;AB&lt;b&gt;CDEFGHIJK&lt;/b&gt;LMNOPQRSTUVWXYZ&lt;/p&gt;
&lt;p&gt;&lt;b&gt;abcd&lt;/b&gt;efghijklmnopqrstuvwxyz01&lt;b&gt;23456&lt;/b&gt;789&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 20px;&quot;&gt;[ ^ ]&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 20px; text-align: left;&quot;&gt;
&lt;p&gt;대괄호에서의 ^는 not의 의미.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[^CDghi45]&lt;/p&gt;
&lt;p&gt;&lt;b&gt;AB&lt;/b&gt;CD&lt;b&gt;EFGHIJKLMNOPQRSTUVWXYZ&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;abcdef&lt;/b&gt;ghi&lt;b&gt;jklmnopqrstuvwxyz0123&lt;/b&gt;45&lt;b&gt;6789&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 5.89147%; text-align: center; height: 20px;&quot;&gt;( | )&lt;/td&gt;
&lt;td style=&quot;width: 34.6123%; height: 20px; text-align: left;&quot;&gt;
&lt;p&gt;문자열을 선택하는 기호&lt;/p&gt;
&lt;p&gt;(on|ues|rida)&lt;/p&gt;
&lt;p&gt;M&lt;b&gt;on&lt;/b&gt;day T&lt;b&gt;ues&lt;/b&gt;day F&lt;b&gt;rida&lt;/b&gt;y&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(Mon|Tues|Fri)day&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;M&lt;/span&gt;on&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;day T&lt;/span&gt;ues&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;day F&lt;/span&gt;rida&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;y&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;..(id|esd|nd)ay //문자 두개와 (id,esd,nd)ay가 포함되는 문구&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;M&lt;/span&gt;on&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;day T&lt;/span&gt;ues&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;day F&lt;/span&gt;rida&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;y&lt;/span&gt;&amp;nbsp;&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;h4&gt;수량자&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 498px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.7675%; text-align: center; height: 20px;&quot;&gt;정규표현식&lt;/td&gt;
&lt;td style=&quot;width: 85.2325%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 103px;&quot;&gt;
&lt;td style=&quot;width: 14.7675%; text-align: center; height: 103px;&quot;&gt;*&lt;/td&gt;
&lt;td style=&quot;width: 85.2325%; height: 103px;&quot;&gt;
&lt;p&gt;0~여러개&lt;/p&gt;
&lt;p&gt;a*b (a가 없어도 됨)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;aab&lt;/b&gt;c &lt;b&gt;ab&lt;/b&gt;c &lt;b&gt;b&lt;/b&gt;c&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;-A*-&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;-@-***&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;&quot;*&quot;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;***-@-&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;[-@]*&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@-&lt;/span&gt;***&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;&quot;*&quot;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;***&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@-&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 103px;&quot;&gt;
&lt;td style=&quot;width: 14.7675%; text-align: center; height: 103px;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;width: 85.2325%; height: 103px;&quot;&gt;
&lt;p&gt;1~여러개&lt;/p&gt;
&lt;p&gt;a+b (반드시 a가 한개이상)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;aab&lt;/b&gt;c &lt;b&gt;ab&lt;/b&gt;c bc&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;\*+&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;-@-&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;***&lt;/span&gt;--&quot;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;*&lt;/span&gt;&quot;--&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;***&lt;/span&gt;-@-&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;-@+-&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@@@-&lt;/span&gt;***--&quot;*&quot;--***&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@@@-&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;[^ ]+ (^ 옆에 공백. 공백 부정)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@@@-&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;**&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&quot;*&quot;&lt;/span&gt; &lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 103px;&quot;&gt;
&lt;td style=&quot;width: 14.7675%; text-align: center; height: 103px;&quot;&gt;?&lt;/td&gt;
&lt;td style=&quot;width: 85.2325%; height: 103px;&quot;&gt;
&lt;p&gt;0 or 1&lt;/p&gt;
&lt;p&gt;a?b&lt;/p&gt;
&lt;p&gt;a&lt;b&gt;ab&lt;/b&gt;c &lt;b&gt;ab&lt;/b&gt;c &lt;b&gt;b&lt;/b&gt;c&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-X?XX?X&lt;/p&gt;
&lt;p&gt;-&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-XX&lt;/span&gt;-@&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-XX&lt;/span&gt;-@@&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-XX&lt;/span&gt;-@@@&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-XX&lt;/span&gt;-@@&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-@?@?@?-&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;--&lt;/span&gt;XX&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@-&lt;/span&gt;XX&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@@@-&lt;/span&gt;XX-@@@@-&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 77px;&quot;&gt;
&lt;td style=&quot;width: 14.7675%; text-align: center; height: 77px;&quot;&gt;.*&lt;/td&gt;
&lt;td style=&quot;width: 85.2325%; height: 77px;&quot;&gt;
&lt;p&gt;모든 텍스트를 의미&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; background-color: #96d5fa;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;-@-***--&quot;*&quot;--***-@-&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;h4&gt;수량자 2&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 328px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.3023%; text-align: center; height: 20px;&quot;&gt;정규표현식&lt;/td&gt;
&lt;td style=&quot;width: 85.6977%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 228px;&quot;&gt;
&lt;td style=&quot;width: 14.3023%; text-align: center; height: 228px;&quot;&gt;.{5}&lt;/td&gt;
&lt;td style=&quot;width: 85.6977%; height: 228px;&quot;&gt;
&lt;p&gt;어떠한 문자건간에(.) 5글자&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;One ring to bring them all and in the darkness bind the&lt;/span&gt;m&lt;/p&gt;
&lt;p&gt;--&amp;gt; 5개씩 끊었을 때 m은 포함이 되지않는다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[els]{1,3} (한개이상 3개이하)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;On&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;e&lt;/span&gt; ring to bring th&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;e&lt;/span&gt;m a&lt;span style=&quot;background-color: #96d5fa;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;ll&lt;/span&gt;&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; data-darkreader-inline-color=&quot;&quot;&gt;[a-z]{3,} (3 이상)&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.3023%; text-align: center; height: 20px;&quot;&gt;
&lt;p&gt;AB*A&lt;/p&gt;
&lt;p&gt;(= AB{0,}A)&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 85.6977%; height: 20px;&quot;&gt;&lt;b&gt;AA&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;ABA&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;ABBA&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/span&gt;ABBBA&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.3023%; text-align: center; height: 20px;&quot;&gt;
&lt;p&gt;AB+A&lt;/p&gt;
&lt;p&gt;(= AB{1,}A)&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 85.6977%; height: 20px;&quot;&gt;AA &lt;b&gt;ABA ABBA ABBBA&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.3023%; text-align: center; height: 20px;&quot;&gt;
&lt;p&gt;AB?A&lt;/p&gt;
&lt;p&gt;(=AB{0,1}A)&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 85.6977%; height: 20px;&quot;&gt;&lt;b&gt;&lt;span&gt;AA&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ABA&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ABBA&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ABBBA&lt;/span&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;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://zvon.org/&quot;&gt;http://zvon.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC/Study</category>
      <author>ForA</author>
      <guid isPermaLink="true">https://fora.tistory.com/28</guid>
      <comments>https://fora.tistory.com/28#entry28comment</comments>
      <pubDate>Wed, 1 May 2019 21:10:37 +0900</pubDate>
    </item>
  </channel>
</rss>