<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이 또한 지나가리</title>
    <link>https://jiyoungkim93.tistory.com/</link>
    <description>나의 모든 순간을 사랑하자</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 22:39:46 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jjiiyoung</managingEditor>
    <item>
      <title>[JAVA Study02]  List / Set / Map</title>
      <link>https://jiyoungkim93.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 데이터 여러개를 다루기 위해서는 배열이나 컬렉션을 사용한다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열은 크기가 고정이라 'new int[10]' 처럼 한 번 선언하면 10이라는 크기를 변경하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 크기가 가변적인 컬렉션이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. List&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내부에 배열(Object[])를 보유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 요소 추가 시 배열에 값을 순서대로 저장하고 인덱스로 값에 접근한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 순서가 중요하거나 값을 자주 꺼내야할 때 List를 쓴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnmjVU/dJMcahpUUED/AikllrWkX8csCLZefQzCYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnmjVU/dJMcahpUUED/AikllrWkX8csCLZefQzCYk/img.png&quot; data-alt=&quot;출처 : https://www.tcpschool.com/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnmjVU/dJMcahpUUED/AikllrWkX8csCLZefQzCYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnmjVU%2FdJMcahpUUED%2FAikllrWkX8csCLZefQzCYk%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;235&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://www.tcpschool.com/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1771761163850&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface List&amp;lt;E&amp;gt; extends SequencedCollection&amp;lt;E&amp;gt; {}

public interface SequencedCollection&amp;lt;E&amp;gt; extends Collection&amp;lt;E&amp;gt; {}

public interface Collection&amp;lt;E&amp;gt; extends Iterable&amp;lt;E&amp;gt; {}

public interface Iterable&amp;lt;T&amp;gt; {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771761916112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(&quot;A&quot;);
    list.add(&quot;B&quot;);

    System.out.println(list);		// [A,B]
    System.out.println(list.size());	// 2
    System.out.println(list.get(0));	// A

    for (String s : list) {
        System.out.println(s);		// A B 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Set&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 순서가 없는 데이터 집합으로 데이터의 중복을 허용하지 않는다. 중복된 값을 추가하면 무시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내부에 HashMap을 사용한다 {A, B, C}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장할 때 hashCode() 계산 -&amp;gt; 버킷 위치 찾음 -&amp;gt; equals()로 중복 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중복 제거가 목적일 때 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1771768810027&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Set&amp;lt;E&amp;gt; extends Collection&amp;lt;E&amp;gt;

public interface Collection&amp;lt;E&amp;gt; extends Iterable&amp;lt;E&amp;gt;

public interface Iterable&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1771768744221&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;();
    set.add(&quot;A&quot;);
    set.add(&quot;B&quot;);
    System.out.println(set);	//[A,B]
}&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;h4 data-ke-size=&quot;size20&quot;&gt;3. Collection Interface&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- List와 Set은 Collection 인터페이스를 상속받는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Collection 인터페이스에서 제공하는 주요 메소드는 아래와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 272px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 20px;&quot;&gt;메소드&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 20px;&quot;&gt;boolean add(E,e)&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 20px;&quot;&gt;요소 추가&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;list.add(&quot;A&quot;);&lt;br /&gt;set.add(&quot;A&quot;);&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 20px;&quot;&gt;void clear&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 20px;&quot;&gt;컬렉션 요소 제거&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;list.clear();&lt;br /&gt;set.clear();&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 40px;&quot;&gt;boolean contains(Object o)&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 40px;&quot;&gt;컬렉션이 전달된 객체에 포함되어 있는지 확인&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 40px;&quot;&gt;boolean equals(Object o)&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 40px;&quot;&gt;컬렉션과 전달된 객체가 같은지 확인&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 20px;&quot;&gt;boolean isEmpty()&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 20px;&quot;&gt;컬렉션이 비었는지 확인&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 35px;&quot;&gt;boolean remove(Object o)&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 35px;&quot;&gt;컬렉션에서 전달된 객체 제거&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.remove(index);&lt;br /&gt;list.remove(0);&lt;br /&gt;set.remove(value);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 20px;&quot;&gt;int size()&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 20px;&quot;&gt;컬렉션 요소의 총 개수 반환&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;list.size();&lt;br /&gt;set.size();&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 40px;&quot;&gt;Object[] toArray()&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 40px;&quot;&gt;컬렉션의 모든 요소를 Object 타입의 배열로 변환&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 40px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Object[] &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #6a3e3e;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.toArray();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 35.2326%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #575757; text-align: left;&quot;&gt;Iterator&amp;lt;E&amp;gt; iterator()&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; height: 17px;&quot;&gt;컬렉션의 반복자를 반환함&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 17px;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Map&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 'Key : Value' 한 쌍으로 이루어지는 데이터 집합으로 순서가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Key는 중복이 불가하고 Value는 중복을 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HashMap : 빠름, 순서 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LinkedHashMap : 입력 순서 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TreeMap : 정렬 유지&lt;/p&gt;
&lt;pre id=&quot;code_1771768952465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    Map&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
    map.put(&quot;A&quot;, 1);
    map.put(&quot;B&quot;, 1);
    System.out.println(map.get(&quot;A&quot;));		//1
    System.out.println(map.containsKey(&quot;A&quot;));	//true
    map.remove(&quot;A&quot;);
    System.out.println(map.containsKey(&quot;A&quot;));	//false
    
    map.put(&quot;C&quot;, 2);
    //keySet : key를 모아 Set형태로 반환 
    System.out.println(map.keySet());  		//[B,C]
    for (String s : map.keySet()) {
        System.out.println(s + &quot;, &quot; + map.get(s));
    }
    
