<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>오오코딩</title>
    <link>https://vmpo.tistory.com/</link>
    <description>코딩 기록</description>
    <language>ko</language>
    <pubDate>Sun, 31 May 2026 22:46:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>vmpo</managingEditor>
    <image>
      <title>오오코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/3290549/attach/8dfdf2cb0e814beba15f843f48fb6539</url>
      <link>https://vmpo.tistory.com</link>
    </image>
    <item>
      <title>react 함수들</title>
      <link>https://vmpo.tistory.com/132</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜변환하기&lt;/p&gt;
&lt;pre class=&quot;qml&quot; style=&quot;background-color: #2d2d2d; color: #cccccc; text-align: left;&quot;&gt;&lt;code&gt;const date = new Date();

const year = date.getFullYear();
const month = ('0' + (date.getMonth() + 1)).slice(-2);
const day = ('0' + date.getDate()).slice(-2);
const hours = ('0' + date.getHours()).slice(-2);
const minutes = ('0' + date.getMinutes()).slice(-2);
const seconds = ('0' + date.getSeconds()).slice(-2);

const dateStr = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
console.log(dateStr);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codechacha.com/ko/javascript-date-format/#:~:text=JavaScript%20-%20%EB%82%A0%EC%A7%9C%2C%20%EC%8B%9C%EA%B0%84%20%ED%8F%AC%EB%A7%B7%20%28Date%20format%29%201,%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%20...%205%205.%20%EB%8B%A4%EC%96%91%ED%95%9C%20%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98%20&quot;&gt;JavaScript - 날짜, 시간 포맷 (Date format) (codechacha.com)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;color: #111111; text-align: start;&quot;&gt;&lt;code&gt;let name = &quot;홍길동&quot;;
let age = 25;
let message = `안녕하세요, 저는 ${name}이고 ${age}살입니다.`;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/132</guid>
      <comments>https://vmpo.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 22 Aug 2023 11:15:11 +0900</pubDate>
    </item>
    <item>
      <title>leetcode 5. Longest Palindromic Substring 풀이</title>
      <link>https://vmpo.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;leetcode 5번문제 풀이를 해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제.&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;[요약]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;- 주어진 문자열에서 최대 길이를 갖는 문자열을 리턴해라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;-회문은 앞에서 부터 읽든, 뒤에서부터 읽든 동일한 문자열.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s, return&amp;nbsp;the longest palindromic substring&lt;span&gt;&amp;nbsp;&lt;/span&gt;in&lt;span&gt;&amp;nbsp;&lt;/span&gt;s.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; s = &quot;babad&quot; &lt;b&gt;Output:&lt;/b&gt; &quot;bab&quot; &lt;b&gt;Note:&lt;/b&gt; &quot;aba&quot; is also a valid answer.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; s = &quot;cbbd&quot; &lt;b&gt;Output:&lt;/b&gt; &quot;bb&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; s = &quot;a&quot; &lt;b&gt;Output:&lt;/b&gt; &quot;a&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 4:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; s = &quot;ac&quot; &lt;b&gt;Output:&lt;/b&gt; &quot;a&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&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;1 &amp;lt;= s.length &amp;lt;= 1000&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist of only digits and English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1633507611280&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String longestPalindrome(String s) {
        String maxStr = &quot;&quot;;
        for (int i = 0; i &amp;lt; s.length(); i++) {
          String str1 = checkPalind(s, i, i);
          String str2 = checkPalind(s, i, i + 1);

          if (str1.length() &amp;gt; maxStr.length() &amp;amp;&amp;amp; str1.length() &amp;gt;= str2.length()) {
            maxStr = str1;
          }
          if (str2.length() &amp;gt; maxStr.length() &amp;amp;&amp;amp; str1.length() &amp;lt; str2.length()) {
            maxStr = str2;
          }
        }
        return maxStr;
    }
    
  public String checkPalind(String s, int left, int right) {
    while (left &amp;gt;= 0 &amp;amp;&amp;amp; right &amp;lt; s.length()) {
      if (s.charAt(left) == s.charAt(right)) {
        left--;
        right++;
      } else {
        break;
      }
    }
    left++; //while문에서 감소 시키고 끝났으므로, 원래 위치로 돌아오기 위해 다시 돌려줌.
    right--; //while문에서 증가 시키고 끝났으므로, 원래 위치로 돌아오기 위해 다시 돌려줌.
    return s.substring(left, right + 1);
  }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로직 설명.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.일단 문자열이 회문이려면 짝수 or 홀수여야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.짝수인 경우와, 홀수인 경우를 나눠서 계산함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. for loop로 문자열의 첫번째부터 검색해들어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 0번 인덱스 부터시작하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; while문으로 해당 인덱스부터 좌, 우로 뻗어나가면서 문자열이 일치하는지 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) &quot;aba&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for loop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; a 부터 시작&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(홀수)a 와 바로 옆문자까지 포함한 (짝수)ab에 대해서 확인을 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀수 케이스 . a의 경우 우측에는 문자열이 있지만, 좌측에는 문자열이 없으므로 회문이 아님 다음으로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짝수 케이스 . ab의 경우 a, b가 서로 다른 문자이므로 회문이 아님 다음으로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다음 for문 다음 인덱스로 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; b부터 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(홀수) b와 바로 옆문자까지 포함한 (짝수)ba에 대해서 확인을 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀수 케이스 . b의 경우 좌측, 우측에 모두 문자열이 있으므로 해당 문자열을 비교, 같으므로 회문 문자열이라 판단.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;좌우로 한칸씩 뻗어감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aba에 대해 다시 우측과 좌측 문자열 확인, 좌우측 더이상 문자열이 없으므로 다음으로 넘어감.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;aba&quot;를 리턴함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짝수 케이스 . ab의 경우 a, b가 서로 다른 문자이므로 회문이 아님 다음으로 넘어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 maxStr의 length보다 리턴받은 &quot;aba&quot;가 더 크므로 maxStr에 &quot;aba&quot;를 저장함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다음 for문 인덱스로 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; a부터 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 동일한 로직을 수행하며, 좌측으로 뻗어갈수 있지만 오른쪽으로는 불가하므로 더이상 &quot;aba&quot;보다 큰 회문 문자열 생성불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 &quot;aba&quot;가 리턴됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/131</guid>
      <comments>https://vmpo.tistory.com/131#entry131comment</comments>
      <pubDate>Wed, 6 Oct 2021 17:26:55 +0900</pubDate>
    </item>
    <item>
      <title>docker에 mysql 띄우고 데이터 조회해보기</title>
      <link>https://vmpo.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 도커를 설치안했다면 아래 페이지 확인부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/129&quot;&gt;M1맥북 도커 docker 설치하기 - 오오코딩 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633438381399&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;M1맥북 도커 docker 설치하기&quot; data-og-description=&quot;M1 맥북에어에서 도커를 설치해보도록 하겠습니다. docker 설치 먼저 docker를 설치하도록 하겠습니다. 저는 m1 맥북 사용중이라 아래와 같이 구글에서 검색어를 통해 설치하도록 하겠습니다. &amp;nbsp;-&amp;gt; doc&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/129&quot; data-og-url=&quot;https://vmpo.tistory.com/129&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biZlgg/hyLQ9wafK2/2TJfCIBQTK0qu3h6OO2LD0/img.png?width=279&amp;amp;height=131&amp;amp;face=0_0_279_131,https://scrap.kakaocdn.net/dn/IVJei/hyLRc0IroY/7joKDzJogRNesvi6W0XLg0/img.png?width=279&amp;amp;height=131&amp;amp;face=0_0_279_131,https://scrap.kakaocdn.net/dn/WTqcU/hyLQ8xe3Mc/wkNh7iKtiZSFKG4M3dZzk0/img.png?width=2586&amp;amp;height=922&amp;amp;face=0_0_2586_922&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/129&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/129&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biZlgg/hyLQ9wafK2/2TJfCIBQTK0qu3h6OO2LD0/img.png?width=279&amp;amp;height=131&amp;amp;face=0_0_279_131,https://scrap.kakaocdn.net/dn/IVJei/hyLRc0IroY/7joKDzJogRNesvi6W0XLg0/img.png?width=279&amp;amp;height=131&amp;amp;face=0_0_279_131,https://scrap.kakaocdn.net/dn/WTqcU/hyLQ8xe3Mc/wkNh7iKtiZSFKG4M3dZzk0/img.png?width=2586&amp;amp;height=922&amp;amp;face=0_0_2586_922');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;M1맥북 도커 docker 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;M1 맥북에어에서 도커를 설치해보도록 하겠습니다. docker 설치 먼저 docker를 설치하도록 하겠습니다. 저는 m1 맥북 사용중이라 아래와 같이 구글에서 검색어를 통해 설치하도록 하겠습니다. &amp;nbsp;-&amp;gt; doc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Mysql image 내려받아 띄우기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 docker에서 mysql을 띄워 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 명령어 하나로 쉽게 띄울수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m1 맥북의 경우에는 run 다음에 --platform linux/amd64를 꼭 입력해 주어야 합니다. (intel 칩 맥북은 제외)&lt;/p&gt;
&lt;pre id=&quot;code_1633438739100&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker run --platform linux/amd64 -p 3306:3306 --name mysql_container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=main -e MYSQL_USER=oogo -e MYSQL_PASSWORD=1111 -d mysql&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1633439482757&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --platform linux/amd64 
-p 3306:3306 [도커외부포트:도커내부포트]
--name [컨테이너 이름] 
-e MYSQL_ROOT_PASSWORD=[루트 유저 비밀번호] 
-e MYSQL_DATABASE=[데이터베이스 이름] 
-e MYSQL_USER=[유저 이름] 
-e MYSQL_PASSWORD=[비밀번호] 
-d mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에 위 명령어를 입력해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 이미지가 다운로드 되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;906&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCspL/btrgOt1pZMX/t3ZpyISU5F7bbRQwvYIaQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCspL/btrgOt1pZMX/t3ZpyISU5F7bbRQwvYIaQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCspL/btrgOt1pZMX/t3ZpyISU5F7bbRQwvYIaQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCspL%2FbtrgOt1pZMX%2Ft3ZpyISU5F7bbRQwvYIaQk%2Fimg.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;906&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;내려받은 이미지를 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;140&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJPJ8M/btrgWCCbt6I/czz0cywr0km9sUsk4uqw7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJPJ8M/btrgWCCbt6I/czz0cywr0km9sUsk4uqw7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJPJ8M/btrgWCCbt6I/czz0cywr0km9sUsk4uqw7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJPJ8M%2FbtrgWCCbt6I%2Fczz0cywr0km9sUsk4uqw7K%2Fimg.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;140&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설치가 되었고 실행이 되고 있는 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1440&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0BLys/btrgU0X9Tma/H3HzIyNvk2lUcAkJk2sR6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0BLys/btrgU0X9Tma/H3HzIyNvk2lUcAkJk2sR6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0BLys/btrgU0X9Tma/H3HzIyNvk2lUcAkJk2sR6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0BLys%2FbtrgU0X9Tma%2FH3HzIyNvk2lUcAkJk2sR6K%2Fimg.png&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1440&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Mysql 접속하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 mysql 서버에 접속해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql에 접속하기 위한 툴로 무료툴인 dbeaver를 설치하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brew가 설치되어 있을 경우 아래 커맨드로 설치가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633439319856&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew install --cask dbeaver-community&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;924&quot; width=&quot;567&quot; height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BR38v/btrgVRs61gf/PH8Di6XTvXD53vBhoJKOL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BR38v/btrgVRs61gf/PH8Di6XTvXD53vBhoJKOL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BR38v/btrgVRs61gf/PH8Di6XTvXD53vBhoJKOL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBR38v%2FbtrgVRs61gf%2FPH8Di6XTvXD53vBhoJKOL0%2Fimg.png&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;924&quot; width=&quot;567&quot; height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brew가 없는 경우 아래 url에서 설치파일을 다운받아 설치하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot;&gt;Download | DBeaver Community&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633439342103&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download | DBeaver Community&quot; data-og-description=&quot;Download Tested and verified for MS Windows, Linux and Mac OS X. Install: Windows installer &amp;ndash; run installer executable. It will automatically upgrade version (if needed). MacOS DMG &amp;ndash; just run it and drag-n-drop DBeaver into Applications. Debian package&quot; data-og-host=&quot;dbeaver.io&quot; data-og-source-url=&quot;https://dbeaver.io/download/&quot; data-og-url=&quot;https://dbeaver.io/download/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dbeaver.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbeaver.io/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download | DBeaver Community&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Download Tested and verified for MS Windows, Linux and Mac OS X. Install: Windows installer &amp;ndash; run installer executable. It will automatically upgrade version (if needed). MacOS DMG &amp;ndash; just run it and drag-n-drop DBeaver into Applications. Debian package&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbeaver.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었으면 이제 도커로 띄운 mysql에 연결해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdzyj9/btrgOuF3sZT/1WQiCiB0UPZ6iOLgS7ZoR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdzyj9/btrgOuF3sZT/1WQiCiB0UPZ6iOLgS7ZoR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdzyj9/btrgOuF3sZT/1WQiCiB0UPZ6iOLgS7ZoR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdzyj9%2FbtrgOuF3sZT%2F1WQiCiB0UPZ6iOLgS7ZoR0%2Fimg.png&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설정한 db명과 root비밀번호를 입력해 설정해줍니다. 그리고 완료버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciEpx/btrgVRmoY17/3CFWDfO2c8mXaqU1BYuRuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciEpx/btrgVRmoY17/3CFWDfO2c8mXaqU1BYuRuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciEpx/btrgVRmoY17/3CFWDfO2c8mXaqU1BYuRuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcciEpx%2FbtrgVRmoY17%2F3CFWDfO2c8mXaqU1BYuRuK%2Fimg.png&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 연결시에는 드라이버가 없기때문에 자동으로 드라이버 설치 팝업이 뜨며 설치를 진행하면 자동으로 다운로드가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7cEY1/btrgOtAj6e7/8VDjbxcY0Gzre0m6Uh67Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7cEY1/btrgOtAj6e7/8VDjbxcY0Gzre0m6Uh67Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7cEY1/btrgOtAj6e7/8VDjbxcY0Gzre0m6Uh67Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7cEY1%2FbtrgOtAj6e7%2F8VDjbxcY0Gzre0m6Uh67Wk%2Fimg.png&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1340&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이버 프로퍼티스 탭에서 allowPublicKeyRetrieval을 true로 변경해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1496&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKvcRc/btrgXicuXom/gDXSHKxtNqfKOz8RpJllu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKvcRc/btrgXicuXom/gDXSHKxtNqfKOz8RpJllu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKvcRc/btrgXicuXom/gDXSHKxtNqfKOz8RpJllu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKvcRc%2FbtrgXicuXom%2FgDXSHKxtNqfKOz8RpJllu0%2Fimg.png&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1496&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결을 해보면 정상적으로 접속이되는 것을 확인 할 수 있습니다!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1360&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Kmei/btrgU1pgxsq/bjpy7IWHJ7Z3F8K7aycKX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Kmei/btrgU1pgxsq/bjpy7IWHJ7Z3F8K7aycKX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Kmei/btrgU1pgxsq/bjpy7IWHJ7Z3F8K7aycKX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Kmei%2FbtrgU1pgxsq%2Fbjpy7IWHJ7Z3F8K7aycKX1%2Fimg.png&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;1360&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 테이블을 생성하고 데이터를 넣고 조회를 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 저장, 조회가 되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;750&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvdvcf/btrgV82vV9J/aGFKwOKZipkR0ngYkKuk61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvdvcf/btrgV82vV9J/aGFKwOKZipkR0ngYkKuk61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvdvcf/btrgV82vV9J/aGFKwOKZipkR0ngYkKuk61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvdvcf%2FbtrgV82vV9J%2FaGFKwOKZipkR0ngYkKuk61%2Fimg.png&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;750&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버/docker</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/130</guid>
      <comments>https://vmpo.tistory.com/130#entry130comment</comments>
      <pubDate>Tue, 5 Oct 2021 23:32:33 +0900</pubDate>
    </item>
    <item>
      <title>M1맥북 도커 docker 설치하기</title>
      <link>https://vmpo.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;M1 맥북에어에서 도커를 설치해보도록 하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;docker 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 docker를 설치하도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 m1 맥북 사용중이라 아래와 같이 구글에서 검색어를 통해 설치하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; docker desktop for apple silicon 웹페이지 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2586&quot; data-origin-height=&quot;922&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6NbjI/btrgQBrkqMO/vtAxalyPIxcWslwi6lqraK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6NbjI/btrgQBrkqMO/vtAxalyPIxcWslwi6lqraK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6NbjI/btrgQBrkqMO/vtAxalyPIxcWslwi6lqraK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6NbjI%2FbtrgQBrkqMO%2FvtAxalyPIxcWslwi6lqraK%2Fimg.png&quot; data-origin-width=&quot;2586&quot; data-origin-height=&quot;922&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;downlaod 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2586&quot; data-origin-height=&quot;922&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nscZt/btrgV6wMLU9/TvFDlqRdkJbVPSzYO414DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nscZt/btrgV6wMLU9/TvFDlqRdkJbVPSzYO414DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nscZt/btrgV6wMLU9/TvFDlqRdkJbVPSzYO414DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnscZt%2FbtrgV6wMLU9%2FTvFDlqRdkJbVPSzYO414DK%2Fimg.png&quot; data-origin-width=&quot;2586&quot; data-origin-height=&quot;922&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드파일을 실행해주겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1182&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccS4Jf/btrgVSFyRo4/79JDyuaCODBsfMmUIGhEDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccS4Jf/btrgVSFyRo4/79JDyuaCODBsfMmUIGhEDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccS4Jf/btrgVSFyRo4/79JDyuaCODBsfMmUIGhEDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccS4Jf%2FbtrgVSFyRo4%2F79JDyuaCODBsfMmUIGhEDK%2Fimg.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1182&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;docker 설치가 완료되면 관리 화면이 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1430&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqADAh/btrgYlteEwH/4Tk0viSKHCfrkLx5UHYZwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqADAh/btrgYlteEwH/4Tk0viSKHCfrkLx5UHYZwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqADAh/btrgYlteEwH/4Tk0viSKHCfrkLx5UHYZwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqADAh%2FbtrgYlteEwH%2F4Tk0viSKHCfrkLx5UHYZwk%2Fimg.png&quot; data-origin-width=&quot;2542&quot; data-origin-height=&quot;1430&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설치된 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XWN6m/btrgV8OSqfc/kcFnUrmzn88WTu9m3REfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XWN6m/btrgV8OSqfc/kcFnUrmzn88WTu9m3REfT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XWN6m/btrgV8OSqfc/kcFnUrmzn88WTu9m3REfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXWN6m%2FbtrgV8OSqfc%2FkcFnUrmzn88WTu9m3REfT0%2Fimg.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;444&quot; data-ke-mobilestyle=&quot;widthOrigin&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>서버/docker</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/129</guid>
      <comments>https://vmpo.tistory.com/129#entry129comment</comments>
      <pubDate>Tue, 5 Oct 2021 21:51:13 +0900</pubDate>
    </item>
    <item>
      <title>leetcode Twosum 문제 풀이</title>
      <link>https://vmpo.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리트코드 1번 문제인 twosum 문제를 풀어보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 방법이 있겠지만 효율성이 높은 로직을 활용해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제.&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[요약]. nums 배열이 , target 값이 주어질때 nums 배열중 2개 숫자의 합이 target값이 되는 두개 숫자의 인덱스 번호를&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열로 생성해서 출력해라.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Given an array of integers&lt;span&gt;&amp;nbsp;&lt;/span&gt;nums&amp;nbsp;and an integer&lt;span&gt;&amp;nbsp;&lt;/span&gt;target, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;indices of the two numbers such that they add up to&lt;span&gt;&amp;nbsp;&lt;/span&gt;target.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You may assume that each input would have&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;exactly&lt;span&gt;&amp;nbsp;&lt;/span&gt;one solution&lt;/b&gt;, and you may not use the&lt;span&gt;&amp;nbsp;&lt;/span&gt;same&lt;span&gt;&amp;nbsp;&lt;/span&gt;element twice.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can return the answer in any order.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; nums = [2,7,11,15], target = 9 &lt;b&gt;Output:&lt;/b&gt; [0,1] &lt;b&gt;Output:&lt;/b&gt; Because nums[0] + nums[1] == 9, we return [0, 1].&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; nums = [3,2,4], target = 6 &lt;b&gt;Output:&lt;/b&gt; [1,2]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input:&lt;/b&gt; nums = [3,3], target = 6 &lt;b&gt;Output:&lt;/b&gt; [0,1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&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;2 &amp;lt;= nums.length &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;-109&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;= nums[i] &amp;lt;= 109&lt;/li&gt;
&lt;li&gt;-109&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;= target &amp;lt;= 109&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Only one valid answer exists.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 처음 생각나는 방법은 이중 for문으로 전체 검색을 하면 되겠지만 성능상 효율이 떨어진다. (O(n2))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map에 데이터를 저장해서 체크하는 방식으로 처리 하면 for loop 한번으로 처리 가능하다.( O(n) )&lt;/p&gt;
&lt;pre id=&quot;code_1633406304723&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map&amp;lt;Integer, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; nums.length; i++) {
            int secondNum = target - nums[i];
            if (map.containsKey(secondNum)) {
                if (map.get(secondNum) &amp;gt; i) {
                  return new int[]{i, map.get(secondNum)};
                } else {
                  return new int[]{map.get(secondNum), i};
                }
            }
            map.put(nums[i], i);
        }
        return null;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. map 객체 하나 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 전달받은 nums 배열에 대해 0번 인덱스부터 마지막까지 확인하는 for loop 작성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 두개의 합이 될 target 파라미터에서 i번째 nums[i] 의 데이터 값을 빼준 결과 값은 nums[i] 와 함께 twosum 조합이 결과값이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, [2,7,11,12] 배열에서 target=9 일때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for loop 를 시작하면 제일 처음 첫번째 배열값인 2에 접근하게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;이제 2와 다른 값을 합쳐 9를 만들어야하는데 결국, target- nums[0] , 즉 9-2= 7&amp;nbsp; 7을 찾아야한다. 이 7을 찾는 과정을&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int secondNum = target - nums[i]; 로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이제 map에는 Loop를 돌때마다 검색한 데이터값과, 데이터값의 배열 인덱스번호를 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 먼저 map에서 검색한 값과 합이 되어야할 값을 검색해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; target 9, 첫번째 원소가 2라면&amp;nbsp; 7을 key값으로 map에서 조회해본다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-1. map에 해당하는 데이터가 없을 경우 map.put() 메소드를 활용해서 해당 loop의 데이터를 저장해준다.( key = nums[i], val= i)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-2. map에 해당하는 데이터가 있을경우 int[] 2개 데이터의 인덱스번호를 갖는 배열을 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;아래 if문 분기처리는 사실 해주지 않아도 통과되긴한다. 하지만, 문제에서는 가장 작은 index 번호부터 출력하는 것으로 보여 아래 처리를 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(map.get(secondNum)&amp;nbsp;&amp;gt;&amp;nbsp;i)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;int[]{i,&amp;nbsp;map.get(secondNum)};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;int[]{map.get(secondNum),&amp;nbsp;i};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/128</guid>
      <comments>https://vmpo.tistory.com/128#entry128comment</comments>
      <pubDate>Tue, 5 Oct 2021 13:10:03 +0900</pubDate>
    </item>
    <item>
      <title>나스닥 2.5% 폭락, 국제유가 7년만 최고치</title>
      <link>https://vmpo.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;10월 첫째날도 안좋더니 10월 첫월요일인 오늘 아예 폭락하고 있습니다 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 다팔고 없지만 얼마전까지 태슬라를 샀었는데 차량 인도량이 예측치를 상회해서 그런지 태슬라만 잘 버티고 있네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거의 나스닥 포인트가 올해 3월 고점수준으로 빠찌고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1440&quot; width=&quot;546&quot; height=&quot;1181&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blahx7/btrgCDpd3m9/VGZuuPoXDemvpe5Vk0qVcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blahx7/btrgCDpd3m9/VGZuuPoXDemvpe5Vk0qVcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blahx7/btrgCDpd3m9/VGZuuPoXDemvpe5Vk0qVcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblahx7%2FbtrgCDpd3m9%2FVGZuuPoXDemvpe5Vk0qVcK%2Fimg.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1440&quot; width=&quot;546&quot; height=&quot;1181&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국제유가도 7년만에 최고가를 돌파하고 있네요. 원유 관련주인 엑슨모빌, 옥시덴탈은 나스닥 폭락에도 잘 오르고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1072&quot; width=&quot;694&quot; height=&quot;579&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGyU3/btrgB2JxC9n/D4N62j6ky3FauClKi7MA31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGyU3/btrgB2JxC9n/D4N62j6ky3FauClKi7MA31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGyU3/btrgB2JxC9n/D4N62j6ky3FauClKi7MA31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGyU3%2FbtrgB2JxC9n%2FD4N62j6ky3FauClKi7MA31%2Fimg.png&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1072&quot; width=&quot;694&quot; height=&quot;579&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;나스닥은 무적이니깐 슬슬 한번 주워볼때가 된 것일지,,&amp;nbsp; 이와 중에 비트코인은 잘 오르고 있네요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;1312&quot; width=&quot;771&quot; height=&quot;484&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHCcl/btrgHFfKlNK/758likq5IoiCRVD979aLk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHCcl/btrgHFfKlNK/758likq5IoiCRVD979aLk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHCcl/btrgHFfKlNK/758likq5IoiCRVD979aLk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHCcl%2FbtrgHFfKlNK%2F758likq5IoiCRVD979aLk0%2Fimg.png&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;1312&quot; width=&quot;771&quot; height=&quot;484&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 코인중에 엑시인피니티만 산 상태인데,,, 악재가 너무 많은 와중에 나스닥이 너무 크게 빠지는 것을 보니 오히려 기회일 것 같기도 합니다. 조금 지켜보다가 주워봐야 겠네요.&lt;/p&gt;</description>
      <category>재테크</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/127</guid>
      <comments>https://vmpo.tistory.com/127#entry127comment</comments>
      <pubDate>Tue, 5 Oct 2021 01:49:50 +0900</pubDate>
    </item>
    <item>
      <title>맥북 run cat 적용하기 - 맥 cpu 모니터링</title>
      <link>https://vmpo.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저는 M1맥북에어를 사용하고 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥북의 cpu가 얼마나 사용되고 있는지 직관적이게 확인 할 수 있는 run cat 유틸을 다운로드해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1080&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9X8zx/btrgRM5DQkF/N9KZAntXqUouatKqKFurZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9X8zx/btrgRM5DQkF/N9KZAntXqUouatKqKFurZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9X8zx/btrgRM5DQkF/N9KZAntXqUouatKqKFurZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9X8zx%2FbtrgRM5DQkF%2FN9KZAntXqUouatKqKFurZ1%2Fimg.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;1080&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 하고 실행해보면 아래와 같이 상단에 고양이 아이콘이 하나 생깁니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 시스템 인포로 가보면 cpu 사용률과 메모리, 배터리, 디스크 사용률을 각각 확인 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 사용률이 커지면 커질수록 고양이가 빨리 뛰게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/422833740&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/pG0da/hyLPgCQ3jW/1phjY5YbibwhkKgrqFMj8k/img.jpg?width=522&amp;amp;height=208&amp;amp;face=0_0_522_208&quot; data-video-width=&quot;522&quot; data-video-height=&quot;208&quot; data-video-origin-width=&quot;522&quot; data-video-origin-height=&quot;208&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/422833740?service=daum_tistory&quot; width=&quot;522&quot; height=&quot;208&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;864&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKq33L/btrgRUiooX8/pgDY7RApqCZzBFCWHWd5BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKq33L/btrgRUiooX8/pgDY7RApqCZzBFCWHWd5BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKq33L/btrgRUiooX8/pgDY7RApqCZzBFCWHWd5BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKq33L%2FbtrgRUiooX8%2FpgDY7RApqCZzBFCWHWd5BK%2Fimg.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;864&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/126</guid>
      <comments>https://vmpo.tistory.com/126#entry126comment</comments>
      <pubDate>Tue, 5 Oct 2021 01:32:34 +0900</pubDate>
    </item>
    <item>
      <title>[java] java random string 만들기!</title>
      <link>https://vmpo.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java 에서 간단하게 random string을 만들 수 있는 방법을 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Random 클래스를 활용해서 간단하게 생성할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;randim.ints()에 아스키코드값의 범위를 지정해줌으로써 랜덤으로 출력할 문자조합의 범위를 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 기본적으로 숫자와 알파벳의 아스키코드값이 어떻게 설정되어 있는지 확인해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;숫자 : 0~9 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;-&amp;gt;아스키코드값 : 48~57&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;영문 a~z&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;-&amp;gt; 대문자 아스키코드값 :&amp;nbsp; 65~90&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;-&amp;gt; 소문자 아스키코드값 :&amp;nbsp; 97~122&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 랜덤 알파벳 소문자 문자열 생성하기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.1.아스키코드 기준으로 숫자 97~122가 소문자 a~z로 까지 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.2.그럼 이제 랜덤 문자열의 범위를 아스키코드값의 범위(97~122)로 제한해줍니다. rightLimit+1로 해주는 이유는 내부적으로 배열처리시 +1이 필요하게 되어 설정해줍니다. 내부 소스를 들어가보면 확인 가능하지만 여기서는 넘어가겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.3. random.ints()는 intstream을 반환합니다. 이를 limit()으로 원하는 문자열 크기만큼 셋팅해줍니다. 저는 문자열의 길이를 10으로 지정하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.4. 최종적으로 collect() 메소드로 StringBuilder 객체를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.5. 이제 StringBuilder 객체를 toString() 으로 문자열로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고. 대문자까지 포함하고 싶다면 대문자 아스키코드값의 범위가 65~90 이니깐 random.ints() 메소드의 첫번째 파라미터를 65로 설정하고, stream에서 필터를 걸어 아스키코드값의 범위를 제한 해주어야 합니다. 아래 문자열+알파벳 예시에서 확인 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633363258160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void Test_랜덤알파벳(){
    int leftLimit = 97; // letter 'a'
    int rightLimit = 122; // letter 'z'
    int targetStringLength = 10;
    Random random = new Random();
    String generatedString = random.ints(leftLimit, rightLimit + 1)
                                   .limit(targetStringLength)
                                   .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                                   .toString();
    System.out.println(generatedString);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 랜덤 알파벳 +숫자 문자열 생성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.1.숫자의 경우 아스키코드로 변환시 48~57이 0~9로 표현됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.2.따라서 로직의 randim.ints() 메소드의 첫번째 파라미터를 48로 지정해준다. 두번째 파라미터는 알파벳의 제일끝이 122이므로 알파벳만 출력할때와 같이 122+1로 셋팅해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.3.알파벳과 숫자만 출력되어야 하니깐 filter() 메소드를 활용해서 아스키코드의 범위를 제한 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.4.문자열 길이를 limit()메소드로 제한해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.5.collect() 메소드로 StringBuilder 객체를 생성해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.6. 이제 StringBuilder 객체를 toString() 으로 문자열로 변환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633363478391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void Test_랜덤숫자앏파벳() {
    int leftLimit = 48; // numeral '0'
    int rightLimit = 122; // letter 'z'
    int targetStringLength = 10;
    Random random = new Random();
    String generatedString = random.ints(leftLimit, rightLimit + 1)
                                   .filter(i -&amp;gt; (i &amp;lt;= 57 || i &amp;gt;= 65) &amp;amp;&amp;amp; (i &amp;lt;= 90 || i &amp;gt;= 97))
                                   .limit(targetStringLength)
                                   .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                                   .toString();
    System.out.println(generatedString);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력결과는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2552&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bez5H7/btrgC6Fe9kp/m4gYBLRHs2jDyZALVdzuO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bez5H7/btrgC6Fe9kp/m4gYBLRHs2jDyZALVdzuO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bez5H7/btrgC6Fe9kp/m4gYBLRHs2jDyZALVdzuO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbez5H7%2FbtrgC6Fe9kp%2Fm4gYBLRHs2jDyZALVdzuO0%2Fimg.png&quot; data-origin-width=&quot;2552&quot; data-origin-height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&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>Java/기본</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/125</guid>
      <comments>https://vmpo.tistory.com/125#entry125comment</comments>
      <pubDate>Tue, 5 Oct 2021 01:18:17 +0900</pubDate>
    </item>
    <item>
      <title>티스토리 코드블럭 테마 변경하기</title>
      <link>https://vmpo.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 코드블럭 테마를 변경하는 방법에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 관련 블로그를 하는 경우에는 코드를 붙여넣기 해야하는 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 테마로 할경우에는 강조되는 영역이 없어 가독성이 떨어지게 됩니다. 티스토리에서는 쉽게 코드블럭 테마를 변경할 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드블럭 테마를 변경하는 방법은 기본적으로 아래 2가지 방법이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 기본 플러그인 사용&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 커스텀 테마 적용하기(highlight.js)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두가지 방법에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 기본 플러그인 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 페이지에서 플러그인 탭을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;998&quot; width=&quot;312&quot; height=&quot;556&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKgliO/btrgDUYQFBA/DJj3euOtKMSf5dVgFTIzjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKgliO/btrgDUYQFBA/DJj3euOtKMSf5dVgFTIzjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKgliO/btrgDUYQFBA/DJj3euOtKMSf5dVgFTIzjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKgliO%2FbtrgDUYQFBA%2FDJj3euOtKMSf5dVgFTIzjK%2Fimg.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;998&quot; width=&quot;312&quot; height=&quot;556&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 플러그인 중에 Synatax highlight라는 플러그인이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 순서대로 진행하면 몇개의 템플릿 테마를 적용 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;838&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcwyRT/btrgC6yuBYa/iugEAaQuMMcDlkm9aQ0qW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcwyRT/btrgC6yuBYa/iugEAaQuMMcDlkm9aQ0qW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcwyRT/btrgC6yuBYa/iugEAaQuMMcDlkm9aQ0qW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcwyRT%2FbtrgC6yuBYa%2FiugEAaQuMMcDlkm9aQ0qW1%2Fimg.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;838&quot; data-ke-mobilestyle=&quot;widthOrigin&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-origin-width=&quot;1718&quot; data-origin-height=&quot;1314&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niHoB/btrgQARYyfS/KTKXrzXKAkTEfhUIRQ3Kek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niHoB/btrgQARYyfS/KTKXrzXKAkTEfhUIRQ3Kek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niHoB/btrgQARYyfS/KTKXrzXKAkTEfhUIRQ3Kek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniHoB%2FbtrgQARYyfS%2FKTKXrzXKAkTEfhUIRQ3Kek%2Fimg.png&quot; data-origin-width=&quot;1718&quot; data-origin-height=&quot;1314&quot; data-ke-mobilestyle=&quot;widthOrigin&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-origin-width=&quot;1794&quot; data-origin-height=&quot;670&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WjVKS/btrgHD94yjp/k7ZG6JxRlqq6HDmmEquPi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WjVKS/btrgHD94yjp/k7ZG6JxRlqq6HDmmEquPi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WjVKS/btrgHD94yjp/k7ZG6JxRlqq6HDmmEquPi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWjVKS%2FbtrgHD94yjp%2Fk7ZG6JxRlqq6HDmmEquPi1%2Fimg.png&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;670&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;최종적으로 테마를 선택하고 적용을 누르면 코드블럭이 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 커스텀 테마 적용하기(highlight.js)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 블로그 같은 경우에는 커스텀 테마로 적용되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;highlight.js를 활용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사이트에서 원하는 테마의 네임을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://highlightjs.org/static/demo/&quot;&gt;highlight.js demo (highlightjs.org)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633361346898&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;highlight.js demo&quot; data-og-description=&quot;&quot; data-og-host=&quot;highlightjs.org&quot; data-og-source-url=&quot;https://highlightjs.org/static/demo/&quot; data-og-url=&quot;https://highlightjs.org/static/demo/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://highlightjs.org/static/demo/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://highlightjs.org/static/demo/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;highlight.js demo&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;highlightjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 블로그의 경우에는 atom one dark 테마를 적용하고 있습니다. 해당 테마를 선택하고 어떤식으로 출력되는지 확인해봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 테마 이름을 복사해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;1528&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFS03A/btrgFTk17PA/p6eKgxCKt3kutwfwoxUrs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFS03A/btrgFTk17PA/p6eKgxCKt3kutwfwoxUrs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFS03A/btrgFTk17PA/p6eKgxCKt3kutwfwoxUrs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFS03A%2FbtrgFTk17PA%2Fp6eKgxCKt3kutwfwoxUrs1%2Fimg.png&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;1528&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테마명을 확인했으면 아래와 같은 스크립트를 준비합니다. 여기서, &amp;lt;link rel=&quot;&quot;&amp;gt; 태그의 제일 마지막 부분을 선택했던 테마명으로 변경해줍니다. 띄어쓰기 공간은 하이폰으로 변경해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, atom one light 테마를 선택했다면, 아래 노란색 태그와 같이 끝 부분을 변경해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/styles/&lt;span style=&quot;background-color: #f6e199;&quot;&gt;atom-one-light.min.css&lt;/span&gt;&quot;&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633361214749&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- highlight theme--&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/styles/atom-one-dark.min.css&quot;&amp;gt;
&amp;lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/highlight.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- load() --&amp;gt;
&amp;lt;script&amp;gt;hljs.initHighlightingOnLoad();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 관리자 화면으로 돌아와서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꾸미기-&amp;gt; 스킨편집으로 들어갑니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;910&quot; width=&quot;317&quot; height=&quot;492&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzQ0Uf/btrgMudF9Ja/bl6Pj30kqkctYKl9KUdpE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzQ0Uf/btrgMudF9Ja/bl6Pj30kqkctYKl9KUdpE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzQ0Uf/btrgMudF9Ja/bl6Pj30kqkctYKl9KUdpE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzQ0Uf%2FbtrgMudF9Ja%2Fbl6Pj30kqkctYKl9KUdpE0%2Fimg.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;910&quot; width=&quot;317&quot; height=&quot;492&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 편집으로 들어가서 아래와 같이 &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; 태그 사이에 위에서 생성했던 스크립트를 입력하고 저장해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJI8l/btrgB2Qe7hP/wV75fEDd7OOjtvP3wR6OHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJI8l/btrgB2Qe7hP/wV75fEDd7OOjtvP3wR6OHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJI8l/btrgB2Qe7hP/wV75fEDd7OOjtvP3wR6OHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJI8l%2FbtrgB2Qe7hP%2FwV75fEDd7OOjtvP3wR6OHK%2Fimg.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;596&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;만약, Synatax highlight 를 적용했다면 적용 해제를 해줍니다. 그리고 코드 페이지를 확인해봅니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 적용된 것을 확인 할 수 있습니다.&lt;/p&gt;</description>
      <category>기타</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/124</guid>
      <comments>https://vmpo.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 5 Oct 2021 00:33:09 +0900</pubDate>
    </item>
    <item>
      <title>[java] Stack 2개로 Queue 만들기</title>
      <link>https://vmpo.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;stack 2개로 Queue 를 구현해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 들었을땐 약간 난감하지만 차근차근 생각해보면 크게 어렵지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택은 마지막에 저장된 데이터가 가장 먼저 출력되기 때문에 마지막에 저장된 데이터 부터 다음 스택으로 옮겨주고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 다시 출력하면 제일 처음에 저장한 데이터를 출력 할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 큐 형태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack 1에 먼저 데이터를 A,B,C 순서대로 넣으면 아래와 같이 데이터는 쌓인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack 1&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 13.9535%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력할때는 아래 Stack 2에 데이터를 옮겨서 출력해야 한다. Stack 1의 데이터를 순서대로 출력하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C,B,A 순으로 출력되며 순서대로 다시 Stack 2에 저장하면 아래와 같이 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 Stack2 데이터를 출력하면 A,B,C 순서대로 출력이 가능하며 즉, Queue와 동일하게 FIFO(First in First out)이 가능해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stack 2&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 13.9535%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 구현해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue클래스에는 데이터가 String, Integer 여러 타입이 들어올 수 있도록 제네릭타입으로 선언해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633347550619&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StackToQueue {

  public static void main(String[] args) {

    Queue&amp;lt;Integer&amp;gt; queue = new Queue&amp;lt;&amp;gt;();
    queue.enQueue(1);
    queue.enQueue(2);
    queue.enQueue(3);
    System.out.println(queue.deQueue());
    queue.enQueue(4);
    System.out.println(queue.deQueue());
    queue.enQueue(5);
    System.out.println(queue.deQueue());
    System.out.println(queue.deQueue());
    System.out.println(queue.deQueue());
  }
}

class Queue&amp;lt;T&amp;gt;{
  Stack&amp;lt;T&amp;gt; inner = new Stack&amp;lt;&amp;gt;();
  Stack&amp;lt;T&amp;gt; outer = new Stack&amp;lt;&amp;gt;();

  public void enQueue(T data){
    inner.add(data);
  }

  public T deQueue(){
    if(outer.isEmpty()){
      while(!inner.isEmpty()){
        outer.push(inner.pop());
      }
    }
    return outer.pop();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>Java/기본</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/123</guid>
      <comments>https://vmpo.tistory.com/123#entry123comment</comments>
      <pubDate>Mon, 4 Oct 2021 20:45:08 +0900</pubDate>
    </item>
    <item>
      <title>[java] java List에서 Max, Min 값 구하기</title>
      <link>https://vmpo.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Array에서 max,min 값을 구하는 방법을 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Integer array일 경우, Collections List로 변환 후 maptoInt().max()사용&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1633346204793&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StreamMaxMin {

  public static void main(String[] args) {

    Integer[] arr = {1, 2, 3, 4, 5};
    List&amp;lt;Integer&amp;gt; list = Arrays.asList(arr);

    Integer max = list.stream()
                      .mapToInt(x -&amp;gt; x)
                      .max()
                      .getAsInt();

    Integer min = list.stream()
                      .mapToInt(x -&amp;gt; x)
                      .min()
                      .getAsInt();

    System.out.println(&quot;max : &quot; + max);
    System.out.println(&quot;min : &quot; + min);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;max&amp;nbsp;:&amp;nbsp;5&lt;br /&gt;min&amp;nbsp;:&amp;nbsp;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.int 타입 array를 stream으로 바로 변환해서 max()사용&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1633346376239&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void test1() {
    //타입이 int일경우
    int[] arr = {1, 2, 3, 4, 5};
    int max = Arrays.stream(arr)
                    .max()
                    .getAsInt();
    int min = Arrays.stream(arr)
                    .min()
                    .getAsInt();

    System.out.println(&quot;max : &quot; + max);
    System.out.println(&quot;min : &quot; + min);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;max&amp;nbsp;:&amp;nbsp;5&lt;br /&gt;min&amp;nbsp;:&amp;nbsp;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>Max</category>
      <category>Min</category>
      <category>Stream</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/122</guid>
      <comments>https://vmpo.tistory.com/122#entry122comment</comments>
      <pubDate>Mon, 4 Oct 2021 20:20:38 +0900</pubDate>
    </item>
    <item>
      <title>[java] UUID란 무엇인가? 활용하기</title>
      <link>https://vmpo.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java에서 간단하게 식별자를 생성할 수 있는 UUID에 대해서 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;UUID란?&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;출처 : 위키백과&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 상에서 서로 모르는 개체들을 식별하고 구별하기 위해서는 각각의 고유한 이름이 필요하다. 이 이름은 고유성(유일성)이 매우 중요하다. 같은 이름을 갖는 개체가 존재한다면 구별이 불가능해 지기 때문이다. 고유성을 완벽하게 보장하려면 중앙관리시스템이 있어서 일련번호를 부여해 주면 간단하지만 동시다발적이고 독립적으로 개발되고 있는 시스템들의 경우 중앙관리시스템은 불가능하다. 개발주체가 스스로 이름을 짓도록 하되 고유성을 충족할 수 있는 방법이 필요하다. 이를 위하여 탄생한 것이 범용고유식별자(UUID)이며 국제기구에서 표준으로 정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UUID 표준에 따라 이름을 부여하면 고유성을 완벽하게 보장할 수는 없지만 실제 사용상에서 중복될 가능성이 거의 없다고 인정되기 때문에 많이 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[요약]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;#어느 시스템에나 적용할 수 있는 구분값&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;#중복될 가능성이 0은 아니지면 거의 0에 가까움.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;UUID는 16&amp;nbsp;옥텟 (128비트)의 수이다.&amp;nbsp;표준형식에서 UUID는 32개의 16진수로 표현되며 총 36개 문자(32개 문자와 4개의 하이픈)로 된 8-4-4-4-12라는 5개의 그룹을 하이픈으로 구분&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) &lt;span style=&quot;color: #202122;&quot;&gt;550e8400-e29b-41d4-a716-446655440000&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;Java에서 UUID 생성하기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java 내장클래스인 UUID 클래스를 활용하면 쉽게 사용가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 메소드로 randomUUID()를 호출하면 자동으로 랜덤한 값의 UUID를 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1633344925169&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.oogo.uuid;

import java.util.UUID;

public class UudiTeser {

  public static void main(String[] args) {
    UUID first = UUID.randomUUID();
    UUID second = UUID.randomUUID();

    System.out.println(&quot;UUID first: &quot; + first.toString());
    System.out.println(&quot;UUID second: &quot; + second.toString());
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;UUID first: fa857de4-fedb-4651-b895-8e7efc18342c&lt;br /&gt;UUID second: 1668d9dc-3134-4f85-86c4-5b4d6651fa25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;db scheme에 상관없이 uuid를 key값으로 저장하면 db마이그레이션시에도 큰 이슈는 없을 것으로 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 중복이 발생할 가능성이 있으니 저장시의 예외처리는 필요할듯. 아니면 고유성이 완벽히 보장되어야 하는 로직에는 사용하지 않는 것이 날듯하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텐츠 정보가 어쩔수없이 url에 노출될때 알기쉬운 패턴의 key값을 활용하기 싫을때에도 활용 가능 할 수 있을 것 같다.&lt;/p&gt;</description>
      <category>Java/기본</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/121</guid>
      <comments>https://vmpo.tistory.com/121#entry121comment</comments>
      <pubDate>Mon, 4 Oct 2021 20:00:30 +0900</pubDate>
    </item>
    <item>
      <title>[java] hashMap 순서를 유지하고 싶은 경우</title>
      <link>https://vmpo.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HashMap은 데이터의 순서가 보장되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 test1()을 실행해보면 출력결과가 입력한 순서대로 저장되지 않았다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HashMap의 순서를 보장하고 싶은경우에는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;LinkedHashMap&lt;/b&gt;&lt;/span&gt;을 활용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633285837808&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MapTester {
  public static void main(String[] args) {
    test1();
    test2();
  }

  public static void test1(){
    System.out.println(&quot;HashMap-&amp;gt;&quot;);
    Map&amp;lt;String,Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
    map.put(&quot;삼성전자&quot;,1);
    map.put(&quot;카카오&quot;,2);
    map.put(&quot;테스트&quot;,3);
    map.keySet().stream().forEach(System.out::println);
  }

  public static void test2(){
    System.out.println(&quot;LinkedHashMap-&amp;gt;&quot;);
    Map&amp;lt;String,Integer&amp;gt; map = new LinkedHashMap&amp;lt;&amp;gt;();
    map.put(&quot;삼성전자&quot;,1);
    map.put(&quot;카카오&quot;,2);
    map.put(&quot;테스트&quot;,3);
    map.keySet().stream().forEach(System.out::println);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;HashMap-&amp;gt;&lt;br /&gt;카카오&lt;br /&gt;테스트&lt;br /&gt;삼성전자&lt;br /&gt;LinkedHashMap-&amp;gt;&lt;br /&gt;삼성전자&lt;br /&gt;카카오&lt;br /&gt;테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>LinkedHashMap</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/120</guid>
      <comments>https://vmpo.tistory.com/120#entry120comment</comments>
      <pubDate>Mon, 4 Oct 2021 03:32:37 +0900</pubDate>
    </item>
    <item>
      <title>[java] java set , HashSet 자료구조</title>
      <link>https://vmpo.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java의 자료 구조중 Set interface에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set 인터페이스를 구현한 대표적인 클래스는 Hashset과 Treeset이 있습니다. 이중 자주 사용하는 HashSet 샘플을 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set은 아래와 같은 특성이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 중복을 허용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# List와 달리 순서를 보장하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp; 중복을 허용하지 않음.&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1633283799531&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SetTester {

  public static void main(String[] args) {

    Set&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
    set.add(1);
    set.add(1);
    set.add(1);
    set.add(1);
    set.forEach(System.out::println);

  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&amp;nbsp; 순서를 보장하지 않음.&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1633283991762&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void test(){
    Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
    set.add(&quot;삼성전자&quot;);
    set.add(&quot;카카오&quot;);
    set.add(&quot;네이버&quot;);
    set.forEach(System.out::println);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;카카오&lt;br /&gt;네이버&lt;br /&gt;삼성전자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.&amp;nbsp; Set을 List로, List를 Set으로.&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1633284277667&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void test1(){
    //리스트를 Set으로
    String[] arr = {&quot;삼성전자&quot;,&quot;카카오&quot;,&quot;네이버&quot;};
    Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;(Arrays.asList(arr));
    set.forEach(System.out::println);

    //Set을 리스트로
    List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(set);
    list.stream().forEach(System.out::println);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;카카오&lt;br /&gt;네이버&lt;br /&gt;삼성전자&lt;br /&gt;카카오&lt;br /&gt;네이버&lt;br /&gt;삼성전자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/119</guid>
      <comments>https://vmpo.tistory.com/119#entry119comment</comments>
      <pubDate>Mon, 4 Oct 2021 03:05:55 +0900</pubDate>
    </item>
    <item>
      <title>[비트코인] 엑시인피니티 450만원 투자 후기</title>
      <link>https://vmpo.tistory.com/118</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 동안 주식만 하고 있었는데 비트코인이 폭락하고 반등하고 있다는 소식에 관심이 생겨 투자할만한 비트코인을 좀 찾아봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[엑시인피니티가 뭐지??]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;무엇을 사볼까 하다가, 5월 폭락장 이후에 거의 혼자 몇십배 오른 코인이 하나 있는데요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엑시인피니티라는 코인입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;차트가 진짜 무섭게 상승하고 있는데요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;1254&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF6xRc/btrgB6dV8jk/sjsoeqE4zD9UlaZPzaWKB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF6xRc/btrgB6dV8jk/sjsoeqE4zD9UlaZPzaWKB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF6xRc/btrgB6dV8jk/sjsoeqE4zD9UlaZPzaWKB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF6xRc%2FbtrgB6dV8jk%2FsjsoeqE4zD9UlaZPzaWKB0%2Fimg.png&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;1254&quot; data-ke-mobilestyle=&quot;widthOrigin&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;엑시 인피니티는 베트남기업에서 만든 NFT를 활용한 게임입니다. 게임 매출도 거의 2조가까이 되는 인기 게임입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;도대체 왜 인기가 많은걸지 찾아보니, 게임을 하면서 돈도 벌 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;게임을 하면 SLP라는 것을 얻을 수 있는데, 하루 퀘스트를 완료하면 최대 125개를 받을 수 있습니다. SLP는 실제 거래가 가능하며 현재 기준으로는 개당 84원정도 하고 있으니 만원이상은 하루에 벌 수 있는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;764&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bydmVZ/btrgC5Mpnwb/IUz2FamH7iCMVLYb0Qvl0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bydmVZ/btrgC5Mpnwb/IUz2FamH7iCMVLYb0Qvl0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bydmVZ/btrgC5Mpnwb/IUz2FamH7iCMVLYb0Qvl0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbydmVZ%2FbtrgC5Mpnwb%2FIUz2FamH7iCMVLYb0Qvl0k%2Fimg.png&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;764&quot; data-ke-mobilestyle=&quot;widthOrigin&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또한, SLP 뿐만아니라 게임내에서 새로운 캐릭터를 생성해 이더리움으로 사고 팔 수 도 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;너무 신기한데, 이렇게 게임하면서도 돈을 벌 수 있어서 엄청나게 인기를 끌고 있다고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2476&quot; data-origin-height=&quot;1216&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5DI1h/btrgBJDfJj3/4KKrJkVAxjLTwZbMQaXvWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5DI1h/btrgBJDfJj3/4KKrJkVAxjLTwZbMQaXvWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5DI1h/btrgBJDfJj3/4KKrJkVAxjLTwZbMQaXvWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5DI1h%2FbtrgBJDfJj3%2F4KKrJkVAxjLTwZbMQaXvWK%2Fimg.png&quot; data-origin-width=&quot;2476&quot; data-origin-height=&quot;1216&quot; data-ke-mobilestyle=&quot;widthOrigin&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 이유로 엑시인피니티 코인의 가격도 지속적으로 상승하고 있는 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[구매후기]&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;저도 한 번 동참해보기 위해 구매를 해보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;요즘 가는 코인이 간다길래, 오늘(10/3) 한번 133,000원에 450만원정도 구매를 해보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 한 번 진입해봤는데 반나절 동안 마이너스였는데 갑자기 오르면서 수익을 보고 있네요 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 좀만 버텨보고 다시 마이너스 되기전에 팔아버려야 겠네요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기도하면서 자도록 하겠습니다ㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caHaMc/btrgC5S9XQM/t046ZNkkGOAK5SgcGbXWok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caHaMc/btrgC5S9XQM/t046ZNkkGOAK5SgcGbXWok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caHaMc/btrgC5S9XQM/t046ZNkkGOAK5SgcGbXWok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaHaMc%2FbtrgC5S9XQM%2Ft046ZNkkGOAK5SgcGbXWok%2Fimg.png&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1240&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>재테크/비트코인</category>
      <category>비트코인</category>
      <category>엑시인피니티</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/118</guid>
      <comments>https://vmpo.tistory.com/118#entry118comment</comments>
      <pubDate>Mon, 4 Oct 2021 01:32:17 +0900</pubDate>
    </item>
    <item>
      <title>website 소스 전체 가져오기 - httrack</title>
      <link>https://vmpo.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;website의 html, javascript 소스 및 이미지 정보를 모두 가져올 수 있는 httrack 툴을 테스트해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우, 맥에서 모두 사용가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 맥을 사용하고 있어 맥 기준으로 테스트 진행해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 html, javascript, image 소스를 모두 가져오기 때문에 사이트에 따라 시간이 엄청 오래 걸릴 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.httrack.com/&quot;&gt;HTTrack Website Copier - Free Software Offline Browser (GNU GPL)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633071641530&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTTrack Website Copier - Free Software Offline Browser (GNU GPL)&quot; data-og-description=&quot;Version 3.49-2 (05/20/2017) Engine fixes (keep-alive, redirects, new hashtables, unit tests) Installing HTTrack: Go to the download section now! For help and questions: Visit the forum, Read the documentation, Read the FAQs, Browse the sources Welcome HTTr&quot; data-og-host=&quot;www.httrack.com&quot; data-og-source-url=&quot;https://www.httrack.com/&quot; data-og-url=&quot;https://www.httrack.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kqFMe/hyLNgpy7il/pvmfKqIrXJWpawO0VD5ZwK/img.jpg?width=300&amp;amp;height=233&amp;amp;face=0_0_300_233&quot;&gt;&lt;a href=&quot;https://www.httrack.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.httrack.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kqFMe/hyLNgpy7il/pvmfKqIrXJWpawO0VD5ZwK/img.jpg?width=300&amp;amp;height=233&amp;amp;face=0_0_300_233');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HTTrack Website Copier - Free Software Offline Browser (GNU GPL)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Version 3.49-2 (05/20/2017) Engine fixes (keep-alive, redirects, new hashtables, unit tests) Installing HTTrack: Go to the download section now! For help and questions: Visit the forum, Read the documentation, Read the FAQs, Browse the sources Welcome HTTr&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.httrack.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 사이트 캡처화면입니다. 다운로드 탭에서 해당하는 버전을 다운로드 받으시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2864&quot; data-origin-height=&quot;1568&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ3VH4/btrgu2prUri/wFf93Qe2inTNgH0ZPA39OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ3VH4/btrgu2prUri/wFf93Qe2inTNgH0ZPA39OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ3VH4/btrgu2prUri/wFf93Qe2inTNgH0ZPA39OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ3VH4%2Fbtrgu2prUri%2FwFf93Qe2inTNgH0ZPA39OK%2Fimg.png&quot; data-origin-width=&quot;2864&quot; data-origin-height=&quot;1568&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;맥에 homebrew가 설치되어 있는 경우 아래 명령어로 쉽게 설치 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ &lt;span style=&quot;background-color: #ccffcc; color: #000000;&quot;&gt;brew install httrack&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치를 완료했으면 이제 실행파일을 열어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;맥에서는 아래 커맨드를 입력하면 자동으로 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ webhttrack&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 아래와 같은 웹사이트가 로컬에서 열립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3142&quot; data-origin-height=&quot;758&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H53QS/btrgxBLpJdk/W3FKPABHJscgo3nU6dZ0yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H53QS/btrgxBLpJdk/W3FKPABHJscgo3nU6dZ0yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H53QS/btrgxBLpJdk/W3FKPABHJscgo3nU6dZ0yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH53QS%2FbtrgxBLpJdk%2FW3FKPABHJscgo3nU6dZ0yk%2Fimg.png&quot; data-origin-width=&quot;3142&quot; data-origin-height=&quot;758&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넥스트를 눌러주면 아래와같이 어디 폴더에 저장할지 탭이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 입력해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3012&quot; data-origin-height=&quot;648&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTqibz/btrgBmlU1qT/0fEmtsLyq3l8JyiW2dAuT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTqibz/btrgBmlU1qT/0fEmtsLyq3l8JyiW2dAuT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTqibz/btrgBmlU1qT/0fEmtsLyq3l8JyiW2dAuT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTqibz%2FbtrgBmlU1qT%2F0fEmtsLyq3l8JyiW2dAuT0%2Fimg.png&quot; data-origin-width=&quot;3012&quot; data-origin-height=&quot;648&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 아래 탭에 사이트 url 주소를 입력하고 넥스트를 누르면&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEtcEa/btrgBmlVfyd/JB5DutNAzJlL5O0Dsgjbf1/img.png&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/bEtcEa/btrgBmlVfyd/JB5DutNAzJlL5O0Dsgjbf1/img.png&quot; data-origin-width=&quot;3014&quot; data-origin-height=&quot;944&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 화면이 노출되고 이제 스타트 버튼을 누르면 웹사이트 소스가 다운받아집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3058&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjuCoK/btrgwCcKHlw/4YxUGfhKtUagwAqIDLrxz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjuCoK/btrgwCcKHlw/4YxUGfhKtUagwAqIDLrxz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjuCoK/btrgwCcKHlw/4YxUGfhKtUagwAqIDLrxz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjuCoK%2FbtrgwCcKHlw%2F4YxUGfhKtUagwAqIDLrxz1%2Fimg.png&quot; data-origin-width=&quot;3058&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드를 받고 있는 모습입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;3064&quot; data-origin-height=&quot;1468&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9OxLH/btrgzIXQw4z/DyCC2dU4dKKVFEmR9hcXsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9OxLH/btrgzIXQw4z/DyCC2dU4dKKVFEmR9hcXsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9OxLH/btrgzIXQw4z/DyCC2dU4dKKVFEmR9hcXsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9OxLH%2FbtrgzIXQw4z%2FDyCC2dU4dKKVFEmR9hcXsK%2Fimg.png&quot; data-origin-width=&quot;3064&quot; data-origin-height=&quot;1468&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리를 백업하거나, 아니면 특정 사이트의 전체 소스를 백업해야 될때 유용하게 사용 할 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 타 사이트를 백업할 경우 저작권에 유의해야 합니다.&lt;/p&gt;</description>
      <category>기타</category>
      <category>HTTrack</category>
      <category>웹사이트 소스 다운</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/117</guid>
      <comments>https://vmpo.tistory.com/117#entry117comment</comments>
      <pubDate>Fri, 1 Oct 2021 16:08:25 +0900</pubDate>
    </item>
    <item>
      <title>[java] java stream sorted() 활용하기</title>
      <link>https://vmpo.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java stream sorted() 메소드 활용법에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java stream은 sorted()메소드로 쉽게 정렬이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한,두개 이상을 정렬 조건으로 걸어야할 때는 thenComparing()을 활용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 샘플코드로 테스트를 진행해보도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633070406703&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Stock {

  int no;
  int price;
  String name;

  Stock(int price, String name) {
    this.price = price;
    this.name = name;
  }

  Stock(int no, int price, String name) {
    this.no = no;
    this.price = price;
    this.name = name;
  }

  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 리스트를 셋팅한 후 조건 별로 정렬해보도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633070431108&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(1, 100000, &quot;하이닉스&quot;));
    list.add(new Stock(2, 400000, &quot;네이버&quot;));
    list.add(new Stock(2, 30000, &quot;카카오뱅크&quot;));
    list.add(new Stock(3, 110000, &quot;카카오&quot;));
    list.add(new Stock(4, 77000, &quot;삼성전자&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.가격 순&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633070460934&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    list.stream()
        .sorted(Comparator.comparing(Stock::getPrice))
        .map(Stock::getName)
        .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#출력결과&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카카오뱅크&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;삼성전자&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이닉스&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;카카오&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네이버&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.No 오름차순, 가격 오름차순&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건을 2개 이상 걸어야 할 때는 themComparing으로 앞의 조건이 동일할 경우 다음 조건을 걸어 정렬처리 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633070534618&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    list.stream()
        .sorted(Comparator.comparing(Stock::getNo)
                          .thenComparing(Stock::getPrice))
        .map(Stock::getName)
        .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#출력결과&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이닉스&lt;br /&gt;카카오뱅크&lt;br /&gt;네이버&lt;br /&gt;카카오&lt;br /&gt;삼성전자&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.No 오름차순, 가격 내림차순&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;역순으로 정렬해야 할 때는 파라미터로 Comparator.reverseOrder()를 셋팅해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633070573135&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    list.stream()
        .sorted(Comparator.comparing(Stock::getNo)
                          .thenComparing(Stock::getPrice,Comparator.reverseOrder()))
        .map(Stock::getName)
        .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#출력결과&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하이닉스&lt;br /&gt;네이버&lt;br /&gt;카카오뱅크&lt;br /&gt;카카오&lt;br /&gt;삼성전자&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>Stream</category>
      <category>themComparing</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/116</guid>
      <comments>https://vmpo.tistory.com/116#entry116comment</comments>
      <pubDate>Fri, 1 Oct 2021 15:46:19 +0900</pubDate>
    </item>
    <item>
      <title>[java] Stream api 사용하기 - 02</title>
      <link>https://vmpo.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스트림 api에서 사용할 수 있는 중간 연산 처리 메소드를 활용해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 조건문으로 필터링 : filter(), distinct()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 리턴 타입을 변환 하거나 데이터를 조작 : map(), flatMap()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 개수 제한 : limit(), skip()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 정렬 : sorted()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. filter(), distinct() 활용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter의 경우 중간의 특정 조건에 해당하는 데이터만 뽑아낸 새로운 스트림을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distinct의 경우 중복을 제거합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633067122673&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(1);
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);

    //기본 출력
    list.stream().forEach(System.out::print);
    System.out.println();
    list.stream().filter(i-&amp;gt;i&amp;gt;2).forEach(System.out::print);
    System.out.println();
    list.stream().distinct().forEach(System.out::print);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;11234&lt;br /&gt;34&lt;br /&gt;1234&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Map(), flatmap() 활용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map은 각 스트림의 요소들을 특정 로직으로 변환하여 스트림을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 객체가 저장된 배열에서 각 객체의 이름만 뽑아 내고 싶을때와 같은 상황에서 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stock 클래스를 아래와 같이 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633067918627&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Stock {

  int price;
  String name;

  Stock(int price , String name){
    this.price = price;
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stock 데이터가 저장된 배열에서 이름만 추출해보도록 하겠습니다. map을 통해 name만 가진 스트림으로 변환 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633067884445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(77000, &quot;삼성전자&quot;));
    list.add(new Stock(100000, &quot;하이닉스&quot;));
    list.add(new Stock(110000, &quot;카카오&quot;));
    list.add(new Stock(400000, &quot;네이버&quot;));

    //객체에서 이름만 뽑아냄
    list.stream().map(Stock::getName).forEach(System.out::println);
    //위와 동일함 -&amp;gt; list.stream().map(s-&amp;gt;s.getName()).forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;삼성전자&lt;br /&gt;하이닉스&lt;br /&gt;카카오&lt;br /&gt;네이버&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flatmap의 경우 단일 배열이 아닐 경우 전체 데이터를 평탄화해 단일 스트림으로 변환해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 mainlist는 List를 배열로 가지고 있는 List입니다. mainlist의 모든 Stock 객체의 이름을 추출하고 싶을때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 스트림에서만 사용가능만 map으로는 처리 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flatmap으로 단일 스트림으로 평탄화시켜준 후, map으로 추출 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633068273073&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;List&amp;lt;Stock&amp;gt;&amp;gt; mainlist = new ArrayList&amp;lt;&amp;gt;();

    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(77000, &quot;삼성전자&quot;));
    list.add(new Stock(100000, &quot;하이닉스&quot;));

    List&amp;lt;Stock&amp;gt; list2 = new ArrayList&amp;lt;&amp;gt;();
    list2.add(new Stock(110000, &quot;카카오&quot;));
    list2.add(new Stock(400000, &quot;네이버&quot;));

    mainlist.add(list);
    mainlist.add(list2);

    mainlist.stream()
            .flatMap(Collection::stream)
            .map(Stock::getName)
            .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;삼성전자&lt;br /&gt;하이닉스&lt;br /&gt;카카오&lt;br /&gt;네이버&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. limit(), skip() 활용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;limit은 스트림의 데이터를 해당 개수 만큼 제한 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633068527502&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(77000, &quot;삼성전자&quot;));
    list.add(new Stock(100000, &quot;하이닉스&quot;));
    list.add(new Stock(110000, &quot;카카오&quot;));
    list.add(new Stock(400000, &quot;네이버&quot;));

    list.stream().limit(1).map(Stock::getName).forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;삼성전자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skip 지정된 개수만큼 앞에서부터 제외하고 나머지 요소를 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633068646731&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(77000, &quot;삼성전자&quot;));
    list.add(new Stock(100000, &quot;하이닉스&quot;));
    list.add(new Stock(110000, &quot;카카오&quot;));
    list.add(new Stock(400000, &quot;네이버&quot;));

    list.stream().skip(2).map(Stock::getName).forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;카카오&lt;br /&gt;네이버&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. sorted() 활용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sorted() 메소드를 활용하면 데이터 정렬이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1633068878719&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    List&amp;lt;Stock&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(new Stock(77000, &quot;삼성전자&quot;));
    list.add(new Stock(100000, &quot;하이닉스&quot;));
    list.add(new Stock(110000, &quot;카카오&quot;));
    list.add(new Stock(400000, &quot;네이버&quot;));

    System.out.println(&quot;가격 순으로 오름차순&quot;);
    list.stream()
        .sorted(Comparator.comparing(Stock::getPrice))
        .map(Stock::getName)
        .forEach(System.out::println);
    System.out.println();
    System.out.println(&quot;가격 순으로 내림차순&quot;);
    list.stream()
        .sorted(Comparator.comparing(Stock::getPrice, Comparator.reverseOrder()))
        .map(Stock::getName)
        .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#출력결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가격 순으로 오름차순&lt;br /&gt;삼성전자&lt;br /&gt;하이닉스&lt;br /&gt;카카오&lt;br /&gt;네이버&lt;br /&gt;&lt;br /&gt;가격&amp;nbsp;순으로&amp;nbsp;내림차순&lt;br /&gt;네이버&lt;br /&gt;카카오&lt;br /&gt;하이닉스&lt;br /&gt;삼성전자&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>Stream</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/115</guid>
      <comments>https://vmpo.tistory.com/115#entry115comment</comments>
      <pubDate>Fri, 1 Oct 2021 15:17:47 +0900</pubDate>
    </item>
    <item>
      <title>[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회-02</title>
      <link>https://vmpo.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바로 네이버 주식가격 크롤링하기 두번째 포스팅입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 개발 환경은 아래 포스팅 확인해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/113&quot;&gt;[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회 -01 - 오오코딩 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631865178740&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회 -01&quot; data-og-description=&quot;Java로 크롤링 쉽게 하기 Java에서도 Python 처럼 쉽게 크롤링이 가능합니다. Jsoup 라이브러리를 활용해서 네이버 주식 가격을 조회 해보도록 하겠습니다. 전체 소스는 제일 하단에 공유해드렸습니&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/113&quot; data-og-url=&quot;https://vmpo.tistory.com/113&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VKvRw/hyLCFvZbSr/wrCMydi2MmYObbEjxv76E1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/bAvo4n/hyLCvz9iIF/yWBgfdnnRoPrf8YMJS0OG1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/imy27/hyLDX9DGmq/bjRNsh9Hw7sWhRNQEgkBq1/img.png?width=1862&amp;amp;height=1066&amp;amp;face=0_0_1862_1066&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/113&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/113&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VKvRw/hyLCFvZbSr/wrCMydi2MmYObbEjxv76E1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/bAvo4n/hyLCvz9iIF/yWBgfdnnRoPrf8YMJS0OG1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/imy27/hyLDX9DGmq/bjRNsh9Hw7sWhRNQEgkBq1/img.png?width=1862&amp;amp;height=1066&amp;amp;face=0_0_1862_1066');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회 -01&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java로 크롤링 쉽게 하기 Java에서도 Python 처럼 쉽게 크롤링이 가능합니다. Jsoup 라이브러리를 활용해서 네이버 주식 가격을 조회 해보도록 하겠습니다. 전체 소스는 제일 하단에 공유해드렸습니&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에선 실제 로컬 서버를 띄우고 브라우저에서 크롤링한 데이터를 출력해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 패키지 구조 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 구조로 구성해두었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller - url정보 셋팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service - 컨트롤러에서 호출할 메소드 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain - 리턴할 dto 경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;component - 실제 크롤링할 로직 처리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;1408&quot; width=&quot;453&quot; height=&quot;624&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blzSRX/btrfmQb7dqy/ZFRcwFZQlydbbT9KfkPPW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blzSRX/btrfmQb7dqy/ZFRcwFZQlydbbT9KfkPPW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blzSRX/btrfmQb7dqy/ZFRcwFZQlydbbT9KfkPPW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblzSRX%2FbtrfmQb7dqy%2FZFRcwFZQlydbbT9KfkPPW1%2Fimg.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;1408&quot; width=&quot;453&quot; height=&quot;624&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#Controller&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이&amp;nbsp; localhost:8080/kospi/all 을 호출했을때 처리를 위한 컨트롤러 생성. Json형태로 리턴함.&lt;/p&gt;
&lt;pre id=&quot;code_1631865355139&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.oogo.api.controller.stock;

import com.oogo.api.domain.dto.stock.KospiStockDto;
import com.oogo.api.service.stock.StockService;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class StockController {

  private final StockService stockService;

  @GetMapping(&quot;/kospi/all&quot;)
  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList(HttpServletRequest request) {
    return stockService.getKosPiStockList();

  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#Service&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 컨트롤러에서 호출할 메소드로 component 메소드를 호출해서 결과값을 컨트롤러로 전달함 (중간 다리 역할)&lt;/p&gt;
&lt;pre id=&quot;code_1631865429552&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.oogo.api.service.stock;

import com.oogo.api.component.stock.JsoupComponent;
import com.oogo.api.domain.dto.stock.KospiStockDto;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class StockService {

  private final JsoupComponent jsoupComponent;

  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList() {
    return jsoupComponent.getKosPiStockList();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#domain&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링할 결과 값을 저장할 Dto 클래스 토론방url(discussionRoomUrl) 은 뒷 uri만 크롤링되므로 앞에 도메인까지 포함 될 수 있도록 getter를 새로 추가해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1631865500338&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.oogo.api.domain.dto.stock;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class KospiStockDto {

  private String no;
  private String stockName;
  private String price;                // 현재가
  private String diffAmount;           // 전일비
  private String dayRange;             // 등락률
  private String parValue;             // 액면가
  private String marketCap;            // 시가총액
  private String numberOfListedShares; // 상장 주식 수
  private String foreignOwnRate;       // 외국인 비율
  private String turnover;             // 거래량
  private String per;                  // per
  private String roe;                  // roe
  private String discussionRoomUrl;    // 토론방 url

  public String getDiscussionRoomUrl() {
    return &quot;https://finance.naver.com&quot;+discussionRoomUrl;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;#Component&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 크롤링 로직 처리를 하는 클래스&lt;/p&gt;
&lt;pre id=&quot;code_1631865597980&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.oogo.api.component.stock;

import com.oogo.api.domain.dto.stock.KospiStockDto;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

@Component
public class JsoupComponent {

  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList() {
    final String stockList = &quot;https://finance.naver.com/sise/sise_market_sum.nhn?&amp;amp;page=1&quot;;
    Connection conn = Jsoup.connect(stockList);
    try {
      Document document = conn.get();
      return getKosPiStockList(document);
    } catch (IOException ignored) {
    }
    return null;
  }

  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList(Document document) {
    Elements kosPiTable = document.select(&quot;table.type_2 tbody tr&quot;);
    List&amp;lt;KospiStockDto&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    for (Element element : kosPiTable) {
      if (element.attr(&quot;onmouseover&quot;).isEmpty()) {
        continue;
      }
      list.add(createKosPiStockDto(element.select(&quot;td&quot;)));
    }
    return list;
  }

  public KospiStockDto createKosPiStockDto(Elements td) {
    KospiStockDto kospiStockDto = KospiStockDto.builder().build();
    Class&amp;lt;?&amp;gt; clazz = kospiStockDto.getClass();
    Field[] fields = clazz.getDeclaredFields();

    for (int i = 0; i &amp;lt; td.size(); i++) {
      String text;
      if(td.get(i).select(&quot;.center a&quot;).attr(&quot;href&quot;).isEmpty()){
        text = td.get(i).text();
      }else{
        text = &quot;https://finance.naver.com&quot; + td.get(i).select(&quot;.center a&quot;).attr(&quot;href&quot;);
      }
      fields[i].setAccessible(true);
      try{
        fields[i].set(kospiStockDto,text);
      }catch (Exception ignored){
      }
    }
    return kospiStockDto;
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;--Component 상세 설명--&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. &lt;span style=&quot;color: #61afef;&quot;&gt;getKosPiStockList&lt;/span&gt;()&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서비스에서 호출할 메소드로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타겟 URL을 기준으로 크롤링하기 위한 커넥션을 생성하고 document 객체를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- getKosPiStockList(document) 를 호출해 결과값을 받아 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1631865637357&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList() {
    final String stockList = &quot;https://finance.naver.com/sise/sise_market_sum.nhn?&amp;amp;page=1&quot;;
    Connection conn = Jsoup.connect(stockList);
    try {
      Document document = conn.get();
      return getKosPiStockList(document);
    } catch (IOException ignored) {
    }
    return null;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. &lt;span style=&quot;color: #61afef;&quot;&gt;getKosPiStockList&lt;/span&gt;(&lt;span style=&quot;color: #e5c07b;&quot;&gt;Document &lt;/span&gt;&lt;span style=&quot;color: #d19a66;&quot;&gt;document&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 결과값을 1차적으로 전달받는다. (document.select() 메소드로 태그 접근함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이제 전달 받은 결과값 kosPiTable 변수에 담긴 데이터를 for loop를 통해 하나씩 KospiStockDto 객체로 변환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- KospiStockDto 객체 변환은 createKosPiStockDto() 메소를 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변환된 객체는 List&amp;lt;KospiStockDto&amp;gt; list; 에 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장한 list를 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1631865766865&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public List&amp;lt;KospiStockDto&amp;gt; getKosPiStockList(Document document) {
    Elements kosPiTable = document.select(&quot;table.type_2 tbody tr&quot;);
    List&amp;lt;KospiStockDto&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    for (Element element : kosPiTable) {
      if (element.attr(&quot;onmouseover&quot;).isEmpty()) {
        continue;
      }
      list.add(createKosPiStockDto(element.select(&quot;td&quot;)));
    }
    return list;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. &lt;span style=&quot;color: #61afef;&quot;&gt;createKosPiStockDto&lt;/span&gt;(&lt;span style=&quot;color: #e5c07b;&quot;&gt;Elements &lt;/span&gt;&lt;span style=&quot;color: #d19a66;&quot;&gt;td&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전달 받은 객체를 dto 객체로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- java 의 리플렉션을 활용해 객체로 변환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- KospiStockDto kospiStockDto = KospiStockDto.builder().build(); 기본 객체를 하나 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;nbsp; -&amp;gt; KospiStockDto kospiStockDto = new KospiStockDto() 와 동일한 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- kospiStockDto.getClass();&amp;nbsp; 해당객체의 Class 타입으로 접근한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- clazz.getDeclaredFields();&amp;nbsp; 전체 필드를 배열로 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&amp;nbsp;-&amp;gt; KospiStockDto 에서 생성한 필드 순서로 (위에서 부터 차례로) 배열을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전달받은 파라미터인 &quot;Element td&quot; 는 앞서 크롤링시 &amp;lt;tr&amp;gt; 태그 하위에 있는 td들을 모두 갖는 리스트라고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아래 캡처화면의 &amp;lt;tr&amp;gt;&amp;lt;/tr&amp;gt; 영역 정보라고 보면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;..&amp;lt;/td&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLydXl/btrfn4mNpEz/tNkLfEfQeo2QRRZYU9x5t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLydXl/btrfn4mNpEz/tNkLfEfQeo2QRRZYU9x5t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLydXl/btrfn4mNpEz/tNkLfEfQeo2QRRZYU9x5t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLydXl%2Fbtrfn4mNpEz%2FtNkLfEfQeo2QRRZYU9x5t0%2Fimg.png&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;- Element td 를 기준으로 for문을 돌리며 i=0 부터 순서대로 Field[] 배열의 0번째 데이터부터 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- field[i].setAccessible(true); private 변수에 대한 접근을 허용하도록 한다.(KospiStockDto 필드가 private 이기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fields[i].set(kospiStockDto,text); set 메소드로 필드의 값을 셋팅한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;파라미터로 set(셋팅할 원본 객체, 변경할 값) 을 전달하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 셋팅된 KospiStockDto 객체를 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1631865917769&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public KospiStockDto createKosPiStockDto(Elements td) {
    KospiStockDto kospiStockDto = KospiStockDto.builder().build();
    Class&amp;lt;?&amp;gt; clazz = kospiStockDto.getClass();
    Field[] fields = clazz.getDeclaredFields();

    for (int i = 0; i &amp;lt; td.size(); i++) {
      String text;
      if(td.get(i).select(&quot;.center a&quot;).attr(&quot;href&quot;).isEmpty()){
        text = td.get(i).text();
      }else{
        text = &quot;https://finance.naver.com&quot; + td.get(i).select(&quot;.center a&quot;).attr(&quot;href&quot;);
      }
      fields[i].setAccessible(true);
      try{
        fields[i].set(kospiStockDto,text);
      }catch (Exception ignored){
      }
    }
    return kospiStockDto;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 빌드해서 실제 브라우저에서 어떤결과가 출력되는지 확인해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8080/kospi/all 호출 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 json array 결과를 확인 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 데이터를 db에 저장할 수도 있고 html을 만들어서 예쁘게 화면으로 출력 할 수도 있을 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 포스팅에선 db 저장 및 html 화면 출력까지 한 번 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2020&quot; width=&quot;634&quot; height=&quot;641&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmMWgk/btrfmQi1lE8/ckETZTudmNvNKiRgWXikqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmMWgk/btrfmQi1lE8/ckETZTudmNvNKiRgWXikqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmMWgk/btrfmQi1lE8/ckETZTudmNvNKiRgWXikqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmMWgk%2FbtrfmQi1lE8%2FckETZTudmNvNKiRgWXikqK%2Fimg.png&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2020&quot; width=&quot;634&quot; height=&quot;641&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체소스는 아래 Github 참고 부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/build99k/spring-boot-buildup&quot;&gt;build99k/spring-boot-buildup (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631866701220&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - build99k/spring-boot-buildup&quot; data-og-description=&quot;Contribute to build99k/spring-boot-buildup development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/build99k/spring-boot-buildup&quot; data-og-url=&quot;https://github.com/build99k/spring-boot-buildup&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uvBzh/hyLD1KZ1sf/fDnm38qzdPbzNikldn9UTk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/build99k/spring-boot-buildup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/build99k/spring-boot-buildup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uvBzh/hyLD1KZ1sf/fDnm38qzdPbzNikldn9UTk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - build99k/spring-boot-buildup&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to build99k/spring-boot-buildup development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>springboot</category>
      <category>jsoup</category>
      <category>springboot</category>
      <category>네이버</category>
      <category>주식</category>
      <category>크롤링</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/114</guid>
      <comments>https://vmpo.tistory.com/114#entry114comment</comments>
      <pubDate>Fri, 17 Sep 2021 17:19:06 +0900</pubDate>
    </item>
    <item>
      <title>[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회 -01</title>
      <link>https://vmpo.tistory.com/113</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Java로 크롤링 쉽게 하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Java에서도 Python 처럼 쉽게 크롤링이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Jsoup 라이브러리를 활용해서 네이버 주식 가격을 조회 해보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 소스는 제일 하단에 공유해드렸습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발환경 : springboot&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라이브러리 : Jsoup&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Jsoup 라이브러리 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &amp;gt; java project일 경우 jar 파일을 다운로드 받아서 import 한 후 진행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsoup.org/&quot;&gt;jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631788351190&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety&quot; data-og-description=&quot;jsoup: Java HTML Parser jsoup is a Java library for working with real-world HTML. It provides a very convenient API for fetching URLs and extracting and manipulating data, using the best of HTML5 DOM methods and CSS selectors. jsoup implements the WHATWG H&quot; data-og-host=&quot;jsoup.org&quot; data-og-source-url=&quot;https://jsoup.org/&quot; data-og-url=&quot;https://jsoup.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7TJlw/hyLCLoy8y4/Y8ok41FY2G9ohJooiudKFK/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480&quot;&gt;&lt;a href=&quot;https://jsoup.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsoup.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7TJlw/hyLCLoy8y4/Y8ok41FY2G9ohJooiudKFK/img.png?width=480&amp;amp;height=480&amp;amp;face=0_0_480_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;jsoup: Java HTML Parser jsoup is a Java library for working with real-world HTML. It provides a very convenient API for fetching URLs and extracting and manipulating data, using the best of HTML5 DOM methods and CSS selectors. jsoup implements the WHATWG H&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsoup.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본 포스팅은 스프링부트 환경이므로 maven or gradle 설정을 해주도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(저는 gradle로 진행하겠습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;MAVEN&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 842px;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;org.jsoup&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;jsoup&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;1.14.2&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Gradle&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 18px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #fafafa;&quot;&gt;implementation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #737e73;&quot;&gt;'org.jsoup:jsoup:1.14.2'&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 gradle 설정을 해주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;424&quot; width=&quot;674&quot; height=&quot;206&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GMKPs/btrfhIj6Dnk/p33QeqfL4PzE8DJmkNxLwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GMKPs/btrfhIj6Dnk/p33QeqfL4PzE8DJmkNxLwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GMKPs/btrfhIj6Dnk/p33QeqfL4PzE8DJmkNxLwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGMKPs%2FbtrfhIj6Dnk%2Fp33QeqfL4PzE8DJmkNxLwk%2Fimg.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;424&quot; width=&quot;674&quot; height=&quot;206&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 네이버 시가총액 순위 가격조회 화면을 크롤링 해보도록 하겠습니다. 빨간색 영역을 조회하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;URL : https://finance.naver.com/sise/sise_market_sum.nhn?&amp;amp;page=1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1989&quot; data-origin-height=&quot;1866&quot; width=&quot;531&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFKUvT/btrfhJQQmHT/t846l4QZ1rP5z4299YL8m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFKUvT/btrfhJQQmHT/t846l4QZ1rP5z4299YL8m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFKUvT/btrfhJQQmHT/t846l4QZ1rP5z4299YL8m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFKUvT%2FbtrfhJQQmHT%2Ft846l4QZ1rP5z4299YL8m0%2Fimg.png&quot; data-origin-width=&quot;1989&quot; data-origin-height=&quot;1866&quot; width=&quot;531&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;F12 를 눌러서 개발자 도구를 활용해서 html이 어떻게 구성되어있는지 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조회하고자 하는 영역은 &amp;lt;table&amp;gt;영역으로 &amp;lt;thead&amp;gt; 가 제일 상단 칼럼정보(N,종목명,전일비,,,) &amp;lt;tbody&amp;gt;가 데이터를 담는 row들인 것을 알 수 있습니다. 그럼 해당 영역을 나눠서 조회 해보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;1066&quot; width=&quot;636&quot; height=&quot;364&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ni86d/btrfi4Nv5Uh/cBnI9lxqLi365RzHRPphyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ni86d/btrfi4Nv5Uh/cBnI9lxqLi365RzHRPphyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ni86d/btrfi4Nv5Uh/cBnI9lxqLi365RzHRPphyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNi86d%2Fbtrfi4Nv5Uh%2FcBnI9lxqLi365RzHRPphyk%2Fimg.png&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;1066&quot; width=&quot;636&quot; height=&quot;364&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 서버를 띄우지 않고 콘솔창에 크롤링 결과를 출력 해보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* 전체소스&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631788676053&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class JsoupComponentLocalMain {

  public static void getStockPriceList() {

    final String stockList = &quot;https://finance.naver.com/sise/sise_market_sum.nhn?&amp;amp;page=1&quot;;
    Connection conn = Jsoup.connect(stockList);

    try {
      Document document = conn.get();
      String thead = getStockHeader(document); // 칼럼명
      String tbody = getStockList(document);   // 데이터 리스트
      System.out.println(thead);
      System.out.println(tbody);

    } catch (IOException ignored) {
    }
  }

  public static String getStockHeader(Document document) {
    Elements stockTableBody = document.select(&quot;table.type_2 thead tr&quot;);
    StringBuilder sb = new StringBuilder();
    for (Element element : stockTableBody) {
      for (Element td : element.select(&quot;th&quot;)) {
        sb.append(td.text());
        sb.append(&quot;   &quot;);
      }
      break;
    }
    return sb.toString();
  }

  public static String getStockList(Document document) {
    Elements stockTableBody = document.select(&quot;table.type_2 tbody tr&quot;);
    StringBuilder sb = new StringBuilder();
    for (Element element : stockTableBody) {
      if (element.attr(&quot;onmouseover&quot;).isEmpty()) {
        continue;
      }

      for (Element td : element.select(&quot;td&quot;)) {
        String text;
        if(td.select(&quot;.center a&quot;).attr(&quot;href&quot;).isEmpty()){
          text = td.text();
        }else{
          text = &quot;https://finance.naver.com&quot;+td.select(&quot;.center a&quot;).attr(&quot;href&quot;);
        }
        sb.append(text);
        sb.append(&quot;   &quot;);
      }
      sb.append(System.getProperty(&quot;line.separator&quot;)); //줄바꿈
    }
    return sb.toString();
  }

  public static void main(String[] args) {
    getStockPriceList();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;상세설명&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.조회할 URL 셋팅 및 Document 객체로드하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-getStockHeader() -&amp;gt; 칼럼명 정보 조회&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-getStockList()&amp;nbsp; &amp;nbsp;-&amp;gt; 리스트 데이터 조회&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631789149851&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static void getStockPriceList() {

    final String stockList = &quot;https://finance.naver.com/sise/sise_market_sum.nhn?&amp;amp;page=1&quot;;
    Connection conn = Jsoup.connect(stockList);

    try {
      Document document = conn.get();
      String thead = getStockHeader(document); // 칼럼명
      String tbody = getStockList(document);   // 데이터 리스트
      System.out.println(thead);
      System.out.println(tbody);

    } catch (IOException ignored) {
    }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 칼럼명 정보 파싱&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- document.select() 로 html 태그 접근&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; table.type_2&amp;nbsp;thead&amp;nbsp;tr&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-tr 태그로 접근했으니, th를 for문으로 각각 조회&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;576&quot; width=&quot;675&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcNoIC/btrfhkw1Hu8/VaEnIkwhDgzULba5ttTqHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcNoIC/btrfhkw1Hu8/VaEnIkwhDgzULba5ttTqHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcNoIC/btrfhkw1Hu8/VaEnIkwhDgzULba5ttTqHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcNoIC%2Fbtrfhkw1Hu8%2FVaEnIkwhDgzULba5ttTqHK%2Fimg.png&quot; data-origin-width=&quot;1588&quot; data-origin-height=&quot;576&quot; width=&quot;675&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&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_1631789264974&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static String getStockHeader(Document document) {
    Elements stockTableBody = document.select(&quot;table.type_2 thead tr&quot;);
    StringBuilder sb = new StringBuilder();
    for (Element element : stockTableBody) {
      for (Element td : element.select(&quot;th&quot;)) {
        sb.append(td.text());
        sb.append(&quot;   &quot;);
      }
      break;
    }
    return sb.toString();
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 데이터 정보 파싱&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- document.select() 로 html 태그 접근&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; table.type_2&amp;nbsp;tbody&amp;nbsp;tr&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- tr 태그로 접근했으니, td를 for으로 조회,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 마지막 td는 토론방 url로 a tag를 통해 접근해야되니깐 별도 분기처리를 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMuj2t/btrfcYPk6uz/Ku7wdBG713ZmwTSWilK5Jk/img.png&quot; width=&quot;671&quot; height=&quot;287&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/cMuj2t/btrfcYPk6uz/Ku7wdBG713ZmwTSWilK5Jk/img.png&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;688&quot; /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631789286408&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static String getStockList(Document document) {
    Elements stockTableBody = document.select(&quot;table.type_2 tbody tr&quot;);
    StringBuilder sb = new StringBuilder();
    for (Element element : stockTableBody) {
      if (element.attr(&quot;onmouseover&quot;).isEmpty()) {
        continue;
      }

      for (Element td : element.select(&quot;td&quot;)) {
        String text;
        if(td.select(&quot;.center a&quot;).attr(&quot;href&quot;).isEmpty()){
          text = td.text();
        }else{
          text = &quot;https://finance.naver.com&quot;+td.select(&quot;.center a&quot;).attr(&quot;href&quot;);
        }
        sb.append(text);
        sb.append(&quot;   &quot;);
      }
      sb.append(System.getProperty(&quot;line.separator&quot;)); //줄바꿈
    }
    return sb.toString();
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;main 메소드로 출력해보도록 하겠습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 정상적으로 출력되는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1436&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHeBi/btrfdYuWuP0/8BiCQOZzfuysQ8VubMcac1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHeBi/btrfdYuWuP0/8BiCQOZzfuysQ8VubMcac1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHeBi/btrfdYuWuP0/8BiCQOZzfuysQ8VubMcac1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHeBi%2FbtrfdYuWuP0%2F8BiCQOZzfuysQ8VubMcac1%2Fimg.png&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1436&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 서버를 띄워 브라우저 호출은 다음 포스팅에서 진행하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 소스 코드는 아래 깃허브에 올려두었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/build99k/spring-boot-buildup&quot;&gt;build99k/spring-boot-buildup (github.com)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631789736185&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - build99k/spring-boot-buildup&quot; data-og-description=&quot;Contribute to build99k/spring-boot-buildup development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/build99k/spring-boot-buildup&quot; data-og-url=&quot;https://github.com/build99k/spring-boot-buildup&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n7Nsy/hyLCKpQP8M/w9BPJXHTOU0FhJ9FE9nH80/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/build99k/spring-boot-buildup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/build99k/spring-boot-buildup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n7Nsy/hyLCKpQP8M/w9BPJXHTOU0FhJ9FE9nH80/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - build99k/spring-boot-buildup&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to build99k/spring-boot-buildup development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>springboot</category>
      <category>Java</category>
      <category>jsoup</category>
      <category>sprigboot</category>
      <category>주식</category>
      <category>주식가격조회</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/113</guid>
      <comments>https://vmpo.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 16 Sep 2021 19:56:20 +0900</pubDate>
    </item>
    <item>
      <title>[비트코인] 업비트 API로 시세 조회</title>
      <link>https://vmpo.tistory.com/112</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;업비트 시세조회 API 활용하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;업비트 API를 통해 시세조회를 할 수 있는 스프링부트 서버를 간단하게 만들어 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업비트 API관련 문서는 아래 링크를 참조하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.upbit.com/docs&quot;&gt;인증 가능한 요청 만들기 (upbit.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631707178853&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;업비트 개발자 센터&quot; data-og-description=&quot;업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.&quot; data-og-host=&quot;docs.upbit.com&quot; data-og-source-url=&quot;https://docs.upbit.com/docs&quot; data-og-url=&quot;https://docs.upbit.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5Djh8/hyLBtvG95I/yIkHrXGvijDkCKSWxfh8d1/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627&quot;&gt;&lt;a href=&quot;https://docs.upbit.com/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.upbit.com/docs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5Djh8/hyLBtvG95I/yIkHrXGvijDkCKSWxfh8d1/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;업비트 개발자 센터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.upbit.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 호출 하기 위해 Feign Client를 활용하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Feign Client 관련 상세 설명은 아래 링크 참조 부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/109&quot;&gt;[springboot]Feign client 사용하기 - REST api 간편 호출 - 오오코딩 (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631707224210&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[springboot]Feign client 사용하기 - REST api 간편 호출&quot; data-og-description=&quot;스프링 환경에서 간편하게 외부 api를 호출할 수 있는 라이브러리인 feign client 를 사용해보도록 하겠습니다. restTemplate 보다 훨씬 더 간편하게 api를 호출 할 수 있습니다. feign client의 다양한 기능&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/109&quot; data-og-url=&quot;https://vmpo.tistory.com/109&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e4ocf/hyLBAByNXv/zEkSkE2Bd4WWfRshnku2S1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/JwvcJ/hyLBAn3CC7/DZvVQdDs1b7Y1VBkgO0Hb1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/dLiN4j/hyLCzgKCHX/8pLjH5TA4rRKHGLMCl0tV0/img.png?width=1876&amp;amp;height=1066&amp;amp;face=0_0_1876_1066&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/109&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/109&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e4ocf/hyLBAByNXv/zEkSkE2Bd4WWfRshnku2S1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/JwvcJ/hyLBAn3CC7/DZvVQdDs1b7Y1VBkgO0Hb1/img.png?width=800&amp;amp;height=810&amp;amp;face=0_0_800_810,https://scrap.kakaocdn.net/dn/dLiN4j/hyLCzgKCHX/8pLjH5TA4rRKHGLMCl0tV0/img.png?width=1876&amp;amp;height=1066&amp;amp;face=0_0_1876_1066');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[springboot]Feign client 사용하기 - REST api 간편 호출&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스프링 환경에서 간편하게 외부 api를 호출할 수 있는 라이브러리인 feign client 를 사용해보도록 하겠습니다. restTemplate 보다 훨씬 더 간편하게 api를 호출 할 수 있습니다. feign client의 다양한 기능&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 소스는 아래 github 링크 공유드리도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시세 조회 API : &lt;span style=&quot;background-color: #f6f8fa; color: #b35e14;&quot;&gt;&lt;a href=&quot;https://api.upbit.com/v1/ticker?markets=KRW-BTC&quot;&gt;https://api.upbit.com/v1/ticker?markets=KRW-BTC&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 호출 해보면 아래 결과를 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c12ZLn/btrfa1EFK0d/Q8Te1XF6skHT68EUz1HZWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c12ZLn/btrfa1EFK0d/Q8Te1XF6skHT68EUz1HZWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c12ZLn/btrfa1EFK0d/Q8Te1XF6skHT68EUz1HZWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc12ZLn%2Fbtrfa1EFK0d%2FQ8Te1XF6skHT68EUz1HZWK%2Fimg.png&quot; data-origin-width=&quot;2866&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;1. Controller 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;602&quot; width=&quot;592&quot; height=&quot;282&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJ1GG/btre6DxOqVc/6uTJcmvmgBLXBwvu95Z6pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJ1GG/btre6DxOqVc/6uTJcmvmgBLXBwvu95Z6pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJ1GG/btre6DxOqVc/6uTJcmvmgBLXBwvu95Z6pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJ1GG%2Fbtre6DxOqVc%2F6uTJcmvmgBLXBwvu95Z6pK%2Fimg.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;602&quot; width=&quot;592&quot; height=&quot;282&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Service 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;486&quot; width=&quot;615&quot; height=&quot;286&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csqaMh/btrfcnfETx1/V61alSqhiOqdo8bTZDcMW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csqaMh/btrfcnfETx1/V61alSqhiOqdo8bTZDcMW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csqaMh/btrfcnfETx1/V61alSqhiOqdo8bTZDcMW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsqaMh%2FbtrfcnfETx1%2FV61alSqhiOqdo8bTZDcMW1%2Fimg.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;486&quot; width=&quot;615&quot; height=&quot;286&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Feign client interface&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;350&quot; width=&quot;724&quot; height=&quot;128&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDyM9/btre7Jds0CU/2G9aUK9D2S19XJDSFWqCDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDyM9/btre7Jds0CU/2G9aUK9D2S19XJDSFWqCDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDyM9/btre7Jds0CU/2G9aUK9D2S19XJDSFWqCDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDyM9%2Fbtre7Jds0CU%2F2G9aUK9D2S19XJDSFWqCDk%2Fimg.png&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;350&quot; width=&quot;724&quot; height=&quot;128&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. DTO 생성 - api 호출 후 리턴 받을 데이터를 매핑할 클래스 편의상 모두 String으로 처리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1358&quot; width=&quot;360&quot; height=&quot;620&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y20dc/btrfarwzSZk/scD2d31cSvegkMi4Mz75q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y20dc/btrfarwzSZk/scD2d31cSvegkMi4Mz75q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y20dc/btrfarwzSZk/scD2d31cSvegkMi4Mz75q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY20dc%2FbtrfarwzSZk%2FscD2d31cSvegkMi4Mz75q0%2Fimg.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1358&quot; width=&quot;360&quot; height=&quot;620&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. main 클래스 어노테이션 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;480&quot; width=&quot;675&quot; height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR6YgS/btrfc74JdfJ/45LYXm6iGKe4QV0Vn0Dfk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR6YgS/btrfc74JdfJ/45LYXm6iGKe4QV0Vn0Dfk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR6YgS/btrfc74JdfJ/45LYXm6iGKe4QV0Vn0Dfk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR6YgS%2Fbtrfc74JdfJ%2F45LYXm6iGKe4QV0Vn0Dfk1%2Fimg.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;480&quot; width=&quot;675&quot; height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 후 호출 테스트를 해보면 아래와 같은 정상적으로 시세 조회가 가능한 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 URL에서 주황색 부분을 원하는 티커로 변경해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; http://localhost:8080/v1/upbit/&lt;span style=&quot;background-color: #f3c000;&quot;&gt;KRW-BTC&amp;nbsp;&lt;/span&gt;&amp;nbsp; (비트코인 한국 시세)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1190&quot; width=&quot;520&quot; height=&quot;580&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AX459/btrfbecHpI1/n9RfeVUTnp4AMGLaa5tV40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AX459/btrfbecHpI1/n9RfeVUTnp4AMGLaa5tV40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AX459/btrfbecHpI1/n9RfeVUTnp4AMGLaa5tV40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAX459%2FbtrfbecHpI1%2Fn9RfeVUTnp4AMGLaa5tV40%2Fimg.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1190&quot; width=&quot;520&quot; height=&quot;580&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>springboot</category>
      <category>API</category>
      <category>비트코인</category>
      <category>업비트</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/112</guid>
      <comments>https://vmpo.tistory.com/112#entry112comment</comments>
      <pubDate>Wed, 15 Sep 2021 21:11:50 +0900</pubDate>
    </item>
    <item>
      <title>[java] sha-256 해싱 알고리즘 사용하기</title>
      <link>https://vmpo.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;블록체인에서 가장 많이 사용하고 있는 해싱 알고리즘인 sha-256 알고리즘을 java로 구현 해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. sha256으로 해싱&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;java 기본 클래스인 MessageDigest 를 활용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-MessageDigest 객체 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-변환할 스트링을 바이트로 변환하여 digest() 메소드의 파라미터로 던짐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-bytesToHex 메소드로 바이트를 16진수 스트링으로 변환함 (해당 메소드는 새로 구현해야됨, 아래 참고)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631673004472&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static String Sha256(String originalString) throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance(&quot;SHA-256&quot;);
    byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
    return bytesToHex(encodedhash);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 바이트로 해싱된 데이터를 16진수 스트링으로 변환&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전달받은 바이트 값을 16진수로 변환해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0xff &amp;amp; hash[i] 는 16진수 변환을 위한 조작인데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;hash[i] 값이 음수일 경우 양수로 변환하기 위한 작업이다. 바이트의 경우 비트로 표현하면 8bit 이지만, 제일 앞자리를 부호비트로 사용하기 때문에 10진수 표현 범위는 -128~ 127이다.&amp;nbsp; ( 1111 1111 일 경우 제일 앞자리를 부호비트로 사용해 255가 아닌&amp;nbsp; -1로 표현됨.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0xff는 비트로 표현하면 1111 1111&amp;nbsp; &amp;nbsp;10진수로 표현하면 255이다. 즉,&amp;nbsp; int 타입으로 처리된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, int는 4byte로 비트로 표현하면 32bit이다. (0000 0000 0000 0000 0000 0000 1111 1111) 이 되며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 32bit 값과 전달받은 byte와 and 연산을 시켜 양수로 표현이 되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-1 &amp;amp; 0xff 를 할경우 255으로 변환됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ex)&amp;nbsp; 0000 0000 0000 0000 0000 0000 1111 1111&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; (0xff)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;and&amp;nbsp; 1111&amp;nbsp; 1111&amp;nbsp; &amp;nbsp; 1111&amp;nbsp; &amp;nbsp; 1111&amp;nbsp; &amp;nbsp; 1111&amp;nbsp; &amp;nbsp;1111&amp;nbsp; 1111 1111&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; -1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;=.&amp;nbsp; &amp;nbsp;0000 0000 0000 0000 0000 0000 1111 1111 ( 10진수 255 , 양수로 변환됨)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631673173355&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  public static String bytesToHex(byte[] hash) {
    StringBuilder hexString = new StringBuilder(2 * hash.length);
    for (int i = 0; i &amp;lt; hash.length; i++) {
      String hex = Integer.toHexString(0xff &amp;amp; hash[i]);
      if (hex.length() == 1) {
        hexString.append('0');
      }
      hexString.append(hex);
    }
    return hexString.toString();
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 전체 소스코드 및 수행 결과&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;test&quot; 라는 스트링 값을 sha256 변환을 진행해 보면 아래와 같이 출력 값을 확인 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1198&quot; width=&quot;605&quot; height=&quot;454&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDoEMh/btre7IYsZDf/LgQkXZwATeqFm2pe8NBJk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDoEMh/btre7IYsZDf/LgQkXZwATeqFm2pe8NBJk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDoEMh/btre7IYsZDf/LgQkXZwATeqFm2pe8NBJk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDoEMh%2Fbtre7IYsZDf%2FLgQkXZwATeqFm2pe8NBJk1%2Fimg.png&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;1198&quot; width=&quot;605&quot; height=&quot;454&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;164&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2bE9E/btre42XwiQW/7rNxAX5PpX66asIZicMlWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2bE9E/btre42XwiQW/7rNxAX5PpX66asIZicMlWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2bE9E/btre42XwiQW/7rNxAX5PpX66asIZicMlWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2bE9E%2Fbtre42XwiQW%2F7rNxAX5PpX66asIZicMlWK%2Fimg.png&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;164&quot; data-ke-mobilestyle=&quot;widthOrigin&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>Java/기본</category>
      <category>Java</category>
      <category>SHA256</category>
      <category>블록체인</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/111</guid>
      <comments>https://vmpo.tistory.com/111#entry111comment</comments>
      <pubDate>Wed, 15 Sep 2021 11:58:03 +0900</pubDate>
    </item>
    <item>
      <title>[java]  Stream api 사용하기 - 01</title>
      <link>https://vmpo.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java 1.8부터 사용가능한 stream api 를 사용해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트림의 경우 기본적으로 아래 순서로 진행됩니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;stream 생성 -&amp;gt;중간연산(여러번 가능, stream을 반환함)&amp;nbsp; -&amp;gt; 최종연산&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-&amp;gt; 대상컬렉션.stream().중간연산.최종연산&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. stream으로 List의 데이터 출력하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strings 변수명으로 생성된 List를 출력하는 구문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 연산없이 바로 최종연산으로 데이터를 출력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1631612645767&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    //데이터 초기화
    List&amp;lt;String&amp;gt; strings = new ArrayList(){{
      add(&quot;A&quot;);
      add(&quot;B&quot;);
      add(&quot;C&quot;);
      add(&quot;d&quot;);
    }};
    strings.stream().forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 데이터가 출력된 것을 알 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;362&quot; width=&quot;530&quot; height=&quot;113&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlkcWk/btreYmWPv3t/V4Sg1PGEj141H1aWMjeS71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlkcWk/btreYmWPv3t/V4Sg1PGEj141H1aWMjeS71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlkcWk/btreYmWPv3t/V4Sg1PGEj141H1aWMjeS71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlkcWk%2FbtreYmWPv3t%2FV4Sg1PGEj141H1aWMjeS71%2Fimg.png&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;362&quot; width=&quot;530&quot; height=&quot;113&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 여기서 stream() 을 생성하고 최종연산을 한경우, 해당 strem을 다시 사용할 수 없음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Stream&amp;lt;String&amp;gt; 을 생성한 후 strStream에 대해 최종연산을 2번 진행하면 2번째 진행하는 연산에서 오류가 발생함.&lt;/p&gt;
&lt;pre id=&quot;code_1631612604452&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    //데이터 초기화
    List&amp;lt;String&amp;gt; strings = new ArrayList(){{
      add(&quot;A&quot;);
      add(&quot;B&quot;);
      add(&quot;C&quot;);
      add(&quot;d&quot;);
    }};

    Stream&amp;lt;String&amp;gt; strStream = strings.stream();
    strStream.forEach(System.out::println);
    //아래 구문은 오류 발생
    strStream.forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exception 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;176&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MkmWB/btreYctFAeN/vJbqKofSl4Z8UqdAlkhtb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MkmWB/btreYctFAeN/vJbqKofSl4Z8UqdAlkhtb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MkmWB/btreYctFAeN/vJbqKofSl4Z8UqdAlkhtb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMkmWB%2FbtreYctFAeN%2FvJbqKofSl4Z8UqdAlkhtb0%2Fimg.png&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;176&quot; data-ke-mobilestyle=&quot;widthOrigin&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.&amp;nbsp; 기본형 배열을 stream으로 변환하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 형 스트링 배열을 선언 하고(String[])&amp;nbsp; 해당 배열을 스트림으로 변환한 결과이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arrays.stream() 을 통해 스트림 변환이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1631612664854&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    String[] abc = {&quot;a&quot;,&quot;b&quot;,&quot;c&quot;};
    Stream&amp;lt;String&amp;gt; stream = Arrays.stream(abc);
    stream.forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.&amp;nbsp; &amp;nbsp;기본형 타입의 스트림&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무한 스트림을 생성할 경우에는 사이즈제한을 무조건 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 범위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; IntStream.&lt;span&gt;range&lt;/span&gt;(&lt;span style=&quot;color: #6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6897bb;&quot;&gt;5&lt;/span&gt;) //끝 자리 숫자 포함하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; IntStream.&lt;span&gt;rangeClosed&lt;/span&gt;(&lt;span style=&quot;color: #6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6897bb;&quot;&gt;5&lt;/span&gt;); //끝 자리 숫자 포함.&lt;/p&gt;
&lt;pre id=&quot;code_1631612682929&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    System.out.println(&quot;IntStream 출력&quot;);
    IntStream intStream1 = IntStream.range(1, 5); //[1,2,3,4] 5를 포함하지 않음
    IntStream intStream2 = IntStream.rangeClosed(1, 5); //[1,2,3,4,5] 5를 포함
    IntStream intStream3 = new Random().ints(); //무한 스트림 생성( 무한으로 임의의 숫자가 생성됨)
    intStream3.limit(5).forEach(System.out::println); //무한 스트림을 출력할때는 limit으로 사이즈 제한을 해줘야함.

    //Long type도 가능함.
    System.out.println(&quot;LongStream 출력&quot;);
    LongStream longStream = LongStream.rangeClosed(1, 5); // [1, 2, 3, 4, 5]
    longStream.forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;616&quot; width=&quot;689&quot; height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMsaEv/btre2fipqWp/bw5ejdpsk3cOfIzYYLyb7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMsaEv/btre2fipqWp/bw5ejdpsk3cOfIzYYLyb7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMsaEv/btre2fipqWp/bw5ejdpsk3cOfIzYYLyb7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMsaEv%2Fbtre2fipqWp%2Fbw5ejdpsk3cOfIzYYLyb7K%2Fimg.png&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;616&quot; width=&quot;689&quot; height=&quot;250&quot; data-ke-mobilestyle=&quot;widthOrigin&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.&amp;nbsp; Stream 생성&amp;nbsp; iterate , generate&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1631612959527&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    //연산가능!
    Stream&amp;lt;Integer&amp;gt; stream = Stream.iterate(0,n-&amp;gt;n+4);
    //stream.forEach(System.out::println); //무한 스트림 발생 ( 출력하면 무한히 계속 실행됨)
    stream.limit(5).forEach(System.out::println); //limit 으로 제한 [0,4,8,12,16]

    //파라미터는 없고 출력만함!
    Stream&amp;lt;Integer&amp;gt; gen = Stream.generate(()-&amp;gt; 10);
    gen.limit(5).forEach(System.out::println);//[10,10,10,10,10]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>Stream</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/110</guid>
      <comments>https://vmpo.tistory.com/110#entry110comment</comments>
      <pubDate>Tue, 14 Sep 2021 18:55:00 +0900</pubDate>
    </item>
    <item>
      <title>[springboot]Feign client 사용하기 - REST api 간편 호출</title>
      <link>https://vmpo.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스프링 환경에서 간편하게 외부 api를 호출할 수 있는 라이브러리인 feign client 를 사용해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;restTemplate 보다 훨씬 더 간편하게 api를 호출 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;feign client의 다양한 기능이 있지만 본 문서에서는 스프링 부트 환경에서 기본적인 기능을 활용해 api 호출을 간단하게 진행해보도록 하겠습니다. 전체 소스 코드는 하단의 github url 등록해두었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 라이브러리 import&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#gradle&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;ext {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;set(&lt;/span&gt;'springCloudVersion'&lt;span style=&quot;color: #6a8759;&quot;&gt;, &lt;/span&gt;&quot;2020.0.2&quot;&lt;span style=&quot;color: #6a8759;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;dependencies {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #629755;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'&lt;br /&gt;&amp;nbsp; implementation group: 'io.github.openfeign', name: 'feign-gson', version: '11.0'&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#maven&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;3.0.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저의 경우 프로젝트가 gradle로 셋팅하여 진행하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1138&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NeW7z/btreK7LME1P/TqTtCD30ogv6rmSNoQppK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NeW7z/btreK7LME1P/TqTtCD30ogv6rmSNoQppK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NeW7z/btreK7LME1P/TqTtCD30ogv6rmSNoQppK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNeW7z%2FbtreK7LME1P%2FTqTtCD30ogv6rmSNoQppK1%2Fimg.png&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1138&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.샘플 API 선정 - github rest api&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;json 호출 테스트 api로 github 에서 컨트리뷰터 이력을 확인 할 수 있는 github rest api를 활용 하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 url은 feign client 프로젝트 에 대한 이력을 확인 할 수 있는 api로 주황색 부분을 다른 깃헙 프로젝트 변경하면 해당 프로젝트의 컨트리퓨터 정보를 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ex ) &lt;a style=&quot;color: #000000;&quot; href=&quot;https://api.github.com/repos/OpenFeign/feign/contributors&quot;&gt;https://api.github.com/repos/&lt;span style=&quot;background-color: #f3c000;&quot;&gt;OpenFeign/feign&lt;/span&gt;/contributors&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호출 샘플 -&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1860&quot; width=&quot;447&quot; height=&quot;619&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYyzO0/btreY1SHjY6/lyKgQRnrf46j0k6nhWxxH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYyzO0/btreY1SHjY6/lyKgQRnrf46j0k6nhWxxH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYyzO0/btreY1SHjY6/lyKgQRnrf46j0k6nhWxxH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYyzO0%2FbtreY1SHjY6%2FlyKgQRnrf46j0k6nhWxxH0%2Fimg.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;1860&quot; width=&quot;447&quot; height=&quot;619&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Feign client 적용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트는 아래 구성으로 진행하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 패키지는 아래 정보를 담고 있습니다. (feigntest2 는 무시)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;feigntest&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;client&lt;/span&gt; : feignclient interface 관련 클래스모음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;controller&lt;/span&gt; : 로컬에서 테스트해볼 기본 컨트롤러&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;dto&lt;/span&gt; : feign client로 api를 호출했을때 결과 값을 매핑할 클래스 Contributor.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;resources&lt;/span&gt; : application.properties 기본 프로젝트 컨피그 셋팅&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;718&quot; width=&quot;359&quot; height=&quot;407&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRvty/btre1aaUGjk/FwS0lOPAXwkTRwD0Bkx6kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRvty/btre1aaUGjk/FwS0lOPAXwkTRwD0Bkx6kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRvty/btre1aaUGjk/FwS0lOPAXwkTRwD0Bkx6kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRvty%2Fbtre1aaUGjk%2FFwS0lOPAXwkTRwD0Bkx6kK%2Fimg.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;718&quot; width=&quot;359&quot; height=&quot;407&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#Controller&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;localhost:8080/v1/github/{owner}/{repo} 를 호출할 때 리턴할 수 있도록 셋팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제 api를 호출하는 GitHubFeignService를 autowired해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*@RequiredArgsConstructor 어노테이션을 설정하고 servcie 변수 선언시 final 를 셋팅해주면 autowired 생갹 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;1066&quot; width=&quot;797&quot; height=&quot;453&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OcwA3/btre6DCOiyV/zJ76I6WixY2K097aX1dyjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OcwA3/btre6DCOiyV/zJ76I6WixY2K097aX1dyjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OcwA3/btre6DCOiyV/zJ76I6WixY2K097aX1dyjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOcwA3%2Fbtre6DCOiyV%2FzJ76I6WixY2K097aX1dyjk%2Fimg.png&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;1066&quot; width=&quot;797&quot; height=&quot;453&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#Service&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제 api 호출을 담당하는 GitHubFeignClient 인터페이스를 autowired 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 인터페이스를 통해 컨트리뷰터 정보를 획득하도록 getContributor 메소드를 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1028&quot; width=&quot;719&quot; height=&quot;479&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHoUt/btre4Od07Am/cT9BRgW8r9Q61iN1D7pHj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHoUt/btre4Od07Am/cT9BRgW8r9Q61iN1D7pHj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHoUt/btre4Od07Am/cT9BRgW8r9Q61iN1D7pHj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHoUt%2Fbtre4Od07Am%2FcT9BRgW8r9Q61iN1D7pHj1%2Fimg.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1028&quot; width=&quot;719&quot; height=&quot;479&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# @FeinClient 인터페이스 구현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;api 호출은 아래와 같이 인터페이스와 메소드를 셋팅해주는 것으로 처리 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;1. @FeignClient 어노테이션 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;(name =&quot;feign client 이름 설정&quot; , url=&quot;호출할 api url&quot;, configuration = &quot;feignclient 설정정보가 셋팅되어 있는 클래스&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;2. api를 호출할 메소드 셋팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;url이 가변 이라면, 컨트롤러에서 사용하는 것처럼 @RequestMapping 활용해 api url를 동적으로 변경 할 수 있다. 아래 처럼&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메소드에 @RequestMapping 어노테이션 설정, 메소드 파라미터에서 uri에서 변경이 필요한 부분을 @PathVariable 어노테이션을 설정해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;708&quot; width=&quot;702&quot; height=&quot;257&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSF1RF/btreY1Zt50T/JYkERLhJaCOHc8sWobP8e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSF1RF/btreY1Zt50T/JYkERLhJaCOHc8sWobP8e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSF1RF/btreY1Zt50T/JYkERLhJaCOHc8sWobP8e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSF1RF%2FbtreY1Zt50T%2FJYkERLhJaCOHc8sWobP8e1%2Fimg.png&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;708&quot; width=&quot;702&quot; height=&quot;257&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# @FeinClient 컨피그 정보 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Config 클래스를 생성하고 필요한 각 설정 정보를 아래와 같이 셋팅 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Config 클래스를 따로 생성하지 않아도 아래 Bean들은 기본적으로 제공된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본으로 셋팅됨 : [ Logger , Decoder, Encoder, Contract ]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;412&quot; width=&quot;649&quot; height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HfNbI/btre1aaU4Ou/aW1CJwkkMUK02h92VE0NE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HfNbI/btre1aaU4Ou/aW1CJwkkMUK02h92VE0NE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HfNbI/btre1aaU4Ou/aW1CJwkkMUK02h92VE0NE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHfNbI%2Fbtre1aaU4Ou%2FaW1CJwkkMUK02h92VE0NE0%2Fimg.png&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;412&quot; width=&quot;649&quot; height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 bean들은 기본으로 제공되지 않고 필요시 config 클래스에 생성해주어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[Retryer(재요청 횟수 설정), Request.options(타임아웃 설정)]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;414&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkOL2/btre7Iw8yQ8/4109KMIzr36MI2NmulOuS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkOL2/btre7Iw8yQ8/4109KMIzr36MI2NmulOuS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkOL2/btre7Iw8yQ8/4109KMIzr36MI2NmulOuS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkOL2%2Fbtre7Iw8yQ8%2F4109KMIzr36MI2NmulOuS0%2Fimg.png&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;414&quot; data-ke-mobilestyle=&quot;widthOrigin&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-origin-width=&quot;780&quot; data-origin-height=&quot;710&quot; width=&quot;400&quot; height=&quot;364&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SPHGp/btreY25svaF/OdOCMmCvwEj2oKbI4odb80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SPHGp/btreY25svaF/OdOCMmCvwEj2oKbI4odb80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SPHGp/btreY25svaF/OdOCMmCvwEj2oKbI4odb80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSPHGp%2FbtreY25svaF%2FOdOCMmCvwEj2oKbI4odb80%2Fimg.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;710&quot; width=&quot;400&quot; height=&quot;364&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;샘플로 decoder만 커스텀하게 신규로 생성해 보았습니다. 정상적으로 호출됐을 경우(status =200) 로그를 찍도록 해두었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1502&quot; width=&quot;554&quot; height=&quot;437&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcvCoA/btre43osp6Q/UrGynyiK2a0osCh1MTLl3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcvCoA/btre43osp6Q/UrGynyiK2a0osCh1MTLl3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcvCoA/btre43osp6Q/UrGynyiK2a0osCh1MTLl3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcvCoA%2Fbtre43osp6Q%2FUrGynyiK2a0osCh1MTLl3K%2Fimg.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1502&quot; width=&quot;554&quot; height=&quot;437&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# Dto 생성 ( api 결과 값이 매핑되도록)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sample api의 리턴 정보를 매핑 할 수 있도록 필드 설정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;1080&quot; width=&quot;336&quot; height=&quot;473&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nad0N/btreYn24dbv/dPGlagRqzLHvCaiCDoDaT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nad0N/btreYn24dbv/dPGlagRqzLHvCaiCDoDaT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nad0N/btreYn24dbv/dPGlagRqzLHvCaiCDoDaT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnad0N%2FbtreYn24dbv%2FdPGlagRqzLHvCaiCDoDaT0%2Fimg.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;1080&quot; width=&quot;336&quot; height=&quot;473&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;# @EnableFeignClients 어노테이션 설정 필수!&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 프로젝트에 feign client 사용이 가능하도록 main 클래스에서 설정해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 프로젝트에 필요하지 않고 특정영역에만 필요하다면 사용을 하는 실제 서비스영역에 설정해줘도 된다. 그럼, 해당 서비스 클래스에서만 사용가능하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcmkHE/btre34amSIW/CIjk92305aAtG1VwuBKal0/img.png&quot; width=&quot;545&quot; height=&quot;169&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/bcmkHE/btre34amSIW/CIjk92305aAtG1VwuBKal0/img.png&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;574&quot; /&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#&amp;nbsp; application.properties 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;feinclient 로그 정보 설정(feign client 로그 설정),&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빌드없이 소스를 수정하여 반영하도록 설정(spring devtools) ,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;브라우저에서 호출시 결과값을 보기 좋게 출력하기 위한 설정(pretty print json)을 해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;658&quot; width=&quot;533&quot; height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgPK3O/btreYlYfyIx/Tr4RtyFXaeN8SMlIsK969K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgPK3O/btreYlYfyIx/Tr4RtyFXaeN8SMlIsK969K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgPK3O/btreYlYfyIx/Tr4RtyFXaeN8SMlIsK969K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgPK3O%2FbtreYlYfyIx%2FTr4RtyFXaeN8SMlIsK969K%2Fimg.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;658&quot; width=&quot;533&quot; height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Feign client 를 활용해 최종적으로 api 호출하기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;브라우저에서 컨트롤러에서 설정된 uri를 기준으로 호출해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/OpenFeign/feign을 붙여주니, &lt;a style=&quot;color: #000000;&quot; href=&quot;https://api.github.com/repos/OpenFeign/feign/contributors&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://api.github.com/repos/OpenFeign/feign/contributors&lt;/a&gt;&amp;nbsp;를 호출하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;2018&quot; width=&quot;522&quot; height=&quot;775&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WtLwl/btre5u69HHU/46gbXU5JsQHVSkxahGVTHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WtLwl/btre5u69HHU/46gbXU5JsQHVSkxahGVTHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WtLwl/btre5u69HHU/46gbXU5JsQHVSkxahGVTHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWtLwl%2Fbtre5u69HHU%2F46gbXU5JsQHVSkxahGVTHk%2Fimg.png&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;2018&quot; width=&quot;522&quot; height=&quot;775&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 포맷을 리턴하는 다른 api를 호출해 보도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://api.github.com/repos/octocat/hello-world/contributors&quot;&gt;https://api.github.com/repos/octocat/hello-world/contributors&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 정상적으로 호출되는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1240&quot; width=&quot;549&quot; height=&quot;483&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjDNef/btre6CRsGit/KkKxYpHwCIdQwf4aQ53Xw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjDNef/btre6CRsGit/KkKxYpHwCIdQwf4aQ53Xw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjDNef/btre6CRsGit/KkKxYpHwCIdQwf4aQ53Xw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjDNef%2Fbtre6CRsGit%2FKkKxYpHwCIdQwf4aQ53Xw1%2Fimg.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1240&quot; width=&quot;549&quot; height=&quot;483&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음 포스팅에서는 feign client의 다른 기능을 확인 해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전체 소스정보&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/build99k/feign-api-test&quot;&gt;build99k/feign-api-test: FeignClient Test Sample Code (github.com)&lt;/a&gt;&lt;/p&gt;</description>
      <category>springboot</category>
      <category>feign</category>
      <category>feignclient</category>
      <category>openfeign</category>
      <category>springboot</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/109</guid>
      <comments>https://vmpo.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 12 Sep 2021 16:24:35 +0900</pubDate>
    </item>
    <item>
      <title>[스프링 스터디] IoC 컨테이너와 빈</title>
      <link>https://vmpo.tistory.com/108</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;스프링 ioc컨테이너와 빈의 개념 정리&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IoC 컨테이너&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ApplicationContext 객체를 구현한 객체&lt;/li&gt;
&lt;li&gt;ApplicationContext = BeanFactory&lt;/li&gt;
&lt;li&gt;어노테이션, xml 등으로 사전에 정의된 객체들을 저장하고 있음( 해당 객체를 통해 접근 할 수 있다고 생각하면됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bean(빈 객체)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IoC 컨테이너가 관리하는 객체&lt;/li&gt;
&lt;li&gt;ApplicationContext (beanFactory)가 관리하는 객체&lt;/li&gt;
&lt;li&gt;싱글톤(하나만 생성), 프로토타입(사용할떄마다 생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;ApplicationContext&amp;nbsp;&lt;/p&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;&gt;
&lt;li&gt;XML 설정&lt;/li&gt;
&lt;li&gt;annotation 설정 1
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;@Component 어노테이션이 설정된 객체들을 모두 빈팩토리에 올림&amp;nbsp;&lt;/li&gt;
&lt;li&gt;@Autowired 어노테이션이 붙어있는 변수들에 해당객체를 주입함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;annotation 설정 2
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;@Configuration 어노테이션이 붙은 클래스의 메소드에 @Bean 어노테이션을 추가해줌&lt;/li&gt;
&lt;li&gt;@Configuration 어노테이션과 함께 @ComponentScan 를 붙여줌 (ex. @ComponentScan&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(basePackageClasses = 클래명.class))&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;@Configuration 어노테이션과 함께 @ComponentScan(basePackageClasses = 클래명.class) 를 붙여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>springboot</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/108</guid>
      <comments>https://vmpo.tistory.com/108#entry108comment</comments>
      <pubDate>Mon, 12 Apr 2021 21:43:10 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] java 비트연산 정리하기</title>
      <link>https://vmpo.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기초개념인 java 비트연산을 정리해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비트연산은 2개의 이진수에 대해서 연산하는 것을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컴퓨터는 이진수로 대화를 하고 있기 때문에 이 비트연산을 알아두는 것이 기본일 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;컴퓨터가 숫자를 표현하는 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 0,1을 활용해서 데이터를 표현합니다. 숫자 2의 경우 0010 로 표현하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[0] [0] [1] [0] &amp;lt;-- 각 자리수를 공간이라고 생각하면 4개의 공간을 사용하고 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 이 공간하나를 bit라고 정의해서 연산을 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 2를 표현한 이진수는 4bit로 표현했다고 말할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 컴퓨터는 8bit의 공간을 기준으로 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8개의 bit를 1 byte로 표현합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1byte공간이 1024개로 할당하면 1kb(1024byte)가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1024개 만큼 커질수록 mb,gb,tb로 치환되는 단위를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터가 사용하는 최소단위인 bit의 연산으로 컴퓨터는 대화를 하게 됩니다. 지금 블로그 화면에 노출되는 모든데이터도 0,1로 표현된 bit들을 연산해 우리가 이해할 수 있는 모습으로 변환된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 가장 기초적인 부분에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. AND 연산 (&amp;amp;)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span&gt;&lt;b&gt;두 수의 각자리수에 대해 둘다 1일경우 1로 변환하는 것을 말합니다.&lt;br /&gt;&lt;br /&gt;십진수 9와 11을 이진수로 변환해 비교해보겠습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1001&lt;br /&gt;AND 1011&lt;br /&gt;=&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1001&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1584775887622&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class bit {
    public static void main(String[] args) {

        int a = 9;
        int b = 11;

        System.out.println(Integer.toBinaryString(a)); //바이너리로 변환
        System.out.println(Integer.toBinaryString(b)); //바이너리로 변환
        System.out.println(&quot;10진수 : &quot; + (a &amp;amp; b));
        System.out.println(&quot;2진수 : &quot; + Integer.toBinaryString(a &amp;amp; b));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RM2EJ/btqCPAY3akB/wX0ry1M9p20340k30euZV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RM2EJ/btqCPAY3akB/wX0ry1M9p20340k30euZV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RM2EJ/btqCPAY3akB/wX0ry1M9p20340k30euZV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRM2EJ%2FbtqCPAY3akB%2FwX0ry1M9p20340k30euZV0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. OR 연산 ( | )&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;두 수의 각자리수가 하나만 1이면 1로 변환합니다.&lt;br /&gt;&lt;br /&gt;십진수 9와 11을 이진수로 변환해 비교해보겠습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1001&amp;nbsp;&amp;nbsp;&lt;br /&gt;OR 1011&lt;br /&gt;=&amp;nbsp; &amp;nbsp;1011&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1584776041058&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package bit;

public class bit {
    public static void main(String[] args) {

        int a = 9;
        int b = 11;

        System.out.println(Integer.toBinaryString(a)); //바이너리로 변환
        System.out.println(Integer.toBinaryString(b)); //바이너리로 변환
        System.out.println(&quot;10진수 : &quot; + (a | b));
        System.out.println(&quot;2진수 : &quot; + Integer.toBinaryString(a | b));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sA7cG/btqCSYYE6vA/oobkvLVvwbwtEh3KKrs3x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sA7cG/btqCSYYE6vA/oobkvLVvwbwtEh3KKrs3x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sA7cG/btqCSYYE6vA/oobkvLVvwbwtEh3KKrs3x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsA7cG%2FbtqCSYYE6vA%2FoobkvLVvwbwtEh3KKrs3x0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. XOR 연산 (^)&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;두 수의 각 자리수가 다른 경우 1로 변환합니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;십진수 9와 11을 이진수로 변환해 비교해보겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1001&lt;br /&gt;XOR&amp;nbsp; 1011&lt;br /&gt;=&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0010&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1584776210757&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package bit;

public class bit {
    public static void main(String[] args) {

        int a = 9;
        int b = 11;

        System.out.println(Integer.toBinaryString(a)); //바이너리로 변환
        System.out.println(Integer.toBinaryString(b)); //바이너리로 변환
        System.out.println(&quot;10진수 : &quot; + (a ^ b));
        System.out.println(&quot;2진수 : &quot; + Integer.toBinaryString(a ^ b));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rl5Wi/btqCQojIv18/CBC6DliqoeVn8PLKeTkL5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rl5Wi/btqCQojIv18/CBC6DliqoeVn8PLKeTkL5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rl5Wi/btqCQojIv18/CBC6DliqoeVn8PLKeTkL5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frl5Wi%2FbtqCQojIv18%2FCBC6DliqoeVn8PLKeTkL5k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. NOT 연산 (~)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 자리수를 반대로 변환하는 것을 의미합니다.&lt;br /&gt;&lt;br /&gt;십진수 9를 이진수로 변환해 테스트해보겠습니다.&lt;br /&gt;&lt;br /&gt;NOT 1001 = 0110&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1584777549152&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package bit;

public class bit {
    public static void main(String[] args) {

        int a = 9;
        int b = 11;

        System.out.println(Integer.toBinaryString(a)); //바이너리로 변환
        System.out.println(&quot;10진수 : &quot; + ~a);
        System.out.println(&quot;2진수 : &quot; + Integer.toBinaryString(~a));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBaQeQ/btqCTxmcS0V/gcbxcRjJbEtyhGmKKufnRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBaQeQ/btqCTxmcS0V/gcbxcRjJbEtyhGmKKufnRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBaQeQ/btqCTxmcS0V/gcbxcRjJbEtyhGmKKufnRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBaQeQ%2FbtqCTxmcS0V%2FgcbxcRjJbEtyhGmKKufnRk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9를 NOT연산하는 경우 10진수 -10이 출력됩니다. -10을 이진수로 변환하는 경우1111111111111111111111111111&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;0110&lt;/span&gt; 가 출력되는데요.&amp;nbsp; 제일 아래에서 설명드리니겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. SHIFT 연산( &amp;lt;&amp;lt;, &amp;gt;&amp;gt;)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4-1. &amp;lt;&amp;lt; 연산&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이진수의 각자리를 왼쪽으로 N칸 밀고 제일 첫째자리는 0으로 채워주는 연산입니다.&lt;br /&gt;&lt;br /&gt;3을 2칸 SHIFT연산 하세요&lt;br /&gt;3 &amp;lt;&amp;lt; 2&lt;br /&gt;&lt;br /&gt;= 3 * 2^2 = 12&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진수 3&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2칸 왼쪽으로 밀기 (뒤에 0을 2개 채우기) , 결과값은 12&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 20px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 20px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4-2.&amp;nbsp; &amp;gt;&amp;gt; 연산&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이진수의 각자리를 오른쪽으로 N칸 밀고 밀면서 사라지는 자리수는 삭제해버린다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;16을 3칸 SHIFT연산 하세요&lt;br /&gt;&lt;br /&gt;16&amp;nbsp; &amp;gt;&amp;gt; 3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=16 / 2^3 = 2&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16을 이진수로 표현하면 아래와 같이 1 0 0 0 0&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;3&amp;nbsp; 즉, 오른쪽으로 3칸 이동 시키겠습니다. (뒤 3칸을 자르고 앞을 0으로 채웁니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력값은 2가 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 맨앞을 동일한 부호비트로 채운다는 점입니다. 항상 0으로 채우는 것은 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수일 경우 1로 채워주게됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부호비트와 관련 된 자세한 설명은 맨 아래에서 설명드리겠습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4-2.&amp;nbsp; &amp;gt;&amp;gt;&amp;gt; 연산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 오른쪽 SHIFT에 &amp;gt;가 하나 더 추가된 경우에는 오른쪽 SHIFT연산을 할 경우 항상 양수만 고려하겠다는 뜻입니다. 즉, 오른쪽으로 밀고 남은 공간을 항상 0으로 채우겠다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt;연산을 할 경우 무조건 양수만 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHIFT연산을 코드로 구현하면 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1584781722248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package bit;

public class bit {
    public static void main(String[] args) {

        System.out.println(3 &amp;lt;&amp;lt;2);
        System.out.println(Integer.toBinaryString((3 &amp;lt;&amp;lt;2)));

        System.out.println(16 &amp;gt;&amp;gt; 3);
        System.out.println(Integer.toBinaryString((16 &amp;gt;&amp;gt; 3)));

        System.out.println(-16 &amp;gt;&amp;gt;&amp;gt; 3);
        System.out.println(Integer.toBinaryString((-16 &amp;gt;&amp;gt;&amp;gt; 3)));

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTtS4R/btqCSXMgy19/aGxLZZk9Dtw9IL1gJ7vGX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTtS4R/btqCSXMgy19/aGxLZZk9Dtw9IL1gJ7vGX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTtS4R/btqCSXMgy19/aGxLZZk9Dtw9IL1gJ7vGX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTtS4R%2FbtqCSXMgy19%2FaGxLZZk9Dtw9IL1gJ7vGX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 부호비트와 Integer 의 범위&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Integer 값의 범위는&amp;nbsp; -2^31 ~ 2^31-1 입니다. 이는 어떻게 산출된 것일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intger는 &lt;span style=&quot;color: #333333;&quot;&gt;4byte, 즉 &lt;/span&gt;32개의 bit를 사용합니다. 32개의 bit공간을 1로 채운 값은 &lt;span style=&quot;color: #000000;&quot;&gt;4,294,967,295&lt;/span&gt;이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 위와 같이 사용할 경우 음수표현을 할 수 없어 음수 표현을 위해 맨앞의 자리를 부호로 사용하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 0,1일때 각각 양수, 음수로 표현하게됩니다. 이를 부호비트라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 == 양수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 == 음수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.349%; height: 103px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span&gt;32번째&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(부호비트)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;31번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;30번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;...&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;3번재&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;2번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1번째&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.,...&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 32개의 공간에서 맨앞자리는 부호비트로 사용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 표현할 수 있는 숫자는 양수일 경우 2^31 -1개가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 -1을 해주는 이유는 제일 첫번째 bit의 최대 값이 1이기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 아래와 같이 4bit짜리 공간이 있다고 하면, 모두 1로 채웠을때의 값은 1+2+4+8 = 15입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 앞 bit가 1이기 때문에 2^4 -1 값까지만 표현가능 한 것입니다. 이 bit가 31개까지 늘어나면 동일하게&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2^31-1만큼까지만 표현 가능한 것입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 음수의 범위는 어떻게 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 부호비트가 1이고 나머지 31개의 자리도 모두 1인 경우를 -1로 표현합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부호비트가 0일때 즉 양수일때 가장 큰 값을 부호비트가 1인 음수일 경우에는 가장 작은 값으로 치환합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span&gt;32번째&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(부호비트)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;31번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;30번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;...&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;3번재&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;2번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1번째&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.,...&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 NOT연산에서 9를 NOT 연산 할 경우 1111111111111111111111111111&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;0110 &lt;/span&gt;이 출력된 것을 잠시 살펴보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 숫자 9는 32BIT로 표현하면 아래 와 같이 5번째~32번째는 모두 0으로 표현 될 것 입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span&gt;32번째&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(부호비트)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;31번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;30번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;4번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;3번재&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;2번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1번째&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT연산은 모든 자리를 반대로 변환하기 때문에 아래와 같이 변환 된 것입니다. 이는 양수에서 가장 큰 수 가 음수에서 가장 작은 수가 되는 음수 표현방식에 따라서 -10이 출력되게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span&gt;32번째&lt;/span&gt;&lt;br /&gt;&lt;span&gt;(부호비트)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;31번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;30번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;.....&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;4번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;3번재&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;2번째&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1번째&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1111%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/106</guid>
      <comments>https://vmpo.tistory.com/106#entry106comment</comments>
      <pubDate>Sat, 21 Mar 2020 18:17:36 +0900</pubDate>
    </item>
    <item>
      <title>[java] 상속의 개념 알아보기</title>
      <link>https://vmpo.tistory.com/105</link>
      <description>&lt;p&gt;대충은 알고 있지만, 정확히는 모르고있었던 상속의 개념에 대해 정리해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상속이란 자식 클래스가 부모클래스로부터 &quot;능력&quot;을 물려받는 것입니다. 여기서 능력이란 멤버변수, 메소드로 정의할 수 있겠습니다. 아래 내용에서는 이해를 쉽게하기 위해 능력으로 설명하겠습니다.&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;blockquote style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;extends 키워드로 상속 관계 만들기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 부모클래스인 Cafe 클래스를 생성하겠습니다. 멤버변수 name,location과 makeCoffee()라는 함수를 정의했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/rtqSd/btqCO1oWyYR/bVrrwvnUqfNwkuf5ZMKk5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtqSd/btqCO1oWyYR/bVrrwvnUqfNwkuf5ZMKk5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtqSd/btqCO1oWyYR/bVrrwvnUqfNwkuf5ZMKk5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtqSd%2FbtqCO1oWyYR%2FbVrrwvnUqfNwkuf5ZMKk5k%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자식클래스는 Starbucks 클래스를 생성했습니다.&lt;/p&gt;
&lt;p&gt;클래스명 옆에 extends 부모클래스명 을 입력해줍니다. 아직 Starbucks 내부에는 아무코드도 넣지 않았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/bYmVvb/btqCTw8BICz/KmUsDlhY5dU3PsDmMzfxmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYmVvb/btqCTw8BICz/KmUsDlhY5dU3PsDmMzfxmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYmVvb/btqCTw8BICz/KmUsDlhY5dU3PsDmMzfxmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYmVvb%2FbtqCTw8BICz%2FKmUsDlhY5dU3PsDmMzfxmK%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;부모-자식클래스의 관계&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;앞에서 상속을 받는 것은 능력을 물려받는 것이라고 언급했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 Starbucks 타입(자료형)으로 Starbucks 객체를 선언했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;starbucks. 으로 어떤 메소드, 멤버변수에 접근할 수 있는지 확인해보면, 아래와 같이 Cafe클래스의 모든 함수와 멤버변수에 접근 가능한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/bntU3V/btqCOz0zVVv/z6i8rRZVy9KXDvPRTNTLYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bntU3V/btqCOz0zVVv/z6i8rRZVy9KXDvPRTNTLYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bntU3V/btqCOz0zVVv/z6i8rRZVy9KXDvPRTNTLYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbntU3V%2FbtqCOz0zVVv%2Fz6i8rRZVy9KXDvPRTNTLYK%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 상속을 받으면 부모클래스의 능력을 그대로 물려받는 것을 알게되었습니다. 그럼 Starbucks클래스에 멤버변수와 메소드를 추가해 능력을 확장 시켜보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Starbucks클래스에 menu라는 멤버변수와 pay()라는 함수를 정의했습니다. 이제, Starbucks클래스는 Cafe클래스의 능력 + Starbucks클래스의 능력을 갖게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/cEcqis/btqCSYqJ8Q2/DytzpQNcKET7yx9hLZS1X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEcqis/btqCSYqJ8Q2/DytzpQNcKET7yx9hLZS1X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEcqis/btqCSYqJ8Q2/DytzpQNcKET7yx9hLZS1X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEcqis%2FbtqCSYqJ8Q2%2FDytzpQNcKET7yx9hLZS1X0%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Main함수에서 Starbucks클래스의 객체를 만들어 능력이 확장된 것을 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;Cafe클래스의 모든 능력과, Starbucks클래스의 능력들이 모두 사용되는 것을 확인 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하나의 클래스를 선언하여 2개의 클래스를 사용하는 효과를 내고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/cjkw1Z/btqCSfTQx7l/2wvIieDQ2DmZjdoN4gUlw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjkw1Z/btqCSfTQx7l/2wvIieDQ2DmZjdoN4gUlw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjkw1Z/btqCSfTQx7l/2wvIieDQ2DmZjdoN4gUlw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjkw1Z%2FbtqCSfTQx7l%2F2wvIieDQ2DmZjdoN4gUlw0%2Fimg.png&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;/figure&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/bBi1n7/btqCQpiA5Sx/64PBY0NBugkPAD0qxpddBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBi1n7/btqCQpiA5Sx/64PBY0NBugkPAD0qxpddBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBi1n7/btqCQpiA5Sx/64PBY0NBugkPAD0qxpddBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBi1n7%2FbtqCQpiA5Sx%2F64PBY0NBugkPAD0qxpddBk%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;p&gt;Cafe와 Starbucks클래스에 test라는 동일한 이름의 변수를 선언해보았습니다.&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-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvEr4S/btqCOytMXec/KyZMldSeKCrWv8IBGRCWv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvEr4S/btqCOytMXec/KyZMldSeKCrWv8IBGRCWv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvEr4S/btqCOytMXec/KyZMldSeKCrWv8IBGRCWv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvEr4S%2FbtqCOytMXec%2FKyZMldSeKCrWv8IBGRCWv1%2Fimg.png&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;/figure&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/ek6pZ5/btqCUcB5f79/eheG12t160AG3IvcMcx6P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ek6pZ5/btqCUcB5f79/eheG12t160AG3IvcMcx6P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ek6pZ5/btqCUcB5f79/eheG12t160AG3IvcMcx6P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fek6pZ5%2FbtqCUcB5f79%2FeheG12t160AG3IvcMcx6P1%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출력결과는 아래와 같이 자식클래스의 name이 출력되게 됩니다.&lt;/p&gt;
&lt;p&gt;같은 멤버변수를 선언했을때는 자식클래스의 멤버변수가 우선이 되는 것을 알 수 있습니다.&amp;nbsp;&lt;/p&gt;
&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/svYtS/btqCTxNeusW/wJlZiGiaRU4lvQCdgcqkl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/svYtS/btqCTxNeusW/wJlZiGiaRU4lvQCdgcqkl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/svYtS/btqCTxNeusW/wJlZiGiaRU4lvQCdgcqkl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsvYtS%2FbtqCTxNeusW%2FwJlZiGiaRU4lvQCdgcqkl0%2Fimg.png&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;/figure&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/b7D3Cq/btqCQ28wgqy/ca7hmTqns7XciFMzG5L3v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7D3Cq/btqCQ28wgqy/ca7hmTqns7XciFMzG5L3v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7D3Cq/btqCQ28wgqy/ca7hmTqns7XciFMzG5L3v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7D3Cq%2FbtqCQ28wgqy%2Fca7hmTqns7XciFMzG5L3v1%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;메소드 오버라이딩&lt;/b&gt;&lt;/blockquote&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;(@Override 어노테이션이 해당 메소드가 오버라이딩 되었다는 것을 알려줍니다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위에서 Starbucks클래스에는 아무 코드도 넣지 않고 않고 생성을 했었습니다. 아무것도 넣지 않더라도 내부적으로 아래와 같이 메소드들은 자동으로 정의가 됩니다. 이렇게 자동정의가 되기 때문에 따로 코드를 넣지 않아도 객체 생성후 부모클래스의 메소드들을 그대로 사용 할 수 있는 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 오버라이드 메소드들에는 내부적으로 super.메소드명 으로 정의되어있습니다. super라는 키워드로 부모클래스의 특정 메소드를 접근하고 있는 것이라고 생각하시면 됩니다.&lt;/p&gt;
&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/wW1lD/btqCOyHe4Z1/YrW0IuOqm2Of0VnceGyxek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wW1lD/btqCOyHe4Z1/YrW0IuOqm2Of0VnceGyxek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wW1lD/btqCOyHe4Z1/YrW0IuOqm2Of0VnceGyxek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwW1lD%2FbtqCOyHe4Z1%2FYrW0IuOqm2Of0VnceGyxek%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오버라이딩은 부모클래스의 메소드를 그대로 사용하는 것 뿐만아니라, 재정의해서 사용도 가능합니다.&lt;/p&gt;
&lt;p&gt;makeCoffe() 메소드를 재정의해서 사용해보도록 하겠습니다.&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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzWgvb/btqCPzr9FLT/eT6FKz27xE9I6E2bQ8cuj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzWgvb/btqCPzr9FLT/eT6FKz27xE9I6E2bQ8cuj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzWgvb/btqCPzr9FLT/eT6FKz27xE9I6E2bQ8cuj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzWgvb%2FbtqCPzr9FLT%2FeT6FKz27xE9I6E2bQ8cuj1%2Fimg.png&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;/figure&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;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/Bu5ED/btqCSfM4Dd2/UMgFlIBSAovnzHJag0Q5L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bu5ED/btqCSfM4Dd2/UMgFlIBSAovnzHJag0Q5L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bu5ED/btqCSfM4Dd2/UMgFlIBSAovnzHJag0Q5L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBu5ED%2FbtqCSfM4Dd2%2FUMgFlIBSAovnzHJag0Q5L0%2Fimg.png&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;/figure&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/bEyHE1/btqCQpv3adJ/Tv45BBoYLQAFx9Wi6rOqlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEyHE1/btqCQpv3adJ/Tv45BBoYLQAFx9Wi6rOqlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEyHE1/btqCQpv3adJ/Tv45BBoYLQAFx9Wi6rOqlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEyHE1%2FbtqCQpv3adJ%2FTv45BBoYLQAFx9Wi6rOqlK%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오버라이딩의 개념은 아래 페이지에서 좀더 자세히 정리해두었습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1584767837767&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[java] 오버로딩, 오버라이딩  (overloading, overriding)&quot; data-og-description=&quot;어느언어에서나 중요한 개념인 오버로딩과 오버라이딩 개념을 확인해보겠습니다. 간단하게 개념은 아래와 같습니다. 기본개념 overloading : 같은 메소드명을 파라미터 또는 리턴 타입을 달리 하여 다르게 생성 할..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/29&quot; data-og-url=&quot;https://vmpo.tistory.com/29&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/r47CZ/hyFlBGXyHH/gCxDaENBYNu0cJufu8Cek1/img.png?width=800&amp;amp;height=671&amp;amp;face=0_0_800_671,https://scrap.kakaocdn.net/dn/e538N/hyFmIdoAfL/MKQWoy0yyrSkWLgSkRI44k/img.png?width=800&amp;amp;height=671&amp;amp;face=0_0_800_671,https://scrap.kakaocdn.net/dn/b5010p/hyFlPZvczp/tzg2Awuu5K1yeJ8J8DrUBk/img.png?width=1526&amp;amp;height=1368&amp;amp;face=0_0_1526_1368&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/29&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/r47CZ/hyFlBGXyHH/gCxDaENBYNu0cJufu8Cek1/img.png?width=800&amp;amp;height=671&amp;amp;face=0_0_800_671,https://scrap.kakaocdn.net/dn/e538N/hyFmIdoAfL/MKQWoy0yyrSkWLgSkRI44k/img.png?width=800&amp;amp;height=671&amp;amp;face=0_0_800_671,https://scrap.kakaocdn.net/dn/b5010p/hyFlPZvczp/tzg2Awuu5K1yeJ8J8DrUBk/img.png?width=1526&amp;amp;height=1368&amp;amp;face=0_0_1526_1368');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[java] 오버로딩, 오버라이딩 (overloading, overriding)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;어느언어에서나 중요한 개념인 오버로딩과 오버라이딩 개념을 확인해보겠습니다. 간단하게 개념은 아래와 같습니다. 기본개념 overloading : 같은 메소드명을 파라미터 또는 리턴 타입을 달리 하여 다르게 생성 할..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;상속관계에서 타입(자료형) 다르게 선언하기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;상속관계에서 자식클래스 객체생성시 타입을 부모클래스로 정의할 수 있습니다.&lt;/p&gt;
&lt;p&gt;아래와 같이 Cafe starbucks = new Starbucks(); 로 Starbucks객체를 생성이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이때 중요한 것은 이렇게 타입(자료형)을 Cafe로 선언한 경우에는 starbucks객체를 생성해도 Cafe의 능력을 한정된 다는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉 Starbucks클래스는 Cafe클래스 상속으로 능력이 확장되었지만, 실제 사용할 객체를 생성시에 Cafe 타입(자료형)으로 정의 할 경우 능력이 Cafe클래스의 능력으로 제한된다는 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/bOKYjC/btqCUbpD0aA/8HGHEnfyMlUmfa1ORRwkt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOKYjC/btqCUbpD0aA/8HGHEnfyMlUmfa1ORRwkt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOKYjC/btqCUbpD0aA/8HGHEnfyMlUmfa1ORRwkt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOKYjC%2FbtqCUbpD0aA%2F8HGHEnfyMlUmfa1ORRwkt1%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이때 중요한 것은 능력이 제한되었다는 것입니다.&lt;/p&gt;
&lt;p&gt;즉 타입(자료형) = 껍데기 라고 생각해보면, 껍데기가 Starbucks가 아니라 Cafe기 때문에 Cafe의 겉모습을 하고 있지만 속은 Starbucks로 채운 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이상태에서는 기본적으로 Cafe클래스의 능력만 사용가능하고 Starbucks클래스의 능력은 사용이 불가합니다.&lt;/p&gt;
&lt;p&gt;아래와 같이 Starbucks클래스에만 있는 pay()메소드와 menu 멤버변수는 오류가 발생하는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cafe와 Starbucks 클래스에 모두 선언되어있었던 test 변수의 경우 사용은 가능하지만, 출력하면 Cafe 클래스의 정의된 값으로 출력되게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/dM5NWF/btqCQoYegfZ/EdkMqKwQHGT0H6pkjiElWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM5NWF/btqCQoYegfZ/EdkMqKwQHGT0H6pkjiElWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM5NWF/btqCQoYegfZ/EdkMqKwQHGT0H6pkjiElWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM5NWF%2FbtqCQoYegfZ%2FEdkMqKwQHGT0H6pkjiElWk%2Fimg.png&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;/figure&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/ECL3a/btqCQnE5kd8/UB0uNgsaMEDqetD9msbRZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECL3a/btqCQnE5kd8/UB0uNgsaMEDqetD9msbRZk/img.png&quot; data-alt=&quot;test변수만 출력했을때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECL3a/btqCQnE5kd8/UB0uNgsaMEDqetD9msbRZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECL3a%2FbtqCQnE5kd8%2FUB0uNgsaMEDqetD9msbRZk%2Fimg.png&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;test변수만 출력했을때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Cafe클래스의 능력을 모두사용해야 하지만, 앞서 설명했던 오버라이딩을 해서 메소드를 재정의하는 경우에는&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Starbucks클래스의 재정의한 메소드로 사용이 됩니다.&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-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpfYD/btqCSYqKLqX/5EkzngTfB8LnaEcY3yYatK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpfYD/btqCSYqKLqX/5EkzngTfB8LnaEcY3yYatK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpfYD/btqCSYqKLqX/5EkzngTfB8LnaEcY3yYatK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpfYD%2FbtqCSYqKLqX%2F5EkzngTfB8LnaEcY3yYatK%2Fimg.png&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;/figure&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/bSA1oN/btqCPAEFPZn/Iv5GXnPe3iUUjGkT25HKuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSA1oN/btqCPAEFPZn/Iv5GXnPe3iUUjGkT25HKuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSA1oN/btqCPAEFPZn/Iv5GXnPe3iUUjGkT25HKuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSA1oN%2FbtqCPAEFPZn%2FIv5GXnPe3iUUjGkT25HKuk%2Fimg.png&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;/figure&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;Cafe 클래스는 애초에 Starbucks클래스보다 능력의 범위가 좁습니다. 시작이 작은 능력인 클래스의 객체를 더큰 범위의 타입(자료형)으로는 생성이 불가능하다는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&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/curtsT/btqCSYEiAUt/pcKewb6cpajDdbjvlwYXek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/curtsT/btqCSYEiAUt/pcKewb6cpajDdbjvlwYXek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/curtsT/btqCSYEiAUt/pcKewb6cpajDdbjvlwYXek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcurtsT%2FbtqCSYEiAUt%2FpcKewb6cpajDdbjvlwYXek%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상속관계를 IS -A 관계라도고 하는데요. 자식클래스는 부모클래스다. 라는 문장은 성립하지만, 부모클래스는 자식클래스다 라는 개념은 성립이 되지 않습니다. 즉, Starbucks is a Cafe , 는 맞지만, Cafe is a Starbucks는 말이좀 이상합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[정리]&lt;/p&gt;
&lt;p&gt;1. 상속은 extends 키워드로 정의 할 수 있다.&lt;/p&gt;
&lt;p&gt;2. 자식클래스는 부모클래스의 모든 멤버변수, 메소드를 물려받고&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;자식클래스의 내부에서 멤버변수,메소드를 정의해 확장시켜 사용이 가능하다.&lt;/p&gt;
&lt;p&gt;3. 부모클래스의 메소드를 자식클래스에서 재정의해서 사용하는 것을 오버라이딩이라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;오버라이딩 할 경우, 오버라이딩된 메소드로 실행된다.&lt;/p&gt;
&lt;p&gt;4. 부모클래스 타입(자료형)으로 자식클래스 객체를 생성하면, 부모클래스의 능력으로 제한된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;4-1. 위의 경우, 자식클래스에서 오버라이딩 한 메소드는 자식클래스의 메소드로 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;4-2. 위의 경우, 자식클래스에서 정의한 멤버변수는 사용이 불가하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 자식클래스 타입(자료형)으로 부모클래스의 객체를 생성할 수는 없다.&lt;/p&gt;</description>
      <category>Java/기본</category>
      <category>Java</category>
      <category>상속</category>
      <category>오버라이딩</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/105</guid>
      <comments>https://vmpo.tistory.com/105#entry105comment</comments>
      <pubDate>Sat, 21 Mar 2020 14:22:59 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] java로 BFS 구현하기</title>
      <link>https://vmpo.tistory.com/103</link>
      <description>&lt;p&gt;BFS(너비우선탐색)로 최단거리를 구하는 JAVA코드를 구현해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;BFS의 경우 특정위치를 기준으로 인접한 노드를 모두 방문하며 한 번 방문했던 노드는&lt;/p&gt;
&lt;p&gt;방문 이력을 저장해가면서 다음 노드, 다음노드로 넘어가 전체를 검색하는 방법입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;BFS는 QUEUE를 활용해서 구현할 수 있습니다.&amp;nbsp;&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;아래는 최단거리 검색 예제를 통해 JAVA로 BFS를 구현해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;bfs.txt파일에는 아래와 같이 첫번째 열에 행과 열을 표시해주고&lt;/p&gt;
&lt;p&gt;다음 라인부터 행/열에 맞는 배열이 생성됩니다. (1 : 이동가능 ,0 : 이동불가)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 샘플에서는 0,0 지점에서 마지막 4,6 지점까지 가는 최단거리를 출력하는 코드입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1의 경우 인접한 노드라고 생각하면되고, 0 은 인접하지 않은 노드로 보면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 실제로 bfs로 최단거리를 찾는 코드를 구현해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hdh2t/btqCsHxxZzq/hfOdI9JfQk8PGKSDmrCrw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hdh2t/btqCsHxxZzq/hfOdI9JfQk8PGKSDmrCrw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hdh2t/btqCsHxxZzq/hfOdI9JfQk8PGKSDmrCrw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHdh2t%2FbtqCsHxxZzq%2FhfOdI9JfQk8PGKSDmrCrw0%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1583481116887&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.company;

        import java.io.FileInputStream;
        import java.util.*;

public class Main {

    static int N =0; //행
    static int M =0; //열
    static int[][] arr;
    static boolean[][] visited;

    public static void main(String[] args) {

        try{

			// Scanner sc = new Scanner(System.in);
            Scanner sc = new Scanner(new FileInputStream(&quot;C:\\Users\\vmpo\\Desktop\\bfs.txt&quot;));

            N = sc.nextInt();
            M = sc.nextInt();
            sc.nextLine();

            arr = new int[N][M];
            visited = new boolean[N][M];

            for (int i = 0; i &amp;lt; N; i++) {
                String str = sc.nextLine();
                for (int j = 0; j &amp;lt; M; j++) {
                    arr[i][j] = str.charAt(j)-'0';
                    visited[i][j] = false;
                }
            }

            visited[0][0] = true;
            BFS(0, 0);

        }catch (Exception e){
            System.out.println(e.toString());
            e.printStackTrace();
        }

    }

    static void BFS(int start, int end){

        try{

            Queue&amp;lt;Node&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
			//최초 queue 삽입
            q.add(new Node(start,end,1));

            while(!q.isEmpty()){

                Node node = q.poll();
                visited[node.x][node.y] = true;
                System.out.println(node.x + &quot;,&quot; +node.y );
				//상하좌우 이동 가능여부를 확인해본다.

				//좌
                if(node.y-1 &amp;gt;= 0 &amp;amp;&amp;amp; node.y-1 &amp;lt; M &amp;amp;&amp;amp; arr[node.x][node.y-1] == 1 &amp;amp;&amp;amp; visited[node.x][node.y-1] == false){
                    q.add(new Node(node.x,node.y-1,node.depth+1));
                }

				//우
                if(node.y+1 &amp;gt;= 0 &amp;amp;&amp;amp; node.y+1 &amp;lt; M &amp;amp;&amp;amp;arr[node.x][node.y+1] == 1 &amp;amp;&amp;amp; visited[node.x][node.y+1] == false){
                    q.add(new Node(node.x,node.y+1,node.depth+1));
                }

				//위	
                if(node.x-1 &amp;gt;= 0 &amp;amp;&amp;amp; node.x-1 &amp;lt; N &amp;amp;&amp;amp;arr[node.x-1][node.y] == 1 &amp;amp;&amp;amp; visited[node.x-1][node.y] == false){
                    q.add(new Node(node.x-1,node.y,node.depth+1));
                }

				//아래
                if(node.x+1 &amp;gt;= 0 &amp;amp;&amp;amp; node.x+1 &amp;lt; N &amp;amp;&amp;amp; arr[node.x+1][node.y] == 1 &amp;amp;&amp;amp; visited[node.x+1][node.y] == false){
                    q.add(new Node(node.x+1, node.y,node.depth+1));
                }

                if(visited[N-1][M-1]){
                    System.out.println(&quot;완료&quot;);
                    System.out.println(node.depth);
                    break;
                }

            }

        }catch (Exception e){
            System.out.println(e.toString());
        }
    }

}

class Node{
    int x;
    int y;
    int depth;

    Node(int _x, int _y, int _depth){
        this.x = _x;
        this.y = _y;
        this.depth = _depth;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. Node클래스를 생성합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;x좌표, y좌표를 의미하는 멤버변수 int x,y 와 해당 노드까지 오는데 몇번이 걸렸는지를 의미하는 int depth를 선언합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. Node가 저장될 Queue를 선언합니다. 그리고 0,0에 depth는 1로 초기화한 Node 객체를 큐에 넣어줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Queue q = new LinkedList&amp;lt;&amp;gt;(); &lt;br /&gt;&amp;nbsp; //최초 queue 삽입 &lt;br /&gt;&amp;nbsp; q.add(new Node(start,end,1));&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. while문에는 q안에 데이터 존재 여부를 체크하며 반복하게됩니다. 루프 내에서는&lt;/p&gt;
&lt;p&gt;상,하,좌,우에 접근할 수 있는 노드가 있는지(위에서는 &quot;1&quot;이 있는지) 확인해줍니다. &quot;1&quot;이 있는 경우라면 해당 노드의 좌표를 queue에 넣어줍니다. queue에 넣어줄때는 x,y좌표와 함께 depth를 앞의 노드 +1 을 해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;queue에 넣으면 넣은 순서대로(선입선출) 다시 검색이 시작되기 때문에 인접노드를 모두 queue에 담은 후에 다시 처음 넣었던 노드를 중심으로 인접노드를 다시 검색하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 이렇게 전체를 검색하고 최종 지점(위에서는 (4,6))좌표에 이동해서 방문체크가 완료된다면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;종료하고 4,6좌표 노드의 depth를 출력해줍니다. depth값이 결국 최단거리로 이동한 값이 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 과정이 완료되면 최종적으로 depth , 즉 최단거리 값이 출력됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>BFS</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/103</guid>
      <comments>https://vmpo.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 16 Mar 2020 23:53:00 +0900</pubDate>
    </item>
    <item>
      <title>mssql json파라미터 전달하기- openjson() 활용</title>
      <link>https://vmpo.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL SERVER 2016부터 JSON형태의 STRING쉽게 DB에서 파싱이 가능해졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPENJSON()함수를 사용해서 JSON 문자열을 SELECT 결과로 쉽게 변환이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;color: #333333;&quot;&gt;OPENJSON() 기본 사용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 실행해보면,&lt;/p&gt;
&lt;pre id=&quot;code_1580978068500&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE @json NVARCHAR(MAX) 

SET @json='{&quot;name&quot;:&quot;John&quot;,&quot;surname&quot;:&quot;Doe&quot;,&quot;age&quot;:45,&quot;skills&quot;:[&quot;SQL&quot;,&quot;C#&quot;,&quot;MVC&quot;]}'; 

SELECT * 
FROM OPENJSON(@json);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 문자열을 파싱해 SELECT의 결과처럼 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;291&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgR5fS/btqBMNdwyvk/ZVuxohNiZmuFuruKEm0aAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgR5fS/btqBMNdwyvk/ZVuxohNiZmuFuruKEm0aAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgR5fS/btqBMNdwyvk/ZVuxohNiZmuFuruKEm0aAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgR5fS%2FbtqBMNdwyvk%2FZVuxohNiZmuFuruKEm0aAK%2Fimg.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;291&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OPENJSON() 특정 속성만 출력&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 케이스의 경우 특정 KEY값만 확인해서 추출도 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WITH() 절을 활용해 $.JSONKEY값 형태로 스크립트를 작성하면 해당 속성값이 SELECT결과에 포함시킬 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580978208616&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE @json NVARCHAR(MAX) 
SET @json =    
  N'[   
       {   
         &quot;Order&quot;: {   
           &quot;Number&quot;:&quot;SO43659&quot;,   
           &quot;Date&quot;:&quot;2011-05-31T00:00:00&quot;   
         },   
         &quot;AccountNumber&quot;:&quot;AW29825&quot;,   
         &quot;Item&quot;: {   
           &quot;Price&quot;:2024.9940,   
           &quot;Quantity&quot;:1   
         }   
       },   
       {   
         &quot;Order&quot;: {   
           &quot;Number&quot;:&quot;SO43661&quot;,   
           &quot;Date&quot;:&quot;2011-06-01T00:00:00&quot;   
         },   
         &quot;AccountNumber&quot;:&quot;AW73565&quot;,   
         &quot;Item&quot;: {   
           &quot;Price&quot;:2024.9940,   
           &quot;Quantity&quot;:3   
         }   
      }   
 ]'   
    
SELECT * FROM   
 OPENJSON ( @json )   
WITH (    
              Number   varchar(200) '$.Order.Number' ,   
              Date     datetime     '$.Order.Date',   
              Customer varchar(200) '$.AccountNumber',   
              Quantity int          '$.Item.Quantity'   
 )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;737&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AT0sM/btqBOCIGB1s/7p1ulxKLv4mcap0YuVtTmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AT0sM/btqBOCIGB1s/7p1ulxKLv4mcap0YuVtTmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AT0sM/btqBOCIGB1s/7p1ulxKLv4mcap0YuVtTmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAT0sM%2FbtqBOCIGB1s%2F7p1ulxKLv4mcap0YuVtTmK%2Fimg.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;737&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OPENJSON() JSON문자열 그대로 출력&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 SELECT 출력결과에 JSON형태 그대로를 유지하고 싶다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WITH절에 칼럼 타입을 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;NVARCHAR(MAX) AS JSON&lt;/b&gt;&lt;/span&gt;으로 주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580978635226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE @json NVARCHAR(MAX) =
N'{&quot;someObject&quot;:   
    {&quot;someArray&quot;:  
      [  
          {&quot;k1&quot;: 11, &quot;k2&quot;: null, &quot;k3&quot;: &quot;text&quot;},  
          {&quot;k1&quot;: 21, &quot;k2&quot;: &quot;text2&quot;, &quot;k4&quot;: { &quot;data&quot;: &quot;text4&quot; }},  
          {&quot;k1&quot;: 31, &quot;k2&quot;: 32},  
          {&quot;k1&quot;: 41, &quot;k2&quot;: null, &quot;k4&quot;: { &quot;data&quot;: false }}     
       ]  
    }  
 }'  
   
SELECT * FROM  
OPENJSON(@json, N'lax $.someObject.someArray')  
WITH ( k1 int,   
        k2 varchar(100),  
        col3 varchar(6) N'$.k3',  
        col4 varchar(10) N'lax $.k4.data',  
        col5 nvarchar(MAX) N'lax $.k4' AS JSON, 
        array_element nvarchar(MAX) N'$' AS JSON  
 )  
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*COL5, ARRAY_ELEMENT 칼럼에는 JSON 문자열 그대로 출력되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;554&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brGCgN/btqBL7wBNHs/s1kHsh40ty4wc8v0SJWhFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brGCgN/btqBL7wBNHs/s1kHsh40ty4wc8v0SJWhFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brGCgN/btqBL7wBNHs/s1kHsh40ty4wc8v0SJWhFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrGCgN%2FbtqBL7wBNHs%2Fs1kHsh40ty4wc8v0SJWhFk%2Fimg.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;554&quot; data-ke-mobilestyle=&quot;widthOrigin&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OPENJSON() 사용시 호환성레벨 130 이상 필요&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPENJSON은 호환성레벨이 130이상이어야만 사용가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;130보다 작을 경우 따로 설정을 해주셔야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호환성레벨은 아래 스크립트로 조회할 수 있습니다. WHERE절 NAME에 DATABASE명을 설정해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biYw2F/btqBM6DW5hT/EHr80JGUGuTS3KHoj5Vw6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biYw2F/btqBM6DW5hT/EHr80JGUGuTS3KHoj5Vw6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biYw2F/btqBM6DW5hT/EHr80JGUGuTS3KHoj5Vw6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiYw2F%2FbtqBM6DW5hT%2FEHr80JGUGuTS3KHoj5Vw6K%2Fimg.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB/MSSQL</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/102</guid>
      <comments>https://vmpo.tistory.com/102#entry102comment</comments>
      <pubDate>Thu, 6 Feb 2020 17:59:56 +0900</pubDate>
    </item>
    <item>
      <title>윈도우에서 hostsname 확인하기</title>
      <link>https://vmpo.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서는 cmd명령어로 hostname을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 -&amp;gt; cmd -&amp;gt; &lt;b&gt;hostname&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;509&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNpQf/btqBGfhjVFh/Kftx3O6YNkNGvKphK8evJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNpQf/btqBGfhjVFh/Kftx3O6YNkNGvKphK8evJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNpQf/btqBGfhjVFh/Kftx3O6YNkNGvKphK8evJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNpQf%2FbtqBGfhjVFh%2FKftx3O6YNkNGvKphK8evJK%2Fimg.png&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;509&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/101</guid>
      <comments>https://vmpo.tistory.com/101#entry101comment</comments>
      <pubDate>Tue, 4 Feb 2020 00:10:24 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot] 스프링부트 aop Aspectj 적용하기 - 메소드 실행시 특정 로직 수행</title>
      <link>https://vmpo.tistory.com/100</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 springboot 환경셋업이 필요합니다.&lt;/p&gt;
&lt;p&gt;환경셋업은 아래 링크 참고 부탁드립니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vmpo.tistory.com/7?category=730732&quot;&gt;https://vmpo.tistory.com/7?category=730732&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1580357906845&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;intellij SpringBoot(인텔리제이 스프링부트) 시작하기 - hello world 브라우저에 출력하기(gradle)&quot; data-og-description=&quot;intellij SpringBoot(스프링부트) hello world 출력하기 @intellij 기준으로 진행하겠습니다 @Gradle 프로젝트로 진행하는 이유는 빌드 속도도 maven보다 빠르고 import 라이브러리도 한눈에 볼 수 있어 개발시에..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/7?category=730732&quot; data-og-url=&quot;https://vmpo.tistory.com/7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EnQrB/hyELQoYD1v/mWRc57kNn4AyivQqYXxu21/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/cYZort/hyELU5Y46Z/mRs6fxCS8DGwMJGJ0blkiK/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/jBiRE/hyELPji8Je/QhUH2dTRMcywaghFih6v8K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/7?category=730732&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EnQrB/hyELQoYD1v/mWRc57kNn4AyivQqYXxu21/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/cYZort/hyELU5Y46Z/mRs6fxCS8DGwMJGJ0blkiK/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/jBiRE/hyELPji8Je/QhUH2dTRMcywaghFih6v8K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;intellij SpringBoot(인텔리제이 스프링부트) 시작하기 - hello world 브라우저에 출력하기(gradle)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;intellij SpringBoot(스프링부트) hello world 출력하기 @intellij 기준으로 진행하겠습니다 @Gradle 프로젝트로 진행하는 이유는 빌드 속도도 maven보다 빠르고 import 라이브러리도 한눈에 볼 수 있어 개발시에..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;springboot로 개발환경을 갖췄다면&amp;nbsp; 본격적으로 AspectJ를 적용해보도록하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;특정 메소드 실행 전, 실행 후, exception발생시 등 메소드 전 후의 특정 로직을 수행해야 할 경우&lt;/p&gt;
&lt;p&gt;활용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;ex) 소스 변경으로 인한 영향도 없이 전체 페이지 진입로그를 저장해야할 경우&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;순서대로 진행하면 Aspectj를 쉽게 적용가능합니다.&lt;/p&gt;
&lt;p&gt;전체 코드는 제일 하단에 추가해두었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. AspectJ 라이브러리 환경설정&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 build.gradle 파일에 dependencies 영역에&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;implementation 'org.springframework.boot:spring-boot-starter-aop' 를 추가해줍니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;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/yDl7q/btqBzQWv70Z/NWkQ987BmxKXnifXdvVR5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yDl7q/btqBzQWv70Z/NWkQ987BmxKXnifXdvVR5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yDl7q/btqBzQWv70Z/NWkQ987BmxKXnifXdvVR5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyDl7q%2FbtqBzQWv70Z%2FNWkQ987BmxKXnifXdvVR5k%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*springboot의 경우 위 설정만 하더라도 바로 적용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;2. &lt;span&gt;@Aspect 적용 클래스 생성&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;AspectJ는 신규 클래스에 @Aspect 어노테이션만 적용해주면 쉽게 사용가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;URL 진입처리를 할 Controller class 1개와 aspectJ를 적용할 class 1개를 각각 아래와 같이 생성하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;TestConroller는 localhost:8080/test 를 브라우저에서 입력하면, Hello World를 출력하는 간단한 메소드 하나를 정의해두었습니다.&lt;/p&gt;
&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/bkWkof/btqBADP9eX3/a7kxcRKaFAYGq7tBih1Fck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkWkof/btqBADP9eX3/a7kxcRKaFAYGq7tBih1Fck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkWkof/btqBADP9eX3/a7kxcRKaFAYGq7tBih1Fck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkWkof%2FbtqBADP9eX3%2Fa7kxcRKaFAYGq7tBih1Fck%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;LogAopHelperCLS 클래스에는 @Aspect 어노테이션과 @Componet 어노테이션을 추가해줍니다.&lt;/p&gt;
&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/cL0gBZ/btqBzQPIdGj/VOUQrVx1xgUcQdP0ROf0UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL0gBZ/btqBzQPIdGj/VOUQrVx1xgUcQdP0ROf0UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL0gBZ/btqBzQPIdGj/VOUQrVx1xgUcQdP0ROf0UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL0gBZ%2FbtqBzQPIdGj%2FVOUQrVx1xgUcQdP0ROf0UK%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 LogAopHelperCLS 클래스에&amp;nbsp; http://&lt;span style=&quot;color: #333333;&quot;&gt;localhost:8080/test 호출시 로그를 생성할 수 있는 코드를 작성해보겠습니다.&lt;/span&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;span style=&quot;color: #333333;&quot;&gt;LogAopHelperCLS 클래스 즉, @AspectJ어노테이션에 선언된 클래스의 &lt;/span&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;@Pointcut : &lt;span style=&quot;color: #333333;&quot;&gt;aspectJ를 적용할 타겟을 정의해준다. 전체 컨트롤러의 함수대상, 특정 어노테이션을 설정한 함수대상,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 특정 메소드 대상 등 개발자가 적용하길 원하는 범위를 정의하는 어노테이션&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;@Before : aspectJ를 적용할 타겟 메소드가 실행되기 '전' 수행됨&lt;/p&gt;
&lt;p&gt;@AfterReturning : &lt;span style=&quot;color: #333333;&quot;&gt;aspectJ를 적용할 타겟 메소드가 실행된 '후' 수행됨 (제일 마지막에 수행됨)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@&lt;span&gt;Around : &lt;span style=&quot;color: #333333;&quot;&gt;aspectJ를 적용할 타겟 메소드 실행 전 , 후 처리를 모두 할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/span&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;@Pointcut 어노테이션은 GetMapping어노테이션이 선언된 메소드에만 aspectj가 적용되도록 제한하고 있습니다.&lt;/p&gt;
&lt;p&gt;그리고, @Before, @AfterReturning, @Around 어노테이션에서는 파라미터로 GeMapping()함수를 선언해&lt;/p&gt;
&lt;p&gt;해당 범위에 적용할 수 있도록 환경을 만들어주었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 이제 아래 클래스만 있으면 springboot에서 @GetMapping 어노테이션이 있는 메소드에 aspectj 적용이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580697770077&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.c32.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAopHelperCLS {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogAopHelperCLS.class);

    /**
     *   @GetMapping 설정된 메소드 또는 클래스 설정
     *   GetMapping 노테이션이 설정된 특정 클래스/메소드에만 AspectJ가 적용됨.
     */
    @Pointcut(&quot;@annotation(org.springframework.web.bind.annotation.GetMapping)&quot;)
    public void GetMapping(){ }

    /**
     * @param joinPoint
     */
    @Before(&quot;GetMapping()&quot;)
    public void before(JoinPoint joinPoint) {
        LOGGER.info(&quot;=====================AspectJ TEST  : Before Logging Start=====================&quot;);
        LOGGER.info(&quot;=====================AspectJ TEST  : Before Logging End=====================&quot;);
    }

    /**
     * @param joinPoint
     * @param result
     */
    @AfterReturning(pointcut = &quot;GetMapping()&quot;, returning = &quot;result&quot;)
    public void AfterReturning(JoinPoint joinPoint, Object result) {
        LOGGER.info(&quot;=====================AspectJ TEST  : AfterReturning Logging Start=====================&quot;);
        LOGGER.info(&quot;=====================AspectJ TEST  : AfterReturning Logging END=====================&quot;);
    }

    /**
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around(&quot;GetMapping()&quot;)
    public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
        LOGGER.info(&quot;=====================AspectJ TEST  : Around Logging Start=====================&quot;);
        try {
            Object result = joinPoint.proceed();
            LOGGER.info(&quot;=====================AspectJ TEST  : Around Logging END=====================&quot;);
            return result;
        }catch (Exception e) {
            LOGGER.error(&quot;=====================AspectJ Around Exception=====================&quot;);
            LOGGER.error(e.toString());
            return null;
        }
    }

}
&lt;/code&gt;&lt;/pre&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;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/c15lgq/btqBE0EzBVo/kCOmRFJKl7SCZLYkqK8k7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c15lgq/btqBE0EzBVo/kCOmRFJKl7SCZLYkqK8k7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c15lgq/btqBE0EzBVo/kCOmRFJKl7SCZLYkqK8k7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc15lgq%2FbtqBE0EzBVo%2FkCOmRFJKl7SCZLYkqK8k7K%2Fimg.png&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;/figure&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/zsDbW/btqBHUpbKAU/C4Qo5OwV6b7wPkp65qvkH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zsDbW/btqBHUpbKAU/C4Qo5OwV6b7wPkp65qvkH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zsDbW/btqBHUpbKAU/C4Qo5OwV6b7wPkp65qvkH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsDbW%2FbtqBHUpbKAU%2FC4Qo5OwV6b7wPkp65qvkH0%2Fimg.png&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;/figure&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/ceHFzT/btqBHTqhLLf/DmtuoMiGllpfDDNCKfziV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceHFzT/btqBHTqhLLf/DmtuoMiGllpfDDNCKfziV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceHFzT/btqBHTqhLLf/DmtuoMiGllpfDDNCKfziV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceHFzT%2FbtqBHTqhLLf%2FDmtuoMiGllpfDDNCKfziV1%2Fimg.png&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;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 test url입력시 &lt;span style=&quot;color: #333333;&quot;&gt;LogAopHelperCLS에서 정의한 Log를 콘솔에서 확인 할 수 있습니다.&lt;span&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;&gt;@Around시작 -&amp;gt; @before시작,종료 -&amp;gt; @Around종료 -&amp;gt; @AfterReturning시작,종료 순서로 실행되는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Around어노테이션의 시작 종료는 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Object result = joinPoint.proceed()&lt;span&gt;; 전후로 나뉩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;디버깅을 해보면 joinPoint.proceed() 가 실제 타겟 함수 실행 결과를 처리하고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 로직을 응용하면, 특정 url진입시 로그 삽입, 암호화된 파라미터가 있는 url에 대해 복호화처리를&lt;/p&gt;
&lt;p&gt;@aspect가 선언된 클래스에서 처리할 수 있어 효율적인 설계가 가능할 것 같습니다.&lt;/p&gt;</description>
      <category>springboot</category>
      <category>aspectj</category>
      <category>springboot</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/100</guid>
      <comments>https://vmpo.tistory.com/100#entry100comment</comments>
      <pubDate>Mon, 3 Feb 2020 11:57:22 +0900</pubDate>
    </item>
    <item>
      <title>인터넷 연결 없음일때 ERR_PROXY_CONNECTION_FAILED 조치 방법</title>
      <link>https://vmpo.tistory.com/99</link>
      <description>&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;아래 캡처화면과 같이 &quot;프록시 서버에 문제가 발생했거나 주소가 잘못되었습니다&quot;가 노출 된다면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;캡처1.PNG&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JF4GQ/btqzQr3orry/ekkmKb1kZ6kdKILesQplBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JF4GQ/btqzQr3orry/ekkmKb1kZ6kdKILesQplBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JF4GQ/btqzQr3orry/ekkmKb1kZ6kdKILesQplBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJF4GQ%2FbtqzQr3orry%2FekkmKb1kZ6kdKILesQplBK%2Fimg.png&quot; data-filename=&quot;캡처1.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;&lt;span style=&quot;color: #333333;&quot;&gt;검색-&amp;gt; 프록시&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0gY9D/btqzOmilPOR/amYNTju0O90VLljaqNlbGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0gY9D/btqzOmilPOR/amYNTju0O90VLljaqNlbGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0gY9D/btqzOmilPOR/amYNTju0O90VLljaqNlbGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0gY9D%2FbtqzOmilPOR%2FamYNTju0O90VLljaqNlbGk%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;아래와 같이 프록시 서버 사용을 &quot;끔&quot;으로 변경해줍니다.&lt;/p&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/6V1qN/btqzPvd8LO5/i6OtIrWoI5bYv63EelCEg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6V1qN/btqzPvd8LO5/i6OtIrWoI5bYv63EelCEg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6V1qN/btqzPvd8LO5/i6OtIrWoI5bYv63EelCEg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6V1qN%2FbtqzPvd8LO5%2Fi6OtIrWoI5bYv63EelCEg0%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;
&lt;p&gt;브라우저를 닫고 다시 접속해보면 정상적으로 접속가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ei2gWb/btqzOXIXeVx/NhjTskfzTNlulZULgrfuKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ei2gWb/btqzOXIXeVx/NhjTskfzTNlulZULgrfuKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ei2gWb/btqzOXIXeVx/NhjTskfzTNlulZULgrfuKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fei2gWb%2FbtqzOXIXeVx%2FNhjTskfzTNlulZULgrfuKK%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;</description>
      <category>기타</category>
      <category>인터넷연결</category>
      <category>프록시</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/99</guid>
      <comments>https://vmpo.tistory.com/99#entry99comment</comments>
      <pubDate>Mon, 18 Nov 2019 10:52:48 +0900</pubDate>
    </item>
    <item>
      <title>[python] 파이썬 웹 크롤링 - 6 : 한국 피파랭킹 크롤링</title>
      <link>https://vmpo.tistory.com/98</link>
      <description>&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;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct4H7K/btqzJGmfk8c/7F1q2kAUmsH3fd222WAgAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct4H7K/btqzJGmfk8c/7F1q2kAUmsH3fd222WAgAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct4H7K/btqzJGmfk8c/7F1q2kAUmsH3fd222WAgAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct4H7K%2FbtqzJGmfk8c%2F7F1q2kAUmsH3fd222WAgAk%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;그럼 해당 웹페이를 활용해 전체 피파랭킹을 크롤링 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;table 태그로 구성되어있으며 rank-table이라는 id값이 지정되어있습니다.&lt;/p&gt;
&lt;p&gt;해당 id값으로 데이터를 긁어 오겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buOrqo/btqzHUGfok8/Lq13uAf8asCLk4OQYewHcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buOrqo/btqzHUGfok8/Lq13uAf8asCLk4OQYewHcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buOrqo/btqzHUGfok8/Lq13uAf8asCLk4OQYewHcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuOrqo%2FbtqzHUGfok8%2FLq13uAf8asCLk4OQYewHcK%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;pre id=&quot;code_1573564962629&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

fifa_rank = &quot;https://www.fifa.com/fifa-world-ranking/ranking-table/men/&quot;
fifa_rank_html = requests.get(fifa_rank)
fifa_rank_html_list =  BeautifulSoup(fifa_rank_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

fifa_rank_list = fifa_rank_html_list.select('#rank-table &amp;gt;tbody&amp;gt;tr')

for obj in fifa_rank_list :
    print(obj.find('td', {'class': 'fi-table__rank'}).text,'위 : ', obj.find('span', {'class': 'fi-t__nText'}).text )






&lt;/code&gt;&lt;/pre&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;416&quot; height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NL4uo/btqzIfpzkpG/RQUkFSxnuWr8lKICZSFrM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NL4uo/btqzIfpzkpG/RQUkFSxnuWr8lKICZSFrM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NL4uo/btqzIfpzkpG/RQUkFSxnuWr8lKICZSFrM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNL4uo%2FbtqzIfpzkpG%2FRQUkFSxnuWr8lKICZSFrM1%2Fimg.png&quot; width=&quot;416&quot; height=&quot;358&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; width=&quot;405&quot; height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WoT7q/btqzHbuFdR4/WwBLQ0VHyaKKGLARuTmSmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WoT7q/btqzHbuFdR4/WwBLQ0VHyaKKGLARuTmSmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WoT7q/btqzHbuFdR4/WwBLQ0VHyaKKGLARuTmSmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWoT7q%2FbtqzHbuFdR4%2FWwBLQ0VHyaKKGLARuTmSmK%2Fimg.png&quot; width=&quot;405&quot; height=&quot;471&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;
&lt;p&gt;한국의 순위만 따로 뽑고 싶은 경우,&lt;/p&gt;
&lt;p&gt;for문 검색으로 한국일경우 break시켜 확인을 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573565257486&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

fifa_rank = &quot;https://www.fifa.com/fifa-world-ranking/ranking-table/men/&quot;
fifa_rank_html = requests.get(fifa_rank)
fifa_rank_html_list =  BeautifulSoup(fifa_rank_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

fifa_rank_list = fifa_rank_html_list.select('#rank-table &amp;gt;tbody&amp;gt;tr')

for obj in fifa_rank_list :
    if obj.find('span', {'class': 'fi-t__nTri'}).text == 'KOR':
        print('한국 피파랭킹 : ' , obj.find('td', {'class': 'fi-table__rank'}).text,'위')
        break;







&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB1zO4/btqzGpGHyEU/pMx3HvjPz70SXdM5Ecl750/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB1zO4/btqzGpGHyEU/pMx3HvjPz70SXdM5Ecl750/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB1zO4/btqzGpGHyEU/pMx3HvjPz70SXdM5Ecl750/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB1zO4%2FbtqzGpGHyEU%2FpMx3HvjPz70SXdM5Ecl750%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;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 한국피파랭킹을 조회하는 페이지를 직접 호출해서 랭킹을 크롤링 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxTRYD/btqzGrLjJq1/xUW28NdOHniURMINvvzj2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxTRYD/btqzGrLjJq1/xUW28NdOHniURMINvvzj2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxTRYD/btqzGrLjJq1/xUW28NdOHniURMINvvzj2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxTRYD%2FbtqzGrLjJq1%2FxUW28NdOHniURMINvvzj2K%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_1573565505740&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

fifa_rank = &quot;https://www.fifa.com/fifa-world-ranking/associations/association/KOR/men/&quot;
fifa_rank_html = requests.get(fifa_rank)
fifa_rank_html_list =  BeautifulSoup(fifa_rank_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

fifa_rank_list = fifa_rank_html_list.select('.fi-ranking-bignumber')[0]
print('한국피파랭킹 : ',fifa_rank_list.find('span',{'class':'fi-ranking-bignumber--data'}).text.strip() ,'위')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBRTGc/btqzHavI5t3/OlY446bSsIYvSlEkvznIbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBRTGc/btqzHavI5t3/OlY446bSsIYvSlEkvznIbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBRTGc/btqzHavI5t3/OlY446bSsIYvSlEkvznIbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBRTGc%2FbtqzHavI5t3%2FOlY446bSsIYvSlEkvznIbK%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;</description>
      <category>python/크롤링</category>
      <category>크롤링</category>
      <category>피파랭킹</category>
      <category>한국피파랭킹</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/98</guid>
      <comments>https://vmpo.tistory.com/98#entry98comment</comments>
      <pubDate>Tue, 12 Nov 2019 22:36:56 +0900</pubDate>
    </item>
    <item>
      <title>[python] 파이썬 웹 크롤링 - 5 : 네이트 판 톡커들의 선택 랭킹</title>
      <link>https://vmpo.tistory.com/97</link>
      <description>&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;파이썬 설치가 필요하신 경우 아래 url을 참고해주세요.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10&quot;&gt;https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1573555273626&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&quot; data-og-description=&quot;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10&quot; data-og-url=&quot;https://vmpo.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nZoAk/hyDGedVbUM/bhXFHztAvGCKYRc5eKfkT0/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/Ki7oE/hyDGbO1QJ2/SCEm2laqxqYD7wuBif5VL1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/AylhF/hyDGiUV0Af/gEuV8yVlFD4m8qgnkCCU9K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/entry/python-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4anaconda-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%88%EB%8F%84%EC%9A%B0-10&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nZoAk/hyDGedVbUM/bhXFHztAvGCKYRc5eKfkT0/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/Ki7oE/hyDGbO1QJ2/SCEm2laqxqYD7wuBif5VL1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/AylhF/hyDGiUV0Af/gEuV8yVlFD4m8qgnkCCU9K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&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;span style=&quot;color: #333333;&quot;&gt;톡커들의 선택 랭크 리스트를&lt;/span&gt; 하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p&gt;html태그를 찾아기는 화면입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;ol&amp;gt;과 &amp;lt;li&amp;gt;태그로 구성되어있는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;해당 태그를 가져와서 태그 안의 텍스트를 출력해주면 될 것으로 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CYdgv/btqzHVrwel0/FOjg4wGXKcWoS3boM37psk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CYdgv/btqzHVrwel0/FOjg4wGXKcWoS3boM37psk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYdgv/btqzHVrwel0/FOjg4wGXKcWoS3boM37psk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYdgv%2FbtqzHVrwel0%2FFOjg4wGXKcWoS3boM37psk%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;BeautifulSoup 라이브러리를 활용해 일단 &amp;lt;a href&amp;gt;태그들만 가져와 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573555858971&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

pann_talk = &quot;https://pann.nate.com/talk&quot;
pann_talk_html = requests.get(pann_talk)
pann_talk_html_list =  BeautifulSoup(pann_talk_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

pann_rank_list = pann_talk_html_list.select('#talkerChoiceArea0 &amp;gt; li &amp;gt; a')[:10]

for i in pann_rank_list:
    print(i)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 a태그가 출력 된것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;a 태그내에서 &quot;title&quot; 어트리뷰트만 가져오면 실시간 톡 리스트를 출력 할 수 있을 것 같네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFcjd/btqzGp7DMHp/e538K5mVyyQopVGmUZ2VKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFcjd/btqzGp7DMHp/e538K5mVyyQopVGmUZ2VKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFcjd/btqzGp7DMHp/e538K5mVyyQopVGmUZ2VKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFcjd%2FbtqzGp7DMHp%2Fe538K5mVyyQopVGmUZ2VKk%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;텍스트만 출력하는 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573556391835&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

pann_talk = &quot;https://pann.nate.com/talk&quot;
pann_talk_html = requests.get(pann_talk)
pann_talk_html_list =  BeautifulSoup(pann_talk_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

pann_rank_list = pann_talk_html_list.select('#talkerChoiceArea0 &amp;gt; li &amp;gt; a')[:10]

k = 0
for i in pann_rank_list:
    k += 1;
    print(k, '위 : ',i[&quot;title&quot;]);



&lt;/code&gt;&lt;/pre&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/rFE95/btqzHZ8gwV5/1ZUstNF2XNIbc5BChYm4lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rFE95/btqzHZ8gwV5/1ZUstNF2XNIbc5BChYm4lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rFE95/btqzHZ8gwV5/1ZUstNF2XNIbc5BChYm4lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrFE95%2FbtqzHZ8gwV5%2F1ZUstNF2XNIbc5BChYm4lK%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;실제 화면과 똑같은지 확인 해보면 동일한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7Gkm/btqzH1kI4f1/PHMURVWiuLQoMNPea1t191/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7Gkm/btqzH1kI4f1/PHMURVWiuLQoMNPea1t191/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7Gkm/btqzH1kI4f1/PHMURVWiuLQoMNPea1t191/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7Gkm%2FbtqzH1kI4f1%2FPHMURVWiuLQoMNPea1t191%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;아래와 같이 해당 제목의 원본글로 이동하는 URL까지 출력 할 수 도 있습니다.&lt;/p&gt;
&lt;p&gt;필요에 따라 다양한 용도로 활용 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573556595300&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

pann_talk = &quot;https://pann.nate.com/talk&quot;
pann_talk_html = requests.get(pann_talk)
pann_talk_html_list =  BeautifulSoup(pann_talk_html.content ,&quot;html.parser&quot; ,from_encoding='utf=8')

pann_rank_list = pann_talk_html_list.select('#talkerChoiceArea0 &amp;gt; li &amp;gt; a')[:10]
print(pann_rank_list)
k = 0
for i in pann_rank_list:
    k += 1;
    print(k, '위 : ',i[&quot;title&quot;], '(https://pann.nate.com'+i[&quot;href&quot;],')');


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 URL주소를 통해 누르면 원본글로 이동도 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJPOYz/btqzHa3xaEF/A4ZpTKvVDykn4uFTaV55p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJPOYz/btqzHa3xaEF/A4ZpTKvVDykn4uFTaV55p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJPOYz/btqzHa3xaEF/A4ZpTKvVDykn4uFTaV55p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJPOYz%2FbtqzHa3xaEF%2FA4ZpTKvVDykn4uFTaV55p1%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;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PWVL2/btqzI5mqtlE/lEpEpo2lZZUFiLAEIRGXrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PWVL2/btqzI5mqtlE/lEpEpo2lZZUFiLAEIRGXrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PWVL2/btqzI5mqtlE/lEpEpo2lZZUFiLAEIRGXrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPWVL2%2FbtqzI5mqtlE%2FlEpEpo2lZZUFiLAEIRGXrk%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;</description>
      <category>python/크롤링</category>
      <category>python</category>
      <category>네이트판</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/97</guid>
      <comments>https://vmpo.tistory.com/97#entry97comment</comments>
      <pubDate>Tue, 12 Nov 2019 20:09:27 +0900</pubDate>
    </item>
    <item>
      <title>MSSQL 인덱스 생성 스크립트</title>
      <link>https://vmpo.tistory.com/96</link>
      <description>&lt;p&gt;MSSQL에서 인덱스 생성하는 스크립트&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;클러스터드(Clustered) 인덱스 생성 스크립트 , 클러스터드 인덱스는 테이블마다 한 개만 생성 가능함.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CREATE CLUSTERED INDEX 인덱스명 ON 테이블명 (칼럼명);&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예시)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1);&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;논클러스터드(NonClustred) 인덱스 생성 스크립트&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; NONCLUSTERED &lt;/span&gt;&lt;span&gt;INDEX&lt;/span&gt;&lt;span&gt; 인덱스명 &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; 테이블명 (칼럼명); &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;예시)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; NONCLUSTERED &lt;/span&gt;&lt;span&gt;INDEX&lt;/span&gt;&lt;span&gt; IX_ProductVendor_VendorID &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; dbo..ProductVendor (BusinessEntityID); &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>DB/MSSQL</category>
      <category>MSSQL</category>
      <category>인덱스</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/96</guid>
      <comments>https://vmpo.tistory.com/96#entry96comment</comments>
      <pubDate>Sat, 9 Nov 2019 20:39:02 +0900</pubDate>
    </item>
    <item>
      <title>카카오 오픈빌더 -4 : 스킬 QuickReplies(바로가기 응답 리스트만들기)</title>
      <link>https://vmpo.tistory.com/95</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;오늘은 카카오 오픈빌더의 &quot;스킬&quot;을&amp;nbsp; 사용해 카카오톡에 말풍선리스트를 출력해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아래와 같은 모습으로 출력을 해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbpInL/btqzAinnRax/rGw9PNqEw2Z9zQWDHrncU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbpInL/btqzAinnRax/rGw9PNqEw2Z9zQWDHrncU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbpInL/btqzAinnRax/rGw9PNqEw2Z9zQWDHrncU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbpInL%2FbtqzAinnRax%2FrGw9PNqEw2Z9zQWDHrncU0%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;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;지난 포스팅에서 활용한 웹서버 구성을 활용해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://vmpo.tistory.com/94&quot;&gt;https://vmpo.tistory.com/94&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1573130114418&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;카카오 오픈빌더 -3 : 스킬사용 단순응답(웹서버에서 요청/응답)&quot; data-og-description=&quot;카카오 오픈빌더에서 제공하는 플랫폼을 활용해 카카오톡에서 사용자가 발화를 입력하면, 해당 내용이 웹서버로 전달되고 발화내용에 따른 로직처리를 한 후 응답내용을 사용자게에 전달 할 수 있습니다. '스킬'..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/94&quot; data-og-url=&quot;https://vmpo.tistory.com/94&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhy82T/hyDBnXb4NQ/WcY6dmdnptuMtDw4cn03vK/img.png?width=800&amp;amp;height=380&amp;amp;face=0_0_800_380,https://scrap.kakaocdn.net/dn/7j1bD/hyDBsRI1tB/hsnWYyi4ZYnboRdUtiRoIK/img.png?width=800&amp;amp;height=380&amp;amp;face=0_0_800_380,https://scrap.kakaocdn.net/dn/9yP5P/hyDBrrMqjp/yXpMPwpExJR2XRJx4rPXYK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/94&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/94&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhy82T/hyDBnXb4NQ/WcY6dmdnptuMtDw4cn03vK/img.png?width=800&amp;amp;height=380&amp;amp;face=0_0_800_380,https://scrap.kakaocdn.net/dn/7j1bD/hyDBsRI1tB/hsnWYyi4ZYnboRdUtiRoIK/img.png?width=800&amp;amp;height=380&amp;amp;face=0_0_800_380,https://scrap.kakaocdn.net/dn/9yP5P/hyDBrrMqjp/yXpMPwpExJR2XRJx4rPXYK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;카카오 오픈빌더 -3 : 스킬사용 단순응답(웹서버에서 요청/응답)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;카카오 오픈빌더에서 제공하는 플랫폼을 활용해 카카오톡에서 사용자가 발화를 입력하면, 해당 내용이 웹서버로 전달되고 발화내용에 따른 로직처리를 한 후 응답내용을 사용자게에 전달 할 수 있습니다. '스킬'..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;JSON규격확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;JSON형태는 간단합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;기존 TEMPLATE OUTPUTS영역에, quickReplies 리스트 타입을 추가해주기만 하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1573130521814&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
&quot;version&quot;: &quot;2.0&quot;,
  &quot;template&quot;: {
    &quot;outputs&quot;: [
      {
        &quot;simpleText&quot;: {
          &quot;text&quot;: &quot;토트넘 선수 리스트입니다.&quot;
        }
      }
    ],
    &quot;quickReplies&quot;: [
      {
        &quot;messageText&quot;: &quot;손흥민&quot;,
        &quot;action&quot;: &quot;message&quot;,
        &quot;label&quot;: &quot;손흥민&quot;
      },
      {
        &quot;messageText&quot;: &quot;헤리케인&quot;,
        &quot;action&quot;: &quot;message&quot;,
        &quot;label&quot;: &quot;헤리케인&quot;
      },
      {
        &quot;messageText&quot;: &quot;에릭센&quot;,
        &quot;action&quot;: &quot;message&quot;,
        &quot;label&quot;: &quot;에릭센&quot;
      },
      {
        &quot;messageText&quot;: &quot;요리스&quot;,
        &quot;action&quot;: &quot;message&quot;,
        &quot;label&quot;: &quot;요리스&quot;
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;JSON파싱 코드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;json스트링을 만들기 위한 코드 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이해하기 쉽게 하나의 함수 내에 전체 json파싱 작업을 다 확인 할 수 있도록 코드를 작성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그럼 아래 api를 스킬로 등록하고, 특정 입력이 들어올때 리턴하도록 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&quot;토트넘&quot;이라는 단어가 입력될때 리턴되도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1573130811858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @RequestMapping(value = &quot;/kkoChat/v2&quot; , method= {RequestMethod.POST , RequestMethod.GET },headers = {&quot;Accept=application/json&quot;})
    public HashMap&amp;lt;String,Object&amp;gt; kkov2(@RequestBody Map&amp;lt;String, Object&amp;gt; params, HttpServletRequest request, HttpServletResponse response) {

        HashMap&amp;lt;String, Object&amp;gt; resultJson = new HashMap&amp;lt;&amp;gt;();

        try{

            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);

            /* 발화 들어온거 확인하기 * */
            HashMap&amp;lt;String,Object&amp;gt; userRequest =  (HashMap&amp;lt;String,Object&amp;gt;)params.get(&quot;userRequest&quot;);
            String utter = userRequest.get(&quot;utterance&quot;).toString().replace(&quot;\n&quot;,&quot;&quot;);

            List&amp;lt;HashMap&amp;lt;String,Object&amp;gt;&amp;gt; outputs = new ArrayList&amp;lt;&amp;gt;();
            HashMap&amp;lt;String,Object&amp;gt; template = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; simpleText = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; text = new HashMap&amp;lt;&amp;gt;();

            List&amp;lt;HashMap&amp;lt;String,Object&amp;gt;&amp;gt; quickReplies = new ArrayList&amp;lt;&amp;gt;();
            HashMap&amp;lt;String,Object&amp;gt; quickRepl = new HashMap&amp;lt;&amp;gt;();
            quickRepl.put(&quot;action&quot;,&quot;message&quot;);
            quickRepl.put(&quot;label&quot;,&quot;손흥민&quot;);
            quickRepl.put(&quot;messageText&quot;,&quot;손흥민&quot;);
            quickReplies.add(quickRepl);

            HashMap&amp;lt;String,Object&amp;gt; quickRepl2 = new HashMap&amp;lt;&amp;gt;();
            quickRepl2.put(&quot;action&quot;,&quot;message&quot;);
            quickRepl2.put(&quot;label&quot;,&quot;헤리케인&quot;);
            quickRepl2.put(&quot;messageText&quot;,&quot;헤리케인&quot;);
            quickReplies.add(quickRepl2);

            HashMap&amp;lt;String,Object&amp;gt; quickRepl3 = new HashMap&amp;lt;&amp;gt;();
            quickRepl3.put(&quot;action&quot;,&quot;message&quot;);
            quickRepl3.put(&quot;label&quot;,&quot;에릭센&quot;);
            quickRepl3.put(&quot;messageText&quot;,&quot;에릭센&quot;);
            quickReplies.add(quickRepl3);

            HashMap&amp;lt;String,Object&amp;gt; quickRepl4 = new HashMap&amp;lt;&amp;gt;();
            quickRepl4.put(&quot;action&quot;,&quot;message&quot;);
            quickRepl4.put(&quot;label&quot;,&quot;요리스&quot;);
            quickRepl4.put(&quot;messageText&quot;,&quot;요리스&quot;);
            quickReplies.add(quickRepl4);

            text.put(&quot;text&quot;,&quot;토트넘 선수 리스트입니다.&quot;);
            simpleText.put(&quot;simpleText&quot;,text);
            outputs.add(simpleText);

            template.put(&quot;outputs&quot;,outputs);
            template.put(&quot;quickReplies&quot;,quickReplies);

            resultJson.put(&quot;version&quot;,&quot;2.0&quot;);
            resultJson.put(&quot;template&quot;,template);


        }catch (Exception e){

        }

        return resultJson;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;script src=&quot;&amp;lt;a href=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;lt;/a&amp;gt;&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;스킬등록하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;아래와 같이 스킬메뉴에서 방금 작성한 API를 등록해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WRSLq/btqzBUZ7Cny/KhvAfNhBxhYxeLZKknLZhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WRSLq/btqzBUZ7Cny/KhvAfNhBxhYxeLZKknLZhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WRSLq/btqzBUZ7Cny/KhvAfNhBxhYxeLZKknLZhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWRSLq%2FbtqzBUZ7Cny%2FKhvAfNhBxhYxeLZKknLZhk%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;아래와같이 시나리오 메뉴에 들어가&lt;/p&gt;
&lt;p&gt;토트넘 블록을 생성하고 사용자 발화에는 토트넘을 입력해줍니다.&lt;/p&gt;
&lt;p&gt;그리고, 토트넘이라는 단어가 들어올때 스킬 API를 호출하도록 위에서 등록한 토트넘스킬을 등록해주고,&lt;/p&gt;
&lt;p&gt;응답을 리턴 할 수 있도록 봇응답을 스킬데이터 사용으로 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/basv0E/btqzC2plADO/7nVMalLPK8yVYQo6gqWZiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/basv0E/btqzC2plADO/7nVMalLPK8yVYQo6gqWZiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/basv0E/btqzC2plADO/7nVMalLPK8yVYQo6gqWZiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbasv0E%2FbtqzC2plADO%2F7nVMalLPK8yVYQo6gqWZiK%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;그리고 배포를 한 번 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1kkBQ/btqzDtNLOaI/xZ31oWKXHEJPAWzYjkpSj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1kkBQ/btqzDtNLOaI/xZ31oWKXHEJPAWzYjkpSj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1kkBQ/btqzDtNLOaI/xZ31oWKXHEJPAWzYjkpSj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1kkBQ%2FbtqzDtNLOaI%2FxZ31oWKXHEJPAWzYjkpSj1%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;챗봇 대화방에 가서, 토트넘이라고 입력해보겠습니다.&lt;/p&gt;
&lt;p&gt;아래와 같이 위에서 설정한 4개의 바로가기응답 말풍선이 노출되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;여기서 손흥민 말풍선을 눌러보면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;323&quot; height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buiZ1v/btqzAXbWoat/ZQsFvKUL8DnCqdqCcsenk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buiZ1v/btqzAXbWoat/ZQsFvKUL8DnCqdqCcsenk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buiZ1v/btqzAXbWoat/ZQsFvKUL8DnCqdqCcsenk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuiZ1v%2FbtqzAXbWoat%2FZQsFvKUL8DnCqdqCcsenk0%2Fimg.png&quot; width=&quot;323&quot; height=&quot;698&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;위에서 messageText 값을 어떻게 주느냐에 따라, 카톡방에서 전달되는 발화의 내용이 달라질 수 있습니다.&lt;/p&gt;
&lt;p&gt;messageText = &quot;발화내용&quot; 이라고 보시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;332&quot; height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyxXA/btqzAigzsVg/jTiB8LqQRuaZy9GeY8KKdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyxXA/btqzAigzsVg/jTiB8LqQRuaZy9GeY8KKdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyxXA/btqzAigzsVg/jTiB8LqQRuaZy9GeY8KKdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyxXA%2FbtqzAigzsVg%2FjTiB8LqQRuaZy9GeY8KKdK%2Fimg.png&quot; width=&quot;332&quot; height=&quot;718&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>카카오 오픈빌더</category>
      <category>springboot</category>
      <category>카카오오픈빌더</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/95</guid>
      <comments>https://vmpo.tistory.com/95#entry95comment</comments>
      <pubDate>Thu, 7 Nov 2019 22:11:23 +0900</pubDate>
    </item>
    <item>
      <title>카카오 오픈빌더 -3 : 스킬사용 단순응답(웹서버에서 요청/응답)</title>
      <link>https://vmpo.tistory.com/94</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카카오 오픈빌더에서 제공하는 플랫폼을 활용해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카카오톡에서 사용자가 발화를 입력하면, 해당 내용이 웹서버로 전달되고 발화내용에 따른 로직처리를 한 후&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;응답내용을 사용자게에 전달 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;'스킬' 이라는 기능을 활용해서 구현이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;로컬 웹서버 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스프링부트로 아래와 같이 파라미터를 전달 받을 수 있는 컨트롤러를 하나 만들어 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저의 경우 아래 url을 통해 카카오톡에서 전달된 발화내용을 받아 처리하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;http://49.142.78.104:8380/kkoChat/v1&quot;&gt;http://localhost:8380/kkoChat/v1&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572956462790&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = &quot;/kkoChat/v1&quot; , method= {RequestMethod.POST , RequestMethod.GET },headers = {&quot;Accept=application/json&quot;})
    public String callAPI(@RequestBody Map&amp;lt;String, Object&amp;gt; params, HttpServletRequest request, HttpServletResponse response) {

        try{
            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);
            int x = 0;
        }catch (Exception e){

        }
        return &quot;index&quot;;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스프링부트 초기셋팅이 필요하신 경우 아래 링크를 확인해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/7&quot;&gt;https://vmpo.tistory.com/7&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572958339660&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;intellij SpringBoot(인텔리제이 스프링부트) 시작하기 - hello world 브라우저에 출력하기(gradle)&quot; data-og-description=&quot;intellij SpringBoot(스프링부트) hello world 출력하기 @intellij 기준으로 진행하겠습니다 @Gradle 프로젝트로 진행하는 이유는 빌드 속도도 maven보다 빠르고 import 라이브러리도 한눈에 볼 수 있어 개발시에..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/7&quot; data-og-url=&quot;https://vmpo.tistory.com/7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccCJvk/hyDzxyBkAc/bdkWKCjU7BaBfWXr3c7kH0/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/buCaLv/hyDzG997Vz/BzPw431FtlPMnQSu9WEixk/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/dXwyWu/hyDzHgUJSx/Wo4G3KfMt0Cfh5v2k5F8jk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccCJvk/hyDzxyBkAc/bdkWKCjU7BaBfWXr3c7kH0/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/buCaLv/hyDzG997Vz/BzPw431FtlPMnQSu9WEixk/img.png?width=777&amp;amp;height=494&amp;amp;face=0_0_777_494,https://scrap.kakaocdn.net/dn/dXwyWu/hyDzHgUJSx/Wo4G3KfMt0Cfh5v2k5F8jk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;intellij SpringBoot(인텔리제이 스프링부트) 시작하기 - hello world 브라우저에 출력하기(gradle)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;intellij SpringBoot(스프링부트) hello world 출력하기 @intellij 기준으로 진행하겠습니다 @Gradle 프로젝트로 진행하는 이유는 빌드 속도도 maven보다 빠르고 import 라이브러리도 한눈에 볼 수 있어 개발시에..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;스킬등록&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카카오 오픈빌더 관리자 페이지에 접속합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스킬 탭으로 이동합니다. 스킬을 하나 새로 등록해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방금 생성했던 URL을 URL탭에 등록해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 설명 및 이름을 설정해주고 저장을 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GMasN/btqzx6TT6BX/B2RhJj1O8c7q1kOFHDRJA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GMasN/btqzx6TT6BX/B2RhJj1O8c7q1kOFHDRJA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GMasN/btqzx6TT6BX/B2RhJj1O8c7q1kOFHDRJA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGMasN%2Fbtqzx6TT6BX%2FB2RhJj1O8c7q1kOFHDRJA1%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&lt;b&gt;폴백블록 등록&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;폴백블록은 카카오 오픈빌더 챗봇에 설정되지 않은 발화내용이 전달 되었을때 처리하는 블록입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아무것도 등록을 하지 않았다면 모든 발화내용이 폴백등록으로 넘어오게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;다른 블록들을 많이 설정하지 않았기 때문에 저의 경우 폴백블록을 통해서 발화를 받도록 설정하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 아까 설정한 스킬이름을 선택해주고, 봇응답또한 스킬데이터 사용으로 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(저의 로컬 웹서버로 요청을 받고 응답을 전달하도록 하기 위함입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sN0Pv/btqzzKa6TiH/YY0K3OuF52RAJclJjt57IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sN0Pv/btqzzKa6TiH/YY0K3OuF52RAJclJjt57IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sN0Pv/btqzzKa6TiH/YY0K3OuF52RAJclJjt57IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsN0Pv%2FbtqzzKa6TiH%2FYY0K3OuF52RAJclJjt57IK%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;script src=&quot;&amp;lt;a href=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;lt;/a&amp;gt;&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;카카오톡에서 호출테스트 / 요청 규격확인하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카카오 오픈빌더 관리자페이지에서 봇테스트를 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;봇테스트를 눌러 아무 내용이나 입력해봅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아직 응답 설정을 했기때문에 아무내용도 응답하지 않을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 저의 로컬 웹서버에서 어떤 요청이 왔는지 로그를 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csIn48/btqzyWQRGSK/QsMKzpE19j5sYa0W7fala0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csIn48/btqzyWQRGSK/QsMKzpE19j5sYa0W7fala0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csIn48/btqzyWQRGSK/QsMKzpE19j5sYa0W7fala0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsIn48%2FbtqzyWQRGSK%2FQsMKzpE19j5sYa0W7fala0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;소스에서 요청 내용을 jsonstring으로 변환해 콘솔에 찍었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같은 응답이 전달되었네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정렬해서 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umNhm/btqzxCFROUA/RmATAkaSBPddzplEDnv2h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umNhm/btqzxCFROUA/RmATAkaSBPddzplEDnv2h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umNhm/btqzxCFROUA/RmATAkaSBPddzplEDnv2h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumNhm%2FbtqzxCFROUA%2FRmATAkaSBPddzplEDnv2h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;발화를 하나 입력했을때 아래와 같은 JSON요청이 오는 것을 확인 할 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저는 봇테스트에서 &quot;ㅇㅇ&quot;을 입력했었는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 요청 json을 보시면, userRequset -&amp;gt; utterance 키에 value로 넘어 오는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저 utterance를 확인해 특정 로직을 처리하여 응답을 전달할 수 있겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572956941343&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;intent&quot;:{
    &quot;id&quot;:&quot;5d9f410e8192ac00011571d3&quot;,
    &quot;name&quot;:&quot;폴백 블록&quot;,
    &quot;extra&quot;:{
      &quot;reason&quot;:{
        &quot;code&quot;:1,
        &quot;message&quot;:&quot;OK&quot;
      }
    }
  },
  &quot;userRequest&quot;:{
    &quot;timezone&quot;:&quot;Asia/Seoul&quot;,
    &quot;params&quot;:{
      &quot;surface&quot;:&quot;BuilderBotTest&quot;,
      &quot;ignoreMe&quot;:&quot;true&quot;
    },
    &quot;block&quot;:{
      &quot;id&quot;:&quot;5d9f410e8192ac00011571d3&quot;,
      &quot;name&quot;:&quot;폴백 블록&quot;
    },
    &quot;utterance&quot;:&quot;ㅇㅇ\n&quot;,
    &quot;lang&quot;:&quot;kr&quot;,
    &quot;user&quot;:{
      &quot;id&quot;:&quot;8c6bfac588eb225d1f6c4f2b25d4d315c0dc1ce3d15f37175bd688140e29cfdf55&quot;,
      &quot;type&quot;:&quot;botUserKey&quot;,
      &quot;properties&quot;:{
        &quot;botUserKey&quot;:&quot;8c6bfac588eb225d1f6c4f2b25d4d315c0dc1ce3d15f37175bd688140e29cfdf55&quot;
      }
    }
  },
  &quot;contexts&quot;:[
  ],
  &quot;bot&quot;:{
    &quot;id&quot;:&quot;5d9f410e8192ac00011571cf!&quot;,
    &quot;name&quot;:&quot;코딩인텐션&quot;
  },
  &quot;action&quot;:{
    &quot;name&quot;:&quot;스킬테스트&quot;,
    &quot;clientExtra&quot;:null,
    &quot;params&quot;:{
    },
    &quot;id&quot;:&quot;5dc167e7ffa7480001d85f47&quot;,
    &quot;detailParams&quot;:{
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;응답 규격 만들기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자 이제 응답을 어떤식으로 해야 될지만 알면 요청 발화를 받아 응답을 처리 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;응답샘플은 카카오 오픈빌더 도움말에서 확인 할 수 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가이드를 확인해보면 아래와같이 json string을 만들어 리턴하면 챗봇 응답을 할 수 있는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 동일한 규격으로 json string을 만들어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejjUXS/btqzyjleuOk/WlQHHgxirKXmydYuw3yx7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejjUXS/btqzyjleuOk/WlQHHgxirKXmydYuw3yx7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejjUXS/btqzyjleuOk/WlQHHgxirKXmydYuw3yx7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejjUXS%2FbtqzyjleuOk%2FWlQHHgxirKXmydYuw3yx7k%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리턴값 파싱을 위해 아래와 같이 List와 HashMap을 활용해 json규격을 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RestController의 경우 리턴타입을 HashMap으로 설정하면 응답시에 자동으로 json으로 파싱처리해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 규격에 맞는 Class를 생성해 해당 클래스 타입으로 리턴을 해도 json으로 자동 파싱이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;json규격을 만드는 법은 너무도 다양하니 원하는 방법을 사용하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572957923617&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = &quot;/kkoChat/v1&quot; , method= {RequestMethod.POST , RequestMethod.GET },headers = {&quot;Accept=application/json&quot;})
    public HashMap&amp;lt;String,Object&amp;gt; callAPI(@RequestBody Map&amp;lt;String, Object&amp;gt; params, HttpServletRequest request, HttpServletResponse response) {

        HashMap&amp;lt;String, Object&amp;gt; resultJson = new HashMap&amp;lt;&amp;gt;();

        try{

            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);

            List&amp;lt;HashMap&amp;lt;String,Object&amp;gt;&amp;gt; outputs = new ArrayList&amp;lt;&amp;gt;();
            HashMap&amp;lt;String,Object&amp;gt; template = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; simpleText = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; text = new HashMap&amp;lt;&amp;gt;();

            text.put(&quot;text&quot;,&quot;코딩32 발화리턴입니다.&quot;);
            simpleText.put(&quot;simpleText&quot;,text);
            outputs.add(simpleText);

            template.put(&quot;outputs&quot;,outputs);

            resultJson.put(&quot;version&quot;,&quot;2.0&quot;);
            resultJson.put(&quot;template&quot;,template);

        }catch (Exception e){

        }

        return resultJson;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 빌드를 새로 하고, 봇테스트에서 아무 발화나 입력해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재, 특정 발화에 대한 로직처리는 되어있지 않기 때문에 아무 발화에도 응답이 &quot;코딩32 발화리턴입니다&quot;로 전달될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 리턴이 응답이 전달되는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;응답규격과 동일하게 리턴하셔야 봇테스트에서 확인이 가능하십니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNfbRq/btqzx7rOOig/sWWDL1AU0xyGnwhPc7pQf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNfbRq/btqzx7rOOig/sWWDL1AU0xyGnwhPc7pQf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNfbRq/btqzx7rOOig/sWWDL1AU0xyGnwhPc7pQf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNfbRq%2Fbtqzx7rOOig%2FsWWDL1AU0xyGnwhPc7pQf0%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;특정 발화에 대한 특정 로직 처리하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자 그럼 이제 특정 발화를 하드코딩해서 특정 발화가 입력했을때 특정 응답을 리턴해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;발화내용을 case문으로 하드코딩해서 응답을 매핑해주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;뭐야, ㅋㅋ가 들어올때 아래와 같이 응답을 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572958805094&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = &quot;/kkoChat/v1&quot; , method= {RequestMethod.POST , RequestMethod.GET },headers = {&quot;Accept=application/json&quot;})
    public HashMap&amp;lt;String,Object&amp;gt; callAPI(@RequestBody Map&amp;lt;String, Object&amp;gt; params, HttpServletRequest request, HttpServletResponse response) {

        HashMap&amp;lt;String, Object&amp;gt; resultJson = new HashMap&amp;lt;&amp;gt;();

        try{

            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);

            /* 발화 처리 부분 * */
            HashMap&amp;lt;String,Object&amp;gt; userRequest =  (HashMap&amp;lt;String,Object&amp;gt;)params.get(&quot;userRequest&quot;);
            String utter = userRequest.get(&quot;utterance&quot;).toString().replace(&quot;\n&quot;,&quot;&quot;);

            String rtnStr = &quot;&quot;;
            switch (utter){
                case &quot;뭐야&quot; : rtnStr = &quot;코딩32 챗봇입니다.&quot;;
                    break;
                case &quot;ㅋㅋ&quot; : rtnStr = &quot;저도 기분이 좋네요&quot;;
                    break;
                default: rtnStr = &quot;안녕하세요 코딩 32 챗봇입니다.&quot;;
            }
            /* 발화 처리 끝*/

            List&amp;lt;HashMap&amp;lt;String,Object&amp;gt;&amp;gt; outputs = new ArrayList&amp;lt;&amp;gt;();
            HashMap&amp;lt;String,Object&amp;gt; template = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; simpleText = new HashMap&amp;lt;&amp;gt;();
            HashMap&amp;lt;String, Object&amp;gt; text = new HashMap&amp;lt;&amp;gt;();

            text.put(&quot;text&quot;,rtnStr);
            simpleText.put(&quot;simpleText&quot;,text);
            outputs.add(simpleText);

            template.put(&quot;outputs&quot;,outputs);

            resultJson.put(&quot;version&quot;,&quot;2.0&quot;);
            resultJson.put(&quot;template&quot;,template);

        }catch (Exception e){

        }

        return resultJson;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;봇테스트에서도 확인을 해봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;응답이 정상적으로 리턴되는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dG93ip/btqzxClz1bl/kM9ZFgVoEYBPO74wfcCwO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dG93ip/btqzxClz1bl/kM9ZFgVoEYBPO74wfcCwO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dG93ip/btqzxClz1bl/kM9ZFgVoEYBPO74wfcCwO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdG93ip%2FbtqzxClz1bl%2FkM9ZFgVoEYBPO74wfcCwO0%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;카카오톡에서 테스트해보기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기까지 일단 해보고 배포를 한 번 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R4Kau/btqzwuVKzsg/QvCEZbjo9IWVsAcHfY3vk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R4Kau/btqzwuVKzsg/QvCEZbjo9IWVsAcHfY3vk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R4Kau/btqzwuVKzsg/QvCEZbjo9IWVsAcHfY3vk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR4Kau%2FbtqzwuVKzsg%2FQvCEZbjo9IWVsAcHfY3vk0%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;실제 카카오톡에서도 아래와 같이 발화별로 응답이 되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blOU9M/btqzxCy8vE4/7Q4dZsXypMl0lAtykAV5Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blOU9M/btqzxCy8vE4/7Q4dZsXypMl0lAtykAV5Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blOU9M/btqzxCy8vE4/7Q4dZsXypMl0lAtykAV5Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblOU9M%2FbtqzxCy8vE4%2F7Q4dZsXypMl0lAtykAV5Yk%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;지금까지 단순 발화를 서버에서 요청받고 응답하는 기능을 구현해 보았습니다.&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt9QQq/btqzxC6Tnt8/8k5j1KanFj8wkIRW3FMWy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt9QQq/btqzxC6Tnt8/8k5j1KanFj8wkIRW3FMWy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt9QQq/btqzxC6Tnt8/8k5j1KanFj8wkIRW3FMWy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt9QQq%2FbtqzxC6Tnt8%2F8k5j1KanFj8wkIRW3FMWy1%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;</description>
      <category>카카오 오픈빌더</category>
      <category>springboot</category>
      <category>챗봇</category>
      <category>카카오오픈빌더</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/94</guid>
      <comments>https://vmpo.tistory.com/94#entry94comment</comments>
      <pubDate>Tue, 5 Nov 2019 22:13:57 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 레지스트리 추출 방법</title>
      <link>https://vmpo.tistory.com/93</link>
      <description>&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;윈도우 key - &amp;gt; regedit 검색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;336&quot; height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XqNSJ/btqzwvUEcno/NBX86z6JWr2KDNKjq3YoN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XqNSJ/btqzwvUEcno/NBX86z6JWr2KDNKjq3YoN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XqNSJ/btqzwvUEcno/NBX86z6JWr2KDNKjq3YoN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXqNSJ%2FbtqzwvUEcno%2FNBX86z6JWr2KDNKjq3YoN0%2Fimg.png&quot; width=&quot;336&quot; height=&quot;591&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSP2PO/btqzzmnXDnC/TvxiBZVP6mwpxMHLfBLjKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSP2PO/btqzzmnXDnC/TvxiBZVP6mwpxMHLfBLjKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSP2PO/btqzzmnXDnC/TvxiBZVP6mwpxMHLfBLjKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSP2PO%2FbtqzzmnXDnC%2FTvxiBZVP6mwpxMHLfBLjKK%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;내보내기를 누르면 아래와 같이 저장할 경로를 설정하는 팝업이 올라옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ca3Uf/btqzzmuI0HF/0W9zmAYZxbRZtMzCaMLBt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ca3Uf/btqzzmuI0HF/0W9zmAYZxbRZtMzCaMLBt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ca3Uf/btqzzmuI0HF/0W9zmAYZxbRZtMzCaMLBt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCa3Uf%2FbtqzzmuI0HF%2F0W9zmAYZxbRZtMzCaMLBt0%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;정상적으로 레지스트리가 추출된 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXio5f/btqzzlP7u9y/iuVUu7WxzZJ2HWDkZHbVW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXio5f/btqzzlP7u9y/iuVUu7WxzZJ2HWDkZHbVW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXio5f/btqzzlP7u9y/iuVUu7WxzZJ2HWDkZHbVW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXio5f%2FbtqzzlP7u9y%2FiuVUu7WxzZJ2HWDkZHbVW1%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;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;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJg8C/btqzxMH6LCK/Hw4BElova2pQ7pkiOHeHP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJg8C/btqzxMH6LCK/Hw4BElova2pQ7pkiOHeHP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJg8C/btqzxMH6LCK/Hw4BElova2pQ7pkiOHeHP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJg8C%2FbtqzxMH6LCK%2FHw4BElova2pQ7pkiOHeHP1%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;레지스트르 추출 후 다른 컴퓨터에 적용이 필요하거나 백업이 필요한 경우 활용이 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버/window</category>
      <category>레지스트리</category>
      <category>윈도우</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/93</guid>
      <comments>https://vmpo.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 5 Nov 2019 20:06:00 +0900</pubDate>
    </item>
    <item>
      <title>[C#] C# 에서 Mysql연동하기 (insert, select)</title>
      <link>https://vmpo.tistory.com/92</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#에서 Mysql DB를 연동하는 코드를 작성해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Mysql설치가 필요하신 분들은, &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 링크를 확인해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/82&quot;&gt;https://vmpo.tistory.com/82&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572778344506&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;윈도우 10 Mysql 설치하기 (mysql 개발환경 세팅)&quot; data-og-description=&quot;윈도우10에서 mysql을 설치해보도록 하겠습니다. 아래 웹사이트로 접속하면 최신버전 mysql install 파일을 확인할 수 있습니다. https://dev.mysql.com/downloads/installer/ MySQL :: Download MySQL Installer..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/82&quot; data-og-url=&quot;https://vmpo.tistory.com/82&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tp7BL/hyDxFivZK9/01l1em8Vyb3Tprx7o30qkk/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/FtHth/hyDxQdh8q3/LPS76D1IzFGqM4L7oooG9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/czMpLw/hyDxPemQNG/AImMo31OukkheyQmbzbtQk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/82&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tp7BL/hyDxFivZK9/01l1em8Vyb3Tprx7o30qkk/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/FtHth/hyDxQdh8q3/LPS76D1IzFGqM4L7oooG9k/img.png?width=800&amp;amp;height=480&amp;amp;face=0_0_800_480,https://scrap.kakaocdn.net/dn/czMpLw/hyDxPemQNG/AImMo31OukkheyQmbzbtQk/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;윈도우 10 Mysql 설치하기 (mysql 개발환경 세팅)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;윈도우10에서 mysql을 설치해보도록 하겠습니다. 아래 웹사이트로 접속하면 최신버전 mysql install 파일을 확인할 수 있습니다. https://dev.mysql.com/downloads/installer/ MySQL :: Download MySQL Installer..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Mysql DB에 테이블 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DB연동에 앞서 테이블을 먼저 생성해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Mysql Workbench에서 빠르게 생성해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;coding32 Database를 하나 생성하고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Co32Table명을 갖는 table을 생성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfOh2Y/btqzttP4oks/MAp2UfKvvZPdEMFNzqxGEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfOh2Y/btqzttP4oks/MAp2UfKvvZPdEMFNzqxGEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfOh2Y/btqzttP4oks/MAp2UfKvvZPdEMFNzqxGEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfOh2Y%2FbtqzttP4oks%2FMAp2UfKvvZPdEMFNzqxGEk%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;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 이제 C#에서 코드를 구현해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Mysql.Data.dll import&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저, dll파일을 하나 import합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;도구-&amp;gt; nuget패키지관리자-&amp;gt;솔루션용 nuget패키지 관리자에서 Mysql을 검색해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Mysql.Data를 선택한 후 프로젝트에 적용해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNk9ki/btqzusXcWcq/AEKfw1e8b4UvLJJqTkZyT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNk9ki/btqzusXcWcq/AEKfw1e8b4UvLJJqTkZyT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNk9ki/btqzusXcWcq/AEKfw1e8b4UvLJJqTkZyT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNk9ki%2FbtqzusXcWcq%2FAEKfw1e8b4UvLJJqTkZyT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;적용이 완료되었다면, 아래와 같이 Mysql.Data 패키지가 import되어 있는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdz1QS/btqzukE5vTK/ZMYrByGBh4oUpV0EOS8BZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdz1QS/btqzukE5vTK/ZMYrByGBh4oUpV0EOS8BZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdz1QS/btqzukE5vTK/ZMYrByGBh4oUpV0EOS8BZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdz1QS%2FbtqzukE5vTK%2FZMYrByGBh4oUpV0EOS8BZ1%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Conntection String&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#에서 Mysql Connection String은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저 같은 로컬pc에 Mysql을 설치했기 때문에 IP는 localhost로 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;원격 서버로 접근해야되는 경우, 해당 부분을 원격서버 ip로 설정해주시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;Server=서버아이피;Port=포트;Database=데이터베이스명;Uid=접속계정아이디;Pwd=패스워드;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MySqlConnection&amp;nbsp;connection&amp;nbsp;=&amp;nbsp;new MySqlConnection(&quot;Server=localhost;Port=3306;Database=coding32;Uid=root;Pwd=1111&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;C#에서 Mysql Insert 하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1572779752550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using MySql.Data.MySqlClient;

namespace Coding32
{
    class Program
    {
        static void Main(string[] args)
        {


            using (MySqlConnection connection = new MySqlConnection(&quot;Server=localhost;Port=3306;Database=coding32;Uid=root;Pwd=1111&quot;))
            {
                string insertQuery = &quot;INSERT INTO Co32table(idx,header,body) VALUES(3,'header1','body2')&quot;;
                try//예외 처리
                {
                    connection.Open();
                    MySqlCommand command = new MySqlCommand(insertQuery, connection);

                    // 만약에 내가처리한 Mysql에 정상적으로 들어갔다면 메세지를 보여주라는 뜻이다
                    if (command.ExecuteNonQuery() == 1)
                    {
                        Console.WriteLine(&quot;인서트 성공&quot;);
                    }
                    else
                    {
                        Console.WriteLine(&quot;인서트 실패&quot;);
                    }

                }
                catch (Exception ex)
                {
                    Console.WriteLine(&quot;실패&quot;);
                    Console.WriteLine(ex.ToString());
                }
                
            }            

        }
    }
}
&lt;/code&gt;&lt;/pre&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/rhcxr/btqzv7xBs3x/WTakdSsP8pnIr0kEYT3xoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhcxr/btqzv7xBs3x/WTakdSsP8pnIr0kEYT3xoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhcxr/btqzv7xBs3x/WTakdSsP8pnIr0kEYT3xoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frhcxr%2Fbtqzv7xBs3x%2FWTakdSsP8pnIr0kEYT3xoK%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DB조회 결과 : 정상적으로 인서트 된 것을 확인 할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c65P7I/btqzu7yiK6G/iY9UALiPvC6tWHDMafotf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c65P7I/btqzu7yiK6G/iY9UALiPvC6tWHDMafotf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c65P7I/btqzu7yiK6G/iY9UALiPvC6tWHDMafotf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc65P7I%2Fbtqzu7yiK6G%2FiY9UALiPvC6tWHDMafotf0%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;script src=&quot;&amp;lt;a href=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;lt;/a&amp;gt;&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;C#에서 Mysql Select하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MysqlCommand객체를 통해 쿼리를 수행하고, (cmd.ExecuteReader() )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결과를 MySqlDataReader를 통해 읽도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572780111531&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        public static void SelectMysql()
        {
            using (MySqlConnection connection = new MySqlConnection(&quot;Server=localhost;Port=3306;Database=coding32;Uid=root;Pwd=1111&quot;))
            {
                try//예외 처리
                {
                    connection.Open();
                    string sql = &quot;SELECT * FROM Co32table&quot;;

                    //ExecuteReader를 이용하여
                    //연결 모드로 데이타 가져오기
                    MySqlCommand cmd = new MySqlCommand(sql, connection);
                    MySqlDataReader table = cmd.ExecuteReader();
                    
                    while (table.Read())
                    {
                        Console.WriteLine(&quot;{0} {1}&quot;, table[&quot;idx&quot;], table[&quot;header&quot;],table[&quot;body&quot;]);
                    }
                    table.Close();

                }
                catch (Exception ex)
                {
                    Console.WriteLine(&quot;실패&quot;);
                    Console.WriteLine(ex.ToString());
                }

            }
        }&lt;/code&gt;&lt;/pre&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGAxQ6/btqzuRbomvi/ypMkxtxgjrGj8SBSQkkB30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGAxQ6/btqzuRbomvi/ypMkxtxgjrGj8SBSQkkB30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGAxQ6/btqzuRbomvi/ypMkxtxgjrGj8SBSQkkB30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGAxQ6%2FbtqzuRbomvi%2FypMkxtxgjrGj8SBSQkkB30%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;</description>
      <category>C#/기본</category>
      <category>c#</category>
      <category>insert</category>
      <category>mysql</category>
      <category>select</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/92</guid>
      <comments>https://vmpo.tistory.com/92#entry92comment</comments>
      <pubDate>Sun, 3 Nov 2019 20:32:05 +0900</pubDate>
    </item>
    <item>
      <title>C# HttpClient 비동기 웹 요청 구현하기</title>
      <link>https://vmpo.tistory.com/91</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#에서 HttpClient를 활용해 비동기 웹 요청을 해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;지난 포스팅 중 Line notify 를 보내는 예제를 활용해 보도록하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/90&quot;&gt;https://vmpo.tistory.com/90&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572712413830&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C#으로 Line notify 보내기 (라인 메시지 보내기)&quot; data-og-description=&quot;C#으로 라인 메시지 보내기 샘플입니다. *참고 : python으로 line notify를 사용했던 샘플입니다. 필요하시면 확인해주세요. https://vmpo.tistory.com/87 python으로 Line notify (라인 메시지) 보내기 파이썬 및..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/90&quot; data-og-url=&quot;https://vmpo.tistory.com/90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b90Kc4/hyDvGpqJqx/GAVAYr2zmojUcrZTBMOSn1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/bWQTEV/hyDvFqwgfK/9RdmrhmAn2sur36cxdDZD1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/Lck0j/hyDxPSzKDK/lDoHS3B0W08fRU3zxtQKd0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b90Kc4/hyDvGpqJqx/GAVAYr2zmojUcrZTBMOSn1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/bWQTEV/hyDvFqwgfK/9RdmrhmAn2sur36cxdDZD1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/Lck0j/hyDxPSzKDK/lDoHS3B0W08fRU3zxtQKd0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;C#으로 Line notify 보내기 (라인 메시지 보내기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;C#으로 라인 메시지 보내기 샘플입니다. *참고 : python으로 line notify를 사용했던 샘플입니다. 필요하시면 확인해주세요. https://vmpo.tistory.com/87 python으로 Line notify (라인 메시지) 보내기 파이썬 및..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;HttpClient로&amp;nbsp; LINE알림 비동기로 호출해보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 코드는 비동기로 라인 메시지를 보내는 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Header설정은 DefaultRequestHeaders.add()를 통해 name, value를 각각 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Post 호출의 경우 파라미터를 같이 Dictionary&amp;lt;string,string&amp;gt; 형태로 저장을 해준 뒤,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FormUrlFormUrlEncodedContent 객체 생성시 파라미터로 전달해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최종적으로 PostAsync(&quot;url&quot;, &quot;전달할내용&quot;) 메소드를 호출해 줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;PostAsync 호출시에는 await 키워드를 넣어줘야 리턴값을 확인해 줄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572712517355&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static async Task&amp;lt;HttpResponseMessage&amp;gt; PostAsyncHttp()
{
    HttpClient _httpClient = new HttpClient();            
    _httpClient.DefaultRequestHeaders.Add(&quot;Authorization&quot;, &quot;Bearer Ask2OVGx4Jm9mUvcSLmfv1nY&quot;);

    var parameters = new Dictionary&amp;lt;string, string&amp;gt;();
    parameters.Add(&quot;message&quot;, &quot;안녕하세요&quot;);
    var encodedContent = new FormUrlEncodedContent(parameters);

    var response = await _httpClient.PostAsync(&quot;https://notify-api.line.me/api/notify&quot;, encodedContent).ConfigureAwait(false);
    return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 메소드를 비동기로 라인메시지 보내는 API를 3번 연속 호출한 후 비동기 메소드가 처리되는 동안 거의 동시에&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FOR문을 수행하는 코드를 작성해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 메소드 내부에 Console.WriteLine()을 찍어 수행여부를 확인해 주도록 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572713108290&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncTest
{
    class Program
    {

        static async Task Main(string[] args)
        {
            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine(&quot;비동기 3회 시작&quot;);
            Task&amp;lt;HttpResponseMessage&amp;gt; first  = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; second = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; third  = PostAsyncHttp();

            for(int i = 0; i &amp;lt; 10; i++)
            {                
                Console.WriteLine(&quot;다른 로직 수행 : &quot; + i);                
            }

            HttpResponseMessage fr = await first;
            HttpResponseMessage sec = await first;
            HttpResponseMessage th = await first;

            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds+&quot;ms&quot;);

            Thread.Sleep(5000);
        }
        

        public static async Task&amp;lt;HttpResponseMessage&amp;gt; PostAsyncHttp()
        {
            HttpClient _httpClient = new HttpClient();            
            _httpClient.DefaultRequestHeaders.Add(&quot;Authorization&quot;, &quot;Bearer Ask2O1C1EUq0iNdBGAVGx4Jm9mUvcSLmfvgV61OH1nY&quot;);

            var parameters = new Dictionary&amp;lt;string, string&amp;gt;();
            parameters.Add(&quot;message&quot;, &quot;안녕하세요&quot;);
            var encodedContent = new FormUrlEncodedContent(parameters);

            var response = await _httpClient.PostAsync(&quot;https://notify-api.line.me/api/notify&quot;, encodedContent).ConfigureAwait(false);
            Console.WriteLine(&quot;비동기 PostAsyncHttp() 호출&quot;);
            return response;
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실행결과 비동기 메소드를 3번 요청한 후 for문을 수행하는 동안 각 비동기 메소드들이 호출된 모습입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y1dVG/btqzv6LUKmE/GZ8gtByHDrw3KSiqKFNfYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y1dVG/btqzv6LUKmE/GZ8gtByHDrw3KSiqKFNfYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y1dVG/btqzv6LUKmE/GZ8gtByHDrw3KSiqKFNfYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy1dVG%2Fbtqzv6LUKmE%2FGZ8gtByHDrw3KSiqKFNfYk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;라인 메시지도 3건이 온 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9pjxt/btqzukrgdkt/xMauRTzW9AsgfLsZSBnvL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9pjxt/btqzukrgdkt/xMauRTzW9AsgfLsZSBnvL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9pjxt/btqzukrgdkt/xMauRTzW9AsgfLsZSBnvL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9pjxt%2Fbtqzukrgdkt%2FxMauRTzW9AsgfLsZSBnvL1%2Fimg.png&quot; width=&quot;335&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1회 호출과 3회 비동기 호출 수행시간 비교하기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3개의 비동기 메소드 포함 전체 로직 수행시간이 729ms인 것을 확인 할 수 있는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 메소드 1회 실행시의 수행 시간과 한 번 비교해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2개 메소드의 주석을 치고 1번만 호출해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572713403844&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncTest
{
    class Program
    {

        static async Task Main(string[] args)
        {
            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine(&quot;비동기 3회 시작&quot;);
            Task&amp;lt;HttpResponseMessage&amp;gt; first  = PostAsyncHttp();
            //Task&amp;lt;HttpResponseMessage&amp;gt; second = PostAsyncHttp();
            //Task&amp;lt;HttpResponseMessage&amp;gt; third  = PostAsyncHttp();

            for(int i = 0; i &amp;lt; 10; i++)
            {                
                Console.WriteLine(&quot;다른 로직 수행 : &quot; + i);                
            }

            HttpResponseMessage fr = await first;
            //HttpResponseMessage sec = await first;
            //HttpResponseMessage th = await first;

            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds+&quot;ms&quot;);

            Thread.Sleep(5000);
        }
        

        public static async Task&amp;lt;HttpResponseMessage&amp;gt; PostAsyncHttp()
        {
            HttpClient _httpClient = new HttpClient();            
            _httpClient.DefaultRequestHeaders.Add(&quot;Authorization&quot;, &quot;Bearer Ask2O1C1EUq0iNdBGAVGx4Jm9mUvcSLmfvgV61OH1nY&quot;);

            var parameters = new Dictionary&amp;lt;string, string&amp;gt;();
            parameters.Add(&quot;message&quot;, &quot;안녕하세요&quot;);
            var encodedContent = new FormUrlEncodedContent(parameters);

            var response = await _httpClient.PostAsync(&quot;https://notify-api.line.me/api/notify&quot;, encodedContent).ConfigureAwait(false);
            Console.WriteLine(&quot;비동기 PostAsyncHttp() 호출&quot;);
            return response;
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실행시간이 770ms인 것을 확인 할 수 있습니다. 여러번 프로그램을 다시 빌드해봐도 비슷한 시간이 측정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3회 호출 했을때와 거의 차이가 없는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;동기식 실행시에는 1회 수행결과 * 3배의 수행시간이 걸리는 것에 비해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 요청으로 처리 할 경우 1/3로 실행시간을 줄일 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxysRC/btqzujFWbs8/meG00By5FiDy7HQZoGbUnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxysRC/btqzujFWbs8/meG00By5FiDy7HQZoGbUnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxysRC/btqzujFWbs8/meG00By5FiDy7HQZoGbUnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxysRC%2FbtqzujFWbs8%2FmeG00By5FiDy7HQZoGbUnk%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10회 호출과&amp;nbsp; 비교하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10번을 비동기로 요청해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10번의 메소드를 요청해놓고 다음 코드 실행을 위해 기다리지 않기 때문에, &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간차이는 요청로직을 수행하는 정도의 차이만 발생하는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl9Y9A/btqzvI5z9BE/AxwBV8U4JAIx0VhXJyAgy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl9Y9A/btqzvI5z9BE/AxwBV8U4JAIx0VhXJyAgy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl9Y9A/btqzvI5z9BE/AxwBV8U4JAIx0VhXJyAgy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl9Y9A%2FbtqzvI5z9BE%2FAxwBV8U4JAIx0VhXJyAgy1%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;script src=&quot;&amp;lt;a href=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;lt;/a&amp;gt;&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;코드 스니펫 복사&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;how-to-extend-the-async-walkthrough-by-using-taskwhenall-c&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Task.WhenAll를 활용해 비동기 메소드 호출 결과 처리하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 메소드 호출 후 각 메소드의 결과마다 await을 설정해 대기하지 않고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;미리 LIST로 담은 후 Task.Whenall(list)로 처리 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 코드를 확인해보면 Task.WhenAll 라인에서 모든 요청이 종료될때까지 대기되며, 완료된 이후에&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음라인이 실행됩니다. 모든 비동기 요청의 결과 값은 HttpResponseMessage[] 배열에 저장 되어&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필요한 경우 꺼내 쓰면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572714156691&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncTest
{
    class Program
    {

        static async Task Main(string[] args)
        {
            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Console.WriteLine(&quot;비동기 3회 시작&quot;);
            Task&amp;lt;HttpResponseMessage&amp;gt; first  = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; second = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; third  = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test1 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test2 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test3 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test4 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test5 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test6 = PostAsyncHttp();
            Task&amp;lt;HttpResponseMessage&amp;gt; test7 = PostAsyncHttp();

            List&amp;lt;Task&amp;lt;HttpResponseMessage&amp;gt;&amp;gt; list = new List&amp;lt;Task&amp;lt;HttpResponseMessage&amp;gt;&amp;gt;();
            list.Add(first);
            list.Add(second);
            list.Add(test1);
            list.Add(test2);
            list.Add(test3);
            list.Add(test4);
            list.Add(test5);
            list.Add(test6);
            list.Add(test7);

            for (int i = 0; i &amp;lt; 10; i++)
            {                
                Console.WriteLine(&quot;다른 로직 수행 : &quot; + i);                
            }

            HttpResponseMessage[] response = await Task.WhenAll(list);

            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds+&quot;ms&quot;);

            Thread.Sleep(5000);
        }
        

        public static async Task&amp;lt;HttpResponseMessage&amp;gt; PostAsyncHttp()
        {
            HttpClient _httpClient = new HttpClient();            
            _httpClient.DefaultRequestHeaders.Add(&quot;Authorization&quot;, &quot;Bearer Ask2O1C1EUq0iNdBGAVGx4Jm9mUvcSLmfvgV61OH1nY&quot;);

            var parameters = new Dictionary&amp;lt;string, string&amp;gt;();
            parameters.Add(&quot;message&quot;, &quot;안녕하세요&quot;);
            var encodedContent = new FormUrlEncodedContent(parameters);

            var response = await _httpClient.PostAsync(&quot;https://notify-api.line.me/api/notify&quot;, encodedContent).ConfigureAwait(false);
            Console.WriteLine(&quot;비동기 PostAsyncHttp() 호출&quot;);
            return response;
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>C#/기본</category>
      <category>c#</category>
      <category>HttpClient</category>
      <category>line notify</category>
      <category>라인알림</category>
      <category>비동기웹호출</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/91</guid>
      <comments>https://vmpo.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 3 Nov 2019 02:11:54 +0900</pubDate>
    </item>
    <item>
      <title>C#으로 Line notify 보내기 (라인 메시지 보내기)</title>
      <link>https://vmpo.tistory.com/90</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#으로 라인 메시지 보내기 샘플입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;*참고 : python으로 line notify를 사용했던 샘플입니다. 필요하시면 확인해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/87&quot;&gt;https://vmpo.tistory.com/87&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572711088059&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;python으로 Line notify (라인 메시지) 보내기&quot; data-og-description=&quot;파이썬 및 Line notify를 활용해 라인 그룹 채팅방에 메시지를 보내보도록 하겠습니다. 먼저, 파이썬은 기본적으로 설치 되어 있다고 가정하겠습니다. 만약 설치되어 있지 않다면, 아래 링크를 확인해주세요 https..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/87&quot; data-og-url=&quot;https://vmpo.tistory.com/87&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dsgTaC/hyDvCtMwoz/JNp3lBLi2xUkEkFDJGb4Fk/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/1XmgY/hyDvFYobRU/rqrt9DK16lK4Nc1pE133s1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/vKzJb/hyDvErDE7Y/wzihJ71QnE2uGUdkrzWe8K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/87&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/87&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dsgTaC/hyDvCtMwoz/JNp3lBLi2xUkEkFDJGb4Fk/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/1XmgY/hyDvFYobRU/rqrt9DK16lK4Nc1pE133s1/img.png?width=666&amp;amp;height=1440&amp;amp;face=0_0_666_1440,https://scrap.kakaocdn.net/dn/vKzJb/hyDvErDE7Y/wzihJ71QnE2uGUdkrzWe8K/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;python으로 Line notify (라인 메시지) 보내기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;파이썬 및 Line notify를 활용해 라인 그룹 채팅방에 메시지를 보내보도록 하겠습니다. 먼저, 파이썬은 기본적으로 설치 되어 있다고 가정하겠습니다. 만약 설치되어 있지 않다면, 아래 링크를 확인해주세요 https..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;python예제와 거의 동일하며 코드실행만 C#으로 진행하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;라인앱을 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIN3Nr/btqztjs4GpR/ZjcNun5aLulHngQGteEOI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIN3Nr/btqztjs4GpR/ZjcNun5aLulHngQGteEOI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIN3Nr/btqztjs4GpR/ZjcNun5aLulHngQGteEOI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIN3Nr%2Fbtqztjs4GpR%2FZjcNun5aLulHngQGteEOI1%2Fimg.png&quot; width=&quot;264&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;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;처음 가입하신 경우 이메일, 비밀번호를 등록해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AufBG/btqzukkuJYs/QAAwgJhQSzwlF8PoPavkC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AufBG/btqzukkuJYs/QAAwgJhQSzwlF8PoPavkC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AufBG/btqzukkuJYs/QAAwgJhQSzwlF8PoPavkC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAufBG%2FbtqzukkuJYs%2FQAAwgJhQSzwlF8PoPavkC1%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;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완료되었으면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대화방으로 이동해 그룹채팅방을 하나 만들어 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;226&quot; height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYr4p4/btqzu7xYv1i/kKEIB7sc0f9hQK5Eud0J31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYr4p4/btqzu7xYv1i/kKEIB7sc0f9hQK5Eud0J31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYr4p4/btqzu7xYv1i/kKEIB7sc0f9hQK5Eud0J31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYr4p4%2Fbtqzu7xYv1i%2FkKEIB7sc0f9hQK5Eud0J31%2Fimg.png&quot; width=&quot;226&quot; height=&quot;489&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 style=&quot;font-size: 1.25em;&quot;&gt;친구초대를 눌러 line notify를 검색해서 추가해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8UVVr/btqzt4vva2R/dAQIqtwze4y6gbIYj2VFm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8UVVr/btqzt4vva2R/dAQIqtwze4y6gbIYj2VFm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8UVVr/btqzt4vva2R/dAQIqtwze4y6gbIYj2VFm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8UVVr%2Fbtqzt4vva2R%2FdAQIqtwze4y6gbIYj2VFm1%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 style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완료되었으면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Line notify 홈페이지에서 로그인을 진행해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&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/cmx8aK/btqzvo0zH0A/axQ2o82IrHUKRy0zbVbqE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmx8aK/btqzvo0zH0A/axQ2o82IrHUKRy0zbVbqE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmx8aK/btqzvo0zH0A/axQ2o82IrHUKRy0zbVbqE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmx8aK%2Fbtqzvo0zH0A%2FaxQ2o82IrHUKRy0zbVbqE1%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 style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우측 상단의 자신의 아이디를 누르고 mypage로 이동합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4nzq4/btqzu8jmVHw/3UbSmXr3mKWjgSLMJwQEOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4nzq4/btqzu8jmVHw/3UbSmXr3mKWjgSLMJwQEOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4nzq4/btqzu8jmVHw/3UbSmXr3mKWjgSLMJwQEOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4nzq4%2Fbtqzu8jmVHw%2F3UbSmXr3mKWjgSLMJwQEOK%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;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고, mypage 하단에 generate access token 메뉴에서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Generate token을 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bya7Kv/btqzt3J4RJh/b0jS5TSz9H13YdYiC61Kn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bya7Kv/btqzt3J4RJh/b0jS5TSz9H13YdYiC61Kn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bya7Kv/btqzt3J4RJh/b0jS5TSz9H13YdYiC61Kn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbya7Kv%2Fbtqzt3J4RJh%2Fb0jS5TSz9H13YdYiC61Kn0%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 style=&quot;font-size: 1.25em;&quot;&gt;&lt;span&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/plSBv/btqzukkuzxq/J0l74oMidix5ExKdaIZukK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/plSBv/btqzukkuzxq/J0l74oMidix5ExKdaIZukK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/plSBv/btqzukkuzxq/J0l74oMidix5ExKdaIZukK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FplSBv%2Fbtqzukkuzxq%2FJ0l74oMidix5ExKdaIZukK%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;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;Generate token을 눌러주면 아래와 같이 토큰이 생성됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;이 토큰은 다시는 찾을 수 없으니 저장을 따로 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AyWR6/btqztiOsKps/xJQqhqYJZ2cI3IEvWviGDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AyWR6/btqztiOsKps/xJQqhqYJZ2cI3IEvWviGDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AyWR6/btqztiOsKps/xJQqhqYJZ2cI3IEvWviGDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAyWR6%2FbtqztiOsKps%2FxJQqhqYJZ2cI3IEvWviGDk%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 style=&quot;font-size: 1.25em;&quot;&gt;아래와 같이 생성되었다면 성공입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKcMqF/btqzvJwEkhB/SUYbzm2t7ptMkI4H0fDpy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKcMqF/btqzvJwEkhB/SUYbzm2t7ptMkI4H0fDpy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKcMqF/btqzvJwEkhB/SUYbzm2t7ptMkI4H0fDpy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKcMqF%2FbtqzvJwEkhB%2FSUYbzm2t7ptMkI4H0fDpy0%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;script src=&quot;&amp;lt;a href=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;gt;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&amp;lt;/a&amp;gt;&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;그럼 이제 C#코드로 메시지를 날려보겠습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;코드는 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;헤더값중 authorization 에 Bearer '토큰값' 만 설정해주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;전송 파라미터는 message : '전송할 메시지'만 설정해 주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;그럼 실제 코드를 실행해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572711552548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;

namespace LineNotify
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                WebClient wc4 = new WebClient();
                string targetAddress4 = &quot;https://notify-api.line.me/api/notify&quot;;
                wc4.Headers[&quot;Authorization&quot;] = &quot;Bearer 1EUq0iNdBGAVGx4Jm9mUvcSLmfvgV61OH1&quot;;
                
                NameValueCollection nc4 = new NameValueCollection();
                nc4[&quot;message&quot;] = &quot;안녕하세요~~&quot;;

                byte[] bResult4 = wc4.UploadValues(targetAddress4, nc4);
                string result4 = Encoding.UTF8.GetString(bResult4);
            }
            catch(Exception e)
            {

            }            
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 정상적으로 호출되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;356&quot; height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHsR6B/btqzv7YlUJl/z5dcVjnKPQo0mh9BZBXFm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHsR6B/btqzv7YlUJl/z5dcVjnKPQo0mh9BZBXFm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHsR6B/btqzv7YlUJl/z5dcVjnKPQo0mh9BZBXFm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHsR6B%2Fbtqzv7YlUJl%2Fz5dcVjnKPQo0mh9BZBXFm0%2Fimg.png&quot; width=&quot;356&quot; height=&quot;770&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;HttpClient 클래스를 활용해서 호출 할 수 있습니다. ( 닷넷 프레임워크 4.5 이상만 가능)&lt;/p&gt;
&lt;pre id=&quot;code_1572711844109&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace LineNotify
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await GetAsyncHttp();            
        }

        public static async Task GetAsyncHttp()
        {
            HttpClient _httpClient = new HttpClient();
            _httpClient.DefaultRequestHeaders.Add(&quot;Authorization&quot;, &quot;Bearer BGAVGx4Jm9mUvcSLmfnY&quot;);

            var parameters = new Dictionary&amp;lt;string, string&amp;gt;();
            parameters.Add(&quot;message&quot;, &quot;안녕하세요&quot;);
            var encodedContent = new FormUrlEncodedContent(parameters);

            var response = await _httpClient.PostAsync(&quot;https://notify-api.line.me/api/notify&quot;, encodedContent).ConfigureAwait(false);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>API활용하기/Line Notify(라인메시지) API</category>
      <category>c#</category>
      <category>line notify</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/90</guid>
      <comments>https://vmpo.tistory.com/90#entry90comment</comments>
      <pubDate>Sun, 3 Nov 2019 01:29:40 +0900</pubDate>
    </item>
    <item>
      <title>[C#] async, await 비동기 프로그램 작성하기</title>
      <link>https://vmpo.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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#에서는 닷넷 프레임워크 4.5이상에서 async, await이라는 기능을 활용해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 코드를 구현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기존 동기식 코드는 라인단위로 실행이 되기 때문에, 앞에 코드가 끝나야 다음 코드로 넘어 갈 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만, 비동기식 코드는 비동기 코드 실행시 다음 라인으로 넘어가 코드가 실행됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;한 번 요청을 해놓고 해당 결과와 상관없이 곧바로 다음 로직 들을 수행 할 수 있기 때문에, 때때로 효율적인 코드를 작성 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C#에서 async , await 키워드로 비동기 코드 테스트&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Doasync()&lt;/p&gt;
&lt;p&gt;DosyncSecond()&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2개의 비동 함수를 정의했습니다. 비동기 키워드를 정의하기 위해선 async키워드를 메소드 생성시 삽입해주어야 합니다.&lt;/p&gt;
&lt;p&gt;그리고, 메소드 내부에 await 키워드로 특정 로직이 수행 될 수 있도록 대기 하는 로직을 주어야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한, 메소드 수행의 결과를 기다릴 수도 있고, 기다리지 않을 수도 있습니다.&lt;/p&gt;
&lt;p&gt;메소드 바깥에 메소드 수행이 완료되는 것을 기다릴 거라면 await 결과값저장변수 와 같이 선언해&lt;/p&gt;
&lt;p&gt;대기하는 구간을 만들어 주어야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 코드는 Doasync() ,DosyncSecond() 가 연속적으로 요청되며 응답을 기다리지 않고,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 라인의 Console에 문자를 찍는 3개의 로직이 바로 수행됩니다. 콘솔찍는 3개의 로직이 수행되면,&lt;/p&gt;
&lt;p&gt;await k에서는 Doasync()함수가 종료될때까지 기다리며, 종료된 이후에 다음라인인&lt;/p&gt;
&lt;p&gt;await k2로 넘어가 DoasyncSecond()함수가 종료될때까지 기다립니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572700038664&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Async
{
    class Program
    {
        static async Task Main(string[] args)
        {
            
            Task k  = Doasync();
            Task k2 = DoasyncSecond();
            Console.WriteLine(&quot;비동기 메소드 2개를 요청하자 마자 바로 여기로 이동&quot;);
            Console.WriteLine(&quot;동기 코드 수행&quot;);
            Console.WriteLine(&quot;동기 코드 수행2&quot;);
            await k;
            await k2;
            Console.WriteLine(&quot;비동기기 코드 모두 종료된 후 수행&quot;);
            
        }

        public static async Task Doasync()
        {

            await Task.Run( () =&amp;gt;
            {                
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;Doasync&quot;);
                }
            });
        }

        public static async Task DoasyncSecond()
        {            
            await Task.Run( () =&amp;gt;
            {
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;DoasyncSecond&quot;);
                }
            });
        }



    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;결과는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Doasync() ,DosyncSecond()를 먼저 요청했음에도, 비동기 메소드이기 때문에 바로 다음라인들의 로직이 수행되게 됩니다. 그리고, await키워드를 메소드 바깥에 설정해 두었기 때문에 비동기 메소드 2개가 모두 종료될때까지 기다린 후&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최종 모두 수행되면 마지막 Consle.WriteLine()함수를 실행하며 프로그램이 종료되게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbX0cL/btqzvIqUJta/biZievNSKtA9K150vwUhVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbX0cL/btqzvIqUJta/biZievNSKtA9K150vwUhVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbX0cL/btqzvIqUJta/biZievNSKtA9K150vwUhVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbX0cL%2FbtqzvIqUJta%2FbiZievNSKtA9K150vwUhVK%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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비동기 코드 수행을 기다리지 않으려면?&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;await키워드를 사용하지 않으면, 비동기 메소드 수행을 기다리지 않을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;await키워드가 설정된 라인에 주석을 치면,&lt;/p&gt;
&lt;pre id=&quot;code_1572700631362&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Async
{
    class Program
    {
        static async Task Main(string[] args)
        {
            
            Task k  = Doasync();
            Task k2 = DoasyncSecond();
            Console.WriteLine(&quot;비동기 메소드 2개를 요청하자 마자 바로 여기로 이동&quot;);
            Console.WriteLine(&quot;동기 코드 수행&quot;);
            Console.WriteLine(&quot;동기 코드 수행2&quot;);
            //await k;
            //await k2;
            Console.WriteLine(&quot;비동기기 코드 모두 종료된 후 수행&quot;);            
        }

        public static async Task Doasync()
        {

            await Task.Run( () =&amp;gt;
            {                
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;Doasync&quot;);
                }
            });
        }

        public static async Task DoasyncSecond()
        {            
            await Task.Run( () =&amp;gt;
            {
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;DoasyncSecond&quot;);
                }
            });
        }



    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 비동기 메소드 요청을 보냈으나, 메소드 수행완료를 기다리지 않기 때문에,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;메소드가 요청만 보내고 프로그램은 그냥 종료되어 버립니다.&lt;/p&gt;
&lt;p&gt;2개의 비동기 메소드에 Thread.Sleep(100)을 걸어두었기 때문에 프로그램 전체 종료가 100ms 이내에 일어 나기 때문에&lt;/p&gt;
&lt;p&gt;비동기 메소드 내부의 Console.WriteLine()에 가지도 못하고 프로그램이 종료되게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기다릴 필요가 굳이 없는 로직 수행이 필요할 경우 await키워드 없이 사용 할 수 있겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqdqO/btqzujMCQlG/wh5RXl0kKpWCa9pzJx2Kwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqdqO/btqzujMCQlG/wh5RXl0kKpWCa9pzJx2Kwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqdqO/btqzujMCQlG/wh5RXl0kKpWCa9pzJx2Kwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqdqO%2FbtqzujMCQlG%2Fwh5RXl0kKpWCa9pzJx2Kwk%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;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;async 비동기 메소드의 결과값이 필요한 경우&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Doasync() 함수의 리턴 타입을 Task&amp;lt;string&amp;gt;으로 설정해주고, return 값에 string 문자열을 넣어주었습니다.&lt;/p&gt;
&lt;p&gt;이렇게 한 후, await k 키워드로 메소드가 끝날때까지 기다려주도록 하고 결과값을 result변수에 저장합니다.&lt;/p&gt;
&lt;p&gt;그리고, 최종적으로 콘솔에 출력합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 코드를 실행하면, &lt;span style=&quot;color: #333333;&quot;&gt;Doasync() 비동기 메소드의 return값을 가져올 수 있는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비동기로 동시에 요청해서 결과값 반환을 기다리도록 하면 동기 코드보다 훨씬 효율적으로 로직을 구성 할 수 있을 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572701142323&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Async
{
    class Program
    {
        static async Task Main(string[] args)
        {
            
            Task&amp;lt;string&amp;gt; k  = Doasync();
            Task k2 = DoasyncSecond();
            Console.WriteLine(&quot;비동기 메소드 2개를 요청하자 마자 바로 여기로 이동&quot;);
            Console.WriteLine(&quot;동기 코드 수행&quot;);
            Console.WriteLine(&quot;동기 코드 수행2&quot;);
            //await k;
            //await k2;
            Console.WriteLine(&quot;비동기기 코드 모두 종료된 후 수행&quot;);

            string reuslt = await k;//비동기 메소드의 실행결과를 result 변수에 저장함
            Console.WriteLine(reuslt); 
        }
        
        public static async Task&amp;lt;string&amp;gt; Doasync()
        {

            await Task.Run( () =&amp;gt;
            {                
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;Doasync&quot;);
                }
            });

            return &quot;Task&amp;lt;string&amp;gt;으로 결과값을 받아보자&quot;;
        }

        public static async Task DoasyncSecond()
        {            
            await Task.Run( () =&amp;gt;
            {
                for (int i = 0; i &amp;lt; 5; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine(&quot;DoasyncSecond&quot;);
                }
            });
        }



    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQzGzQ/btqztugN3hi/HWKwzuSDNgo76lkobyR9ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQzGzQ/btqztugN3hi/HWKwzuSDNgo76lkobyR9ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQzGzQ/btqztugN3hi/HWKwzuSDNgo76lkobyR9ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQzGzQ%2FbtqztugN3hi%2FHWKwzuSDNgo76lkobyR9ek%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;</description>
      <category>C#/기본</category>
      <category>Async</category>
      <category>await</category>
      <category>c#</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/89</guid>
      <comments>https://vmpo.tistory.com/89#entry89comment</comments>
      <pubDate>Sat, 2 Nov 2019 22:33:31 +0900</pubDate>
    </item>
    <item>
      <title>[C#] visual studio 2019 파일 더블 클릭으로 열게 하기</title>
      <link>https://vmpo.tistory.com/88</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;visual studio를 처음 설치한 경우 디폴트 설정으로 파일을 한 번만 클릭해도 해당 소스로 이동하게 됩니다.&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;도구-&amp;gt;옵션 -&amp;gt;환경 - &amp;gt; 탭 및 창 -&amp;gt;미리보기 탭&lt;/b&gt;&lt;/span&gt;&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7kiaL/btqzs6TuXaP/7OE9fwe768ELpX1tzYAmW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7kiaL/btqzs6TuXaP/7OE9fwe768ELpX1tzYAmW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7kiaL/btqzs6TuXaP/7OE9fwe768ELpX1tzYAmW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7kiaL%2Fbtqzs6TuXaP%2F7OE9fwe768ELpX1tzYAmW1%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;</description>
      <category>C#/기본</category>
      <category>c#</category>
      <category>Visual Studio</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/88</guid>
      <comments>https://vmpo.tistory.com/88#entry88comment</comments>
      <pubDate>Fri, 1 Nov 2019 13:07:58 +0900</pubDate>
    </item>
    <item>
      <title>python으로 Line notify (라인 메시지) 보내기</title>
      <link>https://vmpo.tistory.com/87</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;파이썬 및&amp;nbsp; Line notify를 활용해 라인 그룹 채팅방에 메시지를 보내보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저, 파이썬은 기본적으로 설치 되어 있다고 가정하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 설치되어 있지 않다면, 아래 링크를 확인해주세요&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/34&quot;&gt;https://vmpo.tistory.com/34&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572529773934&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&quot; data-og-description=&quot;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/34&quot; data-og-url=&quot;https://vmpo.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbjJQa/hyDt4w3z29/fpwbIDN16qScOfDwFJzmy0/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/bGFWWX/hyDvxK8b7h/gwmbBq2pbldTIKoLNvHWjk/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/cw9xqd/hyDt4cLDkt/emZWc7reG2YazAVkiU8iO0/img.png?width=1110&amp;amp;height=525&amp;amp;face=0_0_1110_525&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/34&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbjJQa/hyDt4w3z29/fpwbIDN16qScOfDwFJzmy0/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/bGFWWX/hyDvxK8b7h/gwmbBq2pbldTIKoLNvHWjk/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/cw9xqd/hyDt4cLDkt/emZWc7reG2YazAVkiU8iO0/img.png?width=1110&amp;amp;height=525&amp;amp;face=0_0_1110_525');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Line앱을 먼저 설치해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVSaNJ/btqzrt3ADQz/0v2STj7UciSovNkhthp4xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVSaNJ/btqzrt3ADQz/0v2STj7UciSovNkhthp4xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVSaNJ/btqzrt3ADQz/0v2STj7UciSovNkhthp4xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVSaNJ%2Fbtqzrt3ADQz%2F0v2STj7UciSovNkhthp4xK%2Fimg.png&quot; width=&quot;264&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;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 더보기-&amp;gt; 설정 -&amp;gt; 계정으로 들어가서 이메일과 비밀번호를 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;형광색으로 된 부분을 눌러 이메일 계정을 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고 아래 비밀번호를 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCc6eQ/btqzs7xQJOw/0dgg276AOFlXWTXDUUS8qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCc6eQ/btqzs7xQJOw/0dgg276AOFlXWTXDUUS8qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCc6eQ/btqzs7xQJOw/0dgg276AOFlXWTXDUUS8qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCc6eQ%2Fbtqzs7xQJOw%2F0dgg276AOFlXWTXDUUS8qk%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;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완료되었으면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대화방으로 이동해 그룹채팅방을 하나 만들어 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; width=&quot;249&quot; height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wu9K2/btqzrv1uNMY/kjCAR99f9iLFKOuwgsns10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wu9K2/btqzrv1uNMY/kjCAR99f9iLFKOuwgsns10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wu9K2/btqzrv1uNMY/kjCAR99f9iLFKOuwgsns10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwu9K2%2Fbtqzrv1uNMY%2FkjCAR99f9iLFKOuwgsns10%2Fimg.png&quot; width=&quot;249&quot; height=&quot;538&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 alignLeft&quot; width=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxtBs/btqzs7dwT6q/pDOA5sPq2HcDkFXHwt92AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxtBs/btqzs7dwT6q/pDOA5sPq2HcDkFXHwt92AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxtBs/btqzs7dwT6q/pDOA5sPq2HcDkFXHwt92AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwxtBs%2Fbtqzs7dwT6q%2FpDOA5sPq2HcDkFXHwt92AK%2Fimg.png&quot; width=&quot;272&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;font-size: 1.25em;&quot;&gt;그리고 우측 햄버거 버튼을 누르고&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;line notify를 초대해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB07qt/btqzttNXqsv/rOpjj3OqKk8lX8Tvxql4Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB07qt/btqzttNXqsv/rOpjj3OqKk8lX8Tvxql4Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB07qt/btqzttNXqsv/rOpjj3OqKk8lX8Tvxql4Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB07qt%2FbtqzttNXqsv%2FrOpjj3OqKk8lX8Tvxql4Sk%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 alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXp04n/btqztttEwgD/CWKpV9CM6WozWKKCZvCHn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXp04n/btqztttEwgD/CWKpV9CM6WozWKKCZvCHn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXp04n/btqztttEwgD/CWKpV9CM6WozWKKCZvCHn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXp04n%2FbtqztttEwgD%2FCWKpV9CM6WozWKKCZvCHn0%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 style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완료되었으면,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Line notify 홈페이지에서 로그인을 진행해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0NLyf/btqzrG9wepd/wY6ck0nd62ebMiJp47Fuh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0NLyf/btqzrG9wepd/wY6ck0nd62ebMiJp47Fuh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0NLyf/btqzrG9wepd/wY6ck0nd62ebMiJp47Fuh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0NLyf%2FbtqzrG9wepd%2FwY6ck0nd62ebMiJp47Fuh1%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 style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우측 상단의 자신의 아이디를 누르고 mypage로 이동합니다.&lt;/span&gt;&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/dDeR4M/btqzs7R7aM6/emq3lF0s7TKfUr18Sz5eu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDeR4M/btqzs7R7aM6/emq3lF0s7TKfUr18Sz5eu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDeR4M/btqzs7R7aM6/emq3lF0s7TKfUr18Sz5eu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDeR4M%2Fbtqzs7R7aM6%2Femq3lF0s7TKfUr18Sz5eu0%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;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그리고, mypage 하단에 generate access token 메뉴에서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Generate token을 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://k.kakaocdn.net/dn/voTRY/btqzsEpCbQ3/j4Cok13nQjh8yCKL7abIhk/img.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/voTRY/btqzsEpCbQ3/j4Cok13nQjh8yCKL7abIhk/img.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;아까 개설한 그룹 채팅방이름을 검색해줍니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;그리고, 알림을 보낼 모니터링 봇의 이름을 지정해줍니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;완료되었으면, Generate token을 클릭해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brYL2m/btqztiy6hOF/rt3YEh74SuXdRKYWXuBnk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brYL2m/btqztiy6hOF/rt3YEh74SuXdRKYWXuBnk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brYL2m/btqztiy6hOF/rt3YEh74SuXdRKYWXuBnk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrYL2m%2Fbtqztiy6hOF%2Frt3YEh74SuXdRKYWXuBnk1%2Fimg.png&quot; width=&quot;386&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 style=&quot;font-size: 1.25em;&quot;&gt;아래와 같이 토큰정보가 노출됩니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;생성된 토큰을 찾는 메뉴가 없기 때문에 close를 누르기 전에 copy해서 메모장에 저장해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNzI0F/btqzsEJUk2l/zRbOv4OdmzfvVSzuMeUSOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNzI0F/btqzsEJUk2l/zRbOv4OdmzfvVSzuMeUSOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNzI0F/btqzsEJUk2l/zRbOv4OdmzfvVSzuMeUSOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNzI0F%2FbtqzsEJUk2l%2FzRbOv4OdmzfvVSzuMeUSOk%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 style=&quot;font-size: 1.25em;&quot;&gt;몇 초뒤 모니터링 구성이 완료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfJn8q/btqzr7Mjlci/7CkjkDhUnOi9fTv53kj1V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfJn8q/btqzr7Mjlci/7CkjkDhUnOi9fTv53kj1V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfJn8q/btqzr7Mjlci/7CkjkDhUnOi9fTv53kj1V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfJn8q%2Fbtqzr7Mjlci%2F7CkjkDhUnOi9fTv53kj1V1%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;
&lt;p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;그럼 이제, 파이썬 코드에서 메시지를 날려 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;코드는 매우 간단합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572530445051&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
try:

    TARGET_URL = 'https://notify-api.line.me/api/notify'
    TOKEN = 'qsHmQcrOUEJNNjjw5GZIpCVBonbpM40PwQ90aBd0OFt'

    response = requests.post(
        TARGET_URL,
        headers={
            'Authorization': 'Bearer ' + TOKEN
        },
        data={
            'message': '안녕하세요. 헬로우라인모니터링 테스트입니다.'
        }
    )

except Exception as ex:
    print(ex)






&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;실행해보면, 아래와 같이 정상적으로 메시지가 전달 되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz1EJd/btqzs6ZYAJk/LZC8ghm0BrsMh1klEYYgvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz1EJd/btqzs6ZYAJk/LZC8ghm0BrsMh1klEYYgvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz1EJd/btqzs6ZYAJk/LZC8ghm0BrsMh1klEYYgvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz1EJd%2Fbtqzs6ZYAJk%2FLZC8ghm0BrsMh1klEYYgvk%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;이 외 세부적인 내용은 Line notify doc페이지에서 확인 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://notify-bot.line.me/doc/en/&quot;&gt;https://notify-bot.line.me/doc/en/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572530849372&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LINE Notify&quot; data-og-description=&quot;LINE Notify allows you to send web notifications from GitHub, IFTTT, Mackerel, and more directly to your LINE chats.&quot; data-og-host=&quot;notify-bot.line.me&quot; data-og-source-url=&quot;https://notify-bot.line.me/doc/en/&quot; data-og-url=&quot;https://notify-bot.line.me/en/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWXzi/hyDvxxBzbG/ox1SLWPbwfTItMu6GzHAmk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JwoWo/hyDvIy7VuF/4zUFEKOcGxKBMihkSORmy0/img.png?width=435&amp;amp;height=375&amp;amp;face=0_0_435_375,https://scrap.kakaocdn.net/dn/sRndI/hyDvyJ2qGm/14U90fPFUp96Bmz7wuIXfk/img.png?width=950&amp;amp;height=496&amp;amp;face=0_0_950_496&quot;&gt;&lt;a href=&quot;https://notify-bot.line.me/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://notify-bot.line.me/doc/en/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWXzi/hyDvxxBzbG/ox1SLWPbwfTItMu6GzHAmk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JwoWo/hyDvIy7VuF/4zUFEKOcGxKBMihkSORmy0/img.png?width=435&amp;amp;height=375&amp;amp;face=0_0_435_375,https://scrap.kakaocdn.net/dn/sRndI/hyDvyJ2qGm/14U90fPFUp96Bmz7wuIXfk/img.png?width=950&amp;amp;height=496&amp;amp;face=0_0_950_496');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;LINE Notify&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;LINE Notify allows you to send web notifications from GitHub, IFTTT, Mackerel, and more directly to your LINE chats.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;notify-bot.line.me&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>API활용하기/Line Notify(라인메시지) API</category>
      <category>Line</category>
      <category>Notify</category>
      <category>라인 메시지 보내기</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/87</guid>
      <comments>https://vmpo.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 31 Oct 2019 23:13:50 +0900</pubDate>
    </item>
    <item>
      <title>파이썬으로 텔레그램으로 메시지 보내기 - v2 채널 생성해 보내기</title>
      <link>https://vmpo.tistory.com/86</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;파이썬으로 텔레그램 메시지 보내기 두번째 포스팅입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1번 포스팅은 아래 URL 참고 부탁드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/85&quot;&gt;https://vmpo.tistory.com/85&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572443461185&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;파이썬으로 텔레그램으로 메시지 보내기 - v1&quot; data-og-description=&quot;파이썬으로 텔레그램 메시지를 보내보도록 하겠습니다. 사전준비 -텔레그램 앱 또는 pc버전 프로그램을 다운로드 받는다. 끝! -파이썬을 설치한다. 아래 URL을 참고해주세요. https://vmpo.tistory.com/34 [python..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/85&quot; data-og-url=&quot;https://vmpo.tistory.com/85&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SQkqH/hyDtV6X1mI/3iQIMXRP1pXGHU7GEUc5E0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/npTLa/hyDtZnZRu2/kUO8A55EvDyacTorC8Ho4k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/rhE2u/hyDt7GlTCM/71MQxGNVN9c1wWSKdg4NCk/img.png?width=1309&amp;amp;height=741&amp;amp;face=0_0_1309_741&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/85&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SQkqH/hyDtV6X1mI/3iQIMXRP1pXGHU7GEUc5E0/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/npTLa/hyDtZnZRu2/kUO8A55EvDyacTorC8Ho4k/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/rhE2u/hyDt7GlTCM/71MQxGNVN9c1wWSKdg4NCk/img.png?width=1309&amp;amp;height=741&amp;amp;face=0_0_1309_741');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;파이썬으로 텔레그램으로 메시지 보내기 - v1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;파이썬으로 텔레그램 메시지를 보내보도록 하겠습니다. 사전준비 -텔레그램 앱 또는 pc버전 프로그램을 다운로드 받는다. 끝! -파이썬을 설치한다. 아래 URL을 참고해주세요. https://vmpo.tistory.com/34 [python..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;텔레그램에서는 카카오톡의 오픈/비밀 채팅방과 같은 '채널'이라는 개념이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;채널을 새로 생성해 채널에 있는 사람들에게 메세지를 전달 할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 텔레그램에서 채널을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;PC버전 기준으로 진행하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&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/bqj1G3/btqzrXBMJPT/hrTqhW12hYAw4xE9nUe6Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqj1G3/btqzrXBMJPT/hrTqhW12hYAw4xE9nUe6Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqj1G3/btqzrXBMJPT/hrTqhW12hYAw4xE9nUe6Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqj1G3%2FbtqzrXBMJPT%2FhrTqhW12hYAw4xE9nUe6Hk%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/cyJs2f/btqzruz2RZF/seRsIfQSsUd4v0AHUIvIqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyJs2f/btqzruz2RZF/seRsIfQSsUd4v0AHUIvIqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyJs2f/btqzruz2RZF/seRsIfQSsUd4v0AHUIvIqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyJs2f%2Fbtqzruz2RZF%2FseRsIfQSsUd4v0AHUIvIqk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;공개채널로 해주고, t.me/ 뒤 url을 채워줍니다. 뒤 url은 chatbot id가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;t.me/&lt;span style=&quot;color: #ee2323;&quot;&gt;여기가chatid값임&lt;/span&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q7FYm/btqzpIlI1S8/zmSukdvRWAd7nKwTiS86EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q7FYm/btqzpIlI1S8/zmSukdvRWAd7nKwTiS86EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q7FYm/btqzpIlI1S8/zmSukdvRWAd7nKwTiS86EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq7FYm%2FbtqzpIlI1S8%2FzmSukdvRWAd7nKwTiS86EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;채널이 생성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 이제 기존에 만들었던 텔레그램 챗봇과 연결해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/broXbt/btqzpsQZbVb/24e0S1wy5BuQgOvgrXDvN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/broXbt/btqzpsQZbVb/24e0S1wy5BuQgOvgrXDvN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/broXbt/btqzpsQZbVb/24e0S1wy5BuQgOvgrXDvN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbroXbt%2FbtqzpsQZbVb%2F24e0S1wy5BuQgOvgrXDvN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;코코딩테스트&amp;nbsp; &amp;lt;- 이 영역을 눌러 주면 아래와 같이 채널 편집 화면이 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참가자1명&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brT5wj/btqzr7jSNYz/SkEykXP8b4MSQN0d5njkK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brT5wj/btqzr7jSNYz/SkEykXP8b4MSQN0d5njkK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brT5wj/btqzr7jSNYz/SkEykXP8b4MSQN0d5njkK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrT5wj%2Fbtqzr7jSNYz%2FSkEykXP8b4MSQN0d5njkK1%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 셋팅 아이콘을 눌러주고, 채널관리로 들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhb6k6/btqzpWD2Whk/fQyMBjpmRcmInKv1Uw8rjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhb6k6/btqzpWD2Whk/fQyMBjpmRcmInKv1Uw8rjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhb6k6/btqzpWD2Whk/fQyMBjpmRcmInKv1Uw8rjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhb6k6%2FbtqzpWD2Whk%2FfQyMBjpmRcmInKv1Uw8rjk%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;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqGjW4/btqzqdr4jjO/Pu0ABxXTkFf6Qm6k1Y9vJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqGjW4/btqzqdr4jjO/Pu0ABxXTkFf6Qm6k1Y9vJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqGjW4/btqzqdr4jjO/Pu0ABxXTkFf6Qm6k1Y9vJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqGjW4%2Fbtqzqdr4jjO%2FPu0ABxXTkFf6Qm6k1Y9vJK%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;관리자를 추가해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;앞서 만들었던 GGcodingBot을 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwemjk/btqzpX37hCS/Ht0DBSYXju2RiIIy9YmbIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwemjk/btqzpX37hCS/Ht0DBSYXju2RiIIy9YmbIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwemjk/btqzpX37hCS/Ht0DBSYXju2RiIIy9YmbIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwemjk%2FbtqzpX37hCS%2FHt0DBSYXju2RiIIy9YmbIk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;확인을 눌러줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8xvXW/btqzoAhroNw/ULii0CHHYcmTmYoa0oqZ3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8xvXW/btqzoAhroNw/ULii0CHHYcmTmYoa0oqZ3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8xvXW/btqzoAhroNw/ULii0CHHYcmTmYoa0oqZ3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8xvXW%2FbtqzoAhroNw%2FULii0CHHYcmTmYoa0oqZ3k%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;관리자가 2명이 되었네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 이제 GGcodingbot으로 채널에 메시지를 날려보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciTzuF/btqzrHeTGES/BGPKgCjgZTWlUDZKSnptKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciTzuF/btqzrHeTGES/BGPKgCjgZTWlUDZKSnptKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciTzuF/btqzrHeTGES/BGPKgCjgZTWlUDZKSnptKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciTzuF%2FbtqzrHeTGES%2FBGPKgCjgZTWlUDZKSnptKk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;챗봇 아이디를 까먹었다면, 다시 환경 탭-&amp;gt;채널종류 -&amp;gt; 링크에서 t.me/ 뒤 내용을 확인해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 샘플에서는 (&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;vmpomsgtest&lt;/b&gt;&lt;/span&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OQ9F7/btqzqedpEMR/mymsFf8w7kuqFinz4syVF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OQ9F7/btqzqedpEMR/mymsFf8w7kuqFinz4syVF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OQ9F7/btqzqedpEMR/mymsFf8w7kuqFinz4syVF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOQ9F7%2FbtqzqedpEMR%2FmymsFf8w7kuqFinz4syVF0%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 코드를 실행해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;토큰 값은 각자의 챗봇의 토큰 값을 넣어주면됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;chat_id 는 @ + t.me/ 뒤 텍스트 값을 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 샘플에서는&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;@vmpomsgtest&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572444498741&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import telegram

telgm_token = '105957:AAEH3cETdpXWyoKpLn3k'
bot = telegram.Bot(token = telgm_token)
bot.sendMessage(chat_id = '@vmpomsgtest', text=&quot;안녕하세요 코코딩 테스트 챗봇입니다.&quot;)
bot.sendMessage(chat_id = '@vmpomsgtest', text=&quot;안녕하세요 코코딩 테스트 챗봇이 날리는 두 번째 메시지입니다.&quot;)

print('성공')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실행해보면 아래와 같이 메시지가 정상적으로 전송 된 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLGX2W/btqzr9otMwc/QE0kAh6ZmhB5t2op4TLuC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLGX2W/btqzr9otMwc/QE0kAh6ZmhB5t2op4TLuC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLGX2W/btqzr9otMwc/QE0kAh6ZmhB5t2op4TLuC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLGX2W%2Fbtqzr9otMwc%2FQE0kAh6ZmhB5t2op4TLuC1%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;
&lt;p&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 채널은 공개상태입니다. 비공개로 설정하고 메시지를 전송해 보겠습니다.&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비공개로 설정하면 뒤 내용이 조금 달라집니다. 해당 내용으로 chatid를 설정할 경우 발송이 되지 않는데요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이럴 경우 실제 전송되는 json object의 chatid를 확인해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvgTPr/btqzqUZ2Nfc/FyUCKiwSkhZgo5KRlnoDRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvgTPr/btqzqUZ2Nfc/FyUCKiwSkhZgo5KRlnoDRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvgTPr/btqzqUZ2Nfc/FyUCKiwSkhZgo5KRlnoDRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvgTPr%2FbtqzqUZ2Nfc%2FFyUCKiwSkhZgo5KRlnoDRK%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;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 url을 호출해야합니다. 아래 URL은 실제 파이썬에서는 감싸져 있지만 함수 내부에서 메시지 발송시 호출되는 API URL입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 빨간색으로 된 부분만 개인별로 수정해서 호출해 주도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다른 내용은 그대로 두어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;https://api.telegram.org&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/bot&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;토큰값&lt;/b&gt;&lt;/span&gt;/sendMessage?chat_id=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;@채널이름(t.me/뒤 텍스트)&lt;/b&gt;&lt;/span&gt;&amp;amp;text=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;안녕&lt;/b&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; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;저와 같은 경우 아래와 같이 되겠네요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;https://api.telegram.org&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/bot10592:AAEH3cETyoKpLnAv-vFjILevY3k/sendMessage?chat_id=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;@&lt;b&gt;vmpomsgtest&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&amp;amp;text=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;안녕&lt;/b&gt;&lt;/span&gt;&lt;/b&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;font-family: 'Nanum Gothic';&quot;&gt;호출해서 텔레그램으로 정상적으로 메시지가 발송 되었다면.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같은 결과를 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기서 chat id의 -1001221832935 값을 확인해줍니다.&amp;nbsp; 공개/비공개 상관없이 사용되는 chat id값이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIzRw/btqzr9otY6i/tF6Q9kZSQ2K8hB2tpKy8k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIzRw/btqzr9otY6i/tF6Q9kZSQ2K8hB2tpKy8k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIzRw/btqzr9otY6i/tF6Q9kZSQ2K8hB2tpKy8k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIzRw%2Fbtqzr9otY6i%2FtF6Q9kZSQ2K8hB2tpKy8k1%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4zrV/btqzr7xpTIQ/uJCYm5rNNkD2jGhb8cQhZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4zrV/btqzr7xpTIQ/uJCYm5rNNkD2jGhb8cQhZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4zrV/btqzr7xpTIQ/uJCYm5rNNkD2jGhb8cQhZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4zrV%2Fbtqzr7xpTIQ%2FuJCYm5rNNkD2jGhb8cQhZK%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/ts3QQ/btqzrHzbZNw/4Bv7gT1bkuPFiaSdvCuhEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ts3QQ/btqzrHzbZNw/4Bv7gT1bkuPFiaSdvCuhEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ts3QQ/btqzrHzbZNw/4Bv7gT1bkuPFiaSdvCuhEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fts3QQ%2FbtqzrHzbZNw%2F4Bv7gT1bkuPFiaSdvCuhEk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 코드를 실행해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;토큰 값은 개별적으로 입력해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572445077960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import telegram

telgm_token = '10597:AAEH3cETdpXWLevYF6ze3k'
bot = telegram.Bot(token = telgm_token)
bot.sendMessage(chat_id = '-1001221832935', text=&quot;안녕하세요 코코딩 테스트 챗봇입니다.&quot;)
bot.sendMessage(chat_id = '-1001221832935', text=&quot;안녕하세요 코코딩 테스트 챗봇이 날리는 두 번째 메시지입니다.&quot;)

print('성공')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비공개 방에서도 정상적으로 호출되는 것을 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKbhGt/btqzr7KWYlS/E8eKQ4VYnF9x6x5QZVHvcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKbhGt/btqzr7KWYlS/E8eKQ4VYnF9x6x5QZVHvcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKbhGt/btqzr7KWYlS/E8eKQ4VYnF9x6x5QZVHvcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKbhGt%2Fbtqzr7KWYlS%2FE8eKQ4VYnF9x6x5QZVHvcK%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;채널에 초대해 원하는 내용을 챗봇을 통해 공유할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>API활용하기/텔레그램 API</category>
      <category>chatbot</category>
      <category>python</category>
      <category>telegram</category>
      <category>텔레그램 채널</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/86</guid>
      <comments>https://vmpo.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 30 Oct 2019 23:25:36 +0900</pubDate>
    </item>
    <item>
      <title>파이썬으로 텔레그램으로 메시지 보내기 - v1</title>
      <link>https://vmpo.tistory.com/85</link>
      <description>&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;&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;-텔레그램 앱 또는 pc버전 프로그램을 다운로드 받는다. 끝!&lt;/p&gt;
&lt;p&gt;-파이썬을 설치한다.&lt;/p&gt;
&lt;p&gt;아래 URL을 참고해주세요.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vmpo.tistory.com/34&quot;&gt;https://vmpo.tistory.com/34&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572436240146&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&quot; data-og-description=&quot;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&quot; data-og-host=&quot;vmpo.tistory.com&quot; data-og-source-url=&quot;https://vmpo.tistory.com/34&quot; data-og-url=&quot;https://vmpo.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dF8uTD/hyDt0NOzUP/fY0k5CMgkOXyKepnifhk1k/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/gQI8I/hyDt8kOpts/BiaG0y0yRJOpWAGyhCkhm1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/boghrJ/hyDtW5KrfT/okU5vF3Ncc2tu3jXsH6RF0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://vmpo.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vmpo.tistory.com/34&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dF8uTD/hyDt0NOzUP/fY0k5CMgkOXyKepnifhk1k/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/gQI8I/hyDt8kOpts/BiaG0y0yRJOpWAGyhCkhm1/img.png?width=800&amp;amp;height=378&amp;amp;face=0_0_800_378,https://scrap.kakaocdn.net/dn/boghrJ/hyDtW5KrfT/okU5vF3Ncc2tu3jXsH6RF0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[python] 아나콘다(anaconda) 설치하기 -윈도우 10&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;윈도우 10 환경에 python설치를 진행해보겠습니다. python을 단독으로 설치해도 좋지만, 아나콘다를 설치할 경우 python관련 라이브러리를 한꺼번에 받을 수 있기 때문에 초기 셋팅하기가 편리해집니다. 아나콘다..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;vmpo.tistory.com&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;텔레그램에서 봇을 먼저 생성하도록 하겠습니다.&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;botfather라고 검색하면 아래와 같이&lt;/p&gt;
&lt;p&gt;검색 결과가 노출됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;@BotFahter 로 되어있는 채팅방을 클릭해줍니다.&lt;/p&gt;
&lt;p&gt;/start를 입력해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DykFQ/btqzrISnBr6/yQjHcwLaD4r9IOGmc3TfH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DykFQ/btqzrISnBr6/yQjHcwLaD4r9IOGmc3TfH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DykFQ/btqzrISnBr6/yQjHcwLaD4r9IOGmc3TfH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDykFQ%2FbtqzrISnBr6%2FyQjHcwLaD4r9IOGmc3TfH0%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;/newbot을 입력해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앞으로 진행되는 입력 메시지는 botfather가 보내주는 내용에서 클릭으로 진행하셔도 됩니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;/newbot을 입력하면 챗봇의 이름을 입력하라고 나옵니다.&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;(보안을 위해 토큰은 가렸습니다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAEaP/btqzqdZQ78P/fIblzKWKxScZl9m8jATV30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAEaP/btqzqdZQ78P/fIblzKWKxScZl9m8jATV30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAEaP/btqzqdZQ78P/fIblzKWKxScZl9m8jATV30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAEaP%2FbtqzqdZQ78P%2FfIblzKWKxScZl9m8jATV30%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;Done! Congratulations on your new bot 메시지가 나오면 정상적으로 생성이 완료된 것입니다.&lt;/p&gt;
&lt;p&gt;그리고 성공 메시지 중,&lt;/p&gt;
&lt;p&gt;아래 메시지 밑에 나오는 값이 api호출시 필요한 토큰키 입니다. 토큰 값을 따로 저장해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;use this token to access the HTTP API:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-------여기---- 토큰 키-------------------&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSitKC%2FbtqzrveFKY8%2F4GX6vPW0UIncFMWiNNkID1%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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자 이제 그럼 파이썬 코드를 통해 텔레그램 봇에 메시지를 던져보겠습니다.&lt;/h3&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;a href=&quot;https://github.com/python-telegram-bot/python-telegram-bot&quot;&gt;https://github.com/python-telegram-bot/python-telegram-bot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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 style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;파이썬이 설치되어있다면, cmd에서 아래 명령어로 설치가 가능합니다.&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;pip install python-telegram-bot&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;주피터 노트북이라면,&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;!pip install python-telegram-bot&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size23&quot;&gt;아래와 cmd로그를 보면 정상적으로 설치 된 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0UYCC/btqzrWW8gA2/jkrHPKwVCCioXXBjC5USik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0UYCC/btqzrWW8gA2/jkrHPKwVCCioXXBjC5USik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0UYCC/btqzrWW8gA2/jkrHPKwVCCioXXBjC5USik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0UYCC%2FbtqzrWW8gA2%2FjkrHPKwVCCioXXBjC5USik%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;사전에 생성한 텔레그램 봇에서 입력한 대화명을 확인 할 수 있습니다. getUpdates() 라는 메소드를 활용해 얻어 낼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 token은 샘플이니 참고만 하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572441689243&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import telegram

telgm_token = '105923337:AAEH3cETdpXWyoKpLnAv-vFvYF6ze3k'

bot = telegram.Bot(token = telgm_token)

updates = bot.getUpdates()

print(updates)

for i in updates:
    print(i)

print('start telegram chat bot')

#'676149244'&lt;/code&gt;&lt;/pre&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSitKC/btqzrveFKY8/4GX6vPW0UIncFMWiNNkID1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSitKC%2FbtqzrveFKY8%2F4GX6vPW0UIncFMWiNNkID1%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;위 코드를 실행하면,&lt;/p&gt;
&lt;p&gt;아래와 같이 채팅방에 입력한 대화내용을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehKHwD/btqzrYgmEFR/tRdITXPYkdkcLFvRuABLiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehKHwD/btqzrYgmEFR/tRdITXPYkdkcLFvRuABLiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehKHwD/btqzrYgmEFR/tRdITXPYkdkcLFvRuABLiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehKHwD%2FbtqzrYgmEFR%2FtRdITXPYkdkcLFvRuABLiK%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;여기서 chat id 값은 채팅방의 key값이 됩니다. 이 값을 일단 따로 메모장에 저장해둡니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqWIdD/btqzrvsb1R1/kCIlNs1SH4AZSrTdIF0Bzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqWIdD/btqzrvsb1R1/kCIlNs1SH4AZSrTdIF0Bzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqWIdD/btqzrvsb1R1/kCIlNs1SH4AZSrTdIF0Bzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqWIdD%2Fbtqzrvsb1R1%2FkCIlNs1SH4AZSrTdIF0Bzk%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;
&lt;p&gt;이제 채팅방 키값을 알았으니 메시지를 날려보겠습니다.&lt;/p&gt;
&lt;p&gt;아래 코드를 token값만 바꿔서 호출해 보시면 메시지가 정상적으로 날라오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572441984651&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import telegram

telgm_token = '105923337:AAEH3cETdpXWyoKpLnAv-vFvYF6ze3k'

bot = telegram.Bot(token = telgm_token)

#updates = bot.getUpdates()

bot.sendMessage(chat_id = '676149244', text=&quot;안녕하세요 GGCoding 채봇입니다.&quot;)

&lt;/code&gt;&lt;/pre&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dubDU3/btqzptbgl0N/G7jsKvT4gneKXerziFK9x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dubDU3/btqzptbgl0N/G7jsKvT4gneKXerziFK9x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dubDU3/btqzptbgl0N/G7jsKvT4gneKXerziFK9x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdubDU3%2Fbtqzptbgl0N%2FG7jsKvT4gneKXerziFK9x0%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;매우 간단한 코드로 텔레그램 메시지를 발송하는 챗봇을 구현해보았습니다.&lt;/p&gt;</description>
      <category>API활용하기/텔레그램 API</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/85</guid>
      <comments>https://vmpo.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 30 Oct 2019 22:51:20 +0900</pubDate>
    </item>
    <item>
      <title>[MSSQL] 여러개 행을 하나의 행으로 합치기 (STUFF, XML PATH)</title>
      <link>https://vmpo.tistory.com/83</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MSSQL에서 여러개의 행을 하나의 행으로 합치는 방법에 대해 확인 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목표로하는 최종 출력값은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[여러 행 조회 쿼리]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boRLPa/btqzk8rKkFO/17hx8SFHVNiD8h4yO9Xdl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boRLPa/btqzk8rKkFO/17hx8SFHVNiD8h4yO9Xdl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boRLPa/btqzk8rKkFO/17hx8SFHVNiD8h4yO9Xdl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboRLPa%2Fbtqzk8rKkFO%2F17hx8SFHVNiD8h4yO9Xdl0%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;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[한행으로 합치기]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m0GcM/btqzlkZKBIW/Pf8MaHn83tMsaviuvMUYGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m0GcM/btqzlkZKBIW/Pf8MaHn83tMsaviuvMUYGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m0GcM/btqzlkZKBIW/Pf8MaHn83tMsaviuvMUYGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm0GcM%2FbtqzlkZKBIW%2FPf8MaHn83tMsaviuvMUYGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;*시간이 없으시다면 아래 코드를 복사해 SSMS에서 실행하면 바로 결과를 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572274225230&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE #TEMP_TABLE(
		idx INT INDEX ix1_movieidx NONCLUSTERED,
		team_name varchar(100),
		player varchar(100)
	)

insert into #TEMP_TABLE values(1,'토트넘','손흥민')
insert into #TEMP_TABLE values(2,'토트넘','델리알리')
insert into #TEMP_TABLE values(3,'토트넘','헤리케인')
insert into #TEMP_TABLE values(4,'토트넘','에릭센')


SELECT
DISTINCT 
team_name,
STUFF((
	SELECT  ','+player
	FROM #TEMP_TABLE
	FOR XML PATH('')
),1,1,'') as playerList
FROM #TEMP_TABLE 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&lt;b&gt;STUFF, FOR XML PATH 샘플 상세 설명&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저, 임시테이블을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572274272959&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE #TEMP_TABLE(
		idx INT INDEX ix1_movieidx NONCLUSTERED,
		team_name varchar(100),
		player varchar(100)
	)

insert into #TEMP_TABLE values(1,'토트넘','손흥민')
insert into #TEMP_TABLE values(2,'토트넘','델리알리')
insert into #TEMP_TABLE values(3,'토트넘','헤리케인')
insert into #TEMP_TABLE values(4,'토트넘','에릭센')

SELECT * FROM #TEMP_TABLE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;SELECT를 하면 결과는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 데이터 중 PLAYER 칼럼의 값들을 하나의 행으로 묶어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciRnlk/btqzokqeZlQ/3ujRuTCcdnzuGqiPcYESnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciRnlk/btqzokqeZlQ/3ujRuTCcdnzuGqiPcYESnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciRnlk/btqzokqeZlQ/3ujRuTCcdnzuGqiPcYESnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciRnlk%2FbtqzokqeZlQ%2F3ujRuTCcdnzuGqiPcYESnk%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;STUFF 와 FOR XML PATH를 활용해야합니다. 각각의 개념을 확인 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;FOR XML PATH&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FOR XML PATH는 XML형태의 값을 하나의 행에 리턴해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 쿼리를 실행하면,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572275124093&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT  ','+player
FROM #TEMP_TABLE
FOR XML PATH('SAMPLE')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 XML형태의 값으로 한 행에 리턴해주게 되는데요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pg3bY/btqzmkxYO2l/FzDKh3Byc1BWlkEXVk6vak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pg3bY/btqzmkxYO2l/FzDKh3Byc1BWlkEXVk6vak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pg3bY/btqzmkxYO2l/FzDKh3Byc1BWlkEXVk6vak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpg3bY%2FbtqzmkxYO2l%2FFzDKh3Byc1BWlkEXVk6vak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;PATH() 의 파라미터 값을 빈값으로 지정해주게 되면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;아래와 같이 &lt;b&gt;XML태그가 사라진 결과를&lt;/b&gt; 얻을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;PATH()를 빈값으로 지정해주고 원하는 구분자로 이어주기만 하면 되는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwhK5N/btqzl5Vmbah/xPKFKP5jZFpOKYZeRcMWm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwhK5N/btqzl5Vmbah/xPKFKP5jZFpOKYZeRcMWm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwhK5N/btqzl5Vmbah/xPKFKP5jZFpOKYZeRcMWm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwhK5N%2Fbtqzl5Vmbah%2FxPKFKP5jZFpOKYZeRcMWm0%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 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;STUFF&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음으로, STUFF는 지정한 위치의 스트링값을 다른 값으로 바꿔주는 역할을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 쿼리를 실행하면,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572274990164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT STUFF('토트넘핫스퍼',1,2,'12')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;'토트넘핫스퍼' STRING 값의 '1'번 위치부터 2개 문자를&amp;nbsp; '12'로 바꿔 주게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vErDN/btqznu09RWx/mbvtsK1XTNVD2P8V48CEy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vErDN/btqznu09RWx/mbvtsK1XTNVD2P8V48CEy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vErDN/btqznu09RWx/mbvtsK1XTNVD2P8V48CEy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvErDN%2Fbtqznu09RWx%2FmbvtsK1XTNVD2P8V48CEy1%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결론적으로, STUFF는 위 FOR XML PATH에서 제일 앞에 붙는 구분자 값을 삭제하는데 활용하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최종 쿼리를 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;team_name이 중복되므로 distinct처리를 해주고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;stuff와 for xml path를 활용해 문자열을 이어붙여 주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;STUFF는 제일 앞에 붙는 컴마 값을 삭제해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 쿼리를 실행하면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572274542427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
DISTINCT 
team_name,
STUFF((
	SELECT  ','+player
	FROM #TEMP_TABLE
	FOR XML PATH('')
),1,1,'') as playerList
FROM #TEMP_TABLE &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최종 결과를 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJ7Kg/btqzk7NbpBG/CAa8icgD2zkkLPXwDmMKZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJ7Kg/btqzk7NbpBG/CAa8icgD2zkkLPXwDmMKZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJ7Kg/btqzk7NbpBG/CAa8icgD2zkkLPXwDmMKZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJ7Kg%2Fbtqzk7NbpBG%2FCAa8icgD2zkkLPXwDmMKZ1%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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;, 가 아닌 다른 구분자를 활용하고 싶다면 SELECT 다음에 오는 구분자를 원하는 구분자로 바꿔 주기만 하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3GAz/btqzmjlEUmh/Dy8a57AHlSozB6EBEiTUjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3GAz/btqzmjlEUmh/Dy8a57AHlSozB6EBEiTUjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3GAz/btqzmjlEUmh/Dy8a57AHlSozB6EBEiTUjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3GAz%2FbtqzmjlEUmh%2FDy8a57AHlSozB6EBEiTUjK%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;</description>
      <category>DB/MSSQL</category>
      <category>FOR XML PATH</category>
      <category>MSSQL</category>
      <category>Stuff</category>
      <category>여러행 한행으로 합치기</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/83</guid>
      <comments>https://vmpo.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 29 Oct 2019 00:22:31 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 10 Mysql 설치하기 (mysql 개발환경 세팅)</title>
      <link>https://vmpo.tistory.com/82</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;윈도우10에서 mysql을 설치해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 웹사이트로 접속하면 최신버전 mysql install 파일을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/downloads/installer/&quot;&gt;https://dev.mysql.com/downloads/installer/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1572177800661&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MySQL :: Download MySQL Installer&quot; data-og-description=&quot;Select Operating System: Select Operating System&amp;hellip; Microsoft Windows Select OS Version: All Windows (x86, 32-bit) Windows (x86, 32-bit), MSI Installer 8.0.18 18.6M (mysql-installer-web-community-8.0.18.0.msi) MD5: c509966c1033462027a009cc51a98c74 | Signatur&quot; data-og-host=&quot;dev.mysql.com&quot; data-og-source-url=&quot;https://dev.mysql.com/downloads/installer/&quot; data-og-url=&quot;https://dev.mysql.com/downloads/installer/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/downloads/installer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.mysql.com/downloads/installer/&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;MySQL :: Download MySQL Installer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Select Operating System: Select Operating System&amp;hellip; Microsoft Windows Select OS Version: All Windows (x86, 32-bit) Windows (x86, 32-bit), MSI Installer 8.0.18 18.6M (mysql-installer-web-community-8.0.18.0.msi) MD5: c509966c1033462027a009cc51a98c74 | Signatur&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;dev.mysql.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최소용량으로 설치하려면 18.6M 설치파일을,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본 구성을 하고 싶다면 415.1M 설치파일을 다운로드 하도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저는 415.1M설치파일로 설치하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설치파일 다운로드&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZEZqj/btqzkQX1F9F/aVZOwVyp4XUi93zKLpOHd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZEZqj/btqzkQX1F9F/aVZOwVyp4XUi93zKLpOHd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZEZqj/btqzkQX1F9F/aVZOwVyp4XUi93zKLpOHd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZEZqj%2FbtqzkQX1F9F%2FaVZOwVyp4XUi93zKLpOHd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다운로드를 누르면, 아래 화면이 노출되는데요,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;No thanks just start my download 를 눌러줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그럼 msi 설치 파일이 다운로드됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccVGrc/btqzlFBuqks/aT5hkbAuovi7oxHV33OiSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccVGrc/btqzlFBuqks/aT5hkbAuovi7oxHV33OiSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccVGrc/btqzlFBuqks/aT5hkbAuovi7oxHV33OiSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccVGrc%2FbtqzlFBuqks%2FaT5hkbAuovi7oxHV33OiSk%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 data-ke-size=&quot;size23&quot;&gt;설치파일 실행&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Developer Default설정으로 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lvPlL/btqzllXzCWy/tHpYUiTrmfkSksirMpviz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lvPlL/btqzllXzCWy/tHpYUiTrmfkSksirMpviz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lvPlL/btqzllXzCWy/tHpYUiTrmfkSksirMpviz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlvPlL%2FbtqzllXzCWy%2FtHpYUiTrmfkSksirMpviz1%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;Next를 누르고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ModA/btqzl4HOCie/ki9soIqDROXFaW5136WlJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ModA/btqzl4HOCie/ki9soIqDROXFaW5136WlJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ModA/btqzl4HOCie/ki9soIqDROXFaW5136WlJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ModA%2Fbtqzl4HOCie%2Fki9soIqDROXFaW5136WlJK%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;yest를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SibCK/btqzlk5p1L2/sHBUVUQeKRum3V9zE9QpQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SibCK/btqzlk5p1L2/sHBUVUQeKRum3V9zE9QpQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SibCK/btqzlk5p1L2/sHBUVUQeKRum3V9zE9QpQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSibCK%2Fbtqzlk5p1L2%2FsHBUVUQeKRum3V9zE9QpQk%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;그리고, 아래 화면이 나오면 EXECUTE를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sPTdc/btqzkba0rk4/SviAk2ERUBc6v875lDkvGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sPTdc/btqzkba0rk4/SviAk2ERUBc6v875lDkvGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sPTdc/btqzkba0rk4/SviAk2ERUBc6v875lDkvGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsPTdc%2Fbtqzkba0rk4%2FSviAk2ERUBc6v875lDkvGK%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;아래와 같이 각 항목들이 설치되게 됩니다.&lt;/p&gt;
&lt;p&gt;기다려줍니다.&lt;/p&gt;
&lt;p&gt;모두 완료되면 next를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;next를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwoYRm/btqzlj6vkci/tVTLM8o2K3Odn4gkKIydJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwoYRm/btqzlj6vkci/tVTLM8o2K3Odn4gkKIydJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwoYRm/btqzlj6vkci/tVTLM8o2K3Odn4gkKIydJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwoYRm%2Fbtqzlj6vkci%2FtVTLM8o2K3Odn4gkKIydJ1%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;&lt;span style=&quot;color: #333333;&quot;&gt;next를 눌러줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bklxzD/btqzl4A3B3H/QyY4LmVn3L2ujxcdsOA49K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bklxzD/btqzl4A3B3H/QyY4LmVn3L2ujxcdsOA49K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bklxzD/btqzl4A3B3H/QyY4LmVn3L2ujxcdsOA49K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbklxzD%2Fbtqzl4A3B3H%2FQyY4LmVn3L2ujxcdsOA49K%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;root계정의 비밀번호를 설정해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZxHZI/btqzkmcf8yA/syhkCxUhal86gg8kSWPk41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZxHZI/btqzkmcf8yA/syhkCxUhal86gg8kSWPk41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZxHZI/btqzkmcf8yA/syhkCxUhal86gg8kSWPk41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZxHZI%2Fbtqzkmcf8yA%2FsyhkCxUhal86gg8kSWPk41%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;디폴트 설정을 사용하겠습니다.&lt;/p&gt;
&lt;p&gt;next를 눌러줍니다.&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/zx79c/btqzkQDLvao/qKXXUva7CzEau6SEoVJvMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zx79c/btqzkQDLvao/qKXXUva7CzEau6SEoVJvMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zx79c/btqzkQDLvao/qKXXUva7CzEau6SEoVJvMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzx79c%2FbtqzkQDLvao%2FqKXXUva7CzEau6SEoVJvMk%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;execute를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwPnmW/btqzkmi3vcM/VTgMKs2aLeo09TT1Vmwv80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwPnmW/btqzkmi3vcM/VTgMKs2aLeo09TT1Vmwv80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwPnmW/btqzkmi3vcM/VTgMKs2aLeo09TT1Vmwv80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwPnmW%2Fbtqzkmi3vcM%2FVTgMKs2aLeo09TT1Vmwv80%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;finish를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5TgHN/btqzllcdBQ5/Q9OZ4B4n9C0tcRxOVa0WPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5TgHN/btqzllcdBQ5/Q9OZ4B4n9C0tcRxOVa0WPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5TgHN/btqzllcdBQ5/Q9OZ4B4n9C0tcRxOVa0WPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5TgHN%2FbtqzllcdBQ5%2FQ9OZ4B4n9C0tcRxOVa0WPK%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;
&lt;p&gt;next를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDT13h/btqzkRbw92b/6kvXcKQMkPmL6NqSBfULdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDT13h/btqzkRbw92b/6kvXcKQMkPmL6NqSBfULdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDT13h/btqzkRbw92b/6kvXcKQMkPmL6NqSBfULdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDT13h%2FbtqzkRbw92b%2F6kvXcKQMkPmL6NqSBfULdk%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;finish를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2dRmF/btqzkDdw1DH/davkkunNJwTAAdQHE38kq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2dRmF/btqzkDdw1DH/davkkunNJwTAAdQHE38kq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2dRmF/btqzkDdw1DH/davkkunNJwTAAdQHE38kq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2dRmF%2FbtqzkDdw1DH%2FdavkkunNJwTAAdQHE38kq0%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;아까 등록했던 password를 입력해주고,&lt;/p&gt;
&lt;p&gt;check를 눌러줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Status가 Connection succeeded가 나오면 next를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgsw2K/btqzk8qDukX/NHFpmWjxbpbl6sn3seaTYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgsw2K/btqzk8qDukX/NHFpmWjxbpbl6sn3seaTYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgsw2K/btqzk8qDukX/NHFpmWjxbpbl6sn3seaTYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgsw2K%2Fbtqzk8qDukX%2FNHFpmWjxbpbl6sn3seaTYk%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;Execute를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b72yXP/btqzkCloIqe/XrS6u1kHrCQuoWk6cpoheK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b72yXP/btqzkCloIqe/XrS6u1kHrCQuoWk6cpoheK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b72yXP/btqzkCloIqe/XrS6u1kHrCQuoWk6cpoheK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb72yXP%2FbtqzkCloIqe%2FXrS6u1kHrCQuoWk6cpoheK%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;finish를 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB3lIm/btqzmkXXyyx/JOvaVF85kw1XkICC1yyDf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB3lIm/btqzmkXXyyx/JOvaVF85kw1XkICC1yyDf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB3lIm/btqzmkXXyyx/JOvaVF85kw1XkICC1yyDf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB3lIm%2FbtqzmkXXyyx%2FJOvaVF85kw1XkICC1yyDf1%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;아래 화면이 노출되면 정상적으로 설치가 완료된 것 입니다.&lt;/p&gt;
&lt;p&gt;finish를 눌러주면 workbench와 shell이 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qdNSt/btqzk7eaRcU/BqvUdhDqRWKdKRANF20sck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qdNSt/btqzk7eaRcU/BqvUdhDqRWKdKRANF20sck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qdNSt/btqzk7eaRcU/BqvUdhDqRWKdKRANF20sck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqdNSt%2Fbtqzk7eaRcU%2FBqvUdhDqRWKdKRANF20sck%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;여기까지 왔다면 mysql 서버 및 스크립트를 실행할 수 있는 툴인 workbench까지 정상적으로 설치 된 것입니다.&lt;/p&gt;
&lt;p&gt;workbench에서 데이터 베이스를 생성하고 테이블 및 쿼리를 실행할 준비가 완료되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB/MYSQL</category>
      <category>install</category>
      <category>mysql</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/82</guid>
      <comments>https://vmpo.tistory.com/82#entry82comment</comments>
      <pubDate>Sun, 27 Oct 2019 21:40:56 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 문자열 byte로 변환하기</title>
      <link>https://vmpo.tistory.com/81</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;영문자, 숫자는 1바이트, 한글은 2바이트입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C#에서 문자열을 바이트로 변환하는 코드입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;변환후 바이트 길이 값을 확인해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 코드를 실행해보면 한글의 경우 글자별 2바이트&lt;/p&gt;
&lt;p&gt;영문, 숫자의 경우 1바이트 인것을 확인 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1572014786253&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string ko = &quot;한글&quot;;
            string en = &quot;eng&quot;;
            string num = &quot;123&quot;;

            byte[] koByte = Encoding.Default.GetBytes(ko);
            byte[] enByte = Encoding.Default.GetBytes(en);
            byte[] numByte = Encoding.Default.GetBytes(num);

            Console.WriteLine(&quot;한글 바이트 수 : &quot;+ koByte.Length);
            Console.WriteLine(&quot;eng 바이트 수 : &quot; + enByte.Length);
            Console.WriteLine(&quot;123 바이트 수 : &quot; + numByte.Length);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4aJg/btqzjqli6Ig/8jOhX7gqe6usvmnJQUu2A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4aJg/btqzjqli6Ig/8jOhX7gqe6usvmnJQUu2A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4aJg/btqzjqli6Ig/8jOhX7gqe6usvmnJQUu2A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4aJg%2Fbtqzjqli6Ig%2F8jOhX7gqe6usvmnJQUu2A1%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;</description>
      <category>C#/기본</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/81</guid>
      <comments>https://vmpo.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 25 Oct 2019 23:51:50 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 문자열 자르기 붙이기 split  join  substring</title>
      <link>https://vmpo.tistory.com/80</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C#에서 문자열 처리하는 방법에 대해 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;split : 문자열을 특정 문자를 기준으로 잘라서 arr형태로 만들어 줌&lt;/p&gt;
&lt;p&gt;substring : 문자열 처리방법 중 가장 많이 쓰는 것 중 하나로 원하는 문자열만 뽑아 낼 수 있음&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Split&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;먼저 split함수를 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;문자열를 저장한변수.split('') 형태로 사용하며, split함수의 파라미터로는 char형태로 전달해야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1572012859848&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string nameList = &quot;손흥민,이강인,이청용&quot;;

            string[] arr = nameList.Split(','); //char 형태로 정의해주어야함

            foreach (var a in arr)
            {
                Console.WriteLine(a);
            }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C5396/btqzkDcI2Ke/L5gAkek8QckNIWoznMzERk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C5396/btqzkDcI2Ke/L5gAkek8QckNIWoznMzERk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C5396/btqzkDcI2Ke/L5gAkek8QckNIWoznMzERk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC5396%2FbtqzkDcI2Ke%2FL5gAkek8QckNIWoznMzERk%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;
&lt;p&gt;아래와 같이 , 가 특정 주기로 반복될 때 ,를 기준으로 잘라서 array로 저장할 수 있습니다.&lt;/p&gt;
&lt;p&gt;DB에&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 문자로 구분된 string으로 한 칼럼에 저장을 하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;SELECT 후 프로그램 소스에서는 split을 통해 하나의 칼럼 조회로 여러개의 데이터를 처리 할 수 있도록 구현할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;문자열을 잘라야 하는 경우&quot;&lt;/p&gt;
&lt;p&gt;아래와 같이 split함수에 option값을 주어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래는 &amp;lt;br&amp;gt;을 기준으로 반복되는 string을 &amp;lt;br&amp;gt;을 기준으로 잘라내는 방법입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572013436599&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string address = &quot;시소코&amp;lt;br&amp;gt;델레알리&amp;lt;br&amp;gt;손흥민&quot;;
            string[] result = address.Split(new string[] { &quot;&amp;lt;br&amp;gt;&quot; }, StringSplitOptions.None);

            foreach (var a in result)
            {
                Console.WriteLine(a);
            }&lt;/code&gt;&lt;/pre&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/buIlAa/btqzjfEodxS/Fo442SO04LQMTyf5FWa0q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buIlAa/btqzjfEodxS/Fo442SO04LQMTyf5FWa0q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buIlAa/btqzjfEodxS/Fo442SO04LQMTyf5FWa0q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuIlAa%2FbtqzjfEodxS%2FFo442SO04LQMTyf5FWa0q0%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 data-ke-size=&quot;size23&quot;&gt;String.Join&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;string array를 다시 하나의 문자열 연결하고 싶다면 join함수를 사용하면됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Join 파라미터에 특정 문자로 이어붙이고자 하는 char 타입의 문자를 던져주고, string배열을 함께 던져 주면됩니다.&lt;/p&gt;
&lt;p&gt;아래와 같이 arr에 저장된 문자열을 컴마로 다시 이어붙여 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572014104033&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string nameList = &quot;손흥민,이강인,이청용&quot;;

            string[] arr = nameList.Split(','); //char 형태로 정의해주어야함

            foreach (var a in arr)
            {
                Console.WriteLine(a);
            }


            string joinresult = String.Join(',',arr);
            Console.WriteLine(joinresult)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xZHzk/btqzkmoZy9v/kprlVeQQSQV5td3keMI0Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xZHzk/btqzkmoZy9v/kprlVeQQSQV5td3keMI0Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xZHzk/btqzkmoZy9v/kprlVeQQSQV5td3keMI0Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxZHzk%2FbtqzkmoZy9v%2FkprlVeQQSQV5td3keMI0Sk%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;h4 data-ke-size=&quot;size20&quot;&gt;Substring&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;가장 많이 사용하는 string 함수 중의 하나인 substring의 활용법을 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;인덱스 번호를 입력해서 원하는 문자열을 출력할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;substring(시작 인덱스, 시작인덱스포함 출력하고자 하는 문자열 수)&lt;/p&gt;
&lt;p&gt;substirng(0,10) : 0번째 인덱스 포함해서 오른쪽으로 10개의 문자열출력&lt;/p&gt;
&lt;pre id=&quot;code_1572013873354&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string rawAddressRoad = &quot;서울특별시 종로구 북촌로5길 48&quot;;

            //0번째 인덱스부터 끝까지 출력, 전체 출력과 동일함
            string case_1 = rawAddressRoad.Substring(0);
            
            //0번째 인덱스에 있는 문자 포함해 다음 3개 출력 ( 출력 : 서울특)
            string case_2 = rawAddressRoad.Substring(0, 3);
            
            //6번째 인덱스에 있는 문자 포함해 다음 3개 출력 ( 출력 : 종로구)            
            string case_3 = rawAddressRoad.Substring(6, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/기본</category>
      <category>Join</category>
      <category>split</category>
      <category>substring</category>
      <author>vmpo</author>
      <guid isPermaLink="true">https://vmpo.tistory.com/80</guid>
      <comments>https://vmpo.tistory.com/80#entry80comment</comments>
      <pubDate>Fri, 25 Oct 2019 23:41:52 +0900</pubDate>
    </item>
  </channel>
</rss>