<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>기록</title>
    <link>https://matcha-dev.tistory.com/</link>
    <description>코딩, 개발</description>
    <language>ko</language>
    <pubDate>Tue, 28 Jul 2026 15:56:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>서기A</managingEditor>
    <item>
      <title>[이분탐색 / S4] 어두운 굴다리</title>
      <link>https://matcha-dev.tistory.com/91</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Question&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17266&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/17266&lt;/a&gt;&lt;/p&gt;
&lt;table id=&quot;12554fb0-ba14-80d4-9c79-e91dd94b1cbf&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;12554fb0-ba14-80b2-9e12-cbd7cae7792f&quot;&gt;
&lt;td id=&quot;}sma&quot;&gt;시간 제한&lt;/td&gt;
&lt;td id=&quot;PDHC&quot;&gt;메모리 제한&lt;/td&gt;
&lt;td id=&quot;r^Wi&quot;&gt;제출&lt;/td&gt;
&lt;td id=&quot;I?i{&quot;&gt;정답&lt;/td&gt;
&lt;td id=&quot;cAhS&quot;&gt;맞힌 사람&lt;/td&gt;
&lt;td id=&quot;COAh&quot;&gt;정답 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;12554fb0-ba14-80d3-82f2-ca7242592ae7&quot;&gt;
&lt;td id=&quot;}sma&quot;&gt;1 초&lt;/td&gt;
&lt;td id=&quot;PDHC&quot;&gt;256 MB&lt;/td&gt;
&lt;td id=&quot;r^Wi&quot;&gt;9302&lt;/td&gt;
&lt;td id=&quot;I?i{&quot;&gt;3622&lt;/td&gt;
&lt;td id=&quot;cAhS&quot;&gt;2857&lt;/td&gt;
&lt;td id=&quot;COAh&quot;&gt;38.426%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 정리&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가로등의 높이가 H라면 왼쪽으로 H, 오른쪽으로 H만큼 주위를 비춘다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRhide/btsKnpt2twU/bScIgh6s5pzfPDJgK3GCe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRhide/btsKnpt2twU/bScIgh6s5pzfPDJgK3GCe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRhide/btsKnpt2twU/bScIgh6s5pzfPDJgK3GCe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRhide%2FbtsKnpt2twU%2FbScIgh6s5pzfPDJgK3GCe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;163&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;163&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;가로등의 높이가 1일 경우 0~1사이의 길이 어둡기 때문에 상빈이는 지나가지 못한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caOxcK/btsKm69gpoI/XqFXg3d6okjhPotCAsSB5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caOxcK/btsKm69gpoI/XqFXg3d6okjhPotCAsSB5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caOxcK/btsKm69gpoI/XqFXg3d6okjhPotCAsSB5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaOxcK%2FbtsKm69gpoI%2FXqFXg3d6okjhPotCAsSB5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;169&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;169&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일 경우 0~5의 모든 길이 밝기 때문에 상빈이는 지나갈 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RTJen/btsKlsscYB7/cC9jzqTEa1UUkP7SrEQ0E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RTJen/btsKlsscYB7/cC9jzqTEa1UUkP7SrEQ0E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RTJen/btsKlsscYB7/cC9jzqTEa1UUkP7SrEQ0E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRTJen%2FbtsKlsscYB7%2FcC9jzqTEa1UUkP7SrEQ0E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;539&quot; height=&quot;240&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Idea&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 높이를 이분탐색으로 찾는다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 높이가 정해지면 가로등을 설치해본다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 왼쪽 pos 를 기준으로 계산한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-1. 현재 위치를 기준으로 가로등이 비출 수 있는 left, right 를 구한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-2. 이전 right 보다 현재 left 가 크면 비출 수 없다는 뜻&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-3. 끝까지 갔을 때 가장 마지막 지점이 n 보다 크거나 같다면 설치 가능&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-4. 작다면 다 비출 수 없다는 뜻&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1730125791048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package baekjoon;

import java.util.*;

/**
 * 어두운 굴다리
 */
public class M17266 {

    static Scanner scan = new Scanner(System.in);
    static int n, m;
    static int[] bridge;

    public static void main(String[] args) {
        init();
        binarySearch();
    }

    private static void init() {
        n = scan.nextInt();
        m = scan.nextInt();

        bridge = new int[n + 1];
        for (int idx = 0; idx &amp;lt; m; idx++) {
            bridge[idx] = scan.nextInt();
        }
    }

    private static void binarySearch() {
        int start = 0;
        int end = n;

        int answer = 0;
        while(start &amp;lt;= end) {
            // 1. 높이를 이분탐색으로 찾는다.
            int mid = (start + end) / 2; // 가로등 높이
            // 2. 높이가 정해지면 가로등을 설치해본다.
            if (light(mid)) {
                answer = mid;
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        System.out.println(answer);
    }

    private static boolean light(int height) {
        // 3. 왼쪽 pos 를 기준으로 계산한다.
        int lastPos = 0;
        for (int idx = 0; idx &amp;lt; m; idx++) {
            // 3-1. 현재 위치를 기준으로 가로등이 비출 수 있는 left, right 를 구한다.
            int left = bridge[idx] - height;
            int right = bridge[idx] + height;

            // 3-2. 이전 right 보다 현재 left 가 크면 비출 수 없다는 뜻
            if (lastPos &amp;lt; left) {
                return false;
            }
            lastPos = right;
        }

        // 3-3. 끝까지 갔을 때 가장 마지막 지점이 n 보다 크거나 같다면 설치 가능
        // 3-4. 작다면 다 비출 수 없다는 뜻
        return lastPos &amp;gt;= n;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>java</category>
      <category>이분탐색</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/91</guid>
      <comments>https://matcha-dev.tistory.com/91#entry91comment</comments>
      <pubDate>Mon, 28 Oct 2024 23:30:02 +0900</pubDate>
    </item>
    <item>
      <title>[구현 / G3] 소수의 연속합</title>
      <link>https://matcha-dev.tistory.com/90</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Question&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1644&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1644&lt;/a&gt;&lt;/p&gt;
&lt;table id=&quot;12954fb0-ba14-80ad-953f-dd1e42d3e07d&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;12954fb0-ba14-80fe-ac14-d3f791fc8f08&quot;&gt;
&lt;td id=&quot;~PkU&quot;&gt;시간 제한&lt;/td&gt;
&lt;td id=&quot;Iquo&quot;&gt;메모리 제한&lt;/td&gt;
&lt;td id=&quot;so:V&quot;&gt;제출&lt;/td&gt;
&lt;td id=&quot;S|Eu&quot;&gt;정답&lt;/td&gt;
&lt;td id=&quot;}ia|&quot;&gt;맞힌 사람&lt;/td&gt;
&lt;td id=&quot;G~NB&quot;&gt;정답 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;12954fb0-ba14-80d1-9a1e-e2cf10a6b9f2&quot;&gt;
&lt;td id=&quot;~PkU&quot;&gt;2 초&lt;/td&gt;
&lt;td id=&quot;Iquo&quot;&gt;128 MB&lt;/td&gt;
&lt;td id=&quot;so:V&quot;&gt;52349&lt;/td&gt;
&lt;td id=&quot;S|Eu&quot;&gt;22685&lt;/td&gt;
&lt;td id=&quot;}ia|&quot;&gt;15757&lt;/td&gt;
&lt;td id=&quot;G~NB&quot;&gt;41.278%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 정리&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-1-1. 3 : 3 (한 가지)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-1-2. 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-1-3. 53 : 5+7+11+13+17 = 53 (두 가지)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-2. 하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-3. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-4. 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1-5. 자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오..&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Idea&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 에라스토테네스의 체를 이용해 소수를 선별한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2-1. 2 ~ i*i 까지 반복문을 돌린다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2-2. 해당 수가 소수라면, 그 수의 배수는 전부 소수가 아님으로 체크한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 선별한 소수를 list 에 담는다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 투 포인터 알고리즘을 사용한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4-1. end 에 해당하는 값을 더한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4-2. 더한 후 n 보다 값이 커지면 작거나 같아질 때 까지 start 를 증가시키며 빼준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4-3. 만약 sum == n 이면 answer 를 추가한다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;package baekjoon;

import java.util.*;

/**
 * 소수의 연속합
 */
public class M1644 {

    static Scanner scan = new Scanner(System.in);
    static int n, answer;
    static List&amp;lt;Integer&amp;gt; primes;

    public static void main(String[] args) {
        init();
        setPrime();
        countSum();
        System.out.println(answer);
    }

    private static void init() {
        n = scan.nextInt();
        primes = new ArrayList&amp;lt;&amp;gt;();
        answer = 0;
    }

    private static void setPrime() {
        // 2. 에라스토테네스의 체를 이용해 소수를 선별한다.
        boolean[] isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        isPrime[0] = false;
        isPrime[1] = false;
        // 2-1. 2 ~ i*i 까지 반복문을 돌린다.
        for (int i = 2; i * i &amp;lt;= n; i++) {
            // 2-2. 해당 수가 소수라면, 그 수의 배수는 전부 소수가 아님으로 체크한다.
            if (isPrime[i]) {
                for (int j = i * i; j &amp;lt;= n; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        // 3. 선별한 소수를 list 에 담는다.
        for (int i = 2; i &amp;lt;= n; i++) {
            if (isPrime[i]) primes.add(i);
        }
    }

    private static void countSum() {
        // 4. 투 포인터 알고리즘을 사용한다.
        int start = 0, sum = 0;
        for (int end = 0; end &amp;lt; primes.size(); end++) {
            // 4-1. end 에 해당하는 값을 더한다.
            sum += primes.get(end);
            // 4-2. 더한 후 n 보다 값이 커지면 작거나 같아질 때 까지 start 를 증가시키며 빼준다.
            while(sum &amp;gt; n) {
                sum -= primes.get(start++);
            }
            // 4-3. 만약 sum == n 이면 answer 를 추가한다.
            if (sum == n) {
                answer++;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>java</category>
      <category>구현</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/90</guid>
      <comments>https://matcha-dev.tistory.com/90#entry90comment</comments>
      <pubDate>Mon, 28 Oct 2024 23:21:26 +0900</pubDate>
    </item>
    <item>
      <title>[DP / G5] LCS</title>
      <link>https://matcha-dev.tistory.com/89</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Question&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9251&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/9251&lt;/a&gt;&lt;/p&gt;
&lt;table id=&quot;12954fb0-ba14-8098-808b-ddf4ee42234c&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;12954fb0-ba14-80a1-a434-e62c350b594f&quot;&gt;
&lt;td id=&quot;RwJK&quot;&gt;시간 제한&lt;/td&gt;
&lt;td id=&quot;mW~u&quot;&gt;메모리 제한&lt;/td&gt;
&lt;td id=&quot;PNSI&quot;&gt;제출&lt;/td&gt;
&lt;td id=&quot;}qvX&quot;&gt;정답&lt;/td&gt;
&lt;td id=&quot;igVH&quot;&gt;맞힌 사람&lt;/td&gt;
&lt;td id=&quot;rZ@L&quot;&gt;정답 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;12954fb0-ba14-80eb-8589-cbb8ce2f08cf&quot;&gt;
&lt;td id=&quot;RwJK&quot;&gt;0.1 초 (&lt;a href=&quot;https://www.acmicpc.net/problem/9251#&quot;&gt;하단 참고&lt;/a&gt;)&lt;/td&gt;
&lt;td id=&quot;mW~u&quot;&gt;256 MB&lt;/td&gt;
&lt;td id=&quot;PNSI&quot;&gt;95558&lt;/td&gt;
&lt;td id=&quot;}qvX&quot;&gt;39932&lt;/td&gt;
&lt;td id=&quot;igVH&quot;&gt;29256&lt;/td&gt;
&lt;td id=&quot;rZ@L&quot;&gt;41.146%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 정리&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-2. 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-3. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Idea&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 기저조건 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2-1. 파라미터가 0보다 작아지면 (index 범위밖이면) return 0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2-2. 이미 계산 된 곳이면 return 계산된 값 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. dp 조건 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-1. 두 글자가 같으면 두 인덱스를 다 줄이고, 연산결과 + 1 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-2. 두 글자가 다르면 한쪽 인덱스씩 줄이고, 그 중 큰 결과를 연산결과에 저장&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;package baekjoon;

import java.util.*;

/**
 * LCS
 */
public class M9251 {

    static Scanner scan = new Scanner(System.in);
    static String s1, s2;
    static int[][] memo;

    public static void main(String[] args) {
        init();
        int answer = topDown(s1.length() - 1, s2.length() - 1);
        System.out.println(answer);
    }

    private static void init() {
        s1 = scan.nextLine();
        s2 = scan.nextLine();
        memo = new int[s1.length()][s2.length()];
        for (int row = 0; row &amp;lt; s1.length(); row++) {
            for (int col = 0; col &amp;lt; s2.length(); col++) {
                memo[row][col] = -1;
            }
        }
    }

    private static int topDown(int idx1, int idx2) {
        // 2. 기저조건
        // 2-1. 파라미터가 0보다 작아지면 (index 범위밖이면) return 0
        if (idx1 &amp;lt; 0 || idx2 &amp;lt; 0) {
            return 0;
        }
        // 2-2. 이미 계산 된 곳이면 return 계산된 값
        if (memo[idx1][idx2] != -1) {
            return memo[idx1][idx2];
        }

        // 3. dp 조건
        if (s1.charAt(idx1) == s2.charAt(idx2)) {
            // 3-1. 두 글자가 같으면 두 인덱스를 다 줄이고, 연산결과 + 1
            memo[idx1][idx2] = topDown(idx1 - 1, idx2 - 1) + 1;
        } else {
            // 3-2. 두 글자가 다르면 한쪽 인덱스씩 줄이고, 그 중 큰 결과를 연산결과에 저장
            memo[idx1][idx2] = Math.max(topDown(idx1 - 1, idx2), topDown(idx1, idx2 - 1));
        }
        return memo[idx1][idx2];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>dp</category>
      <category>java</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/89</guid>
      <comments>https://matcha-dev.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 28 Oct 2024 23:11:28 +0900</pubDate>
    </item>
    <item>
      <title>[백트래킹 / G5] 숌 사이 수열</title>
      <link>https://matcha-dev.tistory.com/88</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Question&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1469&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1469&lt;/a&gt;&lt;/p&gt;
&lt;table id=&quot;12954fb0-ba14-804a-babb-eba626e1d04d&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;12954fb0-ba14-80a1-9cf4-e6fba99a6b4f&quot;&gt;
&lt;td id=&quot;v}[P&quot;&gt;시간 제한&lt;/td&gt;
&lt;td id=&quot;lQ:@&quot;&gt;메모리 제한&lt;/td&gt;
&lt;td id=&quot;Uw?;&quot;&gt;제출&lt;/td&gt;
&lt;td id=&quot;tycC&quot;&gt;정답&lt;/td&gt;
&lt;td id=&quot;rzjy&quot;&gt;맞힌 사람&lt;/td&gt;
&lt;td id=&quot;~mEk&quot;&gt;정답 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;12954fb0-ba14-807e-b2cd-f52fd79a3f20&quot;&gt;
&lt;td id=&quot;v}[P&quot;&gt;2 초&lt;/td&gt;
&lt;td id=&quot;lQ:@&quot;&gt;128 MB&lt;/td&gt;
&lt;td id=&quot;Uw?;&quot;&gt;1041&lt;/td&gt;
&lt;td id=&quot;tycC&quot;&gt;369&lt;/td&gt;
&lt;td id=&quot;rzjy&quot;&gt;263&lt;/td&gt;
&lt;td id=&quot;~mEk&quot;&gt;35.160%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 정리&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1. N개의 다른 숫자로 구성되어 있는 집합 X를 만들었다. 그리고, 길이가 2N인 숌 사이 수열 (S)을 만들려고 한다. &lt;br /&gt;&lt;br /&gt;1-2. 숌 사이 수열이란 다음과 같다. &lt;br /&gt;1-2-1. X에 들어있는 모든 수는 숌 사이 수열 S에 정확히 두 번 등장해야 한다. &lt;br /&gt;1-2-2. X에 등장하는 수가 i라면, S에서 두 번 등장하는 i사이에는 수가 i개 등장해야 한다. &lt;br /&gt;&lt;br /&gt;1-3. 숌이 만든 집합 X가 {1,2,3}이고, 숌이 만든 숌 사이 수열이 {2 3 1 2 1 3}이라면, &lt;br /&gt;1-3-1. 일단 X에 속하는 모든 수가 S에 두 번 등장하므로 1번 조건을 만족한다. &lt;br /&gt;1-3-2. 2와 2사이엔 수가 두 개, 1과 1사이엔 1개, 3과 3사이엔 3개가 등장하므로 조건을 만족시킨다. &lt;br /&gt;&lt;br /&gt;1-4. 만약 여러 개일 경우 사전 순으로 가장 빠른 것을 출력한다. 만약 없을 경우에는 -1을 출력한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Idea&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 사전 순으로 가장 빠른 것을 출력하기 위해 입력받은 배열을 정렬한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 정답을 저장할 배열을 -1 로 채운다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3-1. -1 로 채우고 값을 넣었다 뺌으로써 visit 배열의 역할도 겸한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 기저조건 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4-1. 끝까지 숫자를 채웠다면 return &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4-2. 현재 위치가 이미 채워져있다면 다음 단계로 넘어간다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5. 백트래킹 조건&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5-1. 이미 사용한 숫자면 continue &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5-2. 배열의 범위 밖으로 나가면 continue &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5-3. 현재 위치, num 만큼 떨어진 위치가 둘다 -1 이 아니면 (사용중이면) continue &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;6. true 가 넘어왔다면 이미 결과가 나왔다는 뜻이기 때문에 return&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Code&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/**
 * 숌 사이의 수열
 */
package baekjoon;

import java.util.*;

public class M1469 {

    static Scanner scan = new Scanner(System.in);
    static int n;
    static int[] seq, answer;
    static boolean[] visit;

    public static void main(String[] args) {

        init();
        if (backtrack(0)) {
            for (int idx = 0; idx &amp;lt; n * 2; idx++) {
                System.out.print(answer[idx] + &quot; &quot;);
            }
        } else {
            System.out.println(-1);
        }
    }

    private static void init() {
        n = scan.nextInt();
        seq = new int[n];
        visit = new boolean[n];
        answer = new int[n * 2];

        for (int idx = 0; idx &amp;lt; n; idx++) {
            seq[idx] = scan.nextInt();
        }
        // 2. 사전 순으로 가장 빠른 것을 출력하기 위해 입력받은 배열을 정렬한다.
        Arrays.sort(seq);
        // 3. 정답을 저장할 배열을 -1 로 채운다.
        // 3-1. -1 로 채우고 값을 넣었다 뺌으로써 visit 배열의 역할도 겸한다.
        Arrays.fill(answer, -1);
    }

    private static boolean backtrack(int level) {
        // 4. 기저조건
        // 4-1. 끝까지 숫자를 채웠다면 return
        if (level == n * 2) {
            return true;
        }
        // 4-2. 현재 위치가 이미 채워져있다면 다음 단계로 넘어간다.
        if (answer[level] != -1) {
            return backtrack(level + 1);
        }

        for (int idx = 0; idx &amp;lt; n; idx++) {
            int prev = level;
            int next = level + seq[idx] + 1;

            // 5. 백트래킹 조건
            // 5-1. 이미 사용한 숫자면 continue
            if (visit[idx]) {
                continue;
            }
            // 5-2. 배열의 범위 밖으로 나가면 continue
            if (next &amp;gt;= n * 2) {
                continue;
            }
            // 5-3. 현재 위치, num 만큼 떨어진 위치가 둘다 -1 이 아니면 (사용중이면) continue
            if (answer[prev] != -1 || answer[next] != -1) {
                continue;
            }

            visit[idx] = true;
            answer[prev] = seq[idx];
            answer[next] = seq[idx];

            // 6. true 가 넘어왔다면 이미 결과가 나왔다는 뜻이기 때문에 return
            if (backtrack(level + 1)) {
                return true;
            }

            visit[idx] = false;
            answer[prev] = -1;
            answer[next] = -1;
        }

        return false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Baekjoon</category>
      <category>java</category>
      <category>백트래킹</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/88</guid>
      <comments>https://matcha-dev.tistory.com/88#entry88comment</comments>
      <pubDate>Mon, 28 Oct 2024 22:49:39 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 23. EC2 접속 편의성, Kafka</title>
      <link>https://matcha-dev.tistory.com/87</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnZX4/btsz1ueFDBm/vztSWKIaugzb82PL3kfZ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnZX4/btsz1ueFDBm/vztSWKIaugzb82PL3kfZ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnZX4/btsz1ueFDBm/vztSWKIaugzb82PL3kfZ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnZX4%2Fbtsz1ueFDBm%2FvztSWKIaugzb82PL3kfZ5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-host=&quot;playdata.io&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-ke-align=&quot;alignCenter&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. WSL 에서 EC2 접속&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699499051775&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# home 혹은 .ssh 디렉토리 내 key 파일 존재 여부 확인

이 때 key 파일이 없으면, cp 명령어를 통해 복사해 가져온다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCq1m9/btszYmV9piT/TiPuelOMO61d0jgtn6mNI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCq1m9/btszYmV9piT/TiPuelOMO61d0jgtn6mNI0/img.png&quot; data-alt=&quot;가지고있는 key 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCq1m9/btszYmV9piT/TiPuelOMO61d0jgtn6mNI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCq1m9%2FbtszYmV9piT%2FTiPuelOMO61d0jgtn6mNI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;132&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가지고있는 key 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699494232279&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 접속 방법
ssh -i ~/.ssh/amigo.pem ec2-user@43.202.65.216&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br9gon/btsz2ZSAQoT/SEyILeoMwnfvaXnYD1Utt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br9gon/btsz2ZSAQoT/SEyILeoMwnfvaXnYD1Utt1/img.png&quot; data-alt=&quot;wsl -&amp;amp;gt; ec2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br9gon/btsz2ZSAQoT/SEyILeoMwnfvaXnYD1Utt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr9gon%2Fbtsz2ZSAQoT%2FSEyILeoMwnfvaXnYD1Utt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;266&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;wsl -&amp;gt; ec2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699494281202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka 키워드로 접속 가능하게 설정
Host kafka
	HostName 43.202.65.216
	User ec2-user
	IdentityFile /home/lhs/.ssh/amigo.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F4rKt/btsz1iFnPGL/n86VwdrjuvtnL94ZlURlc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F4rKt/btsz1iFnPGL/n86VwdrjuvtnL94ZlURlc1/img.png&quot; data-alt=&quot;접속 정보 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F4rKt/btsz1iFnPGL/n86VwdrjuvtnL94ZlURlc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF4rKt%2Fbtsz1iFnPGL%2Fn86VwdrjuvtnL94ZlURlc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;108&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;접속 정보 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699495520799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존에 일일이 ip를 작성해 접속하던 것을 Host 를 통해 접속
ssh kafka&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2UyO/btsz1qwy51E/LaqKdWUvwFtajuc03WIV30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2UyO/btsz1qwy51E/LaqKdWUvwFtajuc03WIV30/img.png&quot; data-alt=&quot;Host를 통한 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2UyO/btsz1qwy51E/LaqKdWUvwFtajuc03WIV30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2UyO%2Fbtsz1qwy51E%2FLaqKdWUvwFtajuc03WIV30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;263&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Host를 통한 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. VSCode를 통해 EC2 접속&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 보안 주체 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699495668816&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# C -&amp;gt; Users -&amp;gt; [User이름] -&amp;gt; .ssh
C:\Users\Playdata\.ssh

1. 상속 제거를 통해 보안주체 초기화
2. 보안 주체 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8MefR/btsz1K9tdWi/WMJ1XrPoS9BWJnYJ3ntsjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8MefR/btsz1K9tdWi/WMJ1XrPoS9BWJnYJ3ntsjK/img.png&quot; data-alt=&quot;보안 주체 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8MefR/btsz1K9tdWi/WMJ1XrPoS9BWJnYJ3ntsjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8MefR%2Fbtsz1K9tdWi%2FWMJ1XrPoS9BWJnYJ3ntsjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;320&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보안 주체 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/enyKR7/btsz1TrHnl3/PE3yTq60mJZSd1UbkmbLs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/enyKR7/btsz1TrHnl3/PE3yTq60mJZSd1UbkmbLs1/img.png&quot; data-alt=&quot;확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/enyKR7/btsz1TrHnl3/PE3yTq60mJZSd1UbkmbLs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FenyKR7%2Fbtsz1TrHnl3%2FPE3yTq60mJZSd1UbkmbLs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;310&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;확인&lt;/figcaption&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;2. config 파일 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699496244216&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# config
Host kafka
	HostName 43.202.65.216
	User ec2-user
	IdentityFile C:\Users\Playdata\.ssh\amigo.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnAkKw/btszX1Li2GM/OLSwNeZwmSuWIZicDLiPa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnAkKw/btszX1Li2GM/OLSwNeZwmSuWIZicDLiPa0/img.png&quot; data-alt=&quot;config 파일 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnAkKw/btszX1Li2GM/OLSwNeZwmSuWIZicDLiPa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnAkKw%2FbtszX1Li2GM%2FOLSwNeZwmSuWIZicDLiPa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;243&quot; height=&quot;177&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;config 파일 생성&lt;/figcaption&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;3. VS Code 내에서 &amp;gt;Remote-SSH:Connect to Host&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699496827502&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설정 정보 연결
&amp;gt; Remote-SSH&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4HaFK/btsz3KATjnU/MOFEczM39RDp1kJMw7QV91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4HaFK/btsz3KATjnU/MOFEczM39RDp1kJMw7QV91/img.png&quot; data-alt=&quot;remote-ssh&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4HaFK/btsz3KATjnU/MOFEczM39RDp1kJMw7QV91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4HaFK%2Fbtsz3KATjnU%2FMOFEczM39RDp1kJMw7QV91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;99&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;remote-ssh&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R7LLM/btszXFIw1fk/OpGXc4ElP4UI3EbGvCgVYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R7LLM/btszXFIw1fk/OpGXc4ElP4UI3EbGvCgVYK/img.png&quot; data-alt=&quot;HOST 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R7LLM/btszXFIw1fk/OpGXc4ElP4UI3EbGvCgVYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR7LLM%2FbtszXFIw1fk%2FOpGXc4ElP4UI3EbGvCgVYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;84&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HOST 선택&lt;/figcaption&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;4. Open Folder -&amp;gt; OK를 통해 EC2 내부와 일치하는지 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FbRqz/btsz1tGPeAn/Ek0GKkrcWtDe7YsQqNXtV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FbRqz/btsz1tGPeAn/Ek0GKkrcWtDe7YsQqNXtV1/img.png&quot; data-alt=&quot;ec2 내의 디렉토리를 연다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FbRqz/btsz1tGPeAn/Ek0GKkrcWtDe7YsQqNXtV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFbRqz%2Fbtsz1tGPeAn%2FEk0GKkrcWtDe7YsQqNXtV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;208&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ec2 내의 디렉토리를 연다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLqYC/btszZkcBiul/KKLT5as8kP3zUiTsCvhKNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLqYC/btszZkcBiul/KKLT5as8kP3zUiTsCvhKNk/img.png&quot; data-alt=&quot;ec2 내 환경과 동일한 것 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLqYC/btszZkcBiul/KKLT5as8kP3zUiTsCvhKNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLqYC%2FbtszZkcBiul%2FKKLT5as8kP3zUiTsCvhKNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;281&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ec2 내 환경과 동일한 것 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Kafka 용어&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 구성요소&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699490606641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 주키퍼 (Zookeeper)
Kafka의 메타 데이터 관리 및 상태 점검

2. 카프카 클러스터 (Kafka Cluster)
여러대의 broker 를 구성한 cluster

3. 브로커 (Broker)
Kafka 어플리케이션이 설치 된 서버

4. 프로듀서 (Producer)
Kafka로 메세지를 보내는 역할을 하는 클라이언트

5. 컨슈머 (Consumer)
Kafka 에서 메세지를 꺼내서 사용하는 클라이언트

6. 토픽 (Topic)
메세지 피드를 토픽으로 구분, 각 토픽의 이름은 Kafka 내에서 고유 값이다.

7. 파티션 (Partition)
병렬 처리 및 고성능을 얻기 위해 하나의 토픽을 여러개로 나눈 것

8. 세그먼트 (Segment)
프로듀서가 전송한 실제 메세지가 브로커로 도착 후, 브로커의 로컬 디스크에 저장되는 파일

9. 메세지 (Message)
프로듀서가 브로커로 전송하거나 컨슈머가 읽어가는 데이터&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;b&gt;2. 동작 방식&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 리플리케이션 (replication) &lt;br /&gt;&lt;/b&gt;메세지를 여러개로 복제, 카프카 클러스터 브로커에 분산 시키는 동작을 의미한다.&lt;br /&gt;replication 을 사용하면 하나의 메세지를 여러 브로커에 저장하게 된다. 이렇게 함으로써 메세지 손실을 대비할 수 있고, 안정성이 올라간다.&lt;br /&gt;이&amp;nbsp;때,&amp;nbsp;replication-factor를&amp;nbsp;통해,&amp;nbsp;카프카&amp;nbsp;내에&amp;nbsp;복제&amp;nbsp;메세지를&amp;nbsp;몇개를&amp;nbsp;유지할&amp;nbsp;것인지&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699497065371&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 안정성 - 리소스 간 trade-off
안정성을 유지하기 위해서는 하나의 메세지를 여러개 복제해야하는데, 이러면 리소스가 낭비되게 된다. 
때문에 각각의 장단점이 존재하고, trade-off 가 발생하게 된다.

# 기준점 예시
개발, 테스트 : factor 1 
운영환경 : factor 2 [약간의 손실을 허용], factor 3 [손실 허용]&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;b&gt;2) 파티션 (partition) &lt;br /&gt;&lt;/b&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;것&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699497116163&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&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;&lt;b&gt;3) 세그먼트 (segment)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트는 파티션 내에 존재하고, 프로듀서가 전송한 메세지를 저장하는 역할을 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1699497672151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 처리 과정
1. 프로듀서는 카프카의 peter-overview01 토픽으로 메세지를 전송

2. peter-overview01 토픽은 파티션이 하나인 상태이고, 
프로듀서로부터 받은 메세지를 파티션 0의 세그먼트 파일에 저장한다.

3. 브로커의 세그먼트 로그파일에 저장 된 메세지는 컨슈머가 읽어갈 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; data-alt=&quot;로그 내용 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjskww%2FbtszZm9iJBa%2FFG9wa8N9B72LtuIJKsOCs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;270&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그 내용 확인&lt;/figcaption&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;3. 핵심 개념&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 분산 시스템 (scale-out)&lt;/b&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;b&gt;2) 페이지 캐시&lt;/b&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;b&gt;3) 배치 전송 처리&lt;/b&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;b&gt;4) 압축 전송&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축을 통해 용량을 줄여, 트래픽을 줄인다.&lt;/p&gt;
&lt;pre id=&quot;code_1699498427002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. gzip
2. iz4, snappy&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;b&gt;5) 토픽, 파티션, 오프셋&lt;/b&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;b&gt;6) 복제를 통한 고가용성 보장&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제를 해서 안정성을 올렸기 때문에, 메세지 손실 없이 사용 가능하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Kafka 기동&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Zookeeper 구동 중인지 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699490181632&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zookeeper 서버 구동중인지 확인
ssh peter-zk01.foo.bar
ssh peter-zk02.foo.bar
ssh peter-zk03.foo.bar

sudo systemctl status zookeeper-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZGeR/btsz1eC7hXv/IhVRk8iLth3kuuz0WLiEJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZGeR/btsz1eC7hXv/IhVRk8iLth3kuuz0WLiEJK/img.png&quot; data-alt=&quot;zookeeper 구동 여부 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZGeR/btsz1eC7hXv/IhVRk8iLth3kuuz0WLiEJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZGeR%2Fbtsz1eC7hXv%2FIhVRk8iLth3kuuz0WLiEJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;348&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zookeeper 구동 여부 확인&lt;/figcaption&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;2. Kafka 접속&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699490229182&quot; class=&quot;css&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Kafka EC2 접속
ssh peter-kafka01.foo.bar
ssh peter-kafka02.foo.bar
ssh peter-kafka03.foo.bar

# 각각의 EC2 접속 후 kafka 서버 기동
sudo systemctl enable --now kafka-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs3fHC/btszZmuBhoQ/PdKoHTLUu5HSOAUkV067s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs3fHC/btszZmuBhoQ/PdKoHTLUu5HSOAUkV067s1/img.png&quot; data-alt=&quot;각각의 kafka 기동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs3fHC/btszZmuBhoQ/PdKoHTLUu5HSOAUkV067s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs3fHC%2FbtszZmuBhoQ%2FPdKoHTLUu5HSOAUkV067s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;327&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;각각의 kafka 기동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Kafka log 확인&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699497527871&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka02 접속
ssh peter-kafka02.foo.bar

# /data/kafka-logs 디렉토리로 이동
cd /data/kafka-logs&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SyyZg/btszYHTfPM4/pz8CWzqUK1tTACMB708qS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SyyZg/btszYHTfPM4/pz8CWzqUK1tTACMB708qS0/img.png&quot; data-alt=&quot;로그 폴더로 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SyyZg/btszYHTfPM4/pz8CWzqUK1tTACMB708qS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSyyZg%2FbtszYHTfPM4%2Fpz8CWzqUK1tTACMB708qS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;550&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그 폴더로 이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699497699172&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그 파일이 저장되어있는 디렉토리로 이동
cd peter-overview01-0/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI368j/btszYlbNB6f/jFaQT3RtGlSASCKE5bTMkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI368j/btszYlbNB6f/jFaQT3RtGlSASCKE5bTMkK/img.png&quot; data-alt=&quot;로그파일 디렉토리로 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI368j/btszYlbNB6f/jFaQT3RtGlSASCKE5bTMkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI368j%2FbtszYlbNB6f%2FjFaQT3RtGlSASCKE5bTMkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;89&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그파일 디렉토리로 이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699497844936&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 헥사 코드 출력 키워드를 통해 로그 확인
xxd 00000000000000000000.log

* 헥사 코드로 출력하지 않으면 인코딩 문제 때문에 글씨가 깨진다.
* 로그 확인 시 producer 가 보낸 hi consumer 라는 메세지를 볼 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; data-alt=&quot;로그 내용 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjskww/btszZm9iJBa/FG9wa8N9B72LtuIJKsOCs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjskww%2FbtszZm9iJBa%2FFG9wa8N9B72LtuIJKsOCs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;270&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그 내용 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.&lt;span&gt; 70&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;일차 후기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EC2에 좀 더 편하게 접속하기 위해 설정정보를 만들고, 키를 옮겨 WSL이나 VS Code에서도 사용할 수 있도록 설정을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정은 외부 서버에 접속해야하는 경우 공통으로 사용할 수 있는 부분이기 때문에, 추후 회사에서 회사 서버에 접속해야 하는경우에도 활용할 수 있을 거 같다는 생각이 들었다.&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>70일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/87</guid>
      <comments>https://matcha-dev.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 9 Nov 2023 11:50:18 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 22. Ansible, Zooker, Kafka 설치</title>
      <link>https://matcha-dev.tistory.com/86</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blJdjT/btszSJK40hz/9Pq5rhA0ab7FgIZkSyhNW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blJdjT/btszSJK40hz/9Pq5rhA0ab7FgIZkSyhNW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blJdjT/btszSJK40hz/9Pq5rhA0ab7FgIZkSyhNW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblJdjT%2FbtszSJK40hz%2F9Pq5rhA0ab7FgIZkSyhNW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;opengraph&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-og-host=&quot;playdata.io&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. AWS Instance 생성&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699403541717&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# instance 생성
1. t2-medium
2. 10GB 공간
3. 7개의 instance&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/echmp1/btszYG6BK8h/RmWZnteBFejSqEnpzp2CGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/echmp1/btszYG6BK8h/RmWZnteBFejSqEnpzp2CGk/img.png&quot; data-alt=&quot;7개의 instance 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/echmp1/btszYG6BK8h/RmWZnteBFejSqEnpzp2CGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fechmp1%2FbtszYG6BK8h%2FRmWZnteBFejSqEnpzp2CGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;341&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;7개의 instance 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699403605893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# option
1. 탄력적 IP off
2. IPv6 off
3. 프라이빗 IP 주소 on&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LBbIk/btszTB63LAy/lWFHRPxVnjcc3B4eNqvhUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LBbIk/btszTB63LAy/lWFHRPxVnjcc3B4eNqvhUK/img.png&quot; data-alt=&quot;option&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LBbIk/btszTB63LAy/lWFHRPxVnjcc3B4eNqvhUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLBbIk%2FbtszTB63LAy%2FlWFHRPxVnjcc3B4eNqvhUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;600&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;option&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699403665885&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 나의 instance 만 검색
name : 내 instance&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bACSG5/btszYoSFIf5/PV4PTAYJWrN4vTZ0ZL70l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bACSG5/btszYoSFIf5/PV4PTAYJWrN4vTZ0ZL70l1/img.png&quot; data-alt=&quot;name :&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bACSG5/btszYoSFIf5/PV4PTAYJWrN4vTZ0ZL70l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbACSG5%2FbtszYoSFIf5%2FPV4PTAYJWrN4vTZ0ZL70l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;119&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;name :&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699403784005&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# private ip 별 용도
1. 172.31.1.91
peter-zk01.foo.bar peter-zk01

2. 172.31.1.58
peter-zk02.foo.bar peter-zk02

3. 172.31.14.199
peter-zk03.foo.bar peter-zk03

4. 172.31.6.70
peter-kafka01.foo.bar peter-kafka01

5. 172.31.13.238
peter-kafka02.foo.bar peter-kafka02

6. 172.31.9.193
peter-kafka03.foo.bar peter-kafka03

7. 172.31.2.65
peter-ansible01.foo.bar peter-ansible01&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;ansible instance로 접속해서 나머지 instance 들은 타고 들어갈 예정이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 kafka를 직접 설치하는게 아니라 Github 에 이미 구성되어있는 자료를 다운받아 사용할 예정인데, 때문에 해당 Github 에서 사용한 구성 정보와 동일하게 이름을 설정하기 위해 peter-... 라는 이름을 사용하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1699404536798&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ansible 로 사용할 instance의 public ip로 접속
1. 54.180.126.15
2. key 등록
3. ec2-user&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cyf1L/btszWHed0MM/1AsRdXCtf0YVb7nUK6j9zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cyf1L/btszWHed0MM/1AsRdXCtf0YVb7nUK6j9zK/img.png&quot; data-alt=&quot;ansible로 사용할 instance로 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cyf1L/btszWHed0MM/1AsRdXCtf0YVb7nUK6j9zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCyf1L%2FbtszWHed0MM%2F1AsRdXCtf0YVb7nUK6j9zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;187&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ansible로 사용할 instance로 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZFIK7/btszX0K6G8Z/LkARZU8cLpR3bLX9rbdQfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZFIK7/btszX0K6G8Z/LkARZU8cLpR3bLX9rbdQfK/img.png&quot; data-alt=&quot;ec2-user&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZFIK7/btszX0K6G8Z/LkARZU8cLpR3bLX9rbdQfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZFIK7%2FbtszX0K6G8Z%2FLkARZU8cLpR3bLX9rbdQfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;270&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ec2-user&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699405549066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 여러 instance 가 접속할 수 있도록 key 생성
ssh-keygen -t rsa&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qsv6A/btszVttIZ4E/yrOjMrgdvlOekGtOWOSQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qsv6A/btszVttIZ4E/yrOjMrgdvlOekGtOWOSQkk/img.png&quot; data-alt=&quot;key 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qsv6A/btszVttIZ4E/yrOjMrgdvlOekGtOWOSQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqsv6A%2FbtszVttIZ4E%2FyrOjMrgdvlOekGtOWOSQkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;146&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;key 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699405630701&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성 된 key 확인
cd ~/.ssh

# public key 확인
cat id_rsa.pub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6Icz/btszZluta7Z/VXYPhtBI2SHtXaBK6LEa1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6Icz/btszZluta7Z/VXYPhtBI2SHtXaBK6LEa1k/img.png&quot; data-alt=&quot;공개키 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6Icz/btszZluta7Z/VXYPhtBI2SHtXaBK6LEa1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6Icz%2FbtszZluta7Z%2FVXYPhtBI2SHtXaBK6LEa1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;155&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공개키 확인&lt;/figcaption&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;instance 간 접속을 편하게 하기 위해 각 instance 내에서 서로의 공개키를 등록, 서버 정보를 추가하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1699405887243&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 다른 instance 로 접속하기 위해 모든 instance의 authrized_keys에 공개키 등록
cd ~/.ssh
vim authorized_keys

# 작성했던 서버 정보 추가  
sudo vim /etc/hosts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJjW8/btszYGZRjuO/J6nsBRTzzbesVVlLez49q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJjW8/btszYGZRjuO/J6nsBRTzzbesVVlLez49q0/img.png&quot; data-alt=&quot;authorized_key 에 instance 정보 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJjW8/btszYGZRjuO/J6nsBRTzzbesVVlLez49q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJjW8%2FbtszYGZRjuO%2FJ6nsBRTzzbesVVlLez49q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;68&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;authorized_key 에 instance 정보 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJXo1/btszSIZy3px/KtWkxtjh1haT2K1MXXNLbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJXo1/btszSIZy3px/KtWkxtjh1haT2K1MXXNLbK/img.png&quot; data-alt=&quot;서버 정보들 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJXo1/btszSIZy3px/KtWkxtjh1haT2K1MXXNLbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJXo1%2FbtszSIZy3px%2FKtWkxtjh1haT2K1MXXNLbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;207&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버 정보들 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Ansible , Zookeeper, Kafka 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Ansible 서버 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699409545511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ansible 설치
sudo yum install ansible&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca0blH/btszYI4rQbB/ofKBB9XJWogo3tTIbpuGP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca0blH/btszYI4rQbB/ofKBB9XJWogo3tTIbpuGP1/img.png&quot; data-alt=&quot;ansible install&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca0blH/btszYI4rQbB/ofKBB9XJWogo3tTIbpuGP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca0blH%2FbtszYI4rQbB%2FofKBB9XJWogo3tTIbpuGP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;271&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ansible install&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699409661983&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치가 잘 됐는지 확인
ansible --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDkU4/btszYJh0Ud7/505zdRP9H62o9ad2TVqYz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDkU4/btszYJh0Ud7/505zdRP9H62o9ad2TVqYz1/img.png&quot; data-alt=&quot;ansible version&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDkU4/btszYJh0Ud7/505zdRP9H62o9ad2TVqYz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDkU4%2FbtszYJh0Ud7%2F505zdRP9H62o9ad2TVqYz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;174&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ansible version&lt;/figcaption&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;2. Zookeeper, Kafka 구성을 편하게 하기 위해 Github Open Source에서 Clone&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699409717471&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# script 파일 clone 해오기
git clone https://github.com/onlybooks/kafka2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCQC6P/btszXIRrdzj/eFzUA1hDK89SMeashURoh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCQC6P/btszXIRrdzj/eFzUA1hDK89SMeashURoh1/img.png&quot; data-alt=&quot;git clone&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCQC6P/btszXIRrdzj/eFzUA1hDK89SMeashURoh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCQC6P%2FbtszXIRrdzj%2FeFzUA1hDK89SMeashURoh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;137&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git clone&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699409929957&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; # 설치 파일이 있는 경로로 이동
 cd kafka2/chapter2/ansible_playbook/
 
 해당 디렉토리 내의 yml 파일을 이용해 설치를 진행한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dG0hCz/btszXK2LKYb/5kwL4cvgFdRd0TQ5kP0lA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dG0hCz/btszXK2LKYb/5kwL4cvgFdRd0TQ5kP0lA0/img.png&quot; data-alt=&quot;디렉토리 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dG0hCz/btszXK2LKYb/5kwL4cvgFdRd0TQ5kP0lA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdG0hCz%2FbtszXK2LKYb%2F5kwL4cvgFdRd0TQ5kP0lA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;129&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디렉토리 이동&lt;/figcaption&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;3. Zookeeper 설치를 위해 zookeeper 클러스터 내에 jdk 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699410732800&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ansible server 접속
ssh peter-zk01.foo.bar
ssh peter-zk02.foo.bar
ssh peter-zk03.foo.bar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xihyt/btszU4U6Q0N/3KaIOPztd1PQEh2RAJnNlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xihyt/btszU4U6Q0N/3KaIOPztd1PQEh2RAJnNlK/img.png&quot; data-alt=&quot;ansible 서버 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xihyt/btszU4U6Q0N/3KaIOPztd1PQEh2RAJnNlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxihyt%2FbtszU4U6Q0N%2F3KaIOPztd1PQEh2RAJnNlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;140&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ansible 서버 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699411693400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각 ansible 서버 내 jdk 설치
sudo dnf install java-1.8.0-amazon-corretto-devel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVnka/btszYD3gyvb/pg5rt1MyU5eZIDxuwSZbX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVnka/btszYD3gyvb/pg5rt1MyU5eZIDxuwSZbX0/img.png&quot; data-alt=&quot;jdk 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVnka/btszYD3gyvb/pg5rt1MyU5eZIDxuwSZbX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVnka%2FbtszYD3gyvb%2Fpg5rt1MyU5eZIDxuwSZbX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;215&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;jdk 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699411803351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치한 jdk 확인
java -version
javac -version​&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qgvHO/btszUAmnV4c/MCbKYgzajrGhKMK0vyQaKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qgvHO/btszUAmnV4c/MCbKYgzajrGhKMK0vyQaKk/img.png&quot; data-alt=&quot;jdk 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qgvHO/btszUAmnV4c/MCbKYgzajrGhKMK0vyQaKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqgvHO%2FbtszUAmnV4c%2FMCbKYgzajrGhKMK0vyQaKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;123&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;jdk 확인&lt;/figcaption&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;4. Zookeeper 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699413724176&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# amazon-ec2 version 변경으로 인한 설정 변경
name: ['java-1.8.0-amazon-corretto-devel', 'krb5-workstation', 'git']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccYgd9/btszUxQLY5A/cXzKbyyQieHN3BxuPgfCM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccYgd9/btszUxQLY5A/cXzKbyyQieHN3BxuPgfCM0/img.png&quot; data-alt=&quot;설정 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccYgd9/btszUxQLY5A/cXzKbyyQieHN3BxuPgfCM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccYgd9%2FbtszUxQLY5A%2FcXzKbyyQieHN3BxuPgfCM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;57&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699414520201&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zookeeper 설치
ansible-playbook -i hosts zookeeper.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clpLxP/btszUfCWLVi/YlMI4r2hh32ozFTKFNIZ0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clpLxP/btszUfCWLVi/YlMI4r2hh32ozFTKFNIZ0K/img.png&quot; data-alt=&quot;설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clpLxP/btszUfCWLVi/YlMI4r2hh32ozFTKFNIZ0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclpLxP%2FbtszUfCWLVi%2FYlMI4r2hh32ozFTKFNIZ0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1143&quot; height=&quot;129&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699414649905&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ansible 서버 접속
ssh peter-zk01.foo.bar
ssh peter-zk02.foo.bar
ssh peter-zk03.foo.bar

셋 중 하나에 접속해 zookeeper 접속이 가능한지 테스트한다.

# zookeeper 서버 실행
sudo systemctl status zookeeper-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4tWTm/btszYJ3rnmZ/5cvqdTxYxTZkVWhKGyHOQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4tWTm/btszYJ3rnmZ/5cvqdTxYxTZkVWhKGyHOQ0/img.png&quot; data-alt=&quot;zookeeper 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4tWTm/btszYJ3rnmZ/5cvqdTxYxTZkVWhKGyHOQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4tWTm%2FbtszYJ3rnmZ%2F5cvqdTxYxTZkVWhKGyHOQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;165&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zookeeper 접속&lt;/figcaption&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;5. Kafka 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699414820865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka 설치
ansible-playbook -i hosts kafka.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcQhsj/btszZmfYcN2/bCi5YZUvAqSb0QKaIseX20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcQhsj/btszZmfYcN2/bCi5YZUvAqSb0QKaIseX20/img.png&quot; data-alt=&quot;kafka 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcQhsj/btszZmfYcN2/bCi5YZUvAqSb0QKaIseX20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcQhsj%2FbtszZmfYcN2%2FbCi5YZUvAqSb0QKaIseX20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;101&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kafka 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699415010897&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka 클러스터 접속
ssh peter-kafka01.foo.bar
ssh peter-kafka02.foo.bar
ssh peter-kafka03.foo.bar

셋 중 하나에 접속해 kafka 서버 실행이 가능한지 테스트한다. 

# kafka 서버 실행
sudo systemctl status kafka-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6E58W/btszTCdYDQY/XD20m10Rz2GP95qyrxuos0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6E58W/btszTCdYDQY/XD20m10Rz2GP95qyrxuos0/img.png&quot; data-alt=&quot;kafka 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6E58W/btszTCdYDQY/XD20m10Rz2GP95qyrxuos0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6E58W%2FbtszTCdYDQY%2FXD20m10Rz2GP95qyrxuos0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;176&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kafka 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;b&gt;. Kafka Producer, Consumer 테스트&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699420539016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka 클러스터 접속
ssh peter-kafka01.foo.bar

# Kafka Topic 생성
/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server peter-kafka01.foo.bar:9092 \
--create --topic peter-overview01 --partitions 1 --replication-factor 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceb1HI/btszUvlC3Wk/Nnf17mPqOBSDVk3BbBKk9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceb1HI/btszUvlC3Wk/Nnf17mPqOBSDVk3BbBKk9k/img.png&quot; data-alt=&quot;kafka topic 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceb1HI/btszUvlC3Wk/Nnf17mPqOBSDVk3BbBKk9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fceb1HI%2FbtszUvlC3Wk%2FNnf17mPqOBSDVk3BbBKk9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1294&quot; height=&quot;310&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;kafka topic 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699420814529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# kafka console consumer 실행
/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server peter-kafka01.foo.bar:9092 \
--topic peter-overview01&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mtPpD/btsz1rhdWRr/xLZ3mdfC0quLPLhJr9XzQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mtPpD/btsz1rhdWRr/xLZ3mdfC0quLPLhJr9XzQ0/img.png&quot; data-alt=&quot;consumer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mtPpD/btsz1rhdWRr/xLZ3mdfC0quLPLhJr9XzQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmtPpD%2Fbtsz1rhdWRr%2FxLZ3mdfC0quLPLhJr9XzQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;86&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;consumer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699421021756&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 다른 kafka 클러스터 접속
ssh peter-kafka02.foo.bar

# kafka console producer 실행
/usr/local/kafka/bin/kafka-console-producer.sh --bootstrap-server peter-kafka01.foo.bar:9092 \
--topic peter-overview01&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EpQay/btsz1TqYTEc/NCwMZMSK6XpWasQ3x8w3TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EpQay/btsz1TqYTEc/NCwMZMSK6XpWasQ3x8w3TK/img.png&quot; data-alt=&quot;producer&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EpQay/btsz1TqYTEc/NCwMZMSK6XpWasQ3x8w3TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEpQay%2Fbtsz1TqYTEc%2FNCwMZMSK6XpWasQ3x8w3TK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;301&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;producer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699421175801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# producer 에서 메세지를 보낼 시 comsumer 가 받는 것 확인
hi consumer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T0jn3/btsz1hlDlcv/Z57TonEpbhz5CRwxxVxwS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T0jn3/btsz1hlDlcv/Z57TonEpbhz5CRwxxVxwS0/img.png&quot; data-alt=&quot;producer에서 consumer 로 메세지 전송&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T0jn3/btsz1hlDlcv/Z57TonEpbhz5CRwxxVxwS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT0jn3%2Fbtsz1hlDlcv%2FZ57TonEpbhz5CRwxxVxwS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;210&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;producer에서 consumer 로 메세지 전송&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;69일차 후기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;MSA 로 설계를 함에 있어, 분리 되어있는 DB 끼리 데이터를 동기화하려면 서로의 서비스 API 를 호출해 직접 DB에 INSERT 해, 양쪽의 DB를 일치시켜줬어야했다.&lt;/span&gt;&lt;/span&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&gt;&lt;span&gt;&lt;span&gt;서비스의 종류가 너무 많아지며 해당 방법으로 DB 동기화를 진행할 시 서비스 구조가 너무 복잡해 지게 되었고, 처리량을 감당할 수 없게 되었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;때문에 이를 해결하기 위해 카프카를 사용하게 되었고, 카프카가 지원해주는 높은 처리량, 낮은 지연시간 등을 통해 효율적으로 데이터를 처리할 수 있게 되었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>69일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/86</guid>
      <comments>https://matcha-dev.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 8 Nov 2023 12:50:25 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 21. Keycloak</title>
      <link>https://matcha-dev.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TAmyt/btszLo00CwZ/60qa2eM7hmzzckDC834B50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TAmyt/btszLo00CwZ/60qa2eM7hmzzckDC834B50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TAmyt/btszLo00CwZ/60qa2eM7hmzzckDC834B50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTAmyt%2FbtszLo00CwZ%2F60qa2eM7hmzzckDC834B50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-host=&quot;playdata.io&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-ke-align=&quot;alignCenter&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 마이크로서비스의 보안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 쿠키 (Cookie)&lt;/b&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;사용자는 브라우저의 설정화면이나 개발자 도구에서 쿠키를 확인하고 수정, 삭제할 수 있다.&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자가 조회하는 것도 가능하기 때문에 개인정보나 보안상 민감한 정보를 저장하는데 적합하지 않다.&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;&lt;b&gt;2. 세션 (Session)&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;/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;즉, 서버는 로그인하면 '344asfdsfa412'&amp;nbsp; 같은 형태를 가진 세션ID 를 발급하는데, 서버는 이 세션ID를 가지고 사용자를 구분하게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1699317593744&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&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;&lt;b&gt;3. 토큰 (Token)&lt;/b&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;때문에 서버에 접속하는 사용자들이 많아지면 메모리 공간이 부족해져 서버에 부하가 걸리고, 화면에 행이 걸릴 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1699317419280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* 행(hang)
시스템, 네트워크, 어플리케이션이 동작하지 않고 서비스가 응답하지 않는 상태이다.
즉, 시스템 입출력에 대한 반응이 없는 상태로 시스템 운영이 불가능한 상태를 뜻한다.&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;사용자는 쿠키에 발급받은 토큰을 저장하고, 이후 다시 사이트에 접속하면 서버는 해당 토큰을 통해 인증을 하여 사용자의 요청을 허가하는 방식으로 동작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1699317628480&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* 장점
상태를 메모리에 저장할 필요가 없기 때문에 메모리 공간이 확보된다.

* 단점
한번 로그인한 사용자의 상태를 토큰이 만료될 때까지 제어가 불가능하다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. OAuth2&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;토큰 기반의 보안 프레임워크로, 권한 부여 패턴을 설명하지만 실제 인증을 수행하는 방법은 정의하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 때, 사용자는 ID 제공자 (Idp, Identity provider) 라고하는 제 3자 (3rd party) 인증 서비스로 자신을 인증할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자는 인증에 성공하면 모든 요청과 함께 전달할 토큰을 제공받고 인증 서비스에 이 토큰의 유효성을 확인한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. OAuth 2.0&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open Authoriztion 2.0은 인증을 위한 개방형 표준 프로토콜로, 이 프로토콜을 사용하면 3rd party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 예로, 구글, 카카오, 페이스북, 네이버 등에서 제공하는 간편 로그인 기능도 OAuth2 프로토콜 기반의 사용자 인증 기능을 제공한다.&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;1. 그랜트 (grant)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 체계를 통해 REST 기반의 서비스를 보호할 수 있고, OAuth2 명세에는 네가지 그랜트 타입이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1699318430992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 비밀번호 (password)
2. 클라이언트 자격 증명 (client credential)
3. 인가 코드 (authorization code)
4. 암시적 (implicit)&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;&lt;b&gt;2. 키클록 (keycloak) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키클록은 서비스와 어플리케이션을 위한 ID 및 엑세스 관리용 오픈소스 솔루션으로, 토큰을 발급하기 위해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 서비스와 어플리케이션 코딩을 전혀 혹은 거의 하지않고 쉽게 서비스와 어플리케이션을 보호하는게 목적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 인증을 중앙 집중화하고 SSO(Single-Sign-On) 인증을 가능하게 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1699318510949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Single Sign On
1회 사용자 인증으로 다수의 애플리케이션 및 웹사이트에 대한 사용자 로그인을 허용하는 인증 솔루션&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwzYf/btszQBef15g/Akf9cGZqWBByYE0I9k2WO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwzYf/btszQBef15g/Akf9cGZqWBByYE0I9k2WO1/img.png&quot; data-alt=&quot;실습 예제 docker-compose.yml 내 keycloak 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwzYf/btszQBef15g/Akf9cGZqWBByYE0I9k2WO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwzYf%2FbtszQBef15g%2FAkf9cGZqWBByYE0I9k2WO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;512&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실습 예제 docker-compose.yml 내 keycloak 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;b&gt;. Keycloak 사용&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699319844360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Roles 생성 테스트
1. localhost:8080
2. admin / admin 
3. Roles에서 ADMIN, USER 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmjKI/btszWGSPFRz/yDxb3kCLv45kpJjuGxZdMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmjKI/btszWGSPFRz/yDxb3kCLv45kpJjuGxZdMK/img.png&quot; data-alt=&quot;ADMIN, USER 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmjKI/btszWGSPFRz/yDxb3kCLv45kpJjuGxZdMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpmjKI%2FbtszWGSPFRz%2FyDxb3kCLv45kpJjuGxZdMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1575&quot; height=&quot;268&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADMIN, USER 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699321654776&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# user 생성
Users - add user
illary.huaylupo
john.carnell&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkFROT/btszM3a9eZx/FRRHw9U4LDHfjhrFdhnctK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkFROT/btszM3a9eZx/FRRHw9U4LDHfjhrFdhnctK/img.png&quot; data-alt=&quot;add user&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkFROT/btszM3a9eZx/FRRHw9U4LDHfjhrFdhnctK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkFROT%2FbtszM3a9eZx%2FFRRHw9U4LDHfjhrFdhnctK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;259&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;add user&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699321715050&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성한 user 의 password 설정
credential 탭
password1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ravi0/btszUrvisIu/gdgRgbOcfAZgXeYORBQe7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ravi0/btszUrvisIu/gdgRgbOcfAZgXeYORBQe7k/img.png&quot; data-alt=&quot;password 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ravi0/btszUrvisIu/gdgRgbOcfAZgXeYORBQe7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fravi0%2FbtszUrvisIu%2FgdgRgbOcfAZgXeYORBQe7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1538&quot; height=&quot;269&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;password 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699321759554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성한 user 의 Role Mapping
ostock-admin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBSBfL/btszUBqUFLz/0K7T30tguv9fMSVk49VEs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBSBfL/btszUBqUFLz/0K7T30tguv9fMSVk49VEs1/img.png&quot; data-alt=&quot;role mappings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBSBfL/btszUBqUFLz/0K7T30tguv9fMSVk49VEs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBSBfL%2FbtszUBqUFLz%2F0K7T30tguv9fMSVk49VEs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;297&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;role mappings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699321825818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 해당 realm 을 통해 호출 가능한 endpoint 확인
OpenID Endpoint Configuration&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/la4N2/btszLYBbgAS/diAS8tZwgqF1bKhNdL5WCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/la4N2/btszLYBbgAS/diAS8tZwgqF1bKhNdL5WCk/img.png&quot; data-alt=&quot;endpoints 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/la4N2/btszLYBbgAS/diAS8tZwgqF1bKhNdL5WCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fla4N2%2FbtszLYBbgAS%2FdiAS8tZwgqF1bKhNdL5WCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;460&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;endpoints 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6NlNw/btszUwDclr3/ol5Pc9xynWgNeADyUVUtT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6NlNw/btszUwDclr3/ol5Pc9xynWgNeADyUVUtT0/img.png&quot; data-alt=&quot;가용한 endpoints&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6NlNw/btszUwDclr3/ol5Pc9xynWgNeADyUVUtT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6NlNw%2FbtszUwDclr3%2Fol5Pc9xynWgNeADyUVUtT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;148&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가용한 endpoints&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699322005754&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# client 의 token 확인
Clients - Ostock - Credentials&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmIBK/btszRRg1IvZ/HAF5tqDIHheXVksvNvfa10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmIBK/btszRRg1IvZ/HAF5tqDIHheXVksvNvfa10/img.png&quot; data-alt=&quot;가용 token 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmIBK/btszRRg1IvZ/HAF5tqDIHheXVksvNvfa10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmIBK%2FbtszRRg1IvZ%2FHAF5tqDIHheXVksvNvfa10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;258&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가용 token 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699321225026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 엔드포인트 호출을 통해 JSON payload 확인
http://localhost:8080/auth/realms/spmia-realm/protocol/openid-connect/token&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTvAOq/btszQCc7yjy/0oBrdWL9KHxni75lQzHMyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTvAOq/btszQCc7yjy/0oBrdWL9KHxni75lQzHMyk/img.png&quot; data-alt=&quot;Authorization Token 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTvAOq/btszQCc7yjy/0oBrdWL9KHxni75lQzHMyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTvAOq%2FbtszQCc7yjy%2F0oBrdWL9KHxni75lQzHMyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1059&quot; height=&quot;187&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Authorization Token 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XLLTX/btszMcTzyGA/QTTMSRBe09M6q6GvWTKhI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XLLTX/btszMcTzyGA/QTTMSRBe09M6q6GvWTKhI0/img.png&quot; data-alt=&quot;JSON payload&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XLLTX/btszMcTzyGA/QTTMSRBe09M6q6GvWTKhI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXLLTX%2FbtszMcTzyGA%2FQTTMSRBe09M6q6GvWTKhI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1151&quot; height=&quot;495&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JSON payload&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;b&gt;. Keycloak 을 사용한 권한 테스트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. localhost -&amp;gt; keycloak 변경&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699335330514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PowerToys 를 사용해 호스트파일 편집
127.0.0.1 의 DNS를 keycloak으로 설정&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WvY1B/btszYo5D68z/HclEawIWqK6XkkkmpMqxG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WvY1B/btszYo5D68z/HclEawIWqK6XkkkmpMqxG0/img.png&quot; data-alt=&quot;localhost -&amp;amp;gt; keycloak&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WvY1B/btszYo5D68z/HclEawIWqK6XkkkmpMqxG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWvY1B%2FbtszYo5D68z%2FHclEawIWqK6XkkkmpMqxG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;153&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;localhost -&amp;gt; keycloak&lt;/figcaption&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;2. test 할 user 생성, Token 발급&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699334749612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ostock-user 권한을 부여한 user 생성
ostock-user&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rWiC5/btszMbniC2Y/8ctIXMEvqeP0GPNkxMz351/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rWiC5/btszMbniC2Y/8ctIXMEvqeP0GPNkxMz351/img.png&quot; data-alt=&quot;ostock-user 권한 부여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rWiC5/btszMbniC2Y/8ctIXMEvqeP0GPNkxMz351/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrWiC5%2FbtszMbniC2Y%2F8ctIXMEvqeP0GPNkxMz351%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;303&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ostock-user 권한 부여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699334786078&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성한 user 를 사용하여 token 발급
http://keycloak:8080/auth/realms/spmia-realm/protocol/openid-connect/token

# 현재 발급받은 토큰
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmbW1HVDFOTlJESTA3T0xJdTdoQy1VS2lWVFhFcjFXTXd6OHdfa3Q5SU9BIn0.eyJleHAiOjE2OTkzMzQ5OTEsImlhdCI6MTY5OTMzNDY5MSwianRpIjoiNWE2MjQ4MTAtMDMyOS00YTY0LTk3ZTAtMWVkMTEwZWIzZTQwIiwiaXNzIjoiaHR0cDovL2tleWNsb2FrOjgwODAvYXV0aC9yZWFsbXMvc3BtaWEtcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZmE5MzczMTAtMTZmMy00ZDhlLThkYzctNWU2M2Y2NTFhMDM3IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib3N0b2NrIiwic2Vzc2lvbl9zdGF0ZSI6IjM0NjQ1NzUxLThiMjgtNDhlZi05NmViLTljNmVhYWNiNDE3YSIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJkZWZhdWx0LXJvbGVzLXNwbWlhLXJlYWxtIiwidW1hX2F1dGhvcml6YXRpb24iLCJvc3RvY2stdXNlciJdfSwicmVzb3VyY2VfYWNjZXNzIjp7Im9zdG9jayI6eyJyb2xlcyI6WyJVU0VSIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6ImxocyJ9.d1oBPpzTR_LGQ9M0HNOn23L6vDm6LE74NhPVesIBgI54Ix4qU97a99kF0sVkDky54zU3juuHVYnpq5GRCfr2Z23c1Rv2Yxn1evOTyH6XEJ1qvuWhXdnlDky6lO_EDB8-z-MALelQSdO22AcOzGHNDzBNYISpiWzjVZAf8ZIZrhEOAL0fUIbhSXgApidhmhEb-25XiKcujF74CjMXcLisu2NPzzXMRZlAZT9Ds-DFVj_aqiItOLZ3KHWkEtCWboROOBtzMfYdFKncUG-Ecrle77WW_z84HB3C4BwxalmYHyXTMEvpORu_NrOPeduZJtnS5UYwLrsoJQJvh9JOWQwbPA&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4tQT/btszOPjYt71/JqSdZtCzt1JR4KPW74F0RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4tQT/btszOPjYt71/JqSdZtCzt1JR4KPW74F0RK/img.png&quot; data-alt=&quot;토큰 발급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4tQT/btszOPjYt71/JqSdZtCzt1JR4KPW74F0RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4tQT%2FbtszOPjYt71%2FJqSdZtCzt1JR4KPW74F0RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;490&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 발급&lt;/figcaption&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;3. 발급 받은 토큰을 통해 서비스 API 호출 - 1&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699334891004&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 발급 받은 토큰을 사용해 API 호출
http://localhost:8072/organization/v1/organization/e6a625cc-718b-48c2-ac76-1dfdff9a531e&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sRBWJ/btszXn7feql/R7bi9KUraOpz6fLsRmAeF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sRBWJ/btszXn7feql/R7bi9KUraOpz6fLsRmAeF0/img.png&quot; data-alt=&quot;발급받은 토큰을 사용해 API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sRBWJ/btszXn7feql/R7bi9KUraOpz6fLsRmAeF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsRBWJ%2FbtszXn7feql%2FR7bi9KUraOpz6fLsRmAeF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;464&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발급받은 토큰을 사용해 API 호출&lt;/figcaption&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;4. 발급 받은 토큰을 통해 서비스 API 호출 - 2&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699336180716&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 발급 받은 토큰을 사용해 API 호출
http://localhost:8072/license/v1/organization/d898a142-de44-466c-8c88-9ceb2c2429d3/license/f2a9c9d4-d2c0-44fa-97fe-724d77173c62&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MseD7/btszMaWiLeB/TL9hHkVhIactVqAL9chaK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MseD7/btszMaWiLeB/TL9hHkVhIactVqAL9chaK0/img.png&quot; data-alt=&quot;다른 API 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MseD7/btszMaWiLeB/TL9hHkVhIactVqAL9chaK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMseD7%2FbtszMaWiLeB%2FTL9hHkVhIactVqAL9chaK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1036&quot; height=&quot;488&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다른 API 호출&lt;/figcaption&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;5. Access Token 을 전파하는 과정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtKwLn/btszXmgeCUT/J5VpjCHFggnP9IhIAArWlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtKwLn/btszXmgeCUT/J5VpjCHFggnP9IhIAArWlK/img.png&quot; data-alt=&quot;access token 전파 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtKwLn/btszXmgeCUT/J5VpjCHFggnP9IhIAArWlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtKwLn%2FbtszXmgeCUT%2FJ5VpjCHFggnP9IhIAArWlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2017&quot; height=&quot;1107&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;access token 전파 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;68&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;일차 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 session 을 사용해 user 정보를 저장하여 웹 페이지 내에서 user 정보를 유지했지만, 마이크로서비스가 도입 되고 여러 플랫폼을 함께 사용하게 되면서 session 만을 사용해서는 user 정보를 유지하기가 힘들어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 여러 유저를 저장하다보니 세션 메모리만으로는 저장하기 힘들어지는 문제가 발생했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;때문에 Token 이라는 기술이 등장하게 되었고, Token을 발급할 때 JWT 형식을 사용해 어떤 플랫폼에서 사용하던 컨버팅 과정없이 사용할 수 있게 만들었다. 또한, 문자열 하나만 발급하면 되기 때문에 저장공간도 효율적으로 사용할 수 있게 되었다.&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>68일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/85</guid>
      <comments>https://matcha-dev.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 7 Nov 2023 09:54:26 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 20. Custom System 구축, Kafka</title>
      <link>https://matcha-dev.tistory.com/84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWoPsI/btszRUjFuu7/pD0WAgIsnLHKjeKHAKXQU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWoPsI/btszRUjFuu7/pD0WAgIsnLHKjeKHAKXQU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWoPsI/btszRUjFuu7/pD0WAgIsnLHKjeKHAKXQU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWoPsI%2FbtszRUjFuu7%2FpD0WAgIsnLHKjeKHAKXQU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;opengraph&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-og-host=&quot;playdata.io&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Custom System&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나만의 서비스를 구축해보기 위해, 선생님께서 주신 encore 디렉토리를 기반으로 작업을 진행할 예정이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EENOT/btszOMGahWd/7TTIlbxgZQlPihj0hpnZFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EENOT/btszOMGahWd/7TTIlbxgZQlPihj0hpnZFk/img.png&quot; data-alt=&quot;encore 디렉토리 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EENOT/btszOMGahWd/7TTIlbxgZQlPihj0hpnZFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEENOT%2FbtszOMGahWd%2F7TTIlbxgZQlPihj0hpnZFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;351&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;encore 디렉토리 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699241914953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. github 등록
2. jenkins 도입
3. k8s 서비스 
- aws ECR
- minikube 
- aws EKS 
4. CI/CD&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Github Push&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699237230823&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 내 컴퓨터에서 key 파일 만들기 
ssh-keygen -t ed25519 -C &quot;이메일주소&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ra6o/btszL0EQI4a/IJkhO15e6XWTGxixlaibck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ra6o/btszL0EQI4a/IJkhO15e6XWTGxixlaibck/img.png&quot; data-alt=&quot;key 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ra6o/btszL0EQI4a/IJkhO15e6XWTGxixlaibck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ra6o%2FbtszL0EQI4a%2FIJkhO15e6XWTGxixlaibck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;224&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;key 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0LODD/btszRRAlHQB/3FfS85Xl2vEFCF9kDGKny1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0LODD/btszRRAlHQB/3FfS85Xl2vEFCF9kDGKny1/img.png&quot; data-alt=&quot;생성 된 키 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0LODD/btszRRAlHQB/3FfS85Xl2vEFCF9kDGKny1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0LODD%2FbtszRRAlHQB%2F3FfS85Xl2vEFCF9kDGKny1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;49&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성 된 키 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699237683352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성 된 파일 확인
cat id_ed25519.pub

# github key 등록 위치
https://github.com/settings/keys

# SSH-Key 생성
id_ed25519.pub 의 내용을 넣어 SSH-Key를 생성한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baThqi/btszLjkpC9M/TQjnU2KPhppwrSEFKGux4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baThqi/btszLjkpC9M/TQjnU2KPhppwrSEFKGux4k/img.png&quot; data-alt=&quot;generate ssh-key&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baThqi/btszLjkpC9M/TQjnU2KPhppwrSEFKGux4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaThqi%2FbtszLjkpC9M%2FTQjnU2KPhppwrSEFKGux4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;651&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;generate ssh-key&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1699240904969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# private repository 에 push

1. private repository 생성
이 때 gitignore 생성 안하고 일단 만들어야 pull을 안해도 된다.

2. git init 

3. git remote add origin &quot;my repository address&quot;

4. git remote -v 
원격 레포지토리 연결됐는지 확인

5. git branch -m master main
branch 명 master -&amp;gt; main 변경

6. git branch -m main 
main 사용

7. git add .

8. git commit -m &quot;my message&quot;

9. git push --set-upstream origin main
처음에만 --set-upstream을 이용해 push하고, 이후부터는 그냥 git push 만 해도 적용된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbxpb/btszM1pYN5K/1rImdQ0RlC2DcfeFkjQdzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbxpb/btszM1pYN5K/1rImdQ0RlC2DcfeFkjQdzk/img.png&quot; data-alt=&quot;git push 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbxpb/btszM1pYN5K/1rImdQ0RlC2DcfeFkjQdzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpbxpb%2FbtszM1pYN5K%2F1rImdQ0RlC2DcfeFkjQdzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;274&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git push 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;b&gt;. Kafka&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&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;/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;/p&gt;
&lt;pre id=&quot;code_1699247983174&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 확장성
여러 서버로 확장 (scale out) 구성할 수 있기 때문에 데이터 양에 따라 시스템 확장이 가능하다.

2. 영속성
수신한 데이터를 디스크에 유지할 수 있기 때문에 언제라도 데이터를 읽을 수 있다

3. 유연성
연계할수 있는 제품이 많기 때문에 제품이나 시스템을 연결하는 허브 역할을 한다.
이를 미들웨어 프로그램이라고 한다.

4. 신뢰성
메세지 전달을 보증하므로 데이터 분실을 걱정하지 않아도 된다.&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;b&gt;1. 탄생 배경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카프카는 2011년 미국 LinkedIn에서 출발한 서비스로, 링크드인 웹사이트에서 생성되는 로그를 처리하여 웹 사이트 활동을 추적하는 것을 목적으로 개발 되었다.&lt;/p&gt;
&lt;pre id=&quot;code_1699248366873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 링크드 인이 실현하려는 목표

1. 높은 처리량으로 실시간 처리
전 세계 사용자의 방대한 엑세스 데이터를 처리해야하기 때문에 처리량이 우수해야 했고,
사용자의 활동을 신속하게 파악하거나 사용자의 활동에 따라 즉시 피드백하기 위해서는 
사용자의 활동단위로 실시간 처리를 해야했다.

2. 임의의 타이밍에서 데이터를 읽음
실시간 처리에 대한 요구가 있는 반면, 링크드 인은 기존 시스템에서 수집한 엑세스 로그를 일정 시간마다
배치 처리로 취급하고 싶다는 요구사항도 있었다.

또한, 데이터를 사용하는 타이밍이 반드시 실시간이 아니라 이용 목적에 따라 다를 가능성이 있기 때문에
방대한 데이터를 전달할 때 버퍼 역할도 가능하기를 원했다.

3. 다양한 제품과 시스템에 쉽게 연동
링크드 인에서 데이터 발생원이 되는 데이터 소스와 관련된 시스템이 하나가 아니기 때문에 여러 시스템을 통해
들어오는 데이터를 쉽게 저장, 이용할 수 있어야 했다.

4. 메세지를 잃지 않음
메세지가 방대하더라도 메세지를 손실하지 않아야 했다.
즉, 중복이 있더라도 손실이 발생하면 안됐다.&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;b&gt;2. 기존 시스템&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699248592198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그 수집 시스템

실시간으로 데이터를 수집한다는 관점에서 생각할 수 있는 로그 수집을 위한 미들웨어로,
페이스북이 개발한 Scribe 와 클라우데라가 개발한 Flume 이 대표적이다.

각 프론트엔드 서버가 로그를 중계용 서버로 전송하고, 거기서 로그를 수집하여 데이터베이스와 
분산 파일시스템 HDFS(Hadoop Distributed File System) 에 축적된다.

대량의 로그를 처리하는 것을 가정하고 있기 때문에 분산 환경의 다중 서버 구성으로 이루어져 있고,
이들 제품은 대량의 로그를 HDFS에 축적하고 일괄 처리하는 것이 주 목적이기 때문에 
하둡에서 동작하도록 프로그램을 다시 작성해야한다.

즉, 다양한 제품과의 연계를 실현하기 위해서 이용하기 쉬운 송수신 API 가 없기 때문에
수신하는 쪽이 임의로 메세지를 수신하기 어렵다.

# ETL 도구

데이터의 소스에서 데이터를 추출하여 필요에 따라 변환해서 데이터베이스에 적재하는 도구로,
DataStage, Interstage, Cosminexux, Infromatica PowerCenter, Talend 등이 있다.
이들 제품은 데이터를 파일 단위로 다뤄, 수신하는 쪽이 임의로 메세지를 수신하기가 어려웠다.&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;b&gt;각각의 플랫폼이 서로 사용하는 언어가 다르기 때문에,&lt;/b&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;&lt;b&gt;3. 대체 모델&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699248989631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 메세징 모델

메세징 모델은 다음 세가지 요소로 구성 된다.
Producer : 메세지 생산자
Broker : 메시지 수집 / 전달 역할
Consumer : 메세지 소비자

# 큐잉 모델

브로커 안에 큐를 준비해, 프로듀서의 메세지가 큐에 담기고, 컨슈머가 큐에서 메세지를 추출한다.
하나의 큐에 컨슈머가 여러명 존재할 수 있으며,
컨슈머를 여러 개 준비함으로서 컨슈머에 의한 처리를 확장시킬 수 있고,
컨슈머가 메세지를 받으면 다른 컨슈머는 메세지를 받을 수 없었다.

# 펍 / 섭 메세징 모델

메세지 생산자인 프로듀서를 Publisher, 소비자인 컨슈머를 Subscriber 라고 한다.
퍼블리셔는 누가 그 메세지를 수신하는 지 알 수 없고, 브로커에 있는 topic이라 불리는 카테고리 안에
메세지를 등록하기만 한다.

이때, subscriber는 여러 개 존재하는 토픽 중 하나를 선택하여 메세지를 받고,
여러 subscriber가 동일한 토픽을 구독하기로 한다면 모든 subscriber는 동일한 메세지를 받는다.
또한, 다른 토픽에서 다른 메세지를 받을 수도 있다.&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;b&gt;4. 카프카의 주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699249581598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 높은 처리량과 낮은 지연시간
카프카는 매우 높은 처리량과 낮은 지연시간 (latency) 를 가진다.

2. 높은 확장성
손쉬운 확장 (scale out) 이 가능하다.

3. 고가용성
고가용성 (high avaliability) 는 서비스가 죽지않고 계속 유지되는 것을 의미한다.
고가용성을 갖추면서 지연 없는 빠른 메세지 처리 기능을 유지하는 것이 어렵지만,
카프카는 이를 신경써 개발하였다.

4. 내구성
프로듀서는 카프카로 메세지를 전송할 때, 
프로듀서는 acks라는 옵션을 조정하여 메세지의 내구성을 강화할 수 있다.

5. 개발 편의성
카프카는 메세지를 전송하는 역할을 producer, 메세지를 가져오는 역할을 하는 consumer가 
완벽하게 분리되어 동작하고 서로 영향을 주고 받지 않는다.
이러한 구성에 따라 프로듀싱을 원하는 개발자는 프로듀서만 개발하면 되고 컨슈밍을 원하는 개발자는
컨슈머만 개발해 사용하면 된다.

6. 운영 및 관리 편의성
카프카는 중앙 메인 데이터 파이프라인 역할을 하게 되는데, 운영이나 관리의 편의성이 떨어진다면
그와 같은 주요 역할을 맡기기에 부담되기 때문에, 성능 확장을 위한 증설 작업이 쉽고 간단하며,
최신 버전이 릴리스 되는 경우 무중단으로 버전 업그레이드도 가능하다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Kafka의 주요 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;브로커 &lt;br /&gt;&lt;/b&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;받아들인다. &lt;br /&gt;이것을 여러 대의 클러스터로 구성할 수 있으며 브로커를 추가함으로써&amp;nbsp;수신&amp;nbsp;/&amp;nbsp;전달의&amp;nbsp;처리량&amp;nbsp;향상&amp;nbsp;(scale&amp;nbsp;out)&amp;nbsp;이&amp;nbsp;가능하다. &lt;br /&gt;브로커에서 받은 데이터는 모두 디스크로 내보내기가 이루어져,&amp;nbsp;디스크의&amp;nbsp;총&amp;nbsp;용량에&amp;nbsp;따라&amp;nbsp;장기간&amp;nbsp;데이터를&amp;nbsp;보존할&amp;nbsp;수&amp;nbsp;있다.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;메세지 &lt;br /&gt;&lt;/b&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;해당한다. &lt;br /&gt;메세지는&amp;nbsp;key,&amp;nbsp;value&amp;nbsp;를&amp;nbsp;갖게&amp;nbsp;되어&amp;nbsp;메세지&amp;nbsp;전송에&amp;nbsp;파티셔닝을&amp;nbsp;이용한다.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;프로듀서 &lt;br /&gt;&lt;/b&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;제공된다. &lt;br /&gt;프로듀서는&amp;nbsp;프로듀스&amp;nbsp;API&amp;nbsp;를&amp;nbsp;이용하여&amp;nbsp;브로커에&amp;nbsp;데이터를&amp;nbsp;송신하기&amp;nbsp;위해&amp;nbsp;구현&amp;nbsp;된&amp;nbsp;어플리케이션이다. &lt;br /&gt;실제 사례로는 각종 로그 전송 및 미들웨어와 연동하여 동작하기 때문에 프로듀서 API를 내포한 도구, 미들웨어를&amp;nbsp;통해&amp;nbsp;이용하는&amp;nbsp;형태&amp;nbsp;등&amp;nbsp;다양하다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699251610743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* 사용할 수 있는 서드 파티 플러그인
- Apache Log4j
- Apache Flume
- Fluentd
- Logstash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;컨슈머 &lt;br /&gt;&lt;/b&gt;컨슈머 API를 이용해 브로커에서 메세지를 취득하도록 구현 된 어플리케이션으로, 브로커는 메세지를 영속화하기 위해, 브로커에 도달하는 즉시 컨슈머에서 취득해야하는 제약이 없다.&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;가능하다. &lt;br /&gt;또한, 일정 기간 데이터를 축적한 스토리지에서의 데이터 추출 및 실시간 처리를 위한 어플리케이션의 데이터&amp;nbsp;입력&amp;nbsp;등으로&amp;nbsp;이용&amp;nbsp;가능하다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699251636406&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* 카프카 연계를 위한 컨슈머 기능을 갖춘 기존 제품들 리스트
- Apache Spack
- Apache Samza
- Apache Flink
- Apache Flume
- Fluentd
- Logstash&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;&lt;b&gt;5. 주키퍼 &lt;br /&gt;&lt;/b&gt;카프카의&amp;nbsp;브로커에&amp;nbsp;있어&amp;nbsp;분산&amp;nbsp;처리를&amp;nbsp;위한&amp;nbsp;관리&amp;nbsp;도구로&amp;nbsp;Apache&amp;nbsp;Zookeeper가&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;사용한다. &lt;br /&gt;&lt;br /&gt;카프카에 있어서 주키퍼는 분산 메세징의 메타 데이터를 관리하기 위한 구성요소로 기능한다. &lt;br /&gt;또한, 주키퍼 클러스터의 구조상 3, 5 처럼 홀수로 구성하는 것이 일반적이다.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;카프카&amp;nbsp;클라이언트 &lt;br /&gt;&lt;/b&gt;토픽 작성 등 카프카의 동작 및 운영 상에 필요한 조작을 실행하는 서버로, 메세지의 송수신을 처리하는 서버는 아니다.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;카프카&amp;nbsp;클러스터 &lt;br /&gt;&lt;/b&gt;카프카는 여러 대의 브로커 서버, 주키퍼 서버로 이루어진 클러스터링의 메세지 중계 기능과&amp;nbsp;메세지&amp;nbsp;송수신을&amp;nbsp;위한&amp;nbsp;라이브러리&amp;nbsp;그룹으로&amp;nbsp;구성되어&amp;nbsp;있다. &lt;br /&gt;즉,&amp;nbsp;주키퍼에&amp;nbsp;의해&amp;nbsp;구성&amp;nbsp;된&amp;nbsp;클러스터&amp;nbsp;시스템을&amp;nbsp;카프카&amp;nbsp;클러스터라고&amp;nbsp;정의한다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;67&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;일차 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 수업중에 만들 예정인 서비스를 구축하기 위한 기반 디렉토리를 받아, Git의 Private Repository에 올리는 작업을 진행했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대용량 데이터를 처리하기위해 각 마이크로서비스 끼리 End-To-End 방식 아키텍쳐로 서비스를 구축하면, 유지보수도 어렵고 확장성도 떨어진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 카프카를 활용하면 해결할 수 있지만, 카프카를 구성하기 위한 추천 여건은 최소 3대의 주키퍼 서버, 최소 3대의 카프카 서버를 권장한다. 때문에 카프카를 사용할 여건을 가진 서비스를 잘 구축하는 것이 중요하다 생각이 들었다.&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>67일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/84</guid>
      <comments>https://matcha-dev.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 6 Nov 2023 12:49:44 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 19. Namespace, ConfigMap, AWS CLI</title>
      <link>https://matcha-dev.tistory.com/83</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Piuez/btszC1dGNqr/E33HEUl2lejcMKi8osIfE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Piuez/btszC1dGNqr/E33HEUl2lejcMKi8osIfE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Piuez/btszC1dGNqr/E33HEUl2lejcMKi8osIfE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPiuez%2FbtszC1dGNqr%2FE33HEUl2lejcMKi8osIfE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-host=&quot;playdata.io&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-ke-align=&quot;alignCenter&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. namespace&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1698988371699&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# k8s에서 제공하는 오브젝트 목록
kubectl api-resources&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7JGb/btszHVjejOP/3A5ps1rB5jnfjCOvcfuokk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7JGb/btszHVjejOP/3A5ps1rB5jnfjCOvcfuokk/img.png&quot; data-alt=&quot;제공하는 오브젝트 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7JGb/btszHVjejOP/3A5ps1rB5jnfjCOvcfuokk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7JGb%2FbtszHVjejOP%2F3A5ps1rB5jnfjCOvcfuokk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;235&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제공하는 오브젝트 목록&lt;/figcaption&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;1. namespace ?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698988616515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네임스페이스 목록 확인
kubectl get namespaces&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOcS3X/btszHF8C3Db/ZtkwbSN8AqXkULHcAEBp4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOcS3X/btszHF8C3Db/ZtkwbSN8AqXkULHcAEBp4K/img.png&quot; data-alt=&quot;namespaces&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOcS3X/btszHF8C3Db/ZtkwbSN8AqXkULHcAEBp4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOcS3X%2FbtszHF8C3Db%2FZtkwbSN8AqXkULHcAEBp4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;145&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;namespaces&lt;/figcaption&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;namespace는 용도에 따라 컨테이너와 그에 관련된 리소스들을 구분지어 관리할 수 있는 일종의 논리적인 그룹으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k89s에서는 논리적으로 구분하기 위해 namespace라는 오브젝트를 제공한다.&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;즉, 네임스페이스는 pod, replicaSet, deployment, service등과 같은 쿠버네티스 리소스들이 묶여있는 하나의 가상공간 또는 그룹이다.&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;기본적으로 3개의 네임스페이스가 존재하며, 각 네임스페이스는 논리적인 리소스 공간 이기 때문에 각 namespace에는 pod, replicaSet, deployment, service와 같은 리소스가 따로 존재한다.&lt;/p&gt;
&lt;pre id=&quot;code_1698988766675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; # service namespace 확인
 kubectl get service -n kube-system&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q7ysi/btszGQvNFca/k9A6t60fVf49MxryGGIeGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q7ysi/btszGQvNFca/k9A6t60fVf49MxryGGIeGk/img.png&quot; data-alt=&quot;서비스 네임스페이스 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q7ysi/btszGQvNFca/k9A6t60fVf49MxryGGIeGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq7ysi%2FbtszGQvNFca%2Fk9A6t60fVf49MxryGGIeGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;91&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서비스 네임스페이스 확인&lt;/figcaption&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;예를들어 kube-system 네임스페이스에는 쿠버네티스 의 파드, 서비스등을 이름으로 찾을 수 있도록 하는 DNS 서버의 서비스가 미리 생성되어있다.&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;2. namespace 생성, 적용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698988954561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yaml 파일을 이용해 namespace 생성
vim production-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
 name: production&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6Mi0/btszKzmeziq/rPdGvc5b2PmuhC7aKkX1Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6Mi0/btszKzmeziq/rPdGvc5b2PmuhC7aKkX1Ik/img.png&quot; data-alt=&quot;production-namespace.yaml&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6Mi0/btszKzmeziq/rPdGvc5b2PmuhC7aKkX1Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6Mi0%2FbtszKzmeziq%2FrPdGvc5b2PmuhC7aKkX1Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;268&quot; height=&quot;104&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;production-namespace.yaml&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698989007874&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성한 yaml 파일 적용
kubectl apply -f production-namespace.yaml

# namespace 확인
kubectl get ns (namespace의 약자)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjC5jN/btszJ2a8rwX/Jeh2rpkUJN30NKPCMyFsA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjC5jN/btszJ2a8rwX/Jeh2rpkUJN30NKPCMyFsA1/img.png&quot; data-alt=&quot;namespace 생성, 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjC5jN/btszJ2a8rwX/Jeh2rpkUJN30NKPCMyFsA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjC5jN%2FbtszJ2a8rwX%2FJeh2rpkUJN30NKPCMyFsA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;212&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;namespace 생성, 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698989313976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# yaml 파일 추가 생성, 적용
vim hostname-deploy-svc-ns.yaml

# yaml 파일 적용
kubectl apply -f hostname-deploy-svc-ns.yaml

# namespace들 확인
kubectl get pods --all-namespaces&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tU4gl/btszI3amGV2/vAP8qVIgIewq8yfUs6SkGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tU4gl/btszI3amGV2/vAP8qVIgIewq8yfUs6SkGK/img.png&quot; data-alt=&quot;namespace 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tU4gl/btszI3amGV2/vAP8qVIgIewq8yfUs6SkGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtU4gl%2FbtszI3amGV2%2FvAP8qVIgIewq8yfUs6SkGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;511&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;namespace 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 적용한 namespace의 service 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698989655290&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# production namespace 확인
kubectl get pods -n production

# production namespace 상세정보 보기
kubectl get pods -n production -o wide

# production 이라는 서비스 접근, 확인
kubectl get service -n production&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRa0NW/btszDQwGoEk/iT3gQhBMSKkQYSLduuL0r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRa0NW/btszDQwGoEk/iT3gQhBMSKkQYSLduuL0r1/img.png&quot; data-alt=&quot;namespace 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRa0NW/btszDQwGoEk/iT3gQhBMSKkQYSLduuL0r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRa0NW%2FbtszDQwGoEk%2FiT3gQhBMSKkQYSLduuL0r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1367&quot; height=&quot;184&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;namespace 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;b&gt;. ConfigMap&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 안에 시스템 설정 옵션등을 설치하고 싶다면, yaml 파일에 환경 변수를 직접 적어 놓은 하드 코드방식을 사용할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 deployment의 yaml파일 중 pod template에서 아래와 같은 방식으로 환경 변수를 직접 설정할 수도 있다.&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;환경변수를 파드 템플릿에 직접 명시하는 방식도 나쁘지는 않지만 상황에 따라서는 환경변수의 값만 다른 동일한 여러 yaml이 존재할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 만약 &lt;b&gt;운영환경과 개발환경에서 각각 deployment를 생성해야 한다면 환경 변수가 서로 다르게 설정 된 두가지 버전의 yaml 파일이 따로 존재&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;때문에 쿠버네티스는 yaml 파일과 설정값을 분리할 수있는 configMap과 secret이라는 오브젝트를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;configMap에는 설정값을, secret에서는 노출되어서 안되는 비밀값을 설정한다.&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;1. Log, Container 관한 configMap 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698990113653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# log에 관한 configMap 생성
kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG

# 컨테이너에 관한 configMap 생성
kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker

# 생성한 configMap 확인
kubectl get configmap

# log-level-configmap의 상세정보 보기
kubectl describe configmap log-level-configmap&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJPBAq/btszHu7onZE/zWrAGIbRL8acZrhO50UO4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJPBAq/btszHu7onZE/zWrAGIbRL8acZrhO50UO4K/img.png&quot; data-alt=&quot;생성한 configMap 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJPBAq/btszHu7onZE/zWrAGIbRL8acZrhO50UO4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJPBAq%2FbtszHu7onZE%2FzWrAGIbRL8acZrhO50UO4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;150&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성한 configMap 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LZfnw/btszF49xLOW/Rv58fEKR4WFdBmEeGp4nW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LZfnw/btszF49xLOW/Rv58fEKR4WFdBmEeGp4nW1/img.png&quot; data-alt=&quot;상세정보 보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LZfnw/btszF49xLOW/Rv58fEKR4WFdBmEeGp4nW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLZfnw%2FbtszF49xLOW%2FRv58fEKR4WFdBmEeGp4nW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;329&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상세정보 보기&lt;/figcaption&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;2. 전체 환경변수에 관한 configMap 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698990559661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# all-env-from-configmap.yaml 생성
vim all-env-from-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: container-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      envFrom:
      - configMapRef:
          name: log-level-configmap
      - configMapRef:
          name: start-k8s

# pod 실행, 환경설정 적용
kubectl exec container-env-example env&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UyKgB/btszHF8LncO/fEF9AkMPTMyzU6wzvk2ws1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UyKgB/btszHF8LncO/fEF9AkMPTMyzU6wzvk2ws1/img.png&quot; data-alt=&quot;환경변수 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UyKgB/btszHF8LncO/fEF9AkMPTMyzU6wzvk2ws1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUyKgB%2FbtszHF8LncO%2FfEF9AkMPTMyzU6wzvk2ws1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;254&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경변수 설정&lt;/figcaption&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;3. 특정 환경변수에 관한 configMap 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698991886872&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# selective-env-from-configmap.yaml 생성
vim selective-env-from-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: container-selective-env-example
spec:
  containers:
    - name: my-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      env:
      - name: ENV_KEYNAME_1     # (1.1) 컨테이너에 새롭게 등록될 환경 변수 이름
        valueFrom: 
          configMapKeyRef:
            name: log-level-configmap
            key: LOG_LEVEL
      - name: ENV_KEYNAME_2  # (1.2) 컨테이너에 새롭게 등록될 환경 변수 이름
        valueFrom: 
          configMapKeyRef:
            name: start-k8s      # (2) 참조할 컨피그맵의 이름
            key: k8s             # (3) 가져올 데이터 값의 키
                                 # 최종 결과 -&amp;gt; ENV_KEYNAME_2=$(k8s 키에 해당하는 값)
                                 #              ENV_KEYNAME_2=kubernetes

# 생성한 yaml 파일 적용
kubectl apply -f selective-env-from-configmap.yaml

# pod 실행, 적용 된 설정 값 확인
k exec container-selective-env-example env | grep ENV&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkoDvv/btszJ1QY24V/Z2v5jFLIBXlZvGsYz03lik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkoDvv/btszJ1QY24V/Z2v5jFLIBXlZvGsYz03lik/img.png&quot; data-alt=&quot;적용 된 설정 값 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkoDvv/btszJ1QY24V/Z2v5jFLIBXlZvGsYz03lik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkoDvv%2FbtszJ1QY24V%2FZ2v5jFLIBXlZvGsYz03lik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1293&quot; height=&quot;90&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용 된 설정 값 확인&lt;/figcaption&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;4. volume mount에 관한 configMap 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698992140845&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# volume-mount-configmap.yaml 생성
vim volume-mount-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: my-container
      image: busybox
      args: [ &quot;tail&quot;, &quot;-f&quot;, &quot;/dev/null&quot; ]
      volumeMounts:
      - name: configmap-volume          # volumes에서 정의한 컨피그맵 볼륨 이름 
        mountPath: /etc/config             # 컨피그맵의 데이터가 위치할 경로

  volumes:
    - name: configmap-volume            # 컨피그맵 볼륨 이름
      configMap:
        name: start-k8s

volume 내부의 start-k8s를 /etc/config으로 담는 설정이다.

# 생성한 yaml 파일 적용
kubectl apply -f volume-mount-configmap.yaml

# etc 하위의 configMap 실행
k exec configmap-volume-pod ls /etc/config&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Secret&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;secret은 ssh 키, 비밀번호 등 외부 유출에 민감한 정보를 저장하기 위한 오브젝트로, namespace에 종속적이다.&lt;/p&gt;
&lt;pre id=&quot;code_1698993273363&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# secret 기능을 통해 my-password 생성
kubectl create secret generic my-password --from-literal password=1q2w3e4r

# mypassword, yourpassword라는 문자열로 pw1, pw2 파일 생성
echo mypassword &amp;gt; pw1 &amp;amp;&amp;amp; echo yourpassword &amp;gt; pw2

# secret 기능을 통해 our-password 생성
kubectl create secret generic our-password --from-file pw1 --from-file pw2

# 생성한 password 확인
kubectl get secret

# password의 내용 확인
k get secret my-password -o yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSHPt/btszJ1wOhoT/X3zAxLDkj2Zr3XhkP0Cs81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSHPt/btszJ1wOhoT/X3zAxLDkj2Zr3XhkP0Cs81/img.png&quot; data-alt=&quot;password 생성, 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSHPt/btszJ1wOhoT/X3zAxLDkj2Zr3XhkP0Cs81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSHPt%2FbtszJ1wOhoT%2FX3zAxLDkj2Zr3XhkP0Cs81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;467&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;password 생성, 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698993785429&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 암호화 된 password를 base64를 사용해 확인
echo MXEydzNlNHI= | base64 -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRYlEW/btszGvFFdSo/kcYJBwA9EaZPF48EHHE0I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRYlEW/btszGvFFdSo/kcYJBwA9EaZPF48EHHE0I1/img.png&quot; data-alt=&quot;base64 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRYlEW/btszGvFFdSo/kcYJBwA9EaZPF48EHHE0I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRYlEW%2FbtszGvFFdSo%2FkcYJBwA9EaZPF48EHHE0I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;55&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;base64 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;b&gt;. AWS CLI 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CLI는 Command Line Interface로, AWS를 커맨드 라인에서 제어하기 위한 프로그램이다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698970919010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zip 파일 다운로드
curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o &quot;awscliv2.zip&quot;

# unzip 설치
sudo apt install unzip

# 다운받은 zip 파일 압축 해제
unzip awscliv2.zip

# aws 내 install 실행파일 실행
sudo ./aws/install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vg2D/btszCnuAGgh/kh7SpUx60qjhmaJWsg9T2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vg2D/btszCnuAGgh/kh7SpUx60qjhmaJWsg9T2K/img.png&quot; data-alt=&quot;aws install&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vg2D/btszCnuAGgh/kh7SpUx60qjhmaJWsg9T2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vg2D%2FbtszCnuAGgh%2Fkh7SpUx60qjhmaJWsg9T2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;53&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;aws install&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698971297179&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치 된 aws version 확인
aws --version

# 설치 된 폴더 확인
which aws
which java
which wget

# 관련 된 모든 경로 검색
whichis wget&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc712M/btszH7pJe1a/weio0R2K5qfUifJHRDSdQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc712M/btszH7pJe1a/weio0R2K5qfUifJHRDSdQK/img.png&quot; data-alt=&quot;설치 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc712M/btszH7pJe1a/weio0R2K5qfUifJHRDSdQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc712M%2FbtszH7pJe1a%2Fweio0R2K5qfUifJHRDSdQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;209&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. CLI를 통해 Private Repository 에 image push&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 사용자에게 권한 부여&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698977925523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# iam -&amp;gt; 권한부여
AmazonEC2ContainerRegistryFullAccess&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRUNYc/btszHFtvuVs/hrp6AIiIIB0fyOSwuUvxC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRUNYc/btszHFtvuVs/hrp6AIiIIB0fyOSwuUvxC1/img.png&quot; data-alt=&quot;권한 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRUNYc/btszHFtvuVs/hrp6AIiIIB0fyOSwuUvxC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRUNYc%2FbtszHFtvuVs%2Fhrp6AIiIIB0fyOSwuUvxC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;394&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한 설정&lt;/figcaption&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;&lt;b&gt;2. AWS 홈페이지 내에서 private Repository 생성&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698975336335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Amazon Elastic Container Registry 생성 및 연결
 Elastic Container Registry&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3FGp/btszFH6IxZs/w0TSEo0qLo8MRnh4wkcGXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3FGp/btszFH6IxZs/w0TSEo0qLo8MRnh4wkcGXK/img.png&quot; data-alt=&quot;private repository&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3FGp/btszFH6IxZs/w0TSEo0qLo8MRnh4wkcGXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3FGp%2FbtszFH6IxZs%2Fw0TSEo0qLo8MRnh4wkcGXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;277&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;private repository&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698976088394&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# aws configure 정보 등록
aws configure
1. [엑세스 키]
2. [private 엑세스 키]

# Private Repository 접속
aws ecr get-login-password --region ap-northeast-2 |
docker login --username AWS --password-stdin 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MP0mv/btszFILiJEs/GZXuCxKjkEPSXB7bj1M51K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MP0mv/btszFILiJEs/GZXuCxKjkEPSXB7bj1M51K/img.png&quot; data-alt=&quot;로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MP0mv/btszFILiJEs/GZXuCxKjkEPSXB7bj1M51K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMP0mv%2FbtszFILiJEs%2FGZXuCxKjkEPSXB7bj1M51K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1201&quot; height=&quot;151&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 접속한 repository에 image push&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698976136939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 이미지를 활용해 새로운 태그의 이미지 생성
docker tag ostock/licensing-service:0.0.3-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/amigo

# private repository에 생성한 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/amigo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PI0RP/btszI1bR7Tl/aDRgYEQlzSOPsPPrea1knk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PI0RP/btszI1bR7Tl/aDRgYEQlzSOPsPPrea1knk/img.png&quot; data-alt=&quot;image push&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PI0RP/btszI1bR7Tl/aDRgYEQlzSOPsPPrea1knk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPI0RP%2FbtszI1bR7Tl%2FaDRgYEQlzSOPsPPrea1knk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;75&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;image push&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. CLI에서 repository 생성, image를 버전별로 push&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698977255763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CLI 환경에서 repository 생성
aws ecr create-repository \
    --repository-name ubuntu \
    --image-scanning-configuration scanOnPush=true \
    --region ap-northeast-2
    
# push 할 image 생성
docker tag ubuntu:14.04 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:14.04

# 생성한 repository에 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:14.04

# push 할 다른 버전의 image 생성
docker tag ubuntu:18.04 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:18.04

# 생성한 repository에 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:18.04&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zCtFf/btszFGNvstL/RSWZeGyoDoV4mcPsszker0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zCtFf/btszFGNvstL/RSWZeGyoDoV4mcPsszker0/img.png&quot; data-alt=&quot;push 한 다른 버전의 ubuntu들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zCtFf/btszFGNvstL/RSWZeGyoDoV4mcPsszker0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzCtFf%2FbtszFGNvstL%2FRSWZeGyoDoV4mcPsszker0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;292&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;push 한 다른 버전의 ubuntu들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 기존 서비스를 AWS Repository에 push&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1698982628425&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# eurekaserver, gatewayserver, configserver, kbo-service push
docker tag ostock/eurekaserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/eureka-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/eureka-server:0.0.1-SNAPSHOT

docker tag ostock/kbo-service:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/kbo-service:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/kbo-service:0.0.1-SNAPSHOT

docker tag ostock/gatewayserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/gateway-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/gateway-server:0.0.1-SNAPSHOT

docker tag ostock/configserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/config-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/config-server:0.0.1-SNAPSHOT&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AnibU/btszHTFgVky/32o8yT1eOULcBjc1W7SRj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AnibU/btszHTFgVky/32o8yT1eOULcBjc1W7SRj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AnibU/btszHTFgVky/32o8yT1eOULcBjc1W7SRj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnibU%2FbtszHTFgVky%2F32o8yT1eOULcBjc1W7SRj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;443&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;443&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;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;66&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;일차 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 용도에 따라 컨테이너를 구별하기 위해 namespace를 사용한다. 즉, 실행을 위해 필요한 것들을 모아 하나로 그룹화하여 이름을 붙이는 작업을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 생성한 컨테이너 내부에 특정 설정을 적용하고 싶다면, yaml 파일에 직접 환경설정 정보를 하드코딩하여 적용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 configMap이라 하고, 이를 활용해 로깅레벨 / 볼륨 마운트 등을 설정해 사용할 수 있게 된다.&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;AWS는 반드시 사이트에 접속하지 않더라도 커맨드 환경에서 AWS를 활용할 수 있게 해주는 CLI를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 DockerHub와 같은 Repository 기능도 존재하는데, 이를 활용해 내가 생성한 이미지를 도커 허브가 아니라 AWS 내부에 있는 Repository에 올려, EKS (Elastic Kubernates Service) 를 통해 활용할 수도 있다.&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>66일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/83</guid>
      <comments>https://matcha-dev.tistory.com/83#entry83comment</comments>
      <pubDate>Fri, 3 Nov 2023 12:46:29 +0900</pubDate>
    </item>
    <item>
      <title>[MSA] 18. Ingress, PV / PVC</title>
      <link>https://matcha-dev.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7qNsM/btszFXUR0ad/MK0Hewo2xIE9l6aX7jknx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7qNsM/btszFXUR0ad/MK0Hewo2xIE9l6aX7jknx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7qNsM/btszFXUR0ad/MK0Hewo2xIE9l6aX7jknx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7qNsM%2FbtszFXUR0ad%2FMK0Hewo2xIE9l6aX7jknx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;163&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #0070d1;&quot;&gt;엔코아 플레이데이터(Encore Playdata) Backend&amp;nbsp;2기 백엔드 개발 부트캠프 (playdata.io)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;opengraph&quot; data-og-title=&quot;백엔드 개발 부트캠프&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&quot; data-og-host=&quot;playdata.io&quot; data-og-source-url=&quot;https://playdata.io/bootcamp_backend&quot; data-og-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://playdata.io/bootcamp_backend&quot; data-source-url=&quot;https://playdata.io/bootcamp_backend&quot;&gt;
&lt;div class=&quot;og-image&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 부트캠프&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;playdata.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Ingress, PV / PVC&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Ingress&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;외부에서 내부로 들어오는 패킷을 처리하는 역할로,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer7 에서 정의하는 쿠버네티스 오브젝트이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;외부 요청에 대해 라우팅처리를 하며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;가상호스트 기반의 요청처리,&lt;span&gt;&amp;nbsp;&lt;/span&gt;SSL/TLS 보안 연결 또한 처리한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 외부 요청에 대한 처리 규칙을 쿠버네티스 자체의 기능으로 편리하게 관리할 수있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. PV / PVC&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너의 특징은 컨테이너가 내려가면 저장되어있는 정보가 다 날아간다. 그런데, 쿠버네티스 pod는 언제든 내려갔다 올라올 수 있게 설계 되어있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;때문에 &lt;b&gt;변경사항을 저장을 해둬야 컨테이너가 내려갔다가 다시 올라왔을 때 이전 변경사항을 유지&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 저장하는 공간을 PV (Persistence Volume) 라고 하고, PVC (Persistence Volume Claim) 을 통해 요청을 보내 서비스를 할당, Pod를 생성한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Jenkins&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;jenkins는 git / github 와 파이프라인을 연결할 경우, repository 내 나의 코드에 변경사항을 주기적으로 검사, 감지해서 변경사항을 자동으로 빌드해준다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Ingress 설치&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1698884759355&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# docker실행
sudo service docker start

# minikube 실행
minikube start

# 정상적으로 실행됐는지 확인
kubectl get pods -A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjcxC/btszy7rScCz/WI8iOLgbdQ1FAa4zkZh0tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjcxC/btszy7rScCz/WI8iOLgbdQ1FAa4zkZh0tK/img.png&quot; data-alt=&quot;기본 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjcxC/btszy7rScCz/WI8iOLgbdQ1FAa4zkZh0tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsjcxC%2Fbtszy7rScCz%2FWI8iOLgbdQ1FAa4zkZh0tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;479&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698884956120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ingress 설치
minikube addons enable ingress&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHdSXF/btszAZGymYF/xvQ5U7Fmawzs96vUX5Bxrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHdSXF/btszAZGymYF/xvQ5U7Fmawzs96vUX5Bxrk/img.png&quot; data-alt=&quot;ingress 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHdSXF/btszAZGymYF/xvQ5U7Fmawzs96vUX5Bxrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHdSXF%2FbtszAZGymYF%2FxvQ5U7Fmawzs96vUX5Bxrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1083&quot; height=&quot;168&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ingress 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698885555190&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 접속하기 위한 앱 배포
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

# 포트 노출 
kubectl expose deployment web --type=NodePort --port=8080

# 확인 
kubectl get service web

# 주소 확인 및 서비스 실행
minikube service web --url&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z3XWl/btszCu66IKc/NKCmvaJncXKwIjya6AXBI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3XWl/btszCu66IKc/NKCmvaJncXKwIjya6AXBI1/img.png&quot; data-alt=&quot;pod 생성 및 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3XWl/btszCu66IKc/NKCmvaJncXKwIjya6AXBI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3XWl%2FbtszCu66IKc%2FNKCmvaJncXKwIjya6AXBI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;212&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pod 생성 및 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdZFaR/btszzWwwzsd/sdWf7urAb6k0IKlKnSktkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdZFaR/btszzWwwzsd/sdWf7urAb6k0IKlKnSktkK/img.png&quot; data-alt=&quot;실행한 pod 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdZFaR/btszzWwwzsd/sdWf7urAb6k0IKlKnSktkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdZFaR%2FbtszzWwwzsd%2FsdWf7urAb6k0IKlKnSktkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;313&quot; height=&quot;169&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행한 pod 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Ingress를 통한 LoadBalancer 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 첫 번째 pod 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698885821893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# example-ingress.yaml 파일 생성
vim example-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: example-ingress
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
    rules:
      - host: hello-world.info
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: web
                  port:
                    number: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nyb8R/btszAliOw9C/Tg4qt2fSIaf3jbjiVc6leK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nyb8R/btszAliOw9C/Tg4qt2fSIaf3jbjiVc6leK/img.png&quot; data-alt=&quot;yaml 파일 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nyb8R/btszAliOw9C/Tg4qt2fSIaf3jbjiVc6leK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnyb8R%2FbtszAliOw9C%2FTg4qt2fSIaf3jbjiVc6leK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;367&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;yaml 파일 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698886098161&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 작성한 yaml 파일 적용
kubectl apply -f ./example-ingress.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biuhKK/btszDy2jwWe/NduAvjEBEo4aJekKeRZQKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biuhKK/btszDy2jwWe/NduAvjEBEo4aJekKeRZQKk/img.png&quot; data-alt=&quot;yaml 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biuhKK/btszDy2jwWe/NduAvjEBEo4aJekKeRZQKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiuhKK%2FbtszDy2jwWe%2FNduAvjEBEo4aJekKeRZQKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;49&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;yaml 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698886361621&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ingress 확인
kubectl get ingress&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coFx7a/btszCJXgdYa/zjubpF6K7nY0cFePgmJRR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coFx7a/btszCJXgdYa/zjubpF6K7nY0cFePgmJRR1/img.png&quot; data-alt=&quot;ingress 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coFx7a/btszCJXgdYa/zjubpF6K7nY0cFePgmJRR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoFx7a%2FbtszCJXgdYa%2FzjubpF6K7nY0cFePgmJRR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;71&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ingress 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698887296512&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ingress ip 등록
sudo vim /etc/hosts
192.168.49.2    hello-world.info&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLs1CV/btszDCp484V/FtS5qtpsp5K6yPThlmukkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLs1CV/btszDCp484V/FtS5qtpsp5K6yPThlmukkk/img.png&quot; data-alt=&quot;ip 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLs1CV/btszDCp484V/FtS5qtpsp5K6yPThlmukkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLs1CV%2FbtszDCp484V%2FFtS5qtpsp5K6yPThlmukkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;287&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ip 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1698887512284&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# curl을 날려 ip가 잘 등록되었는지 확인
curl hello-world.info&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qSrZC/btszCtG8PfP/IMJDml1oXRnYEqEZLX2Jc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qSrZC/btszCtG8PfP/IMJDml1oXRnYEqEZLX2Jc1/img.png&quot; data-alt=&quot;ip 등록된 것 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qSrZC/btszCtG8PfP/IMJDml1oXRnYEqEZLX2Jc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqSrZC%2FbtszCtG8PfP%2FIMJDml1oXRnYEqEZLX2Jc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;92&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ip 등록된 것 확인&lt;/figcaption&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;2. 두 번째 pod 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698888453488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 두번째 pod 생성
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0

# deployment 노출 
kubectl expose deployment web2 --port=8080 --type=NodePort

# deployment를 하나 더 띄우기 위한 vim 수정
vim example-ingress.yaml

- path: /v2
  pathType: Prefix
  backend:
    service: 
      name: web2
      port:
        number: 8080

# 작성한 yaml 파일 적용
kubectl apply -f ./example-ingress.yaml

# curl을 날려 ip가 잘 등록되었는지 확인
curl hello-world.info/v2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nizuQ/btszCnAbVEw/otprHkdFDrtOuP9ZWG5x4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nizuQ/btszCnAbVEw/otprHkdFDrtOuP9ZWG5x4k/img.png&quot; data-alt=&quot;curl을 날려 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nizuQ/btszCnAbVEw/otprHkdFDrtOuP9ZWG5x4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnizuQ%2FbtszCnAbVEw%2FotprHkdFDrtOuP9ZWG5x4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;88&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;curl을 날려 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. pv / pvc 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도킹이란, 서로 다른 환경을 연결하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wsl과 windows 서로 도킹을 하여 공유 패키지로 mnt 디렉토리를 이용한다.&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;1. volume 세팅을 위한 pv-volume.yaml 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698892773013&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pv-volume.yaml 파일 생성
vim pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: &quot;/mnt/data&quot;

# 작성한 yaml 파일 등록
kubectl apply -f pv-volume.yaml

# 등록된 것 확인
kubectl get pv task-pv-volume&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJifcS/btszAlwl2jG/dBSjRPurHykebGn4IKIU2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJifcS/btszAlwl2jG/dBSjRPurHykebGn4IKIU2k/img.png&quot; data-alt=&quot;등록 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJifcS/btszAlwl2jG/dBSjRPurHykebGn4IKIU2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJifcS%2FbtszAlwl2jG%2FdBSjRPurHykebGn4IKIU2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;70&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;등록 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. pvc를 세팅하기 위한 pv-claim.yaml 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698892944065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pv-claim.yaml 파일 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
      
# 작성한 yaml 파일 등록
kubectl apply -f pv-claim.yaml

# 등록된 것 확인
kubectl get pv task-pv-claim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MNO4Q/btszCrCFlQk/xIeoxlBDRZcd1VheGeEiAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MNO4Q/btszCrCFlQk/xIeoxlBDRZcd1VheGeEiAk/img.png&quot; data-alt=&quot;Bound 된 것 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MNO4Q/btszCrCFlQk/xIeoxlBDRZcd1VheGeEiAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMNO4Q%2FbtszCrCFlQk%2FxIeoxlBDRZcd1VheGeEiAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;67&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bound 된 것 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. pv / pvc 를 통해 pod를 생성하기 위한 pv-pod.yaml 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698893318565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# pv-pod.yaml 파일 생성
vim pv-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: &quot;http-server&quot;
      volumeMounts:
        - mountPath: &quot;/usr/share/nginx/html&quot;
          name: task-pv-storage
          
      
# 작성한 yaml 파일 등록
kubectl apply -f pv-pod.yaml

# 등록된 것 확인
kubectl get pod task-pv-pod&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgVRlq/btszCLAOFJW/5GyFa5ty1WbZWVEkBhCEa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgVRlq/btszCLAOFJW/5GyFa5ty1WbZWVEkBhCEa0/img.png&quot; data-alt=&quot;pod 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgVRlq/btszCLAOFJW/5GyFa5ty1WbZWVEkBhCEa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgVRlq%2FbtszCLAOFJW%2F5GyFa5ty1WbZWVEkBhCEa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;74&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pod 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. pv / pvc 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698893513088&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# minikube를 통해 쿠버네티스에 접속
minikube ssh

# /mnt/data 디렉토리 접근
cd /mnt/data

# html 파일 생성
sudo sh -c &quot;echo 'Hello from Kubernetes storage' &amp;gt; /mnt/data/index.html&quot;

# pod 내에 접속
kubectl exec -it task-pv-pod -- /bin/bash

# html 파일이 있는 디렉토리 접근
cd /usr/share/nginx/html

# 파일이 존재하는지 확인
cat index.html&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAm37Q/btszCejfmDD/l75YDIHMKf0xZK2hW4FwxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAm37Q/btszCejfmDD/l75YDIHMKf0xZK2hW4FwxK/img.png&quot; data-alt=&quot;pv / pvc 기능 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAm37Q/btszCejfmDD/l75YDIHMKf0xZK2hW4FwxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAm37Q%2FbtszCejfmDD%2Fl75YDIHMKf0xZK2hW4FwxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;993&quot; height=&quot;247&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pv / pvc 기능 확인&lt;/figcaption&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;pv-volume.yaml 을 통해 /mnt/data 를 바라보게 만들었고, pv-claim.yaml 을 통해 요청을 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 pv-pod.yaml 을 통해 /usr/share/nginx/html 를 volumeMount로 사용함으로서 pv, pvc, pod가 모두 연결 시킨 구조로 만들었다.&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;결과를 확인하기 위해, pod 생성 후 해당 pod 내에 들어가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/share/nginx/html 로 접근하여 /mnt/data 내에 있던 index.html이 존재하는지 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Jenkins 실행&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1698905522161&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# jenkins 컨테이너 생성
kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password &amp;amp;&amp;amp; echo

# 실행을 위한 포트포워딩
kubectl --namespace default port-forward svc/jenkins 20000:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qNgWu/btszCGfQQba/G2ndutI24ComqvjrW4L720/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qNgWu/btszCGfQQba/G2ndutI24ComqvjrW4L720/img.png&quot; data-alt=&quot;실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qNgWu/btszCGfQQba/G2ndutI24ComqvjrW4L720/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqNgWu%2FbtszCGfQQba%2FG2ndutI24ComqvjrW4L720%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1314&quot; height=&quot;125&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ee8oHx/btszCejQ6pL/bG24gF1uNNS9E2rdPQ6LGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ee8oHx/btszCejQ6pL/bG24gF1uNNS9E2rdPQ6LGK/img.png&quot; data-alt=&quot;jenkins 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ee8oHx/btszCejQ6pL/bG24gF1uNNS9E2rdPQ6LGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fee8oHx%2FbtszCejQ6pL%2FbG24gF1uNNS9E2rdPQ6LGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1891&quot; height=&quot;424&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;jenkins 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;65&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;일차 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ingress는 OSI 7계층에서 Layer7을 담당하는 쿠버네티스 오브젝트로, 이를 활용해 로드밸런싱 또한 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스는 컨테이너를 관리하기 위한 오케스트레이션 툴로, 컨테이너가 모종의 이유로 종료되거나 중지 될 시 replica를 통해 컨테이너를 대체하여 해당 서비스를 유지하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 이 때 컨테이너가 종료된다면 컨테이너 실행 이후 변경사항이 전부 날아가게 된다. 그렇다면 서비스가 제대로 유지될 수가 없기 때문에 Volume을 통해 변경사항을 저장해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 PV, PVC를 사용하여 변경사항을 유지, 서비스를 유지하게 된다.&lt;/p&gt;</description>
      <category>Bootcamp/MSA</category>
      <category>65일차</category>
      <category>후기</category>
      <author>서기A</author>
      <guid isPermaLink="true">https://matcha-dev.tistory.com/82</guid>
      <comments>https://matcha-dev.tistory.com/82#entry82comment</comments>
      <pubDate>Thu, 2 Nov 2023 12:41:22 +0900</pubDate>
    </item>
  </channel>
</rss>