    //entrySet : key-value 쌍을 Entry 객체의 set으로 반환
    for (Map.Entry&amp;lt;String, Integer&amp;gt; entry : map.entrySet()) {
        System.out.println(entry.getKey() + &quot;, &quot; + entry.getValue());
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발 일만시간의 법칙</category>
      <category>자바 #JAVA #List #Set #Map #collection #컬렉션</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/28</guid>
      <comments>https://jiyoungkim93.tistory.com/28#entry28comment</comments>
      <pubDate>Sun, 22 Feb 2026 23:12:51 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA Study01] 기본형과 참조형</title>
      <link>https://jiyoungkim93.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 기본형 타입(primitive type)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- boolean, byte, short, int, long, float, double, char&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 값을 저장하며 stack 메모리에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- int a = 10; 이라고 선언하면 a 안에는 10이라는 값 자체가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본값이 존재하기 때문에 Null 개념이 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 참조형 타입(reference type)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- String, 배열, 객체 등 기본형 타입을 제외한 모든 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체가 저장된 위치 즉, 주소값을 저장하며 heap 메모리에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- String s = &quot;hello&quot;; 라고 선언하면 s 안에는 &quot;hello&quot; 객체의 주소가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 빈 객체를 의미하는 Null 개념이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Interger는 참조형이나 -128 ~ 127 범위의 Integer는 캐싱하여 같은 객체를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1771686619564&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer a0 = 100;
Integer b0 = 100;
System.out.println(a0 == b0); //true

Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1); //false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 기본형 vs 참조형&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본형은 값 복사 시 값 자체가 복사된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 참조형은 주소 값이 복사 된다. 그래서 참조형은 같은 객체는 가리킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;'=='&lt;/b&gt; 는 &lt;u&gt;같은 객체인가&lt;/u&gt;?를 비교한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;'equals()'&lt;/b&gt;는 &lt;u&gt;논리적으로 같은 값인지? 비교&lt;/u&gt;한다. &quot;hello&quot;라는 리터럴과 new String(&quot;hello&quot;)는 주소는 다를 수 있으나, 논리적인 값은 같기 때문에 '=='로 비교하면 false, equals()로 비교하면 true가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; String 리터럴은 보통 String pool에 저장되어 재사용되는데, new String()으로 선언 시 무조건 새 객체가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본형은 빠르고 단순해야하고, 객체는 여러 변수가 같은 객체를 공유할 수 있도록 유연하게 설계되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 물리적 값과 논리적 값&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 물리적 값은 메모리 관점으로 실제 저장된 값으로 기본형은 값 자체가 저장되고 객체는 주소가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 논리적 값은 내용 자체를 의미한다. 예를 들어, String &quot;hello&quot;의 논리적 값은 문자열 내용 자체인 'hello'를 가리킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1771684869043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    int a = 10;
    int b = a;
    a = 99;
    System.out.println(b);		// 10 (a값 변경에 영향을 받지 않음)

    int[] arr1 = {1, 2, 3};				
    int[] arr2 = arr1;			// 주소가 복사됨(같은 배열을 바라 봄)
    arr1[0] = 99;						
    System.out.println(arr2[0]);	// 99 (같은 객체를 바라봐 값에 영향 받음)
    System.out.println(arr1);		// [I@452b3a41
    System.out.println(arr2);		// [I@452b3a41
    
    System.out.println(s1 == s2); 	// true (String pool에서 값을 가져옴)
    System.out.println(s1 == s3); 	// false (같은 객체가 아니라 주소값이 다름)
    System.out.println(s1.equals(s3));	//true (값을 비교)

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개발 일만시간의 법칙</category>
      <category>자바 #JAVA #기본형 #참조형 #primitive #reference</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/27</guid>
      <comments>https://jiyoungkim93.tistory.com/27#entry27comment</comments>
      <pubDate>Sun, 22 Feb 2026 00:12:23 +0900</pubDate>
    </item>
    <item>
      <title>[Lab01] VirtualBox(v 7.2.6)에 Ubuntu 24.04 설치하기</title>
      <link>https://jiyoungkim93.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Oracle VirtualBox v7 설치 및 Ubuntu iso 이미지 다운로드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- iso 이미지는 2026.02월 기준 24.04 LTS를 다운받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770529041094&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Downloads     &amp;ndash; Oracle VirtualBox&quot; data-og-description=&quot;This VirtualBox Extension Pack Personal Use and Educational License governs your access to and use of the VirtualBox Extension Pack. It does not apply to the VirtualBox base package and/or its source code, which are licensed under version 3 of the GNU Gene&quot; data-og-host=&quot;www.virtualbox.org&quot; data-og-source-url=&quot;https://www.virtualbox.org/wiki/Downloads&quot; data-og-url=&quot;https://www.virtualbox.org/wiki/Downloads&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eG5x5/dJMb83koBd6/HfXQsZaJED5EseFtWsdXSk/img.png?width=2208&amp;amp;height=552&amp;amp;face=0_0_2208_552,https://scrap.kakaocdn.net/dn/cUox1a/dJMb86nTbWa/m4JAtHXE6XcZhuyDSOM3i0/img.png?width=232&amp;amp;height=232&amp;amp;face=0_0_232_232&quot;&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.virtualbox.org/wiki/Downloads&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eG5x5/dJMb83koBd6/HfXQsZaJED5EseFtWsdXSk/img.png?width=2208&amp;amp;height=552&amp;amp;face=0_0_2208_552,https://scrap.kakaocdn.net/dn/cUox1a/dJMb86nTbWa/m4JAtHXE6XcZhuyDSOM3i0/img.png?width=232&amp;amp;height=232&amp;amp;face=0_0_232_232');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Downloads &amp;ndash; Oracle VirtualBox&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This VirtualBox Extension Pack Personal Use and Educational License governs your access to and use of the VirtualBox Extension Pack. It does not apply to the VirtualBox base package and/or its source code, which are licensed under version 3 of the GNU Gene&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.virtualbox.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ubuntu.com/download/server&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770529014875&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Get Ubuntu Server | Download | Ubuntu&quot; data-og-description=&quot;Get Ubuntu Server one of three ways; by using Multipass on your desktop, using MAAS to provision machines in your data centre or installing it directly on a server.&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/download/server&quot; data-og-url=&quot;https://ubuntu.com/download/server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cT8HEx/dJMb8864yMn/vxk3dQH1LCA0oZskC7cHdK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/6lbS0/dJMb84XUpLy/EXrDiRoQDmaO01zIFsb4MK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bICJUx/dJMb9lL7eQn/2ta8KAUJPH9VkSmd8FejU0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/download/server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cT8HEx/dJMb8864yMn/vxk3dQH1LCA0oZskC7cHdK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/6lbS0/dJMb84XUpLy/EXrDiRoQDmaO01zIFsb4MK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bICJUx/dJMb9lL7eQn/2ta8KAUJPH9VkSmd8FejU0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Get Ubuntu Server | Download | Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get Ubuntu Server one of three ways; by using Multipass on your desktop, using MAAS to provision machines in your data centre or installing it directly on a server.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://documentation.ubuntu.com/server/reference/installation/system-requirements/?utm_source=chatgpt.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://documentation.ubuntu.com/server/reference/installation/system-requirements/?utm_source=chatgpt.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1770547266122&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;System requirements&quot; data-og-description=&quot;Ubuntu Server provides a flexible base for your solution that can run on a wide range of hardware, from small virtual machines to enterprise-scale computing. Hard requirements depend on the scenari...&quot; data-og-host=&quot;documentation.ubuntu.com&quot; data-og-source-url=&quot;https://documentation.ubuntu.com/server/reference/installation/system-requirements/?utm_source=chatgpt.com&quot; data-og-url=&quot;https://documentation.ubuntu.com/server/reference/installation/system-requirements/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://documentation.ubuntu.com/server/reference/installation/system-requirements/?utm_source=chatgpt.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://documentation.ubuntu.com/server/reference/installation/system-requirements/?utm_source=chatgpt.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;System requirements&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu Server provides a flexible base for your solution that can run on a wide range of hardware, from small virtual machines to enterprise-scale computing. Hard requirements depend on the scenari...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;documentation.ubuntu.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 새로운 가상머신 만들기&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;★&lt;u&gt;가상머신 설치만 목적이라면 1) 은 넘어가고 2) 가상머신 + ISO 설치를 참고해주세요.&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상머신을 만드는 것은 내 PC에 가상 PC를 하나 더 생성하는 것과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상머신을 생성할 때 ISO 이미지를 첨부해 '가상머신 + OS'를 한 번에 구성할 수도 있고, 가상머신만 생성 한 뒤 OS를 설치할 수도 있다. 나는 가상머신의 환경을 이해하는 것이 목적이기 때문에 두 개 방법으로 각각 생성해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) 가상머신 생성 후 Ubuntu 직접 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-1) 가상머신 새로만들기 -&amp;gt; ISO Image는 선택하지 않고 OS 이름, 종류, 버전만 설정&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;1152&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDua2P/dJMcaflb8qn/KKFoggp8FQG1ReadUlw3j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDua2P/dJMcaflb8qn/KKFoggp8FQG1ReadUlw3j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDua2P/dJMcaflb8qn/KKFoggp8FQG1ReadUlw3j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDua2P%2FdJMcaflb8qn%2FKKFoggp8FQG1ReadUlw3j1%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;1152&quot; height=&quot;804&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-2) Specity virtual hardware에서 CPU, RAM 설정&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;- 나는 ubuntu server 24.04 최소 요구 사항인 mem 3GB, 디스크 25GB로 설정했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S7ehl/dJMcacIM8ZZ/6GUzmapsducvfqkwKFPiMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S7ehl/dJMcacIM8ZZ/6GUzmapsducvfqkwKFPiMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S7ehl/dJMcacIM8ZZ/6GUzmapsducvfqkwKFPiMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS7ehl%2FdJMcacIM8ZZ%2F6GUzmapsducvfqkwKFPiMK%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;894&quot; height=&quot;186&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-3) Specify virtual hard disk에서 디스크 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 미리 전체 크기 할당 옵션을 체크하면 로컬 디스크 공간에서 바로 가상 하드디스크의 용량이 할당된다. 나는 동적 할당을 위해 이 옵션은 체크하지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY43tU/dJMcafZMB8f/VIP95fCDVxbb0zLemuJUN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY43tU/dJMcafZMB8f/VIP95fCDVxbb0zLemuJUN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY43tU/dJMcafZMB8f/VIP95fCDVxbb0zLemuJUN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY43tU%2FdJMcafZMB8f%2FVIP95fCDVxbb0zLemuJUN0%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;898&quot; height=&quot;497&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-4) VM에 Ubuntu 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VM선택 -&amp;gt; 설정 -&amp;gt; 저장소 -&amp;gt; 컨트롤러:IDE -&amp;gt; choose a Disk File -&amp;gt; iso 파일 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxKwvH/dJMb99ZBUFn/hrQIRCFrBd0c5DUzg9HuN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxKwvH/dJMb99ZBUFn/hrQIRCFrBd0c5DUzg9HuN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxKwvH/dJMb99ZBUFn/hrQIRCFrBd0c5DUzg9HuN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxKwvH%2FdJMb99ZBUFn%2FhrQIRCFrBd0c5DUzg9HuN1%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;1205&quot; height=&quot;378&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bl4mc/dJMcadt5RjO/MQNnMQuBik4D8rTwxpFkJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bl4mc/dJMcadt5RjO/MQNnMQuBik4D8rTwxpFkJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bl4mc/dJMcadt5RjO/MQNnMQuBik4D8rTwxpFkJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBl4mc%2FdJMcadt5RjO%2FMQNnMQuBik4D8rTwxpFkJk%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;1205&quot; height=&quot;353&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-5) 가상머신 시작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어는 english로 선택하고 넘어갔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nE3bD/dJMcadVaKRH/NS35lSqYcycrmSKRpKn3rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nE3bD/dJMcadVaKRH/NS35lSqYcycrmSKRpKn3rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nE3bD/dJMcadVaKRH/NS35lSqYcycrmSKRpKn3rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnE3bD%2FdJMcadVaKRH%2FNS35lSqYcycrmSKRpKn3rk%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;727&quot; height=&quot;510&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ubuntu 서버 지본 표준 선택&lt;/p&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;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WDbi4/dJMcacosSXo/gqZgHRQSrtwTHu42nKXFD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WDbi4/dJMcacosSXo/gqZgHRQSrtwTHu42nKXFD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WDbi4/dJMcacosSXo/gqZgHRQSrtwTHu42nKXFD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWDbi4%2FdJMcacosSXo%2FgqZgHRQSrtwTHu42nKXFD1%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;592&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ubuntu가 사용할 네트워크 인터페이스 설정으로 네트워크로 NAT로 설정하면 가상머신은 10.0.2.0/24 대역을 자동으로 할당받아 별도의 설정없이 인터넷에 연결된다. 설정 변경없이 다음 단계로 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv8kce/dJMcabiOTng/hQvQt1KXkQE5lUYrO4V1Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv8kce/dJMcabiOTng/hQvQt1KXkQE5lUYrO4V1Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv8kce/dJMcabiOTng/hQvQt1KXkQE5lUYrO4V1Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv8kce%2FdJMcabiOTng%2FhQvQt1KXkQE5lUYrO4V1Xk%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;1236&quot; height=&quot;441&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- proxy 서버는 필요하지 않아 변경없이 다음으로 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pFTRM/dJMcacB0LUD/3bitpegAQv2BEI0kHckAxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pFTRM/dJMcacB0LUD/3bitpegAQv2BEI0kHckAxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pFTRM/dJMcacB0LUD/3bitpegAQv2BEI0kHckAxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpFTRM%2FdJMcacB0LUD%2F3bitpegAQv2BEI0kHckAxk%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;1198&quot; height=&quot;282&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ubuntu 패키지를 어디서 다운받을지 주소를 적는 단계로 일반적으로 설치 프로그램이 가장 가까운 국가의 미러 서버를 자동 선택하며 한국에서는 kr.archive.ubuntu.com 가 설정된다. 변경없이 다음으로 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDAebe/dJMcadHDGCM/zDX9VwMFFZAolwHaefCCL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDAebe/dJMcadHDGCM/zDX9VwMFFZAolwHaefCCL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDAebe/dJMcadHDGCM/zDX9VwMFFZAolwHaefCCL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDAebe%2FdJMcadHDGCM%2FzDX9VwMFFZAolwHaefCCL1%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;1220&quot; height=&quot;366&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상머신 생성 시 추가했던 25GB 디스크를 어떤 구조로 설치할지 설정하는 단계이다. 기본적으로 디스크 전체 사용 + LVM 구성이 기본 권장이라 변경없이 다음으로 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh0Q1e/dJMcaivpZUN/Gxuj9z1kNAcr4QyftvEapk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh0Q1e/dJMcaivpZUN/Gxuj9z1kNAcr4QyftvEapk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh0Q1e/dJMcaivpZUN/Gxuj9z1kNAcr4QyftvEapk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh0Q1e%2FdJMcaivpZUN%2FGxuj9z1kNAcr4QyftvEapk%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;1237&quot; height=&quot;521&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상디스크 사용을 확인하는 단계로 변경없이 다음으로 넘어간다. confirm 창이 뜨는데 그대로 continue한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjKial/dJMcahJ6yOP/lnGJzDoBZV4kMwUn2bkbB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjKial/dJMcahJ6yOP/lnGJzDoBZV4kMwUn2bkbB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjKial/dJMcahJ6yOP/lnGJzDoBZV4kMwUn2bkbB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjKial%2FdJMcahJ6yOP%2FlnGJzDoBZV4kMwUn2bkbB0%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;1135&quot; height=&quot;660&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 계정 설정 한 후 upgrade는 skip한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OhEJM/dJMcaiPHKBm/RDJKxYNZCTgsH3PLxkHldK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OhEJM/dJMcaiPHKBm/RDJKxYNZCTgsH3PLxkHldK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OhEJM/dJMcaiPHKBm/RDJKxYNZCTgsH3PLxkHldK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOhEJM%2FdJMcaiPHKBm%2FRDJKxYNZCTgsH3PLxkHldK%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;1227&quot; height=&quot;326&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ubuntu 설치 후 터미널로 접속하기 위해 Install OpenSSH sever를 체크하고 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bizS5g/dJMcabiOTLY/2OPMASOCbrLUPk0gDUXLe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bizS5g/dJMcabiOTLY/2OPMASOCbrLUPk0gDUXLe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bizS5g/dJMcabiOTLY/2OPMASOCbrLUPk0gDUXLe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbizS5g%2FdJMcabiOTLY%2F2OPMASOCbrLUPk0gDUXLe1%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;1170&quot; height=&quot;379&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 당장 추가가 필요한 프로그램이 없어 그냥 넘어간다. 여기서 Done을 누르면 Ubuntu가 설치된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edzvjK/dJMcahi2D6M/LKu1r4TK3z3Wml08n9OKv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edzvjK/dJMcahi2D6M/LKu1r4TK3z3Wml08n9OKv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edzvjK/dJMcahi2D6M/LKu1r4TK3z3Wml08n9OKv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedzvjK%2FdJMcahi2D6M%2FLKu1r4TK3z3Wml08n9OKv1%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;1217&quot; height=&quot;500&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-6) 설치 끝나고 터미널에서 접속하기 위해 네트워크 설정을 추가한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포트포워딩 설정을 해서 127.0.0.1:port로 접속해도 되지만 전용 IP를 할당해보려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존에 쓰던 어댑터 설정은 두고 새로 만들었다. 만들기를 클릭하면 자동으로 IPv4 주소를 세팅해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dis68L/dJMcagqRK0u/lAlLLGKIPrGmjF0AvsJOBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dis68L/dJMcagqRK0u/lAlLLGKIPrGmjF0AvsJOBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dis68L/dJMcagqRK0u/lAlLLGKIPrGmjF0AvsJOBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdis68L%2FdJMcagqRK0u%2FlAlLLGKIPrGmjF0AvsJOBk%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;706&quot; height=&quot;478&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상머신 -&amp;gt; 설정 -&amp;gt; 네트워크에서 방금 만든 어댑터를 추가해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNFMnJ/dJMcad1VTxF/7M5XlkyNEmyxyAcEJVQkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNFMnJ/dJMcad1VTxF/7M5XlkyNEmyxyAcEJVQkK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNFMnJ/dJMcad1VTxF/7M5XlkyNEmyxyAcEJVQkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNFMnJ%2FdJMcad1VTxF%2F7M5XlkyNEmyxyAcEJVQkK0%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;704&quot; height=&quot;368&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 가상머신 실행 후 ip 세팅을 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1770554310959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/netplan/50-cloud-init.yaml

network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
# 추가- address는 192.168.209.2 - 254 중 다른 장비와 겹치지 않는 값 사용
    enp0s8:
      dhcp4: no
      addresses:
        - 192.168.209.10/24
        
$ sudo netplan apply&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mobaxterm을 통해 ubuntu에 접속. 터미널 도구는 사용하기 편한걸로 선택해서 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeGMj7/dJMcabJTiXh/ElaJpgrR9kTWTA2bOAscd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeGMj7/dJMcabJTiXh/ElaJpgrR9kTWTA2bOAscd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeGMj7/dJMcabJTiXh/ElaJpgrR9kTWTA2bOAscd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeGMj7%2FdJMcabJTiXh%2FElaJpgrR9kTWTA2bOAscd0%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;614&quot; height=&quot;327&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 가상머신 + ISO 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-1) 새로만들기 -&amp;gt; 다운받은 ubuntu iso파일을 ISO Image란에 첨부&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ISO 파일 첨부 시, Procceed with Unattended Installation가 체크되는데 이 설정은 VM 생성 시 ISO 부팅, Ubuntu 설치를 자동으로 진행해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1EO6k/dJMcaiWuBx0/KonSMgh4JaYfON1xsOaKeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1EO6k/dJMcaiWuBx0/KonSMgh4JaYfON1xsOaKeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1EO6k/dJMcaiWuBx0/KonSMgh4JaYfON1xsOaKeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1EO6k%2FdJMcaiWuBx0%2FKonSMgh4JaYfON1xsOaKeK%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;1132&quot; height=&quot;418&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Set up unattended gueset OS Installation 설정에서 VM에 설치할 Ubuntu의 hostname과 비밀번호를 입력. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hostanme은 '-' 와 공백을 허용하지 않아 ubuntu로 수정해줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AQ3dl/dJMb99L1Rdm/lMYGcmP3d8z2BKb6mZHjq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AQ3dl/dJMb99L1Rdm/lMYGcmP3d8z2BKb6mZHjq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AQ3dl/dJMb99L1Rdm/lMYGcmP3d8z2BKb6mZHjq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAQ3dl%2FdJMb99L1Rdm%2FlMYGcmP3d8z2BKb6mZHjq0%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;918&quot; height=&quot;317&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 리소스, 디스크 설정은 위와 같이 변경하고 완료를 누르면 자동으로 Ubuntu 까지 설치된다.&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;</description>
      <category>인프라</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/26</guid>
      <comments>https://jiyoungkim93.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 8 Feb 2026 21:57:26 +0900</pubDate>
    </item>
    <item>
      <title>Codex 사용하기</title>
      <link>https://jiyoungkim93.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Codex&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어 개발과 엔지니어링 업무를 위해 특화된 AI 에이전트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2026.02.05 codex-5.3 배포. 기존보다 처리 속도가 25% 정도 높다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Codex는 유료 ChatGPT 플랜에서 제공되며 Codex를 사용할 수 있는(앱, CLI, IDE 확장프로그램, 웹)에서 이용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;=&amp;gt; IDE는 VS Code, Cursor, Windsurf 연동 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ChatGPT Plus를 구독해 Codex를 사용해보았는데 개발 최적화라는 말이 왜 나왔는지 알 수 있었다. 프로젝트의 흐름 설명, 기능 구현, 테스트 코드까지 빠르고 피드백 반영이 빨랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(요새는 클로드보다 Codex라고 한다. 또 언제 바뀔지 모르지만.)&lt;/p&gt;
&lt;div style=&quot;background-color: #000000; color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MEAWD/dJMcaioIhFl/N0ejmRlNCJqSRwbpiCY0l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MEAWD/dJMcaioIhFl/N0ejmRlNCJqSRwbpiCY0l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MEAWD/dJMcaioIhFl/N0ejmRlNCJqSRwbpiCY0l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMEAWD%2FdJMcaioIhFl%2FN0ejmRlNCJqSRwbpiCY0l0%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;366&quot; height=&quot;432&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. VSCode에 Codex 확장 프로그램 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) VSCode Extention(ctrl + shift + X) 에서 codex검색하여 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzk9ac/dJMcac2WLwM/1aTp9iF1KKQQDDQT3JN3VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzk9ac/dJMcac2WLwM/1aTp9iF1KKQQDDQT3JN3VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzk9ac/dJMcac2WLwM/1aTp9iF1KKQQDDQT3JN3VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzk9ac%2FdJMcac2WLwM%2F1aTp9iF1KKQQDDQT3JN3VK%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;427&quot; height=&quot;317&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;317&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) codex 로그인 화면이 바로 뜨면 로그인을 진행하고, 로그인창이 뜨지 않으면 왼쪽 chatgot 아이콘 클락 해 로그인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5qB3c/dJMcaaD51ii/oRTjZnWmvbOjNjdI2YnSYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5qB3c/dJMcaaD51ii/oRTjZnWmvbOjNjdI2YnSYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5qB3c/dJMcaaD51ii/oRTjZnWmvbOjNjdI2YnSYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5qB3c%2FdJMcaaD51ii%2FoRTjZnWmvbOjNjdI2YnSYK%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;282&quot; height=&quot;701&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) codex창을 이동하고 싶다면 chatgpt 아이콘이나 codex 탭을 드래그해 오른쪽의 CHAT 옆쪽이로 이동시킬 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coPZjZ/dJMcadHx9qj/xqsKjSpsv65IrvFn88M4Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coPZjZ/dJMcadHx9qj/xqsKjSpsv65IrvFn88M4Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coPZjZ/dJMcadHx9qj/xqsKjSpsv65IrvFn88M4Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoPZjZ%2FdJMcadHx9qj%2FxqsKjSpsv65IrvFn88M4Z0%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;859&quot; height=&quot;445&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) chatgpt 사용을 동의하고나면 vscode에서 chatgpt를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOImZ/dJMcai29cS3/xpDyiQTPleT59WIyalsuZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOImZ/dJMcai29cS3/xpDyiQTPleT59WIyalsuZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOImZ/dJMcai29cS3/xpDyiQTPleT59WIyalsuZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOImZ%2FdJMcai29cS3%2FxpDyiQTPleT59WIyalsuZ0%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;479&quot; height=&quot;677&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 일만시간의 법칙</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/25</guid>
      <comments>https://jiyoungkim93.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 25 Jan 2026 23:43:55 +0900</pubDate>
    </item>
    <item>
      <title>JDK 환경 변수 세팅(IDE STS 5, JDK25)</title>
      <link>https://jiyoungkim93.tistory.com/24</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 환경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IDE : STS 5 (Eclipse 기반)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spring.io/tools#eclipse&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://spring.io/tools#eclipse&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JDK 25&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jdk.java.net/25/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jdk.java.net/25/&lt;/a&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;h4 data-ke-size=&quot;size20&quot;&gt;2. JDK 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) JDK 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/os4o0/dJMcadALcKy/FrQ1REefHDetNlOlW8vku1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/os4o0/dJMcadALcKy/FrQ1REefHDetNlOlW8vku1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/os4o0/dJMcadALcKy/FrQ1REefHDetNlOlW8vku1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fos4o0%2FdJMcadALcKy%2FFrQ1REefHDetNlOlW8vku1%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;512&quot; height=&quot;348&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 환경 변수 설정&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;- 검색 -&amp;gt; 시스템 환경 변수 편집 -&amp;gt; 환경변수 -&amp;gt; 시스템 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-1)&amp;nbsp; &quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;JAVA_HOME : jdk 폴더 경로&lt;/b&gt;&lt;/span&gt;&quot; 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLgzGl/dJMcaiPBXQU/LoWD4is1xx2KJ2lWC3aW2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLgzGl/dJMcaiPBXQU/LoWD4is1xx2KJ2lWC3aW2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLgzGl/dJMcaiPBXQU/LoWD4is1xx2KJ2lWC3aW2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLgzGl%2FdJMcaiPBXQU%2FLoWD4is1xx2KJ2lWC3aW2k%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;618&quot; height=&quot;169&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2-2)&amp;nbsp; &quot;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;PATH : %JAVA_HOME\bin&lt;/b&gt;&lt;/span&gt;&quot; 추가 후 맨 위로 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqLYZ/dJMcaiWornF/GPExAyyJhbmTpigXiczgC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqLYZ/dJMcaiWornF/GPExAyyJhbmTpigXiczgC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqLYZ/dJMcaiWornF/GPExAyyJhbmTpigXiczgC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqLYZ%2FdJMcaiWornF%2FGPExAyyJhbmTpigXiczgC0%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;639&quot; height=&quot;104&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. STS 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) STS 5 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdPu1p/dJMcaf6sKAy/4QZN8FRXIjLcs4wSJek051/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdPu1p/dJMcaf6sKAy/4QZN8FRXIjLcs4wSJek051/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdPu1p/dJMcaf6sKAy/4QZN8FRXIjLcs4wSJek051/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdPu1p%2FdJMcaf6sKAy%2F4QZN8FRXIjLcs4wSJek051%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;260&quot; height=&quot;574&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) STS실행 -&amp;gt; 작업 공간을 선택&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caUWTx/dJMb99LWfT7/QF71rgiqxulPygvEdz71XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caUWTx/dJMb99LWfT7/QF71rgiqxulPygvEdz71XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caUWTx/dJMb99LWfT7/QF71rgiqxulPygvEdz71XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaUWTx%2FdJMb99LWfT7%2FQF71rgiqxulPygvEdz71XK%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;724&quot; height=&quot;191&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- help -&amp;gt; About Spring Tools for Eclipse 에서 설정한 버전 정보들을 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcOSq/dJMcai28Tul/w8nyFV4XBL9xPKY2xo5WF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcOSq/dJMcai28Tul/w8nyFV4XBL9xPKY2xo5WF0/img.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;404&quot; data-is-animation=&quot;false&quot; width=&quot;351&quot; height=&quot;311&quot; data-widthpercent=&quot;44.31&quot; style=&quot;width: 43.7964%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcOSq/dJMcai28Tul/w8nyFV4XBL9xPKY2xo5WF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcOSq%2FdJMcai28Tul%2Fw8nyFV4XBL9xPKY2xo5WF0%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;404&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5PT5H/dJMcagYAxRP/JZE9OZG4uF0Rhi2WHw1T9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5PT5H/dJMcagYAxRP/JZE9OZG4uF0Rhi2WHw1T9K/img.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;454&quot; data-is-animation=&quot;false&quot; width=&quot;496&quot; height=&quot;350&quot; style=&quot;width: 55.0408%;&quot; data-widthpercent=&quot;55.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5PT5H/dJMcagYAxRP/JZE9OZG4uF0Rhi2WHw1T9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5PT5H%2FdJMcagYAxRP%2FJZE9OZG4uF0Rhi2WHw1T9K%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;644&quot; height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- jdk 설정 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://twofootdog.tistory.com/303#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://twofootdog.tistory.com/303#google_vignette&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1767595058268&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;☕ Java 개발자의 영원한 숙제, &amp;quot;도대체 어떤 JDK를 써야 할까?&amp;quot; 완벽 정리&quot; data-og-description=&quot;Java 개발을 시작하거나 서버를 세팅할 때 가장 먼저 마주치는 난관이 있습니다. &amp;quot;아니, Java면 그냥 Java지, OpenJDK는 뭐고 Corretto는 또 뭐야? 유료야 무료야?&amp;quot; 과거 Sun Microsystems 시절에는 고민할 필요&quot; data-og-host=&quot;twofootdog.tistory.com&quot; data-og-source-url=&quot;https://twofootdog.tistory.com/303#google_vignette&quot; data-og-url=&quot;https://twofootdog.tistory.com/303&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dGWUcV/hyZQK9XeQN/sMItQCpTlBtTu1Wzo1Ht9k/img.jpg?width=800&amp;amp;height=534&amp;amp;face=0_0_800_534,https://scrap.kakaocdn.net/dn/xhpc6/hyZPOszaWb/5kxH6uuHjEbDimLWhuzw41/img.jpg?width=800&amp;amp;height=534&amp;amp;face=0_0_800_534,https://scrap.kakaocdn.net/dn/errOPH/hyZPRiAfCH/LHBmFNKe6BPyW88GnEbrx1/img.jpg?width=6016&amp;amp;height=4016&amp;amp;face=0_0_6016_4016&quot;&gt;&lt;a href=&quot;https://twofootdog.tistory.com/303#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://twofootdog.tistory.com/303#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dGWUcV/hyZQK9XeQN/sMItQCpTlBtTu1Wzo1Ht9k/img.jpg?width=800&amp;amp;height=534&amp;amp;face=0_0_800_534,https://scrap.kakaocdn.net/dn/xhpc6/hyZPOszaWb/5kxH6uuHjEbDimLWhuzw41/img.jpg?width=800&amp;amp;height=534&amp;amp;face=0_0_800_534,https://scrap.kakaocdn.net/dn/errOPH/hyZPRiAfCH/LHBmFNKe6BPyW88GnEbrx1/img.jpg?width=6016&amp;amp;height=4016&amp;amp;face=0_0_6016_4016');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;☕ Java 개발자의 영원한 숙제, &quot;도대체 어떤 JDK를 써야 할까?&quot; 완벽 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Java 개발을 시작하거나 서버를 세팅할 때 가장 먼저 마주치는 난관이 있습니다. &quot;아니, Java면 그냥 Java지, OpenJDK는 뭐고 Corretto는 또 뭐야? 유료야 무료야?&quot; 과거 Sun Microsystems 시절에는 고민할 필요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;twofootdog.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 일만시간의 법칙</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/24</guid>
      <comments>https://jiyoungkim93.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 5 Jan 2026 17:46:05 +0900</pubDate>
    </item>
    <item>
      <title>통신테스트 방법 정리</title>
      <link>https://jiyoungkim93.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업무에서 통신 문제가 발생하면 ping, curl, telnet, nc 등 다양하게 테스트해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 에러 메시지나, 테스트 결과로 어떤 부분이 문제인지 정확히 알지 못하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI에 대한 의존도만 높아지는 것 같아 정리하고 넘어가려한다.&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. ping&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765776440237&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ping &amp;lt;IP&amp;gt;
$ ping &amp;lt;domain&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상대방 서버가 살아있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP 레벨 테스트(L3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ICMP(Internet Control Messgae Protocol)를 사용하여 통신상태를 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ICMP Echo Request를 목적지에 전송하고 ICMP Echo Reply 를 수신하여 통신상태 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buLOj5/dJMcadHh7qd/gyaO2gAQfTDFiXzxMaQS81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buLOj5/dJMcadHh7qd/gyaO2gAQfTDFiXzxMaQS81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buLOj5/dJMcadHh7qd/gyaO2gAQfTDFiXzxMaQS81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuLOj5%2FdJMcadHh7qd%2FgyaO2gAQfTDFiXzxMaQS81%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;549&quot; height=&quot;212&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;229&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 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. traceroute/tracert&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765776410628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Window
$ tracert &amp;lt;ip&amp;gt;
$ tracert &amp;lt;domain&amp;gt;

# Linux, MacOS
$ traceroute &amp;lt;IP&amp;gt;
$ traceout &amp;lt;domain&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 내 PC에서 상대 서버까지 패킷이 어떤 라우터를 거쳐 가는지 경로를 보여줌&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 중간 경로에서 막히면 해당 지점 라우터/방화벽에서 Drop&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 시간은 3번 기록하여 네트워크 지연이 일시적인지 확인함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XtoqN/dJMcabQhjW6/7nQIiQhkzdPXT83RfWOSoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XtoqN/dJMcabQhjW6/7nQIiQhkzdPXT83RfWOSoK/img.png&quot; data-alt=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XtoqN/dJMcabQhjW6/7nQIiQhkzdPXT83RfWOSoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXtoqN%2FdJMcabQhjW6%2F7nQIiQhkzdPXT83RfWOSoK%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;638&quot; height=&quot;439&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.cloudns.net/blog/traceroute-command-tracert/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1765775490815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ tracert www.google.com

최대 30홉 이상의
www.google.com [142.250.196.4](으)로 가는 경로 추적:

#홉번호  시간1   시간2   시간3  라우터 이름 [라우터 IP]
  1     1 ms    &amp;lt;1 ms    &amp;lt;1 ms  ip-192-...
  2    &amp;lt;1 ms    &amp;lt;1 ms    &amp;lt;1 ms  ...
  3     1 ms     1 ms     1 ms  ...
  4     2 ms     2 ms     2 ms  ...
  5     1 ms     1 ms     2 ms  ...
  6     2 ms     3 ms     2 ms  ...
  7     *        *        *     요청 시간이 만료되었습니다.
  8     *        *        *     요청 시간이 만료되었습니다.
  9    11 ms     7 ms     8 ms  ...
 10    17 ms    24 ms     8 ms  ...
 11    28 ms    29 ms    29 ms  142.250.165.78
 12    30 ms    46 ms    31 ms  216.239.59.149
 13    29 ms    29 ms    30 ms  142.250.236.53
 14    29 ms    28 ms    29 ms  nckixa-ab-in-f4.1e100.net [142.250.196.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. telnet&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1765785368937&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ telnet &amp;lt;IP&amp;gt; &amp;lt;Port&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Port가 열려있는지 확인 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Window에서 telnet 사용방법 : 제어판 -&amp;gt; 프로그램 및 기능 -&amp;gt; Winodw 기능 켜기/끄기 -&amp;gt; 텔넷 클라이언트 체크(활성화)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8tC3K/dJMcagRAp70/SfGu0ji31qzIQlk9JPGYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8tC3K/dJMcagRAp70/SfGu0ji31qzIQlk9JPGYkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8tC3K/dJMcagRAp70/SfGu0ji31qzIQlk9JPGYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8tC3K%2FdJMcagRAp70%2FSfGu0ji31qzIQlk9JPGYkK%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;343&quot; height=&quot;347&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. nc(netcat)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- nc -zv &amp;lt;IP&amp;gt; &amp;lt;Port&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 옵션 : z(스캔모드), v(verbose)&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. Curl (Client URL)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- curl &amp;lt;옵션&amp;gt; http://IP:Port&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- curl &amp;lt;옵션&amp;gt; https://IP:Port&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- http 서비스라면 가장 정확한 테스트 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리다이렉트/헤더까지 보임&lt;/p&gt;
&lt;pre id=&quot;code_1765770632892&quot; class=&quot;vim&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ curl -h
Usage: curl [options...] &amp;lt;url&amp;gt;
 -d, --data &amp;lt;data&amp;gt;          HTTP POST data
 -f, --fail                 Fail silently (no output at all) on HTTP errors
 -h, --help &amp;lt;category&amp;gt;      Get help for commands
 -i, --include              Include protocol response headers in the output
 -o, --output &amp;lt;file&amp;gt;        Write to file instead of stdout
 -O, --remote-name          Write output to a file named as the remote file
 -s, --silent               Silent mode
 -T, --upload-file &amp;lt;file&amp;gt;   Transfer local FILE to destination
 -u, --user &amp;lt;user:password&amp;gt; Server user and password
 -A, --user-agent &amp;lt;name&amp;gt;    Send User-Agent &amp;lt;name&amp;gt; to server
 -v, --verbose              Make the operation more talkative
 -V, --version              Show version number and quit

# 더 많은 옵션 확인 가능
$ curl -h all&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1765770535311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -I https://naver.com
HTTP/1.1 301 Moved Permanently
Date: Mon, 15 Dec 2025 03:48:10 GMT
content-type: text/html
location: https://www.naver.com/
vary: Accept-Encoding,User-Agent
strict-transport-security: max-age=63072000; includeSubdomains
referrer-policy: unsafe-url
server: nfront

$ curl -v https://naver.com
* Host naver.com:443 was resolved.
* IPv6: (none)
* IPv4: 223.130.200.236, 223.130.200.219, 223.130.192.247, 223.130.192.248
*   Trying 223.130.200.236:443...
* Connected to naver.com (223.130.200.236) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.x
&amp;gt; GET / HTTP/1.1
&amp;gt; Host: naver.com
&amp;gt; User-Agent: curl/8.9.1
&amp;gt; Accept: */*
&amp;gt;
* Request completely sent off
&amp;lt; HTTP/1.1 301 Moved Permanently
&amp;lt; Date: Mon, 15 Dec 2025 03:49:22 GMT
&amp;lt; content-type: text/html
&amp;lt; transfer-encoding: chunked
&amp;lt; location: https://www.naver.com/
&amp;lt; vary: Accept-Encoding,User-Agent
&amp;lt; strict-transport-security: max-age=63072000; includeSubdomains
&amp;lt; referrer-policy: unsafe-url
&amp;lt; server: nfront
&amp;lt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;301 Moved Permanently&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;301 Moved Permanently&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;hr&amp;gt;&amp;lt;center&amp;gt;nginx&amp;lt;/center&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
* Connection #0 to host naver.com left intact&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 321px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;short&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;&amp;nbsp;long&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;예시&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 42px;&quot;&gt;-k&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 42px;&quot;&gt;--insecure&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 42px;&quot;&gt;curl -k &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 42px;&quot;&gt;https 프로토콜에서 SSL 인증서에 대한 검증 없이 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-I&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--head&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -I &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;HTTP&amp;nbsp; 헤더만 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-i&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--include&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -i &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;HTTP 헤더 + 본문 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 16px;&quot;&gt;-L&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 16px;&quot;&gt;--location&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 16px;&quot;&gt;curl -L &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 16px;&quot;&gt;HTTP 301, 302 응답을 받을 경우 redirect URL로 따라감&lt;br /&gt;--max-redirs=&amp;lt;num&amp;gt;으로 몇 번의 redirect까지 따라갈 건지 지정 가능.(default:50)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-d&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--data&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -X POST --data &quot;key=value&quot; &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;HTTP POST 요청 데이터 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-o&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--output &amp;lt;FILE명&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -o test.yaml &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;curl 내용을 파일로 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 53px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 53px;&quot;&gt;-X&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 53px;&quot;&gt;--request&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 53px;&quot;&gt;curl -X POST &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 53px;&quot;&gt;요청시 사용할 메소드 지정&lt;br /&gt;GET, POST, PUT, PATCH, DELETE&lt;br /&gt;default: GET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-A&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--user-agent&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -A &quot;Accept:application/json&quot; &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;서버에 user-agent name 세팅해서 보냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-v&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--verbose&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -v &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;상세모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-H&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl -H &quot;Content-Type:application/json&quot; &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;헤더 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;-e&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;Referer 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.33322%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.2405%; height: 21px;&quot;&gt;--resolve&lt;/td&gt;
&lt;td style=&quot;width: 38.7595%; height: 21px;&quot;&gt;curl --resolve &amp;lt;URL&amp;gt;:&amp;lt;IP&amp;gt; &amp;lt;URL&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.6666%; height: 21px;&quot;&gt;특정 Ip로 연결되도록 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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. tcpdump&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- tcpdump -i eth0 host &amp;lt;IP&amp;gt; and port &amp;lt;Port&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 패킷이 들어가고 나가지 않으면 내 서버쪽 방화벽 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 패킷이 나가는데 들어오지 않으면 상대방 서버쪽 방화벽 문제&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;7. DNS 테스트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- nslookup &amp;lt;도메인&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dig &amp;lt;도메인&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도메인이 어떤 IP로 변환되는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신 문제 발생 시,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방화벽 테스트는 IP + Port 열려있는지 확인 - ping, nc -zv, telnet&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;*참고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.cloudns.net/blog/traceroute-command-tracert/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765775864548&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Traceroute command and its options - ClouDNS Blog&quot; data-og-description=&quot;The Traceroute command (tracert on Windows) is a network diagnostic tool that you have built-in on your device and servers for tracing the route, hop by hop to a target.&quot; data-og-host=&quot;www.cloudns.net&quot; data-og-source-url=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot; data-og-url=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Fd21N/hyZPriBMoJ/Xh7odvsLckRKzowd9M65Ok/img.jpg?width=847&amp;amp;height=565&amp;amp;face=0_0_847_565,https://scrap.kakaocdn.net/dn/k1fZx/hyZPzVfqWr/nZmtbakgqB88TH4Ookf1r1/img.jpg?width=300&amp;amp;height=189&amp;amp;face=0_0_300_189,https://scrap.kakaocdn.net/dn/MmWrG/hyZPJQzO44/5kic21iKLXVrfDzS4mPkL1/img.png?width=744&amp;amp;height=403&amp;amp;face=0_0_744_403&quot;&gt;&lt;a href=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cloudns.net/blog/traceroute-command-tracert/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Fd21N/hyZPriBMoJ/Xh7odvsLckRKzowd9M65Ok/img.jpg?width=847&amp;amp;height=565&amp;amp;face=0_0_847_565,https://scrap.kakaocdn.net/dn/k1fZx/hyZPzVfqWr/nZmtbakgqB88TH4Ookf1r1/img.jpg?width=300&amp;amp;height=189&amp;amp;face=0_0_300_189,https://scrap.kakaocdn.net/dn/MmWrG/hyZPJQzO44/5kic21iKLXVrfDzS4mPkL1/img.png?width=744&amp;amp;height=403&amp;amp;face=0_0_744_403');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Traceroute command and its options - ClouDNS Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Traceroute command (tracert on Windows) is a network diagnostic tool that you have built-in on your device and servers for tracing the route, hop by hop to a target.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cloudns.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인프라/네트워크</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/23</guid>
      <comments>https://jiyoungkim93.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 11 Dec 2025 00:33:45 +0900</pubDate>
    </item>
    <item>
      <title>Grafana + Prometheus 설치하기</title>
      <link>https://jiyoungkim93.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 Ubuntu VM 위에 Kubernetes 클러스터(master 1대, worker 2대)를 구성한 뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus와 Grafana 설치 테스트를 진행했다.&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. prometheus 설치하여 클러스터 메트릭 수집 환경 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. grafana 설치하여 대시보드 준비&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. grafana -&amp;gt; prometheus 연결하여 메트릭 시각화&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Prometheus 설치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) helm으로 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;helm 설치 시 설치되는 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● prometheus-server : prometheus, 각 타겟에서 메트릭을 scrape해서 로컬 TBDB에 저장하고, PromQL 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● prometheus-alertmanager : alert. slack, email, webhook으로 전송 가능. 비활성화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● prometheus-pushgateway : prometheus가 pull방식인데 batch나 job같은 경우 직접 metric을 push 할 수 있게 중간에 받아주는 역할. 비활성화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● prometheus-node-exporter : 각 노드에 daemonset으로 설치됨. 노드에서 OS 레벨 메트릭 노출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● prometheus-kube-state-metrics : kubernetes 오브젝트 상태를 메트릭으로 노출. deploy, pod, node 상태, replicas 수, ready 상태 등&lt;/p&gt;
&lt;pre id=&quot;code_1764080364940&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
&quot;prometheus-community&quot; has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the &quot;fluent&quot; chart repository
...Successfully got an update from the &quot;prometheus-community&quot; chart repository
Update Complete. ⎈Happy Helming!⎈

$ kubectl create namespace monitoring

# 리소스 설정은 필요한 만큼. 테스트용이라 최소한으로 잡았음
$ helm install prometheus prometheus-community/prometheus \
  --namespace monitoring \
  --set server.resources.requests.cpu=100m \
  --set server.resources.requests.memory=300Mi \
  --set server.resources.limits.cpu=500m \
  --set server.resources.limits.memory=800Mi
  --set alertmanager.enabled=false
  --set pushgateway.enabled=false

$ k get po -w -n monitoring
NAME                                                 READY   STATUS    RESTARTS   AGE
prometheus-kube-state-metrics-5cd4f9bbbd-ngdc4       1/1     Running   0          6m40s
prometheus-prometheus-node-exporter-6csv6            1/1     Running   0          6m43s
prometheus-prometheus-node-exporter-d4q9k            1/1     Running   0          6m41s
prometheus-prometheus-node-exporter-f9bq8            1/1     Running   0          6m40s
prometheus-server-9678f7c4-qd2fl                     0/2     Pending   0          2m7s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) provisoner 설치 후 pvc 확인 및 prometheus-server 정상 동작 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1764082139911&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# provisoner 설치
$ kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

$ k get pvc -n monitoring
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
prometheus-server   Bound    pvc-d8b7f986-9582-4155-8e0f-cceb8722586c   8Gi        RWO            local-path     &amp;lt;unset&amp;gt;

$ k get po -n monitoring -w
NAME                                                 READY   STATUS    RESTARTS   AGE
prometheus-kube-state-metrics-5cd4f9bbbd-5ldqx       1/1     Running   0          12m
prometheus-prometheus-node-exporter-5kbg4            1/1     Running   0          12m
prometheus-prometheus-node-exporter-pmd7h            1/1     Running   0          12m
prometheus-prometheus-node-exporter-pqm9h            1/1     Running   0          12m
prometheus-server-6bc7f6b76b-zd29c                   2/2     Running   0          12m&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;데이터 유실이 무방할 땐 스토리지 연결 안하고 pv 사용 비활성화로 설치&lt;/p&gt;
&lt;pre id=&quot;code_1764082586874&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 스토리지 안쓰고 설치
$ helm install prometheus prometheus-community/prometheus \
  --namespace monitoring \
  --set server.resources.requests.cpu=100m \
  --set server.resources.requests.memory=300Mi \
  --set server.resources.limits.cpu=500m \
  --set server.resources.limits.memory=800Mi \
  --set server.persistentVolume.enabled=false \
  --set alertmanager.persistentVolume.enabled=false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 지금 수집되는 메트릭은?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 test-api 파드가 배포되어있다면 아래 표와 같은 메트릭들을 수집 가능&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 96px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 29.8449%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;수집 항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;메트릭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;promQL&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 32px;&quot;&gt;
&lt;td style=&quot;width: 29.8449%; height: 32px;&quot;&gt;파드/컨테이너 리소스 사용량&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%; height: 32px;&quot;&gt;kubelet/cAdvisor 노출 메트릭 scrape&lt;br /&gt;/api/v1/nodes/&amp;lt;노드명&amp;gt;/proxy/metrics/cadvisor&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 32px;&quot;&gt;container_cpu_usage_seconds_total&lt;br /&gt;container_memory_working_set_bytes 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 29.8449%; height: 16px;&quot;&gt;컴포넌트 상태&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%; height: 16px;&quot;&gt;kube-state-metric&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;kube_pod_status_phase&lt;br /&gt;kube_pod_container_status_restarts_total 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 29.8449%; height: 16px;&quot;&gt;노드의 리소스 사용량&lt;/td&gt;
&lt;td style=&quot;width: 36.8217%; height: 16px;&quot;&gt;node-exporter&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;node_cpu_seconds_total&lt;br /&gt;node_memory_MemAvailable_bytes&lt;br /&gt;node_filesystem_avail_bytes 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) prometheus-server configmap 해석&lt;/h4&gt;
&lt;pre id=&quot;code_1764086110076&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;global:
  evaluation_interval: 1m	# alert rule 평가 주기
  scrape_interval: 1m		# 메트릭 scrape 주기
  scrape_timeout: 10s		# scrape 타임아웃&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;- ★scrape_configs : 무엇을 수집할것인지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- scrape_configs 안에 여러 job들이 있고, job이 하나의 수집 규칙임&lt;/p&gt;
&lt;pre id=&quot;code_1764083616216&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;scrape_configs:
- bearer_token_file: ...
  job_name: kubernetes-nodes-cadvisor
  kubernetes_sd_configs:
  - role: node
  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - replacement: kubernetes.default.svc:443
    target_label: __address__
  - regex: (.+)
    replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor
    source_labels:
    - __meta_kubernetes_node_name
    target_label: __metrics_path__
  scheme: https
  tls_config:
    ca_file: ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Grafana 설치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) helm으로 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1764084795596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm repo add grafana https://grafana.github.io/helm-charts

$ helm repo update

$ helm install grafana grafana/grafana \
  -n monitoring \
  --set resources.requests.cpu=100m \
  --set resources.requests.memory=200Mi \
  --set resources.limits.cpu=300m \
  --set resources.limits.memory=500Mi \
  --set adminPassword='admin123!'

$ k get po -n monitoring 
NAME                                                 READY   STATUS    RESTARTS        AGE
grafana-85cdb5b56f-gdnpp                             1/1     Running   0               2m46s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 그라파나 노드포트로 업그레이드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드:노드포트로 로컬에서 정상 접근 확인&lt;/p&gt;
&lt;pre id=&quot;code_1764085162056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ helm upgrade grafana grafana/grafana \
  -n monitoring \
  --set service.type=NodePort \
  --set service.nodePort=32000 \
  --set adminPassword='admin123!'

$ k get svc -n monitoring
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
grafana                               NodePort    10.101.67.242    &amp;lt;none&amp;gt;        80:32000/TCP   8m11s&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;946&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beDydN/dJMcafkJmoL/Z9CpjadMekfh0cmRK8vMQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beDydN/dJMcafkJmoL/Z9CpjadMekfh0cmRK8vMQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beDydN/dJMcafkJmoL/Z9CpjadMekfh0cmRK8vMQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeDydN%2FdJMcafkJmoL%2FZ9CpjadMekfh0cmRK8vMQK%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;946&quot; height=&quot;267&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) prometheus - grafana 연동&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI로도 가능하고 grafana value에서 url을 지정할 수 있음.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1) UI&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 메뉴 -&amp;gt; connection -&amp;gt; data sources -&amp;gt; add data source -&amp;gt; promethes 검색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sSPFV/dJMcacBxVQY/2OMdqxYcAaerlU1ko7S0A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sSPFV/dJMcacBxVQY/2OMdqxYcAaerlU1ko7S0A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sSPFV/dJMcacBxVQY/2OMdqxYcAaerlU1ko7S0A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsSPFV%2FdJMcacBxVQY%2F2OMdqxYcAaerlU1ko7S0A0%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;242&quot; height=&quot;322&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; prometheus-server 내부 dns 주소 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvsgCZ/dJMcadAoAHn/bWJC3qFcpAoIutg2mgTvlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvsgCZ/dJMcadAoAHn/bWJC3qFcpAoIutg2mgTvlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvsgCZ/dJMcadAoAHn/bWJC3qFcpAoIutg2mgTvlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvsgCZ%2FdJMcadAoAHn%2FbWJC3qFcpAoIutg2mgTvlk%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;506&quot; height=&quot;452&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 메뉴 -&amp;gt; explore -&amp;gt; promQL 창에 up test&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxjNkY/dJMcabbySSp/eOx5rdgeByzYcgB0td6Yi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxjNkY/dJMcabbySSp/eOx5rdgeByzYcgB0td6Yi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxjNkY/dJMcabbySSp/eOx5rdgeByzYcgB0td6Yi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxjNkY%2FdJMcabbySSp%2FeOx5rdgeByzYcgB0td6Yi0%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;722&quot; height=&quot;484&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-2) CLI&lt;/h4&gt;
&lt;pre id=&quot;code_1764085929015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# values 파일 받기
$ helm get values -n monitoring grafana &amp;gt; grafana-values.yaml

# 사용자 지정 값 말고 전체 values 확인하려면
$ helm show  values -n monitoring grafana &amp;gt; grafana-values.yaml

$ vi grafana-values.yaml
# 추가
datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
      - name: Prometheus
        type: prometheus
        access: proxy
        url: http://prometheus-server.monitoring.svc.cluster.local
        isDefault: true
        
$ helm upgrade grafana/grafana \
  -n monitoring \
  -f grafana-values.yaml&lt;/code&gt;&lt;/pre&gt;</description>
      <category>혼공/monitoring</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/22</guid>
      <comments>https://jiyoungkim93.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 26 Nov 2025 01:02:43 +0900</pubDate>
    </item>
    <item>
      <title>[Jenkins] Jenkins 설치</title>
      <link>https://jiyoungkim93.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq0cGr/dJMcahJvuAT/ztrn8D1d1vCw2K8BH6Mq0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq0cGr/dJMcahJvuAT/ztrn8D1d1vCw2K8BH6Mq0k/img.png&quot; data-alt=&quot;출처: https://www.jenkins.io/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq0cGr/dJMcahJvuAT/ztrn8D1d1vCw2K8BH6Mq0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq0cGr%2FdJMcahJvuAT%2Fztrn8D1d1vCw2K8BH6Mq0k%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;711&quot; height=&quot;311&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://www.jenkins.io/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Jenkins란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Jenkins는 CI/CD 과정을 자동화하는 도구&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; (Git, Docker, Maven, Gradle 등 2천개의 플러그인을 통해 기능 확장 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예전에는 각 개별자가 개별적으로 코드를 작성하고 빌드 배포 테스트를 한 뒤, 프로젝트 후반에 코드를 통합해여 배포함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 후반에 코드를 통합하면 코드 충돌이 많고 배포하는 주기가 길어졌을 것. 이를 해결하기 위해 CI/CD 도입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CI 지속적인 통합, 개발자들의 코드를 자주 병합하고 테스트 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CD 지속적인 배포, 코드 변경 사항을 빠르게 배포하여 사용자에게 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Jenkins 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- window에 jenkins를 설치해보려 한다.&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-1) Jenkins 홈페이지에서 Windows Jenkins download&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvmXM6/dJMcaa4LXXD/coZHMz0lK8zI49m1KkE5e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvmXM6/dJMcaa4LXXD/coZHMz0lK8zI49m1KkE5e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvmXM6/dJMcaa4LXXD/coZHMz0lK8zI49m1KkE5e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvmXM6%2FdJMcaa4LXXD%2FcoZHMz0lK8zI49m1KkE5e1%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;334&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.jenkins.io/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763791208016&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Download and deploy&quot; data-og-description=&quot;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&quot; data-og-host=&quot;www.jenkins.io&quot; data-og-source-url=&quot;https://www.jenkins.io/download/&quot; data-og-url=&quot;https://www.jenkins.io/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1V4e1/hyZNIrLWCz/exkWnbpbBHaSoHwGrr9DEK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bgQlOR/hyZOfC1SB7/T0x7PXClHADcbK1NUiWv8k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jenkins.io/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1V4e1/hyZNIrLWCz/exkWnbpbBHaSoHwGrr9DEK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bgQlOR/hyZOfC1SB7/T0x7PXClHADcbK1NUiWv8k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download and deploy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jenkins.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-2) 다운받은 jenkins.msi 파일 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bul1jU/dJMcac9jwJa/uIY9PjL2ly774MVTL2Jxu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bul1jU/dJMcac9jwJa/uIY9PjL2ly774MVTL2Jxu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bul1jU/dJMcac9jwJa/uIY9PjL2ly774MVTL2Jxu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbul1jU%2FdJMcac9jwJa%2FuIY9PjL2ly774MVTL2Jxu1%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;561&quot; height=&quot;443&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-3) port는 원하는 대로 설정(1-65535), default는 8080&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYax5/dJMcafSx9Zt/XBAG1NpYM5UHYudNM6Db91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYax5/dJMcafSx9Zt/XBAG1NpYM5UHYudNM6Db91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYax5/dJMcafSx9Zt/XBAG1NpYM5UHYudNM6Db91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYax5%2FdJMcafSx9Zt%2FXBAG1NpYM5UHYudNM6Db91%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;557&quot; height=&quot;436&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-4)&amp;nbsp; Jenkins를 어떤 계정으로 실행할건지 선택&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;i) Run service as LocalSystem&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Window에서 기본 제공하는 LocalSystem 계정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관리자보다 강력한 권한을 가진 시스템 계정으로 Jenkins가 실행되는데는 문제 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Git인증이나 다른 리소스 접근 시 문제 발생 할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테스트용이라면 LocalSystem 계정도 충분하며 추후에 local or domain user로 변경 가능.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;*계정 변경 방법&lt;br /&gt;&lt;br /&gt;1. Win + R &amp;rarr; services.msc&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;2. 목록에서 &lt;b&gt;Jenkins&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 찾기&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;3. 우클릭 &amp;rarr; 속성(Properties)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;4. 탭에서 Log On(로그온) 클릭&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;5. 기본값은 &quot;LocalSystem account&quot;로 되어 있는데 계정 지정으로 변경 후 재시작&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ii) Run service as local or domain user&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Windows 로그인 계정 또는 도메인 계정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Window에 실제로 존재하는 계정만 가능하고 비밀번호가 없는 계정은 사용 불가 ex) PC이름\계정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 계정 비밀번호가 변경되면 Jenkins 서비스도 다 죽어 실무용으로 적합&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ4UdA/dJMcahbK3q0/V3z6PoLUM8yHzXhkoSNbIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ4UdA/dJMcahbK3q0/V3z6PoLUM8yHzXhkoSNbIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ4UdA/dJMcahbK3q0/V3z6PoLUM8yHzXhkoSNbIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ4UdA%2FdJMcahbK3q0%2FV3z6PoLUM8yHzXhkoSNbIk%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;435&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-5) JDK 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Jenkins 버전에 따라 호환되는 자바 버전이 따로 있다. JDK17을 추가한다는게 JDK1.7을 추가해서 failed 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b887VB/dJMcaiIszgn/AUhNAVAmxMKkapk3piSEi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b887VB/dJMcaiIszgn/AUhNAVAmxMKkapk3piSEi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b887VB/dJMcaiIszgn/AUhNAVAmxMKkapk3piSEi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb887VB%2FdJMcaiIszgn%2FAUhNAVAmxMKkapk3piSEi1%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;554&quot; height=&quot;431&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JFjap/dJMcaiaFr86/LC7MAUykdibpkiUKmQOKG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JFjap/dJMcaiaFr86/LC7MAUykdibpkiUKmQOKG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JFjap/dJMcaiaFr86/LC7MAUykdibpkiUKmQOKG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJFjap%2FdJMcaiaFr86%2FLC7MAUykdibpkiUKmQOKG0%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;438&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2nQui/dJMcahQmygq/PuFVDsrxhe1PNkkBDnSIN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2nQui/dJMcahQmygq/PuFVDsrxhe1PNkkBDnSIN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2nQui/dJMcahQmygq/PuFVDsrxhe1PNkkBDnSIN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2nQui%2FdJMcahQmygq%2FPuFVDsrxhe1PNkkBDnSIN1%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;434&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YflqN/dJMcai2LdLs/lWx8MedS3rAglD9d0yjsQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YflqN/dJMcai2LdLs/lWx8MedS3rAglD9d0yjsQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YflqN/dJMcai2LdLs/lWx8MedS3rAglD9d0yjsQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYflqN%2FdJMcai2LdLs%2FlWx8MedS3rAglD9d0yjsQK%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;566&quot; height=&quot;435&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2-6) http://localhost:8088 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로그인 할 때 &lt;u&gt;C:\ProgramData\Jenkins\.jenkins\secrets\initialAdminPassword&lt;/u&gt; 파일에서 admin 비밀번호를 확인하라고 하는데 나는 initialAdminPassword 파일이 없었다. Jenkins가 초기 설정을 끝낸 상태면 초기 비번이 사라져 파일이 정리될 수도 있다고 한다. 이번이 Jenkins 설치 두번째라 이미 설정이 끝난 상태로 정리된 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그래서 비밀번호 재설정 했다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;1. services.msc&amp;nbsp;&amp;rarr;&amp;nbsp;Jenkins&amp;nbsp;&amp;rarr;&amp;nbsp;중지&lt;br /&gt;2. C:\ProgramData\Jenkins\.jenkins\config.xml 파일 열기&lt;br /&gt;3. &amp;lt;useSecurity&amp;gt;&lt;b&gt;true&lt;/b&gt;&amp;lt;/useSecurity&amp;gt; -&amp;gt; &lt;b&gt;false&lt;/b&gt;로 변경&lt;br /&gt;4. Jenkins 재시작&lt;br /&gt;5. 인증없이 Jenkins 페이지 열림 확인&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzDNP5/dJMcagjCoRL/Sl0qkpYrFYMxyknyOWp710/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzDNP5/dJMcagjCoRL/Sl0qkpYrFYMxyknyOWp710/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzDNP5/dJMcagjCoRL/Sl0qkpYrFYMxyknyOWp710/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzDNP5%2FdJMcagjCoRL%2FSl0qkpYrFYMxyknyOWp710%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;658&quot; height=&quot;264&quot; data-origin-width=&quot;1631&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1689&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehl9hQ/dJMcagKGH3I/jGfmPq98dBqlFDXbLj5110/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehl9hQ/dJMcagKGH3I/jGfmPq98dBqlFDXbLj5110/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehl9hQ/dJMcagKGH3I/jGfmPq98dBqlFDXbLj5110/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fehl9hQ%2FdJMcagKGH3I%2FjGfmPq98dBqlFDXbLj5110%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;236&quot; data-origin-width=&quot;1689&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CICD</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/21</guid>
      <comments>https://jiyoungkim93.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 22 Nov 2025 21:54:26 +0900</pubDate>
    </item>
    <item>
      <title>[10/28] 로그는 얼마나, 어떻게 저장될까 - 2.Fluent Bit</title>
      <link>https://jiyoungkim93.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pod log -&amp;gt; fluent bit 로 로그가 수집되는 과정을 정리해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pod는 kubelet에 의해 노드 로컬 디스크 /var/log/pods(/var/log/containers) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하위에&lt;/span&gt;&amp;nbsp;로그를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그는 기본적으로 파일 하나 당 10MB, 파일 5개 저장하므로, 로그가 로테이션 되기 전에 Fluent Bit가 파일을 수집해야 로그 손실이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fluent Bit는 cluster의 daemonset으로 설치되어 각 노드의 파일을 수집한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1AddE/dJMcag4QCuS/EMMkYz3jdmfSt86xuLKcqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1AddE/dJMcag4QCuS/EMMkYz3jdmfSt86xuLKcqk/img.png&quot; data-alt=&quot;출처: https://docs.fluentbit.io/manual/concepts/buffering&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1AddE/dJMcag4QCuS/EMMkYz3jdmfSt86xuLKcqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1AddE%2FdJMcag4QCuS%2FEMMkYz3jdmfSt86xuLKcqk%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;897&quot; height=&quot;299&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://docs.fluentbit.io/manual/concepts/buffering&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;0. Flunet Bit 작동 순서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. [INPUT] pluin은 path 경로에 있는 파일을 읽어들인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수집한 &lt;b&gt;로그 한 줄은 레코드 1개&lt;/b&gt;이며, 여러개의 &lt;b&gt;레코드를 내부적으로 묶어 Chunk 단위&lt;/b&gt;로 관리한다.(chunk 20MB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 수집된 Chunk는 메모리에 우선 저장하고, &lt;b&gt;Mem_buf_Limit까지 메모리 버퍼링 가능&lt;/b&gt;하다.(input plugin의 설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Mem_buf_Limit이 초과하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-1. storage.type = memory 일 때, input이 일시 정지 되고 레코드가 flush 되기 전까지(output으로 내보냄) 새 로그를 수집하지 않는다.(pause) 이 과정에서 로그 유실 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-2. storage.type = filesystem 일 때, 메모리 버퍼 추가 분을 디스크에 내려 chunk로 저장하여 수집을 계속 진행한다. 메모리가 정리되면 디스크에서 메모리로 chunk를 다시 불러와 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(디스크는 [SERVICE]의 storage.path에 지정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 즉, '[INPUT] : 레코드 생성 -&amp;gt; [PARSER] : 레코드 정형화 -&amp;gt; [FILTER]: 레코드 후처리'를 거쳐 OUTPUT 브로커로 로그를 전송한다.&lt;/p&gt;
&lt;pre id=&quot;code_1763474879473&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input &amp;rarr; Parser &amp;rarr; Filter(Record/Chunk 생성 단계)
     &amp;darr;
*** Storage Engine ***
     &amp;darr;
*** Flush Engine ***
     &amp;darr;
Output Plugin (Kafka, ES 등)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. INPUT Plugin&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 519px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 20px; text-align: center;&quot;&gt;설정&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 20px; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 80px;&quot;&gt;Name&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 80px;&quot;&gt;Fluent Bit에 내장된 input plugin name&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 80px;&quot;&gt;- tail: 파일을 실시간으로 읽어들임(tail -f)&lt;br /&gt;- forward : 다른 fluent bit/fluentd로 부터 로그를 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 20px;&quot;&gt;Path&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 20px;&quot;&gt;plugin을 실행할 파일 경로&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;- 패턴에 매칭된 로그 파일 감시&lt;br /&gt;- fluent bit가 읽어 들이는 노드의 로컬 파일 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;Tag&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;filter/output 매칭되는 태크&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;- 레코드에 붙음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;Mem_Buf_Limit&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;tail plugin이 엔진에 데이터를 추가할 때 사용할 수 있는 메모리 제한. 제한 size에 도달하면 수집이 일시 중지되고, 데이터가 flush되면 재시작됨.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;Parser&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;parser 이름 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;multiline.parser&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;content에 적용할 하나 이상의 parser를 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 60px;&quot;&gt;buffer_max_size&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 60px;&quot;&gt;모니터링되는 파일당 버퍼 크기 제한.&lt;br /&gt;파일을 읽을 때 제한 size를 초과하면 해당 파일은 모니터링 목록에서 제거&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;- default: 32k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 60px;&quot;&gt;read_from_head&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 60px;&quot;&gt;새로 발견된 파일의 경우 offset의 위치 정보가 없음. 이 경우 파일의 head부터 읽도록 설정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;- default : false&lt;br /&gt;- head부터 읽지 않으면 tail시 유실 케이스 발생하여 true로 설정하는 것을 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 60px;&quot;&gt;rotate_wait&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 60px;&quot;&gt;보류중인 데이터가 flush되는 경우를 대비해 파일이 rotate된 후 모니터링할 추가 시간 지정.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;- default: 5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 20px;&quot;&gt;refresh_interval&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 20px;&quot;&gt;감시 중인 파일 목록을 새로 고치는 간격&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;- default : 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 40px;&quot;&gt;db&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 40px;&quot;&gt;모니터링되는 파일과 offset을 추적할 db파일 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;skip_long_lines&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;매우 긴 line으로 인해 buffer_max_size에 도달하면 해당 파일 모니터링을 중지. 긴 line은 건너뛰고 버퍼 크기에 맞는 다른 line을 처리&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;- default: off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;skip_empty_line&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;로그 파일에서 빈 줄을 건너뛰어 추가 처리를 하지 않음.(버림)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;- default: off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 17px;&quot;&gt;exclude_path&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 17px;&quot;&gt;특정 기준과 일치하는 파일 수집대상에서 제외&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 17.9845%; height: 40px;&quot;&gt;path_key&lt;/td&gt;
&lt;td style=&quot;width: 48.6821%; height: 40px;&quot;&gt;모니터링되는 파일의 이름이 레코드의 일부로 추가됨.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- kubernetes 환경에서 FluentBit는 daemonset으로 클러스터의 각 노드마다 설치되어 &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;- FluentBit 서버는 재시작되더라도 &lt;b&gt;내부적으로 offset관리&lt;/b&gt;를 하여 중복 수집을 피할 수 있음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- FluentBit의 최종 목표는 로그를 수집, 분석, 필터링하여 중앙으로 전송하는 것이다. 여기서 가장 중요한 기능 중 하나는 '&lt;b&gt;buffering&lt;/b&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;- chunk(덩어리) : Input plugin이 &lt;b&gt;레코드를 내보내면 엔진은 이를 chunk로 그룹화&lt;/b&gt;한다. 크기는 일반적으로 2MB이며, 모든 chunk는 메모리에만 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리에 전송할 수 있는 데이터보다 많은 데이터가 누적되면 서버의 메모리 사용량이 증가하고 이는 OOM kill을 유발할 수 있다. 그래서 &lt;b&gt;레코드의 메모리양을 제한&lt;/b&gt;하는데 그 설정이 &lt;b&gt;mem_buf_limit&lt;/b&gt;이다. mem_buf_limit이 차면 데이터를 더이상 수집하지 않고 input plugin은 일시 중지된다. 이 상태에서 파일이 rotate되면 새 레코드를 등록할 수 없어 데이터가 손실될 우려가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이때 &lt;b&gt;filesystem&lt;/b&gt; buffering을 활성화하면 엔진의 동작이 달라진다. chunk가 생성되면 메모리에 내용을 저장하지만 mmap(2)?를 통해 디스크에 복사본을 매핑한다. 이 chunk는 메모리에서 활성화되고 디스크에 백업된다.(SERVICE 설정의 storage.path에 백업)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2, Parser Plugin&lt;/h4&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;데이터를 정형화 하는 과정에서 field가 생성된다.&lt;/b&gt;(JSON, key-value 구조)&lt;/p&gt;
&lt;pre id=&quot;code_1763454191268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시
2025-11-18T07:10:11.182Z stdout F User login failed id=123

# format regex parser 후
{
  &quot;time&quot;: &quot;2025-11-18T07:10:11.182Z&quot;,
  &quot;stream&quot;: &quot;stdout&quot;,
  &quot;logtag&quot;: &quot;F&quot;,
  &quot;log&quot;: &quot;User login failed id=123&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- multiline 처리는 fluent-bit에서 수행해야 뒷단의 HA 구조에 자유롭다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 139px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 20px; text-align: center;&quot;&gt;설정&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 20px; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;&amp;nbsp;Name&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;parser 이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Format&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;로그 문자열 형식에 따라 Format 선택&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;- regex, json, logfmt, ltsv&lt;br /&gt;- Format이 json이면 로그가 json형식일 때만 적용됨&lt;br /&gt;- 로그가 문자열이면 regex 적용됨.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Regex&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;Format=regex일 대 반드시 필요하며,&lt;br /&gt;(?&amp;lt;필드명&amp;gt;패턴)으로 매칭된 값이 JSON 필드가 됨&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Time_Key&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;로그에서 timestamp로 사용할 필드 이름, 뒷 단에서 모드 이 timestamp 기준으로 정렬됨&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Time_Format&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;Time_Key의 문자열을 어떤 형식으로 파싱할지 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Time_Keep&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;On -원래 로그 time 필드도 유지&lt;br /&gt;Off - time 필드를 결과 JSON에서 제거하고 FlunetBit Timestamp로만 사용&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.5426%; height: 17px;&quot;&gt;Docode_Field_As&lt;/td&gt;
&lt;td style=&quot;width: 41.124%; height: 17px;&quot;&gt;JSON안에 \n, \\, \t 같은 escape 문자가 있는 경우 해석&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.5426%;&quot;&gt;Types&lt;/td&gt;
&lt;td style=&quot;width: 41.124%;&quot;&gt;field1:integer field2:float&lt;br /&gt;문자열 필드를 숫자로 변환&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Filter Plugin&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 레코드를 가공하는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- INPUT plugin의 Tag가 Filter의 Match에 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- kubernetes 필터는 kubernetes 메타데이터(pod_name, namespace, container_name...)를 로그에 붙이기 위해 K8s API서버에 요청을 보낸다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 374px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;설정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Name&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;filter 이름&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Match&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Input의 Tag와 맞는 로그에 적용&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 44px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;Merge_Log&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;K8s 컨테이너 로그의 CRI 헤더와 log 필드를 병합하여 출력&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;default: On&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Keep_Log&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Merge_Log시 원본 log 필드 보존 여부&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;default: Off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 44px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;Multiline.Key_Content&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;multiline 대상 필드로 보통 기본값인 log로 설정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;default: log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Buffer_Chunk_Size&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;kubernetes 필터 내부에서 메타데이터 조립을 위한 chunk 크기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;kubernetes filter는 k8s API 서버에서 metadata(JSON) 응답을 받아 파싱함.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Buffer_Max_Size&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;kubernetes 필터 내부 버퍼의 최대 크기&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;kube-api응답이 size를 넘어가면 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;Buffer_Size&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;K8s API 응답 1회 read() 버퍼 크기&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;default: 32KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;tls.verity&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;API 서버 TLS 인증서 검증 여부&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;default: On&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 44px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;emitter_buffer_size&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;multiline이 생성한 레코드를 임시 저장할 버퍼 크기&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;default: 4M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 44px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;emitter_mem_buf_limit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;multiline 로그 조립 과정에서 holding되는 총 버퍼 크기&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 44px;&quot;&gt;defulat: 5M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;emitter_storag.type&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;buffer 저장 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 22px;&quot;&gt;default: memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;[Flunet Bit configmap 예시]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761629131451&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: ConfigMap
data:
  custom_parsers.conf: |
    [PARSER]
        Name docker_no_time
        Format json
        Time_Keep Off
        Time_Key time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
    [PARSER]
        Name cri
        Format regex
        Regex ^(?&amp;lt;time&amp;gt;[^ ]+) (?&amp;lt;stream&amp;gt;stdout|stderr) (?&amp;lt;logtag&amp;gt;[^ ]*) (?&amp;lt;log&amp;gt;.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z
        Time_Keep   On
    [MULTILINE_PARSER]
        name          multiline-regex-test
        type          regex
        flush_timeout 1000
        #
        # Regex rules for multiline parsing
        # ---------------------------------
        #
        # configuration hints:
        #
        #  - first state always has the name: start_state
        #  - every field in the rule must be inside double quotes
        #
        # rules |   state name  | regex pattern                  | next state
        # ------|---------------|--------------------------------------------
        rule      &quot;start_state&quot;   &quot;/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/&quot;  &quot;cont&quot;
        rule      &quot;cont&quot;          &quot;/^\s+at.*/&quot;                     &quot;cont&quot;
  fluent-bit.conf: |
    [SERVICE]
        Daemon Off
        Flush 1
        Log_Level info
        Parsers_File /fluent-bit/etc/parsers.conf
        Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port 2020
        Health_Check On

    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        multiline.parser docker, cri
        Tag kube.*
        Mem_Buf_Limit 5MB
        Skip_Long_Lines On
        Read_from_Head True

    [INPUT]
        Name systemd
        Tag host.*
        Systemd_Filter _SYSTEMD_UNIT=kubelet.service
        Read_From_Tail On

    [FILTER]
        Name kubernetes
        Match kube.*
        Merge_Log On
        Keep_Log Off
        K8S-Logging.Parser On
        K8S-Logging.Exclude On

    [OUTPUT]
        Name es
        Match kube.*
        Host elasticsearch-master
        Logstash_Format On
        Retry_Limit False

    [OUTPUT]
        Name es
        Match host.*
        Host elasticsearch-master
        Logstash_Format On
        Logstash_Prefix node
        Retry_Limit False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1761196552272&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Tail | Fluent Bit: Official Manual&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.fluentbit.io&quot; data-og-source-url=&quot;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&quot; data-og-url=&quot;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ghL6Q/hyZLkR1FRI/bwl6LQEvoK73WgSaOv7hck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/m2xGP/hyZMm16Pdz/0Its5Oe0JPaIcqsOz1loGk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fluentbit.io/manual/data-pipeline/inputs/tail&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ghL6Q/hyZLkR1FRI/bwl6LQEvoK73WgSaOv7hck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/m2xGP/hyZMm16Pdz/0Its5Oe0JPaIcqsOz1loGk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tail | Fluent Bit: Official Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.fluentbit.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763449305756&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Buffering &amp;amp; Storage | 1.8 | Fluent Bit: Official Manual&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.fluentbit.io&quot; data-og-source-url=&quot;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&quot; data-og-url=&quot;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VkJJD/hyZOb0zYi9/oPrRoMsWJC30gnlqooTf00/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mCFH4/hyZN92KD53/4rO6P0h4WcCEZ0wD1tHdWk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fluentbit.io/manual/1.8/administration/buffering-and-storage&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VkJJD/hyZOb0zYi9/oPrRoMsWJC30gnlqooTf00/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mCFH4/hyZN92KD53/4rO6P0h4WcCEZ0wD1tHdWk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Buffering &amp;amp; Storage | 1.8 | Fluent Bit: Official Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.fluentbit.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763451149224&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Multiline parsing | Fluent Bit: Official Manual&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.fluentbit.io&quot; data-og-source-url=&quot;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&quot; data-og-url=&quot;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bY636u/hyZNH6Ug8B/5SaPTT7XbQf58UyhH7zKO0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbWWCZ/hyZNy9XO2T/z6UjZVi3zcZyVOOD82zalk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#parsers_multiline.conf-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bY636u/hyZNH6Ug8B/5SaPTT7XbQf58UyhH7zKO0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bbWWCZ/hyZNy9XO2T/z6UjZVi3zcZyVOOD82zalk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Multiline parsing | Fluent Bit: Official Manual&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.fluentbit.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>혼공/logging</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/20</guid>
      <comments>https://jiyoungkim93.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 18 Nov 2025 23:18:53 +0900</pubDate>
    </item>
    <item>
      <title>자동으로 Google Sheets 기록하기</title>
      <link>https://jiyoungkim93.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;google sheet에 자동으로 기록해야할 내용이 생겨 작업 전에 간단히 테스트를 진행해보았다.&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;1. Google Cloud Console Google Sheets API Enable 설정 및 서비스 계정 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Google Sheet 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Google Sheet에 자동으로 값을 입력하는 JAVA application 생성&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Google Cloud Console에서 서비스 계정 생성 및 인증키 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Google Sheets를 외부 프로그램에서 자동으로 수정/기록 하기위해선 API호출 권한을 가진 '서비스 계정' 또는 OAath 인증을 반드시 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Google Cloud Console에서 서비스 계정을 생성할 수 있다.&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) Google Cloud Console 가입 후 프로젝트 생성 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(IAM 및 관리자 -&amp;gt; 프로젝트 만들기)&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Google Sheets API 검색 -&amp;gt; 사용(enable)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnW6SW/dJMcafx65B8/tleQyEFv1bzwjnpaGA28k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnW6SW/dJMcafx65B8/tleQyEFv1bzwjnpaGA28k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnW6SW/dJMcafx65B8/tleQyEFv1bzwjnpaGA28k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnW6SW%2FdJMcafx65B8%2FtleQyEFv1bzwjnpaGA28k1%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;511&quot; height=&quot;139&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdfTL/dJMcagjucdp/Ibj9EnnxhvDotaknDzksyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdfTL/dJMcagjucdp/Ibj9EnnxhvDotaknDzksyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdfTL/dJMcagjucdp/Ibj9EnnxhvDotaknDzksyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdfTL%2FdJMcagjucdp%2FIbj9EnnxhvDotaknDzksyk%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;236&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Credentials 검색 -&amp;gt; ServiceAccount(서비스계정) 관리-&amp;gt; 서비스 계정 만들기 (ex.sheets-appender-sa)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0S6zA/dJMcadmLg0S/Acchp63xcESKJfB6ABTmBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0S6zA/dJMcadmLg0S/Acchp63xcESKJfB6ABTmBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0S6zA/dJMcadmLg0S/Acchp63xcESKJfB6ABTmBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0S6zA%2FdJMcadmLg0S%2FAcchp63xcESKJfB6ABTmBk%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;504&quot; height=&quot;122&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TqiRT/dJMcafx65D3/kLiVSgnnygWttAaYBpYPIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TqiRT/dJMcafx65D3/kLiVSgnnygWttAaYBpYPIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TqiRT/dJMcafx65D3/kLiVSgnnygWttAaYBpYPIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTqiRT%2FdJMcafx65D3%2FkLiVSgnnygWttAaYBpYPIk%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;668&quot; height=&quot;128&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PJCFL/dJMcaiaxdvp/uQwhwXIFJj0hXGvGcoDvjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PJCFL/dJMcaiaxdvp/uQwhwXIFJj0hXGvGcoDvjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PJCFL/dJMcaiaxdvp/uQwhwXIFJj0hXGvGcoDvjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPJCFL%2FdJMcaiaxdvp%2FuQwhwXIFJj0hXGvGcoDvjk%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;70&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 계정 생성 후 키 탭 -&amp;gt; 키 추가 -&amp;gt; 새 키 만들기 -&amp;gt; JSON -&amp;gt; 파일 다운로드 -&amp;gt; 안전한 경로에 보관&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxaU00/dJMcadfZGv0/HuKkM1fqJLbmwdkwODRqo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxaU00/dJMcadfZGv0/HuKkM1fqJLbmwdkwODRqo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxaU00/dJMcadfZGv0/HuKkM1fqJLbmwdkwODRqo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxaU00%2FdJMcadfZGv0%2FHuKkM1fqJLbmwdkwODRqo0%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;568&quot; height=&quot;82&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF22S7/dJMcafLEd31/c2tdpYBKPRr5uv3jfv5Be1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF22S7/dJMcafLEd31/c2tdpYBKPRr5uv3jfv5Be1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF22S7/dJMcafLEd31/c2tdpYBKPRr5uv3jfv5Be1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF22S7%2FdJMcafLEd31%2Fc2tdpYBKPRr5uv3jfv5Be1%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;403&quot; height=&quot;122&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 키에 담겨있는 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1763556405320&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;type&quot;: &quot;service_account&quot;,
  &quot;project_id&quot;: &quot;&quot;,
  &quot;private_key_id&quot;: &quot;&quot;,
  &quot;private_key&quot;: &quot;&quot;,
  &quot;client_email&quot;: &quot;&quot;,
  &quot;client_id&quot;: &quot;&quot;,
  &quot;auth_uri&quot;: &quot;https://accounts.google.com/o/oauth2/auth&quot;,
  &quot;token_uri&quot;: &quot;https://oauth2.googleapis.com/token&quot;,
  &quot;auth_provider_x509_cert_url&quot;: &quot;https://www.googleapis.com/oauth2/v1/certs&quot;,
  &quot;client_x509_cert_url&quot;: &quot;https://www.googleapis.com/robot/v1/metadata/x509/&quot;,
  &quot;universe_domain&quot;: &quot;googleapis.com&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 구글 드라이브에서 새 스프레드시트 생성 후 시트 공유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;시트 공유 -&amp;gt; 서비스 계정 이메일을 편집자로 초대(서비스 계정 세부정보에 이메일 정보 확인)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;시트를 공유해야 Google 내부에서 이 계정에 접근 권한을 준 것으로 기록됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. URL에서 시트 id를 복사&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- https://docs.google.com/spreadsheets/d/&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;lt;spreadsheetId&amp;gt;&lt;/span&gt;/edit?gid=0#gid=0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Java Project 생성&lt;/h4&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;- Type: maven&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java Version: 17&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Dependency : Sprinb Boot DevTools, Spring Web&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E15Ug/dJMcajtKjkU/Niop2owTXWlCIk6tenWoPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E15Ug/dJMcajtKjkU/Niop2owTXWlCIk6tenWoPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E15Ug/dJMcajtKjkU/Niop2owTXWlCIk6tenWoPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE15Ug%2FdJMcajtKjkU%2FNiop2owTXWlCIk6tenWoPK%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;453&quot; height=&quot;522&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) pom.xml에 googleapi dependency 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761836458629&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Google Sheets API (존재하는 최신 버전) --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.apis&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;google-api-services-sheets&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;v4-rev20250616-2.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- Google Auth (Service Account) --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.auth&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;google-auth-library-oauth2-http&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.23.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- Google API Client --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.api-client&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;google-api-client&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.6.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- HTTP JSON 파서 --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.http-client&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;google-http-client-jackson2&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.43.3&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) application.yaml에 sheets 관련 설정 추가 (사용자 정의 키)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sheet-name도 실존 sheet명을 적어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- yml에 정보를 빼지 않고 class에서 직접 선언해서 사용해도 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1761837150856&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sheets:
  spreadsheet-id: &quot;&amp;lt;스프레드시트_ID&amp;gt;&quot;
  sheet-name: &quot;Sheet1&quot;
  credentials-path: &quot;C:/keys/sheets-appender-sa.json&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 코드 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- gpt 선생님의 도움을 받아 금방 작성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1761839189646&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.demo;

import java.io.FileInputStream;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.AppendValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;

@Service
public class GoogleSheetsService {

	@Value(&quot;${sheets.spreadsheet-id}&quot;)
	private String spreadsheetId;
	
	@Value(&quot;${sheets.sheet-name}&quot;)
	private String sheetName;
	
	@Value(&quot;${sheets.credentials-path}&quot;)
	private String credentialsPath;
	
	public void appendTestData() throws Exception {
        //google api 호출에 사용할 https 전송 계층 생성
        var httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        var jsonFactory = GsonFactory.getDefaultInstance();

        //sa자격증명 + 범위 지정
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(credentialsPath))
                .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS)); //읽기+쓰기 권한
        
        //sheets api client 생성
        Sheets sheets = new Sheets.Builder(httpTransport, jsonFactory, new HttpCredentialsAdapter(credentials))
                .setApplicationName(&quot;SheetsAppenderApp&quot;)
                .build();
        
        //기록할 데이터 준비(한국 시간 timestamp)
        String now = ZonedDateTime.now(ZoneId.of(&quot;Asia/Seoul&quot;))
                .format(DateTimeFormatter.ofPattern(&quot;yyyy.MM.dd HH:mm:ss&quot;));
        
        //sheet에 write할 값(2차원 배열 형태)
        List&amp;lt;List&amp;lt;Object&amp;gt;&amp;gt; values = Arrays.asList(
                Arrays.asList(now, &quot;test1&quot;)
        );
        ValueRange body = new ValueRange().setValues(values);

        //append(행 추가) 호출
        //range:탭이름!열범위
        AppendValuesResponse response = sheets.spreadsheets().values()
                .append(spreadsheetId, sheetName + &quot;!A:B&quot;, body)
                .setValueInputOption(&quot;USER_ENTERED&quot;)
                .execute();

        System.out.println(&quot;Append 완료: &quot; + response.getUpdates().getUpdatedRange());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1761839327910&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class GoogleSheetsAppenderApplication {

	public static void main(String[] args) {
		SpringApplication.run(GoogleSheetsAppenderApplication.class, args);
	} 
		
	@Bean
	CommandLineRunner run(GoogleSheetsService svc) {
		return args -&amp;gt; {
			svc.appendTestData();
		};
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Append&amp;nbsp;완료:&amp;nbsp;test!A1:B1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crW2Ir/dJMcaaDzuHF/YqUNmEn3vPTtApzqRKEAY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crW2Ir/dJMcaaDzuHF/YqUNmEn3vPTtApzqRKEAY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crW2Ir/dJMcaaDzuHF/YqUNmEn3vPTtApzqRKEAY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrW2Ir%2FdJMcaaDzuHF%2FYqUNmEn3vPTtApzqRKEAY0%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;256&quot; height=&quot;168&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;*구글 API 호출 코드 정리&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Sheets Client는&lt;/b&gt;&amp;nbsp;Google Sheets API를 호출하는 통신 도구. 즉, 구글 시트와 서버와 대화할 수 있는 통로&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Sheets Client는 단순 HTTP 호출기가 아니라 API SDK 내부에 많은 상태가 유지되어있어 매번 새로 생성하면 부담이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 서비스 계정은 OAuth 서버와 백엔드 통신으로 Access Token 생성한다. Sheet Client를 요청마다 새로 생성하면 매번 토큰 발급 요청을 보내고 OAuth 서버가 순간적으로 네트워크가 불안하면 에러 발생한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(GoogleAuthException: Error getting access token for service account)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Access Token 얻는 과정은 아래와 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) private key로 JWT Assertion 생성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) Google OAuth 서버에 POST (url: &lt;a href=&quot;https://oauth2.googleapis.com/token)&quot;&gt;https://oauth2.googleapis.com/token)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3) 응답에서 Access Token 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4) 유효기간 3600s(1h)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;5) 만료되면 refresh token 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Access Token의 유효기간이 1시간이므로 Sheet Client를 재사용하면 토큰 발급은 1시간에 한 번만 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>혼공</category>
      <category>access token</category>
      <category>Google Sheet API</category>
      <category>googlesheet</category>
      <category>oauth</category>
      <category>구글시트</category>
      <category>자동</category>
      <category>자동 기록</category>
      <author>jjiiyoung</author>
      <guid isPermaLink="true">https://jiyoungkim93.tistory.com/19</guid>
      <comments>https://jiyoungkim93.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 31 Oct 2025 01:03:58 +0900</pubDate>
    </item>
  </channel>
</rss>