<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>국밥 개발자</title>
    <link>https://puk0806.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 8 Aug 2026 21:03:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>차노도리</managingEditor>
    <image>
      <title>국밥 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/5792470/attach/da133ad25ebf4488978950a96ee6fc8a</url>
      <link>https://puk0806.tistory.com</link>
    </image>
    <item>
      <title>[React] 'react-virtuoso' Windowing 최적화하기 (스크롤 성능개선, 뒤로가기 처리)</title>
      <link>https://puk0806.tistory.com/118</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Windowing의 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windowing은 가상화 기법의 일종으로, 대량의 데이터를 렌더링 할 때 성능을 최적화하기 위해 사용되는 방법 중 하나이다.&lt;br /&gt;화면 전체를 한 번에 렌더링 하는 대신, 화면에 보이는 영역과 오버스캔 영역만 렌더링 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 리스트나 테이블에서 수천 개 이상의 아이템을 렌더링해야 할 때 사용되며, 화면에 보이는 항목들만 렌더링 하고 사용자가 스크롤할 때 새로운 항목을 점진적으로 렌더링 하는 방식이다. 이 과정에서 보이지 않는 항목은 메모리와 DOM에서 제외되어 성능이 최적화된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;windowing.jpg&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCAeXT/btsJLZbqviO/w3CKBixtqpKbkaeDGRKfH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCAeXT/btsJLZbqviO/w3CKBixtqpKbkaeDGRKfH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCAeXT/btsJLZbqviO/w3CKBixtqpKbkaeDGRKfH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCAeXT%2FbtsJLZbqviO%2Fw3CKBixtqpKbkaeDGRKfH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;609&quot; data-filename=&quot;windowing.jpg&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windowing 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수천 개의 리스트 아이템을 한 번에 렌더링 하지 않고, 화면에 보이는 부분만 렌더링 하므로 DOM 크기가 줄어들어 렌더링 성능과 초기 로딩 속도가 크게 개선된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windowing 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 빠르게 스크롤 시 아이템이 제대로 렌더링 되지 않아서 깜빡임 현상이 발생할 수 있다. (Over Scan을 통하여 어느 정도 해결 가능)&lt;/li&gt;
&lt;li&gt;작은 리스트에서 Windowing 적용하는 계산 비용이 오히려 성능을 저하시킬 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;React Windowing 라이브러리 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라이브러리 비교 요약&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&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;height: 20px; width: 14.7674%;&quot;&gt;&lt;b&gt;라이브러리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 19.0698%;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 18.4884%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 22.6744%;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 24.8837%;&quot;&gt;적합한 상황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 14.7674%;&quot;&gt;&lt;b&gt;React Window&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 19.0698%;&quot;&gt;경량화된 가상화 라이브러리&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 18.4884%;&quot;&gt;간단한 사용법, 가벼운 성능&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 22.6744%;&quot;&gt;복잡한 기능 부족&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 24.8837%;&quot;&gt;간단한 리스트나 그리드가 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 14.7674%;&quot;&gt;&lt;b&gt;React Virtualized&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 19.0698%;&quot;&gt;기능이 풍부한 가상화 라이브러리&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 18.4884%;&quot;&gt;다양한 고급 기능 제공, 유연성&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 22.6744%;&quot;&gt;복잡하고 무거운 사용법&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 24.8837%;&quot;&gt;대규모 데이터 및 복잡한 레이아웃이 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 14.7674%;&quot;&gt;&lt;b&gt;Virtuoso&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 19.0698%;&quot;&gt;가변 크기 항목에 최적화된 라이브러리&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 18.4884%;&quot;&gt;가변 크기 처리, 자동 스크롤 관리&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 22.6744%;&quot;&gt;매우 대규모 데이터 처리에 부족할 수 있음&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 24.8837%;&quot;&gt;동적 데이터를 다루는 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-virtuoso&amp;nbsp; 선택 이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트의 크기가 동적으로 변하는 상황이 많았기 때문에,&amp;nbsp; 가변 크기의 컴포넌트를 자동으로 처리해 주는 라이브러리 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;react-virtuoso 적용하기&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;공식 문서 : &lt;a href=&quot;https://virtuoso.dev/&quot;&gt;https://virtuoso.dev/&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1727244050197&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;Getting Started with React Virtuoso | React Virtuoso&quot; data-og-description=&quot;React Virtuoso is a set of React components that display large data sets using virtualized rendering. The Virtuoso components automatically handle items with variable sizes and changes in items' sizes.&quot; data-og-host=&quot;virtuoso.dev&quot; data-og-source-url=&quot;https://virtuoso.dev/&quot; data-og-url=&quot;https://virtuoso.dev/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://virtuoso.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://virtuoso.dev/&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;Getting Started with React Virtuoso | React Virtuoso&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React Virtuoso is a set of React components that display large data sets using virtualized rendering. The Virtuoso components automatically handle items with variable sizes and changes in items' sizes.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;virtuoso.dev&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;라이브러리 설치&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1727244117246&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install react-virtuoso&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Virtuoso 적용하기&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Virtuoso Props
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useWindowScroll :&amp;nbsp; 브라우저의 기본 스크롤바를 활용하여 스크롤&lt;/li&gt;
&lt;li&gt;totalCount : 전체 데이터의 총길이를 설정&lt;/li&gt;
&lt;li&gt;data : 렌더링 할 데이터 리스트&lt;/li&gt;
&lt;li&gt;overscan : 화면에 보이지 않는 영역에 미리 렌더링 할 높이&lt;/li&gt;
&lt;li&gt;itemContent :&amp;nbsp; data 리스트를 순회하면서 각 항목을 렌더링 할 컴포넌트를 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1727244164174&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Virtuoso } from &quot;react-virtuoso&quot;;
interface WindowingScrollTemplateProps {
  datas: data[];
}
export default function WindowingScrollTemplate({
  datas,
}: WindowingScrollTemplateProps) {
  return (
    &amp;lt;Virtuoso
      useWindowScroll
      totalCount={datas.length || 0}
      data={datas || []}
      overscan={3000}
      itemContent={(itemIndex, item) =&amp;gt; {
        return &amp;lt;ItemComponent data={item} key={`item-${itemIndex}`} /&amp;gt;;
      }}
    /&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ol&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;h2 data-ke-size=&quot;size26&quot;&gt;페이지 이동후 스크롤 복원하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤 이벤트가 발생할 때 현재 화면에 보이는 아이템의 인덱스를 저장해 두었다가, 뒤로 가기를 통해 페이지에 다시 접근할 경우 저장된 정보에 맞춰 스크롤 위치를 복원할 수 있다.&lt;/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;Virtuoso에서 스크롤 초기 설정을 위한 주요 Props&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;initialTopMostItemIndex
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 렌더링 시, 데이터 리스트의 특정 인덱스를 기준으로 스크롤 위치를 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;initialScrollTop
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 렌더링 시, 픽셀 단위로 스크롤 위치를 설정한다.&lt;/li&gt;
&lt;li&gt;document에서는 initialTopMostItemIndex를 권장하고 있으며, 이는 인덱스 기반으로 보다 안정적인 스크롤 제어를 제공&lt;/li&gt;
&lt;li&gt;렌더링 완료 전에 스크롤이 이동되어 예상대로 동작하지 않는 경우가 있는 거 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Virtuoso에서 사용할 추가 Props&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itemsRendered : 리스트가 렌더링 될 때 호출되며, 보이는 DOM 정보를 제공한다. 이 정보를 활용해 현재 보이는 아이템들을 추적할 수 있다.&lt;/li&gt;
&lt;li&gt;isScrolling : 스크롤이 이동 중인지 멈췄는지 여부를 나타낸다. 스크롤이 멈췄을 때 특정 작업을 트리거할 수 있다.&lt;/li&gt;
&lt;/ul&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;initialTopMostItemIndex&lt;/b&gt;를 활용한 스크롤 복원 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;itemsRendered를 사용하여 리스트가 렌더링 될 때 보이는 아이템의 정보를 저장한다. 이를 통해 화면에 보이는 아이템의 인덱스를 추적할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isScrolling을 활용해, 스크롤이 멈췄을 때 현재 스크롤 위치를 저장한다. 스크롤 이벤트가 끝난 시점에 정확한 인덱스나 스크롤 위치를 저장하는 것이 중요하다.&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;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뒤로 가기를 통해 페이지에 다시 접근하지 않았을 경우에는, 저장된 스크롤 값을 제거하는 로직이 필요하다. 페이지 이동 시 상태를 관리하여 불필요한 스크롤 복원이 일어나지 않도록 해야 한다.&lt;/li&gt;
&lt;li&gt;itemsRendered&lt;span&gt;에서 제공되는 &lt;/span&gt;아이템 정보의 offsetTop 값&lt;span&gt;은, &lt;/span&gt;useWindowScroll&lt;span&gt;를 사용하는 경우에도 &lt;/span&gt;기본 브라우저 스크롤의 offsetTop 값이 아닌 Virtuoso 내부의 offsetTop 값&lt;span&gt;을 반환한다. 이 점을 고려하여 스크롤 복원 로직을 작성해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시 코드)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727244351677&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Virtuoso } from &quot;react-virtuoso&quot;;
import { useRef } from &quot;react&quot;;

interface WindowingScrollTemplateProps {
  datas: data[];
}

export default function WindowingScrollTemplate({
  datas,
}: WindowingScrollTemplateProps) {
  const scrollInfoCookie = getCookie(SCROLL_INFO);
  const virtuosoRef = useRef&amp;lt;HTMLDivElement | null&amp;gt;(null);
  const viewItemRef = useRef&amp;lt;data[]&amp;gt;([]);

  const handleItemRender = (items: data[]) =&amp;gt; {
    viewItemRef.current = items;
  };

  // 현재 가운데에 있는 아이템의 Index 찾기
  const handleFindViewIndex = () =&amp;gt; {
    const scrollY = window.scrollY;
    const innerHeight = window.innerHeight;
    const virtuosoOffsetTop = virtuosoRef.current?.offsetTop || 0;

    if (!virtuosoRef.current || viewItemRef.current.length === 0) {
      return;
    }

    const viewportMiddle =
      Math.round(scrollY + innerHeight / 2) - virtuosoOffsetTop;

    const visibleItem = viewItemRef.current.find(
      (item) =&amp;gt;
        item.offset &amp;lt;= viewportMiddle &amp;amp;&amp;amp;
        item.offset + item.size &amp;gt;= viewportMiddle
    );

    const scrollIndex = visibleItem?.index;

    if (!scrollIndex || scrollIndex &amp;lt;= 1) {
      clearCookie(SCROLL_INFO);
      return;
    }

    setCookie(SCROLL_INFO, JSON.stringify({ scrollIndex }));
  };

  return (
    &amp;lt;div ref={virtuosoRef}&amp;gt;
      &amp;lt;Virtuoso
        useWindowScroll
        totalCount={datas.length}
        data={datas}
        overscan={3000}
        itemsRendered={handleItemRender}
        isScrolling={(isScrolling) =&amp;gt; {
          if (!isScrolling) {
            handleFindViewIndex();
          }
        }}
        {...(scrollInfoCookie?.scrollIndex &amp;gt; 0 &amp;amp;&amp;amp; {
          initialTopMostItemIndex: {
            index: scrollInfoCookie.scrollIndex,
            align: &quot;center&quot;,
          },
        })}
        itemContent={(itemIndex, item) =&amp;gt; (
          &amp;lt;ItemComponent data={item} key={`item-${itemIndex}`} /&amp;gt;
        )}
      /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;스크롤이 많을 경우 페이지&amp;nbsp;성능비교 (약 1,200건의 데이터 리스트 렌더링)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜더링 해야할 DOM이 많을 경우Windowing에 장점이 부각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-resize-percent=&quot;54.36696005416385&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.6047%;&quot;&gt;체크 방법&lt;/td&gt;
&lt;td style=&quot;width: 32.4419%;&quot;&gt;네트워크 요청 시간 비교&lt;/td&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;리소스 양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.6047%;&quot;&gt;데이터 캐싱되어있는 경우 렌더링 비교&lt;/td&gt;
&lt;td style=&quot;width: 32.4419%;&quot;&gt;약 9.5초 -&amp;gt; 약 2초&lt;/td&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;약 43 MB -&amp;gt; 약 2 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.6047%;&quot;&gt;데이터 캐싱 안 되어있는 경우 렌더링 비교&lt;/td&gt;
&lt;td style=&quot;width: 32.4419%;&quot;&gt;약 12 초 -&amp;gt; 약 6초&lt;/td&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;약 46 MB -&amp;gt; 약 5MB&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;데이터 캐싱 되어 있을 때 네트워크 요청 비교&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.12.48.png&quot; data-origin-width=&quot;1311&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJWnzI/btsJSpOkXbU/qaRkNcl4wVj4qyuClTKXXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJWnzI/btsJSpOkXbU/qaRkNcl4wVj4qyuClTKXXK/img.png&quot; data-alt=&quot;윈도윙 미 적용 (데이터 캐싱 되어있음)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJWnzI/btsJSpOkXbU/qaRkNcl4wVj4qyuClTKXXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJWnzI%2FbtsJSpOkXbU%2FqaRkNcl4wVj4qyuClTKXXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1311&quot; height=&quot;199&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.12.48.png&quot; data-origin-width=&quot;1311&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도윙 미 적용 (데이터 캐싱 되어있음)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.14.23.png&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8vM8/btsJSou6DMZ/4TPk8a3LkluVUOK5TC3sH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8vM8/btsJSou6DMZ/4TPk8a3LkluVUOK5TC3sH1/img.png&quot; data-alt=&quot;윈도윙 적용 (데이터 캐싱 되어있음)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8vM8/btsJSou6DMZ/4TPk8a3LkluVUOK5TC3sH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8vM8%2FbtsJSou6DMZ%2F4TPk8a3LkluVUOK5TC3sH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1304&quot; height=&quot;205&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.14.23.png&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도윙 적용 (데이터 캐싱 되어있음)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 캐싱 안되어 있을 때 네트워크 요청 비교&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.13.48.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbRTLa/btsJSKxQliw/MrvDniSI2LBCwmV3MxE59k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbRTLa/btsJSKxQliw/MrvDniSI2LBCwmV3MxE59k/img.png&quot; data-alt=&quot;윈도윙 미 적용 (데이터 캐싱 안되어있을 때)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbRTLa/btsJSKxQliw/MrvDniSI2LBCwmV3MxE59k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRTLa%2FbtsJSKxQliw%2FMrvDniSI2LBCwmV3MxE59k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1308&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.13.48.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도윙 미 적용 (데이터 캐싱 안되어있을 때)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.12.00.png&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceL5Ng/btsJRdVMOWW/MTGgD2wkTaPrk2aCKByrkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceL5Ng/btsJRdVMOWW/MTGgD2wkTaPrk2aCKByrkk/img.png&quot; data-alt=&quot;윈도윙 적용 (데이터 캐싱 안되어 있을 때)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceL5Ng/btsJRdVMOWW/MTGgD2wkTaPrk2aCKByrkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceL5Ng%2FbtsJRdVMOWW%2FMTGgD2wkTaPrk2aCKByrkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1307&quot; height=&quot;196&quot; data-filename=&quot;스크린샷 2024-09-30 오후 4.12.00.png&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도윙 적용 (데이터 캐싱 안되어 있을 때)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대량의 DOM 요소를 렌더링 하는 페이지에서는 Windowing 기술을 도입함으로써 네트워크 요청 시간이 단축되고, 렌더링 성능을 크게 개선할 수 있다. 특히 수천 개 이상의 리스트나 데이터를 효율적으로 처리할 때 유용하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 DOM 요소가 적거나 데이터 양이 작은 페이지에서는, 불필요한 연산이 추가되므로 오히려 성능 저하를 일으킬 수 있다. 따라서 데이터 양과 사용 시나리오를 고려해 적절한 상황에서 Windowing을 적용하는 것이 중요하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 초기 화면 진입 시의 스크롤 위치에 대한 고민도 필요하다. 사용자가 페이지를 다시 방문하거나 뒤로 가기를 통해 접근할 때, 스크롤 복원과 관련된 로직은 성능과 사용자 편의성을 동시에 고려해한다.&lt;/p&gt;</description>
      <category>React</category>
      <category>InfiniteScroll</category>
      <category>react</category>
      <category>react-virtuoso</category>
      <category>windoing</category>
      <category>뒤로가기</category>
      <category>성능개선</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/118</guid>
      <comments>https://puk0806.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 28 Sep 2024 21:49:51 +0900</pubDate>
    </item>
    <item>
      <title>[structuredClone] Js 깊은 복사 쉽게 하기(Deep Copy)</title>
      <link>https://puk0806.tistory.com/117</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;얕은 복사 (Shallow Copy)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 데이터 타입의 경우 그 값이 그대로 복사한다.&lt;/li&gt;
&lt;li&gt;객체와 같은 참조 타입의 경우 메모리 주소만 복사한다. (원본데이터와 복사 데이터가 서로에게 영향을 미친다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 얕은&lt;span&gt; &lt;/span&gt;복사&lt;span&gt; &lt;/span&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1714142975999&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = { a: 1, b: { c: 2 } };
const shallowCopy1 = { ...obj };
const shallowCopy2 = Object.assign({}, obj);

console.log(shallowCopy1.b.c);  // 2
shallowCopy1.b.c = 3;
console.log(obj.b.c);  // 3 (원본 객체도 영향을 받음)
shallowCopy2.b.c = 4;
console.log(obj.b.c);  // 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;깊은&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;복사&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (Deep Copy)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 데이터 타입뿐만 아니라, 객체와 같은 참조 타입의 경우에도 독립된 복사본을 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. JSON.parse(JSON.stringify(obj))&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON으로 변환 가능한 데이터 타입만 처리할 수 있다. (undefined, Symbol 타입은 복사되지 않음)&lt;/li&gt;
&lt;li&gt;객체의 구조가 크고 복잡할 경우 코드가 길어지고 가독성이 떨어질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1714143243705&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj1 = { a: 1, b: { c: 2 } };
const deepCopy1 = JSON.parse(JSON.stringify(obj1));

deepCopy1.b.c = 3;

console.log(obj1.b.c);  // 2 - 원본 객체는 영향받지 않음
console.log(deepCopy1.b.c);  // 3

const obj2 = {
  number: 1,
  undefinedValue: undefined,
  symbolValue: Symbol(&quot;unique&quot;)
};

const deepCopy2 = JSON.parse(JSON.stringify(obj2));

console.log(deepCopy2);   // {number: 1} - JSON으로 변환 가능한 데이터만 복사&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. lodash - cloneDeep(obj)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라이브러리 설치 및 라이브러리에 대한 의존성 생김&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1714143262685&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import _ from 'lodash';
const obj = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(obj);

deepCopyWithLodash.b.c = 3;
console.log(obj.b.c);  // 2
console.log(deepCopy.b.c);  // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3.&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;structuredClone(obj)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 깊은 복사에 비해 빠르고 효율적이다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1714143321781&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;structuredClone() global function - Web APIs | MDN&quot; data-og-description=&quot;The global structuredClone() method creates a deep clone of a given value using the structured clone algorithm.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HzQLC/hyVVAwWLyO/1an4gykZ306BkCtrR7IKH1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HzQLC/hyVVAwWLyO/1an4gykZ306BkCtrR7IKH1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;structuredClone() global function - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The global structuredClone() method creates a deep clone of a given value using the structured clone algorithm.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714143346421&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {
  number: 1,
  undefinedValue: undefined,
};

const deepCopy = structuredClone(obj);
deepCopy.number = 2;

console.log(obj);       // { number: 1, undefinedValue: undefined }
console.log(deepCopy);          // { number: 2 ,undefinedValue: undefined}&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 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;깊은 복사 성능 비교&lt;/h4&gt;
&lt;h4 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;결과 )&lt;/h4&gt;
&lt;table style=&quot;text-align: start; 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&gt;JSON.parse(JSON.stringify)&lt;/td&gt;
&lt;td&gt;0.040 ms&lt;/td&gt;
&lt;td&gt;0.051 ms&lt;/td&gt;
&lt;td&gt;0.156 ms&lt;/td&gt;
&lt;td&gt;1.099 ms&lt;/td&gt;
&lt;td&gt;110.561 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cloneDeep&lt;/td&gt;
&lt;td&gt;0.452 ms&lt;/td&gt;
&lt;td&gt;0.808 ms&lt;/td&gt;
&lt;td&gt;3.387 ms&lt;/td&gt;
&lt;td&gt;8.761 ms&lt;/td&gt;
&lt;td&gt;174.174 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;structuredClone&lt;/td&gt;
&lt;td&gt;0.563 ms&lt;/td&gt;
&lt;td&gt;0.571 ms&lt;/td&gt;
&lt;td&gt;0.751 ms&lt;/td&gt;
&lt;td&gt;3.051 ms&lt;/td&gt;
&lt;td&gt;169.150 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;결론 (개인적인 생각)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON.parse
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능이 가장 좋다.&lt;/li&gt;
&lt;li&gt;Json으로 파싱 가능한것만 복사가 가능하다.&lt;/li&gt;
&lt;li&gt;코드가 길어져서 가독성이 떨어질수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cloneDeep&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 라이브러리에 의존하여 추가적인 설치가 필요하다.&lt;/li&gt;
&lt;li&gt;성능이 안좋다.&lt;/li&gt;
&lt;li&gt;코드가 간결하여 가독성이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;structuredClone
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적인 설치 없이 바로 사용 가능하다.&lt;/li&gt;
&lt;li&gt;다른 서드파티 라이브러리에 비해 성능이 비교적 좋다.&lt;/li&gt;
&lt;li&gt;코드가 간결하여 가독성이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>FrontEnd</category>
      <category>copy</category>
      <category>deep clone</category>
      <category>deep copy</category>
      <category>structuredClone</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/117</guid>
      <comments>https://puk0806.tistory.com/117#entry117comment</comments>
      <pubDate>Fri, 26 Apr 2024 23:56:30 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 메모리 관리, 소유권 규칙 정리</title>
      <link>https://puk0806.tistory.com/116</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://www.rust-lang.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.rust-lang.org/&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1713095610995&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;Rust Programming Language&quot; data-og-description=&quot;A language empowering everyone to build reliable and efficient software.&quot; data-og-host=&quot;www.rust-lang.org&quot; data-og-source-url=&quot;https://www.rust-lang.org/&quot; data-og-url=&quot;https://www.rust-lang.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brtrja/hyVPPATexI/EE1AYBzB1kRURiwXFlIwTK/img.jpg?width=2048&amp;amp;height=1024&amp;amp;face=0_0_2048_1024,https://scrap.kakaocdn.net/dn/bpXNVi/hyVPJ1KJTi/Og6U2ahTWV3JIlX3IrLv0k/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/ZKNkw/hyVPQzOgvI/MShMYRKhrq0ZkoUJgcGX30/img.png?width=1000&amp;amp;height=640&amp;amp;face=0_0_1000_640&quot;&gt;&lt;a href=&quot;https://www.rust-lang.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.rust-lang.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brtrja/hyVPPATexI/EE1AYBzB1kRURiwXFlIwTK/img.jpg?width=2048&amp;amp;height=1024&amp;amp;face=0_0_2048_1024,https://scrap.kakaocdn.net/dn/bpXNVi/hyVPJ1KJTi/Og6U2ahTWV3JIlX3IrLv0k/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024,https://scrap.kakaocdn.net/dn/ZKNkw/hyVPQzOgvI/MShMYRKhrq0ZkoUJgcGX30/img.png?width=1000&amp;amp;height=640&amp;amp;face=0_0_1000_640');&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;Rust Programming Language&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A language empowering everyone to build reliable and efficient software.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.rust-lang.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Rust 메모리 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rust는 가비지 컬렉터(GC)를 사용하지 않으면서도 안전한 메모리 관리를 수행한다.&lt;/li&gt;
&lt;li&gt;컴파일러가 소유권 규칙을 강제함으로써, 메모리 할당 및 해제를 자동으로 관리한다.&lt;/li&gt;
&lt;li&gt;개발자는 메모리 해제를 직접 처리할 필요가 없다.&lt;/li&gt;
&lt;li&gt;런타임 성능 저하 없이 메모리 안정성을 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Rust 소유권 규칙&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 값은 소유자(owner)를 가지며, 한 시점에 단 하나의 소유자만이 존재할 수 있다.&lt;/li&gt;
&lt;li&gt;소유자가 스코프를 벗어나면, 그 값은 자동으로 해제된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Stack 영역&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 시점에 크기가 결정된다. 함수가 호출될 때 자동으로 할당되며, 함수가 종료될 때 자동으로 해제된다.&lt;/li&gt;
&lt;li&gt;기본 데이터 타입(정수, 부동 소수점, 불리언, 문자 등)과 고정된 크기를 가진 튜플(기본 데이터 타입으로만 구성된 경우)이 스택 영역에 저장된다.&lt;/li&gt;
&lt;li&gt;스택 영역에 저장된 데이터는 값이 복사되어 다른 변수에 할당될 때 원본 데이터 자체가 복사된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Stack영역 소유권 이동이 되지 않고 데이터 복사 예시&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713095816195&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 3;
let y = x;  // Stack 영역에 있는 데이터 복사 시, 데이터 자체가 복사되

println!(&quot;x ={}&quot;, x);   // 사용 가능
println!(&quot;y ={}&quot;, y);&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Heap 영역&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;런타임 시점에 크기가 결정되며, 동적으로 메모리가 할당된다.&lt;/li&gt;
&lt;li&gt;힙 영역의 데이터를 이동하거나 복사할 때는 소유권이 넘어가거나 명시적으로 clone()을 사용하여 데이터를 복사해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) Heap 영역 소유권 이동 예시&lt;/p&gt;
&lt;pre id=&quot;code_1713095869591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str1 = String::from(&quot;스트링 생성&quot;);
println!(&quot;str1 = {}&quot;, str1);

let str2 = str1;    // heap 메모리 str1 소유권 str2로 넘어감
let str3 = str2.clone();    // str2의 데이터를 복사하여 str3를 생성

println!(&quot;str1 = {}&quot;, str1);    // 소유권이 str2로 넘어가서 str1은 사용할 수 없음
println!(&quot;str2 = {}&quot;, str2);
println!(&quot;str3 = {}&quot;, str3);&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;ex) 함수 사용 예시&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713095951157&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // 함수 테스트
{
    let number = 31;
    owner_function_number(number);
    println!(&quot;데이터가 복사되서 소유권 넘어가지 않음 {}&quot;, number);

    let str1 = String::from(&quot;스트링 생성&quot;);
    owner_function_string(str1);
    println!(&quot;소유권 넘어감 {}&quot;, str1); // 소유권이 넘어가서 사용 불가
}


fn owner_function_number(number: i32) {
    println!(&quot;소우권 테스트 number : {}&quot;, number)
}

fn owner_function_string(str: String) {
    println!(&quot;소유권 테스트 String : {}&quot;, str)
}&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;소유권을 넘겨주지 않고 임대하는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`&amp;amp;`(참조)를 사용하여 소유권을 넘기지 않고 넘기거나, 받을 수 있다.&lt;/li&gt;
&lt;li&gt;기본 값은 immutable이어서 mutable시 명시해서 넘겨줘야 한다.&lt;/li&gt;
&lt;li&gt;`&amp;amp;mut`(변경 참조)는 한 스코프 내에서 하나만 존재할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713096290460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    let mut str1 = String::from(&quot;스트링 생성&quot;);
    owner_function_rent_string(&amp;amp;str1);
    println!(&quot;소유권 임대해서 넘어감 {}&quot;, str1);
    owner_function_rent_mut_string(&amp;amp;mut str1);
}

fn owner_function_rent_string(str: &amp;amp;String) {
    println!(&quot;소유권 임대 테스트 String : {}&quot;, str)
}

fn owner_function_rent_mut_string(str: &amp;amp;mut String) {
    str.push_str(&quot;mutable&quot;);
    println!(&quot;mutable 테스트 String : {}&quot;, str)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Rust</category>
      <category>Rust</category>
      <category>메모리 관리</category>
      <category>소유권</category>
      <category>소유권 규칙</category>
      <category>소유권 임대</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/116</guid>
      <comments>https://puk0806.tistory.com/116#entry116comment</comments>
      <pubDate>Sun, 14 Apr 2024 21:06:42 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] Component Polymorphic하게 사용하기</title>
      <link>https://puk0806.tistory.com/115</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘못된&amp;nbsp; Polymorphic Component 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;component &lt;span&gt;타입에&lt;/span&gt; &lt;span&gt;따라&lt;/span&gt; &lt;span&gt;필요한&lt;/span&gt; props&lt;span&gt;가&lt;/span&gt; &lt;span&gt;다름.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;모든&lt;/span&gt; props&lt;span&gt;가&lt;/span&gt; &lt;span&gt;선택적&lt;/span&gt;(optional)&lt;span&gt;으로&lt;/span&gt; &lt;span&gt;처리되어&lt;/span&gt;, &lt;span&gt;런타임에&lt;/span&gt; &lt;span&gt;필요한&lt;/span&gt; props&lt;span&gt;가&lt;/span&gt; &lt;span&gt;누락될&lt;/span&gt; &lt;span&gt;수&lt;/span&gt;&amp;nbsp;있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1706345006591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { MouseEventHandler } from &quot;react&quot;;

type ButtonType = &quot;button&quot; | &quot;a&quot;;

interface ButtonProps {
  component: ButtonType;
  href?: string;
  onclick?: MouseEventHandler&amp;lt;HTMLAnchorElement &amp;amp; HTMLButtonElement&amp;gt;;
  children: React.ReactNode;
}

const Button = ({ component, href, onclick, children }: ButtonProps) =&amp;gt; {
  return component === &quot;a&quot; ? (
    &amp;lt;a href={href}&amp;gt;{children}&amp;lt;/a&amp;gt;
  ) : (
    &amp;lt;button onClick={onclick}&amp;gt;{children}&amp;lt;/button&amp;gt;
  );
};

export default Button;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;개선된 Polymorphic Component 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제네릭&lt;span&gt; &lt;/span&gt;타입을&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;컴포넌트의&lt;span&gt; &lt;/span&gt;타입을&lt;span&gt; &lt;/span&gt;명확하게&lt;span&gt; &lt;/span&gt;정의&lt;/li&gt;
&lt;li&gt;각&lt;span&gt; component &lt;/span&gt;타입에&lt;span&gt; &lt;/span&gt;맞는&lt;span&gt; &lt;/span&gt;적절한&lt;span&gt; props&lt;/span&gt;를&lt;span&gt; &lt;/span&gt;전달할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있도록&lt;span&gt; &lt;/span&gt;강제&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;props &lt;/span&gt;사용으로&lt;span&gt; &lt;/span&gt;인한&lt;span&gt; &lt;/span&gt;런타임&lt;span&gt; &lt;/span&gt;오류의&lt;span&gt; &lt;/span&gt;가능성을&lt;span&gt; 줄일 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ex)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706345611731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type ButtonType = &quot;button&quot; | &quot;a&quot;;

type PolymorphicComponentProps&amp;lt;
  T extends ButtonType,
  PropsType = Record&amp;lt;string, unknown&amp;gt;
&amp;gt; = {
  component?: T;
} &amp;amp; PropsType &amp;amp;
  React.ComponentPropsWithoutRef&amp;lt;T&amp;gt; &amp;amp; {
    ref?: React.ComponentPropsWithRef&amp;lt;T&amp;gt;[&quot;ref&quot;];
  };

interface ButtonProps {
  children: React.ReactNode;
}

const PolymorphicButton = &amp;lt;T extends ButtonType = &quot;button&quot;&amp;gt;({
  component,
  children,
  ...props
}: PolymorphicComponentProps&amp;lt;T, ButtonProps&amp;gt;) =&amp;gt; {
  const Component = (component ?? &quot;button&quot;) as React.ElementType;

  return (
    &amp;lt;Component className=&quot;button&quot; {...props}&amp;gt;
      {children}
    &amp;lt;/Component&amp;gt;
  );
};

export default PolymorphicButton;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘못된 polymorphic 컴포넌트 사용 시, component 타입에 따라 필요한 props가 명확하지 않아 오류가 발생할 수 있음&lt;/li&gt;
&lt;li&gt;개선된&lt;span&gt; &lt;/span&gt;접근&lt;span&gt; &lt;/span&gt;방식을&lt;span&gt; &lt;/span&gt;통해&lt;span&gt;, &lt;/span&gt;각&lt;span&gt; component &lt;/span&gt;타입에&lt;span&gt; &lt;/span&gt;맞는&lt;span&gt; &lt;/span&gt;적절한&lt;span&gt; props&lt;/span&gt;를&lt;span&gt; &lt;/span&gt;강제함으로써&lt;span&gt; &lt;/span&gt;타입&lt;span&gt; &lt;/span&gt;안전성을&lt;span&gt; &lt;/span&gt;향상시킬&lt;span&gt; &lt;/span&gt;수&lt;span&gt;&amp;nbsp;있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-27 오후 5.57.04.png&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckctkw/btsD5vT8gG6/EmQT0Xp5XakHcrMldMlYkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckctkw/btsD5vT8gG6/EmQT0Xp5XakHcrMldMlYkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckctkw/btsD5vT8gG6/EmQT0Xp5XakHcrMldMlYkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckctkw%2FbtsD5vT8gG6%2FEmQT0Xp5XakHcrMldMlYkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;351&quot; height=&quot;115&quot; data-filename=&quot;스크린샷 2024-01-27 오후 5.57.04.png&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;115&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>Typescript</category>
      <category>Component</category>
      <category>polymorphic</category>
      <category>TypeScript</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/115</guid>
      <comments>https://puk0806.tistory.com/115#entry115comment</comments>
      <pubDate>Sat, 27 Jan 2024 18:08:15 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] Module Federation 다른 서버 TypeScript Type 추론  Example (명시적 정의, @module-federation/typescript)</title>
      <link>https://puk0806.tistory.com/114</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Module Federation에서 Remote App 모듈 사용 시 Type 추론이 자동으로 되지 않는다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-21 오후 9.05.45.png&quot; data-origin-width=&quot;1946&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boJDt4/btsDI8sR4oE/w7ZT1kwNc2I9OBziczIll0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boJDt4/btsDI8sR4oE/w7ZT1kwNc2I9OBziczIll0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boJDt4/btsDI8sR4oE/w7ZT1kwNc2I9OBziczIll0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboJDt4%2FbtsDI8sR4oE%2Fw7ZT1kwNc2I9OBziczIll0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1946&quot; height=&quot;246&quot; data-filename=&quot;스크린샷 2024-01-21 오후 9.05.45.png&quot; data-origin-width=&quot;1946&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1. 명시적으로 정의하여 타입 추론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Monorepo프로젝트 진행 중일 경우 Remote App 경로를 명시적으로 정의하여 타입 추론이 가능하다.&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경로 명시적으로 정의되어 있어, 어떤 컴포넌트에서 오는지 쉽게 파악 가능&lt;/li&gt;
&lt;li&gt;실제 경로를 참조하여 오류를 최소화할 수 있음&lt;/li&gt;
&lt;li&gt;tsconfig 설정만으로 간단하게 사용가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모노레포 구조에서만 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1705841589177&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  // ...생략
  &quot;compilerOptions&quot;: {
    // ...생략
    &quot;paths&quot;: {
      &quot;gugbab_component_app/Button&quot;: [&quot;../gugbab-component-app/src/components/Button&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;방법 2. @module-federation/typescript 활용하여 타입 추론하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Remote App 서버가 구동 중일 때 사용 가능&lt;/li&gt;
&lt;li&gt;Host App에서 Remote App의 타입 정보를 가져와서 추론&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/module-federation/typescript&quot;&gt;https://github.com/module-federation/typescript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Remote App의 타입 정보를 최신 상태로 관리하기 쉽다.&lt;/li&gt;
&lt;li&gt;Monorepo 뿐만 아니라 Multirepo 구조에서도 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입 정보를 원격 서버에서 직접 가져오기 때문에, 원격 서버가 구동 중이어야 한다.&lt;/li&gt;
&lt;li&gt;외부 라이브러리에 의존하게 되어, 라이브러리 업데이트나, 호환성 영향을 받을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Host App, Remote App 공통 작업&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;@module-federation/typescript 모듈 받기&lt;/li&gt;
&lt;li&gt;webpack config `FederatedTypesPlugin`에 기존 federationConfig 추가하기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) webpack.config.js&lt;/p&gt;
&lt;pre id=&quot;code_1705840393945&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const { FederatedTypesPlugin } = require(&quot;@module-federation/typescript&quot;);
// ...생략

module.exports = (_, argv) =&amp;gt; ({
  // ...생략
  plugins: [
    // ...생략
    new ModuleFederationPlugin(federationConfig),
    new FederatedTypesPlugin({ federationConfig }),
  ],
});&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;size18&quot;&gt;&lt;b&gt;Host App 추가 작업&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;tsconfig에 타입 경로 추가하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1705840466572&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    // ...생략
    &quot;paths&quot;: {
      &quot;*&quot;: [&quot;./@mf-types/*&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;h3 data-ke-size=&quot;size23&quot;&gt;HostApp Remote App 모듈 사용 시 Type 추론 가능&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hxjwd/btsDNps3nB1/YqfDDqyFuhYo3eY9sqpUjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hxjwd/btsDNps3nB1/YqfDDqyFuhYo3eY9sqpUjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hxjwd/btsDNps3nB1/YqfDDqyFuhYo3eY9sqpUjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHxjwd%2FbtsDNps3nB1%2FYqfDDqyFuhYo3eY9sqpUjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1129&quot; height=&quot;77&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>MSA</category>
      <category>@module-federation/typescript</category>
      <category>module federation</category>
      <category>type</category>
      <category>TypeScript</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/114</guid>
      <comments>https://puk0806.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 21 Jan 2024 21:48:41 +0900</pubDate>
    </item>
    <item>
      <title>[Error]React - DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.</title>
      <link>https://puk0806.tistory.com/113</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;React를 프로젝트를 진행하며 페이지 이동시 아래 에러 발생&lt;/h4&gt;
&lt;pre id=&quot;code_1705503834446&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;에러 발생 소스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1705503979717&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{data &amp;amp;&amp;amp;(&amp;lt;ins/&amp;gt;)}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;에러 발생 원인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건부 랜더링시 react에서 ins태그를 node로 인식하지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;해결 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;react에서 node로 인식 할 수 있는 태그로 감싸줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1705504329517&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{data &amp;amp;&amp;amp;(&amp;lt;span&amp;gt;&amp;lt;ins/&amp;gt;&amp;lt;/span&amp;gt;)}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Error</category>
      <category>error</category>
      <category>INS</category>
      <category>Node</category>
      <category>react</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/113</guid>
      <comments>https://puk0806.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 18 Jan 2024 00:12:48 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] Module Federation란? Basic Example</title>
      <link>https://puk0806.tistory.com/112</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Module Federation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;webpack5에 도입된 고급 모듈 통합 기능&lt;/li&gt;
&lt;li&gt;서로 다른 애플리케이션이 런타임에 필요한 코드를 공유할 수 있게 해 준다.&lt;/li&gt;
&lt;li&gt;각각의 애플리케이션들이 서로 독립적으로 개발되고 배포될 수 있다.&lt;/li&gt;
&lt;li&gt;필요한 코드만 실시간으로 로드하기 때문에 애플리케이션의 성능을 최적화할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webpack.kr/concepts/module-federation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://webpack.kr/concepts/module-federation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Module Federation 구성요소&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Host&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 애플리케이션(remote)으로부터 모듈을 로드하고 사용하는 주체이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Remote&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Host에 로드될 수 있는 모듈을 제공한다.&lt;/li&gt;
&lt;li&gt;독립적으로 배포 및 업데이트가 될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Shared&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Host와 Remote 애플리케이션 간에 공유되는 의존성을 의미한다.&lt;/li&gt;
&lt;li&gt;중복된 코드의 로딩을 방지하고, 일관된 종속성 관리를 가능하게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;MonoRepo - Module Federation Example&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;워크스페이스 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gugbab-main-app : Host App&lt;/li&gt;
&lt;li&gt;gugbab-compont-app : Remote App&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704634293262&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;packages:
  - 'apps/gugbab-component-app'
  - 'apps/gugbab-main-app'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;create mf-app : 기본 설정의 module federation app을 쉽게 생성할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jherr/create-mf-app&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/jherr/create-mf-app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Module Federation&amp;nbsp; 설정하기&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;플러그인 구성&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹팩 설정 파일에서 ModuleFederationPlugin을 사용하여 host, remote 애플리케이션 설정을 정의한다.&lt;/li&gt;
&lt;li&gt;ex) apps/gugbab-component-app/webpack.config.js
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;name : 노출되는 이름&lt;/li&gt;
&lt;li&gt;filename: 생성되는 entry 파일 명&lt;/li&gt;
&lt;li&gt;expose : 노출되는 모듈 정보&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704635419323&quot; class=&quot;coffeescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;module.exports = (_, argv) =&amp;gt; ({
  ... 생략
  plugins: [
      new ModuleFederationPlugin({
        ... 생략
        name: &quot;gugbab_component_app&quot;,
        filename: &quot;remoteEntry.js&quot;,
        exposes: {
          &quot;./Button&quot;: &quot;./src/components/Button&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;원격 엔트리 파일 생성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Remote 애플리케이션에서 자체적인 빌드 과정을 통해 remote 엔트리 파일을 생성한다. (ex. remoteEntry.js)&lt;/li&gt;
&lt;li&gt;엔트로 파일로 Remote 애플리케이션의 인터페이스 역할과, Host 애플리케이션에서 접근할 수 있게 해 준다.&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;expose옵션을 통하여 Host 애플리케이션에서 로드할 수 있게 모듈을 노출시킨다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;ex) apps/gugbab- main-app/webpack.config.js&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;remotes : import 할 모듈 정보&lt;/li&gt;
&lt;li&gt;Ex) [import시 불러올 변수명] : &quot;[RemoteApp정의된 name]@[RemoteApp주소]/[RemoteApp Entry파일명]&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704635414744&quot; class=&quot;coffeescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;module.exports = (_, argv) =&amp;gt; ({
  ... 생략
  plugins: [
    new ModuleFederationPlugin({
      name: &quot;gugbab_main_app&quot;,
      filename: &quot;remoteEntry.js&quot;,
      remotes: {
        gugbab_component_app:
          &quot;gugbab_component_app@http://localhost:3001/remoteEntry.js&quot;,
      },
    }),
  ],
});

```&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;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Host 애플리케이션은 Remote 애플리케이션의 remoeteEntry를 참조하여 모듈을 동적으로 로드한다.&lt;/li&gt;
&lt;li&gt;주로 import() 문으로 로드하여 코드베이스에 통합한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704635540046&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Button = React.lazy(() =&amp;gt; import(&quot;test/Button&quot;));

const App = () =&amp;gt; (
  &amp;lt;div className=&quot;container&quot;&amp;gt;
    &amp;lt;Button&amp;gt;Gugbab Module Federation Test Button&amp;lt;/Button&amp;gt;
  &amp;lt;/div&amp;gt;
);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>MSA</category>
      <category>host</category>
      <category>MFA</category>
      <category>module federation</category>
      <category>remote</category>
      <category>webpack</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/112</guid>
      <comments>https://puk0806.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 7 Jan 2024 23:04:47 +0900</pubDate>
    </item>
    <item>
      <title>[MFA]Nginx Reverse Proxy Server특징 example(pnpm+turborepo+vite)</title>
      <link>https://puk0806.tistory.com/111</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Reverse Proxy&amp;nbsp; Server&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트 요청을 받아 백앤드 서버로 전달하고, 서버의 응답을 클라이언트에게 다시 전달하는 중간 서버 역할&lt;/li&gt;
&lt;li&gt;로드 밸런싱을 통하여 트래픽을 여러 서버에 분산시키고, 적절한 서버로 라우팅 한다.&lt;/li&gt;
&lt;li&gt;캐싱을 이용하여 동일한 응답을 두에 있는 서버에 다시 요청하지 않을 수 있음&lt;/li&gt;
&lt;li&gt;외부 사용자로부터 내부의 서버를 숨겨 보안에 도움을 준다.&lt;/li&gt;
&lt;li&gt;SSL/TLS암호화를 사용하여 안전한 데이터 전송을 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Nginx Reverse Proxy Server 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이벤트&lt;span&gt; &lt;/span&gt;기반&lt;span&gt;, &lt;/span&gt;비동기&lt;span&gt; &lt;/span&gt;아키텍처로&lt;span&gt; &lt;/span&gt;설계되어&lt;span&gt; &lt;/span&gt;높은&lt;span&gt; &lt;/span&gt;동시&lt;span&gt; &lt;/span&gt;연결을&lt;span&gt; &lt;/span&gt;효율적으로&lt;span&gt; &lt;/span&gt;처리한다.&lt;/li&gt;
&lt;li&gt;적은&lt;span&gt; &lt;/span&gt;메모리와&lt;span&gt; CPU &lt;/span&gt;사용으로&lt;span&gt; &lt;/span&gt;더&lt;span&gt; &lt;/span&gt;많은&lt;span&gt; &lt;/span&gt;트래픽을&lt;span&gt; &lt;/span&gt;처리할&lt;span&gt; &lt;/span&gt;수&lt;span&gt;&amp;nbsp;있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;효과적인&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;로드&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;밸런싱&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;기능과&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;강력한&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;캐싱&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;기능을&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;통해&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;서버&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;부하를&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;줄이고&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;응답&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;시간을&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;단축한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Nginx Reverse Proxy Server Example&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pnpm + turborepo 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704102640062&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm init

pnpm add turbo -D&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;워크스페이스 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apps : nginx 서버 생성 예정&lt;/li&gt;
&lt;li&gt;services : 여러 파이크로 서비스 생성 예정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) pnpm-workspace.yaml&lt;/h4&gt;
&lt;pre id=&quot;code_1704102716159&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;packages:
  - 'services/*'
  - 'apps'/*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;turborepo 설정파일 작성&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) turbo.json&lt;/h4&gt;
&lt;pre id=&quot;code_1704104105926&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;$schema&quot;: &quot;https://turbo.build/schema.json&quot;,
  &quot;pipeline&quot;: {
    &quot;dev&quot;: {
      &quot;cache&quot;: false,
      &quot;persistent&quot;: true
    }
  }
}&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;h2 data-ke-size=&quot;size26&quot;&gt;Nginx&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Nginx 프로젝트 생성&lt;/li&gt;
&lt;li&gt;Nginx proxy config 설정&lt;/li&gt;
&lt;li&gt;Nginx 띄우기 (Docker 이미지로 띄울 예정)&lt;/li&gt;
&lt;/ol&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. Nginx 프로젝트 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1704102966768&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 프로젝트 생성 위치에서
// ex) apps/nginx-app
pnpm init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Nginx Proxy Config 설정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) apps/nginx-app/proxy-server.conf&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;upstream 할 서버 정의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;service_home로 upstream 요청 시 3001번 포트로 proxy 시킴&lt;/li&gt;
&lt;li&gt;service_sub로 upstream 요청 시 3002번 포트로 proxy 시킴&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704103108332&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;upstream service_home {
    server host.docker.internal:3001;
}
upstream service_sub {
    server host.docker.internal:3002;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버 블록 정의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3000번 포트의 '/sub/'로 접근 시 upstream에 정의된 services_sub를 호출함&lt;/li&gt;
&lt;li&gt;그 외의 경우 upstream에 정의된 services_home 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704103316387&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server {
    listen 3000;
    location /sub/ {
        proxy_pass http://service_sub;
    }
    location / {
        proxy_pass http://service_home;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Nginx 띄우기 (Dcoker Image로 띄우기)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) apps/nginx-app/Dockerfile&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도커&amp;nbsp; script 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704103443726&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM nginx:1.25.3-alpine

COPY proxy-server.conf /etc/nginx/conf.d/proxy-server.conf

EXPOSE 3000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ex) apps/nginx-app/package.json&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드, 실행 스크립트 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704103571318&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
&quot;build&quot;: &quot;docker build -t nginx-app .&quot;,
&quot;dev&quot; : &quot;docker run -p 3000:3000 nginx-app&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;service&amp;nbsp;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각 서비스 생성&lt;/li&gt;
&lt;li&gt;외부 서버에서 접근 가능하게 설정파일 수정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 각 서비스 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1704103739119&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 프로젝트 생성할 위치에서
// ex) services/service-home
pnpm create vite@latest services-home --template vanilla-ts

// ex) services/service-sub
pnpm create vite@latest services-sub --template vanilla-ts&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 외부 서버에서 접근 가능하게 수정&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) services/service-home/vite.config.ts&lt;/h4&gt;
&lt;pre id=&quot;code_1704103961758&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from &quot;vite&quot;;

export default defineConfig({
  base: &quot;/&quot;,
  server: {
    // 어디서든 접근 가능하게 설정
    host: true,
    port: 3001,
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ex) services/service-sub/vite.config.ts&lt;/h4&gt;
&lt;pre id=&quot;code_1704103974829&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from &quot;vite&quot;;

export default defineConfig({
  base: &quot;/sub/&quot;,
  server: {
    // 어디서든 접근 가능하게 설정
    host: true,
    port: 3002,
  },
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;테스트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3000 nginx서버와 2개의 서비스 3001,3002 잘 연결되어 있음&lt;/li&gt;
&lt;li&gt;3000에서 호출 시 2개의 서비스(service_home : 3001, service_sub : 3002)를 호출하는 걸 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-01 오후 7.23.33.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sCKp/btsCQ5p8lLf/dPOEeJoVnbW4Ar2uKtSOfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sCKp/btsCQ5p8lLf/dPOEeJoVnbW4Ar2uKtSOfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sCKp/btsCQ5p8lLf/dPOEeJoVnbW4Ar2uKtSOfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sCKp%2FbtsCQ5p8lLf%2FdPOEeJoVnbW4Ar2uKtSOfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;651&quot; data-filename=&quot;스크린샷 2024-01-01 오후 7.23.33.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>MSA</category>
      <category>nginx</category>
      <category>pnpm</category>
      <category>Reverse Proxy Server</category>
      <category>turborepo</category>
      <category>Vite</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/111</guid>
      <comments>https://puk0806.tistory.com/111#entry111comment</comments>
      <pubDate>Mon, 1 Jan 2024 19:58:32 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] 트랜스파일러(Transpiler), 번들러(Bundler) 특징 (Babel, SWC, webpack, Vite)</title>
      <link>https://puk0806.tistory.com/110</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;트랜스파일러(Transpiler)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JS 코드를 다른 버전의 JS 코드로 변환하는 도구&lt;/li&gt;
&lt;li&gt;주로 ES6이상의 JS를 지원하지 않는 브라우저 환경에서 ES6이상의 문법을 사용할 수 있게 해주는 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적으로 업데이트되는 브라우저나, Node.js 환경에서 최신문법을 사용하더라도 이전 버전의 JS로 변환하여 여러 환경에서 코드를 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;ECMAScript 표준을 사용할 수 있게 해 줘 표준화된 코드를 작성하고 유지할 수 있다.&lt;/li&gt;
&lt;li&gt;다양한 플러그인을 지원하여 사용자가 필요한 트랜스파일 과정을 제어할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;폴리필(Polyfill)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;최신 자바스크립트의 기능을 구식 자바스크립트 코드로 똑같이 구현한 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;대표적인 트랜스 파일러&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;Babel&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://babeljs.io/&quot;&gt;https://babeljs.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;최신 자바스크립트 문법을 브라우저가 이이해할 수 있게 변환해 주는 대표적인 트랜스 파일러&lt;/li&gt;
&lt;li&gt;설정파일에 plugin, preset의 정의하여 설정 파일을 바탕으로 문법을 변환한다.&lt;/li&gt;
&lt;li&gt;plugin : 하나의 특정한 변환 또는 특정 기능을 수행 하는 모듈&lt;/li&gt;
&lt;li&gt;preset : 관련된 plugin의 묶음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;SWC&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://swc.rs/&quot;&gt;https://swc.rs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rust로 만들어진 빠른 컴파일 속도를 가진 트랜스 파일러&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 : 고수준의 언어를 기계어나 저수준 언어로 변환하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECMAScript 표준 및 TypeScript를 지원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;번들러(Bundler)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 애플리케이션 여러 파일(HTML, CSS, JS, 이미지)을 하나의 번들 파일로 합치는 과정&lt;/li&gt;
&lt;li&gt;애플리케이션의 로딩 속도를 개선하고 성능을 향상시키는데 도움을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;번들러 장점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번들링을 진행하며 프로젝트 자원을 최적화 한다. (코드 압축, 이미지 최적화, 환경 변수 처리 등)&lt;/li&gt;
&lt;li&gt;여러 개의 파일을 하나의 파일로 결합함으로써 네트워크에서의 로딩 속도를 최적화한다.&lt;/li&gt;
&lt;li&gt;큰 번들 파일을 사용함으로써 브라우저 캐싱 효율이 향상된다.&lt;/li&gt;
&lt;li&gt;코드 분할을 통해 애플리케이션의 논리적 부분을 나눌 수 있고, 초기 로딩 속도를 향상시켜 UX를 개선할 수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;대표적인 번들러&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;webpack&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://webpack.kr/&quot;&gt;https://webpack.kr/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;애플리케이션의 파일들을 모듈 단위로 분리하고 의존성 그래프를 생성하여 번들 파일로 묶어주는 도구&lt;/li&gt;
&lt;li&gt;다양한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;loader&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;plugin&lt;/span&gt;을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;통해&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유연한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설정이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;가능하다&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;모듈 페더레이션 기능을 제공 (추후 글 작성 예정..)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;설정 옵션&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;entry: 번드링 프로세스에서 시작점을 나타내는 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;output : 번들링된 결과물의 파일 경로와 이름등을 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;loaders : js,json파일 이외에 파일을 처리할 수 있도록 도와주는 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;plugins : 번들 최적화, 에샛관리, 환경 변수 주입등 작업 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;mode : 실행되는 환경에 따라 모드를 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Rollup&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://rollupjs.org/&quot;&gt;https://rollupjs.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;표준 모듈 시스템 문법으로 작성된 여러개의 파일로 이루어진 코드를 묶어 주는 역할을 한다.&lt;/li&gt;
&lt;li&gt;라이브러리 제작을 위한 번들러로 많이 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;esbuild&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Go 를 기반으로 만들어진 빠른 빌드 속도와 효율적인 번들링하는 트랜스 파일러
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드 : 소스 코드 및 리소스를 프로덕션 환경에서 실행 가능한 형태로 변환하는 과정 (컴파일, 번들링 등을 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;작은 라이브러리를 만드는용도로 사용&lt;/li&gt;
&lt;li&gt;다른 번들러에 비해 일브 플러그인이 부족할수 있다. (아직 1버전 출시 안됨.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Vite&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.vitejs.dev/&quot;&gt;https://ko.vitejs.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;웹 프로젝트 개발 경험에 초점을 맞춰 개발된 빌드 도구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Vite&lt;span&gt;가&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Webpack&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;보다&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;빠른&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;이유&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜드 스타트 방식으로 개발 서버를 구동할 때, dependencies와 source code 두 가지 카테고리로 나누어 시작 시간을 개선
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(콜드 스타트 : 최초로 시행되어 이전에 캐싱한 데이터가 없는 경우)&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로컬 개발시 ESM 방식을 사용하여 로컬 서버 구동 속도가 매우 빠르다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(ESM : 모듈화 문법인 import,export를 별도의 도구 없이 브라우저 자체에서 소화해 낼수 있는 모듈 방식)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;웹팩은&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;처음&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로컬&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서버를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;시작할&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;때&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;관련&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;있는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모듈들을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;번들링&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;해서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;적재하는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;시간이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;필요하다&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;비트는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;필요한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모듈을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;빠르게&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;번들링해서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용한다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;node 18버전 이상 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MSA</category>
      <category>babel</category>
      <category>bundler</category>
      <category>esbuild</category>
      <category>swc</category>
      <category>transpiler</category>
      <category>Vite</category>
      <category>webpack</category>
      <category>번들러</category>
      <category>트랜스파일러</category>
      <category>폴리필</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/110</guid>
      <comments>https://puk0806.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 25 Dec 2023 22:13:18 +0900</pubDate>
    </item>
    <item>
      <title>[SEO] 캐노니컬 태그 (Canonical tag) 특징 사용법</title>
      <link>https://puk0806.tistory.com/109</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐노니컬 태그&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복 콘텐츠의 문제를 해결하고 검색 엔진 최적화를 돕기 위해 사용되는 태그&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐노니컬 태그 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적 페이지나 여러 URL로 접근 가능한 페이지에서 주된 페이지를 지정하여 중복 콘텐츠를 방지한다.&lt;/li&gt;
&lt;li&gt;중복 콘텐츠를 방지하여 검색 엔진의 혼란을 줄여 페이지 랭킹을 향상할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐노니컬 태그 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;올바르지 않은 주소 사용으로 검색 엔진의 최적화를 방해할수 있다.&lt;/li&gt;
&lt;li&gt;모든 페이지에 동일한 캐노니컬 태그 사용시 중요한 페이지에 대한 랭킹이 희석될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐노니컬 태그 사용법&lt;/h3&gt;
&lt;pre id=&quot;code_1702909586418&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- &amp;lt;link rel=&quot;canonical&quot; href=&quot;캐노니컬할 URL&quot;&amp;gt; --&amp;gt;
&amp;lt;link rel=&quot;canonical&quot; href=&quot;https://puk0806.tistory.com/109&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FrontEnd</category>
      <category>Canonical Tag</category>
      <category>SEO</category>
      <category>캐노니컬</category>
      <category>캐노니컬 태그</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/109</guid>
      <comments>https://puk0806.tistory.com/109#entry109comment</comments>
      <pubDate>Mon, 18 Dec 2023 23:29:30 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] NX 특징 , NX Cache Example</title>
      <link>https://puk0806.tistory.com/108</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://nx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nx.dev/&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1701000757617&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;Nx: Smart, Fast and Extensible Build System&quot; data-og-description=&quot;Nx is a smart, fast and extensible build system which comes with first class monorepo support and powerful integrations.&quot; data-og-host=&quot;nx.dev&quot; data-og-source-url=&quot;https://nx.dev/&quot; data-og-url=&quot;https://nx.dev&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m4i7t/hyUE9Ue45z/wMAxqRiZh7HGRsKmdPcppk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/daxFVa/hyUE1hBnwq/l6LWk6SYVSxm80ybkVRC5k/img.jpg?width=400&amp;amp;height=400&amp;amp;face=81_109_280_327,https://scrap.kakaocdn.net/dn/Ns63j/hyUB3g4tZZ/Pjf8BBKGWYWlEPkmV7Ika1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=144_128_320_320&quot;&gt;&lt;a href=&quot;https://nx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nx.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m4i7t/hyUE9Ue45z/wMAxqRiZh7HGRsKmdPcppk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/daxFVa/hyUE1hBnwq/l6LWk6SYVSxm80ybkVRC5k/img.jpg?width=400&amp;amp;height=400&amp;amp;face=81_109_280_327,https://scrap.kakaocdn.net/dn/Ns63j/hyUB3g4tZZ/Pjf8BBKGWYWlEPkmV7Ika1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=144_128_320_320');&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;Nx: Smart, Fast and Extensible Build System&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Nx is a smart, fast and extensible build system which comes with first class monorepo support and powerful integrations.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nx.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NX 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 가장 많은 기능을 제공하는 모노레포 빌드 시스템 도구&lt;/li&gt;
&lt;li&gt;개발자 생산성 향상, CI 성능 최적화, 코드 품질 유지를 위한 도구&lt;/li&gt;
&lt;li&gt;단일 워크스페이스 혹은 전체 워크스페이스드에 대한 태스크를 수행할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 워크스페이스 태스크 실행: nx[명령어] [app이름]&lt;/li&gt;
&lt;li&gt;전체 워크스페이스 태스크 실행 : nx run-many -t [명령어]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;작업의 결과에 대한 캐싱 기능을제공한다.&lt;/li&gt;
&lt;li&gt;모노레포 안에 있는 모든 패키지 간의 의존성 그래프를 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NX&amp;nbsp; Cache Exmaple&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. NX 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1701001925829&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm -w add nx -D&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. NX 캐싱, 오케스트레이션 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) package.json&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1701002684023&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;08_gugbab-nx-test&quot;,
  ...
  &quot;nx&quot;: {
    &quot;targets&quot;: {
      &quot;build&quot;: {
      	# 캐싱 유무
        &quot;cache&quot;: true,
        # 캐싱할 대상
        &quot;dependOn&quot;:[
          &quot;^build&quot;
        ],
        # 빌드 결과물 생성 위치
        &quot;outputs&quot;: [
          &quot;{projectRoot}/dist/**/*&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;3. 캐싱 테스트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐싱 안되어있을 때 (6s)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baC3Ky/btsATPPMZGq/JyL8Jv9HLjl7epJ4kQG3xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baC3Ky/btsATPPMZGq/JyL8Jv9HLjl7epJ4kQG3xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baC3Ky/btsATPPMZGq/JyL8Jv9HLjl7epJ4kQG3xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaC3Ky%2FbtsATPPMZGq%2FJyL8Jv9HLjl7epJ4kQG3xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1414&quot; height=&quot;940&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;940&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐싱되어있을 때 (88ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmaYNR/btsARjR9IIV/pirN594SxbtfIADxAkgpf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmaYNR/btsARjR9IIV/pirN594SxbtfIADxAkgpf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmaYNR/btsARjR9IIV/pirN594SxbtfIADxAkgpf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmaYNR%2FbtsARjR9IIV%2FpirN594SxbtfIADxAkgpf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1398&quot; height=&quot;1140&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>MSA</category>
      <category>NX</category>
      <category>모노레포</category>
      <category>캐싱</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/108</guid>
      <comments>https://puk0806.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 26 Nov 2023 23:14:37 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] Node 패키지 매니저, 워크스페이스 개념(soft-navigation,hard-navigation)</title>
      <link>https://puk0806.tistory.com/107</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Npm&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json을 사용하여 프로젝트 의존성 및 구성을 관리한다.&lt;/li&gt;
&lt;li&gt;프로젝트에 필요한 외부 라이브러리나 도구들을 손쉽게 추가하고 관리할 수 있다.&lt;/li&gt;
&lt;li&gt;패키지들 간의 의존성을 자동으로 해결해 준다.&lt;/li&gt;
&lt;li&gt;스크립트를 정의하여 빌드, 테스트, 시작등 작업을 간편하게 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;한 번에 하나씩 순차적으로 설치한다. (npm5부터는 병렬설치로 개선)&lt;/li&gt;
&lt;li&gt;lock파일의 도입으로 정확한 의존성 해결과 패키지 설치를 보장한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 환경에서 동일한 패키지 버전이 사용되어 일관된 동작이 가능해진다.&lt;/li&gt;
&lt;li&gt;이전에 설치된 패키지를 캐싱하여 더 빠른 재설치가 가능하다.&lt;/li&gt;
&lt;li&gt;패키지 버전을 명시적으로 기록하여 예상치 못한 업그레이드 방지하여 프로젝트의 안정성과, 보안 측면이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;워크스페이스 기능을 도입되었다. (npm7버전 부터 제공)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Yarn&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json 외에도 yarn.lock 파일을 사용하여 프로젝트 의존성 및 구성을 관리한다.&lt;/li&gt;
&lt;li&gt;여러 패키지를 동시에 가져와서 설치하도록 최적화되어 있다.&lt;/li&gt;
&lt;li&gt;워크스페이스 기능을 도입되었다.&lt;/li&gt;
&lt;li&gt;기본적으로 명시적인 의존 관계를 나태내야 사용이 가능하다.&lt;/li&gt;
&lt;li&gt;node_mouels에 패키지를 저장하는 방식이 아니라 패키지를 압축하여 한 개의. yarn/cache 폴더에 수평적으로 저장한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수평적으로 존재하기 때문에 빠르게 찾을 수 있다.&lt;/li&gt;
&lt;li&gt;압축 파일을 설치하여 설치가 빠르다.&lt;/li&gt;
&lt;li&gt;팬텀 디펜던시가 발생하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Pnpm&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의존성을 효율적으로 관리하는데 초점을 맞춘 패키지 관리자이다&lt;/li&gt;
&lt;li&gt;워크스페이스 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;패키지 의존성을 하나의 디렉터리에 설치하여 엄격한 의존 관리가 가능&lt;/li&gt;
&lt;li&gt;시스템 내에 단일 패키지 스토어에 모든 의존성을 보관하여 디스크 공간이 절약하고, 하드 네비게이션 과정을 통하여 설치 속도가 빠르다.&lt;/li&gt;
&lt;li&gt;소프트 네비게이션을 사용하여 프로젝트의 직접적인 의존성만 모듈 디렉토리의 루트에 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;워크스페이스 기능이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 네비게이션과, 소프트 네비게이션을 통하여 디스크 공간을 절약한다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 네비게이션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 프로젝트 간에 공통 의존성을 하드 네비게이션으로 생성하여 사용&lt;/li&gt;
&lt;li&gt;파일의 사본 역할을 하여 원본 파일이 삭제되더라도 하드 네비게이션에 데이터가 포함되어 있어서 데이터에 엑세스 가 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;소프트 네비게이션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로젝트가 여러 프로젝트에 공유될 때 심볼릭 링크를 사용&lt;/li&gt;
&lt;li&gt;소프트 링크는 파일 이름에 대한 포인터를 참조하는 역할을 하여 원본 파일이 삭제되거나 이동할 경우 동작하지 않는다.&lt;/li&gt;
&lt;li&gt;심볼릭&amp;nbsp;링크 : &lt;a href=&quot;https://en.wikipedia.org/wiki/Symbolic_link&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://en.wikipedia.org/wiki/Symbolic_link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 프로젝트의 의존성 버전을 통합적으로 관리한다.&lt;/li&gt;
&lt;li&gt;단일 코드베이스에서 모든 프로젝트를 함께 빌드하고 테스트할 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>MSA</category>
      <category>hardnavigation</category>
      <category>manage</category>
      <category>NPM</category>
      <category>packaeg</category>
      <category>pnpm</category>
      <category>softnavigation</category>
      <category>workspace</category>
      <category>yarn</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/107</guid>
      <comments>https://puk0806.tistory.com/107#entry107comment</comments>
      <pubDate>Sun, 19 Nov 2023 12:44:49 +0900</pubDate>
    </item>
    <item>
      <title>[투포인터] 백준-1806 부분합 골드4 (Python)</title>
      <link>https://puk0806.tistory.com/106</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;백준-1806 : 부분합&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1806&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1806&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699884701287&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;1806번: 부분합&quot; data-og-description=&quot;첫째 줄에 N (10 &amp;le; N &amp;lt; 100,000)과 S (0 &amp;lt; S &amp;le; 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1806&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1806&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAGqHE/hyUu23l7FD/UrgLZxFE5U8P1Fb9AduaFk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1806&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1806&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAGqHE/hyUu23l7FD/UrgLZxFE5U8P1Fb9AduaFk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;1806번: 부분합&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N (10 &amp;le; N &amp;lt; 100,000)과 S (0 &amp;lt; S &amp;le; 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.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;
&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;1850&quot; data-origin-height=&quot;1342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BB6mS/btsAeDJACOd/4z530l3AIKMdnpKfkuPnxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BB6mS/btsAeDJACOd/4z530l3AIKMdnpKfkuPnxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BB6mS/btsAeDJACOd/4z530l3AIKMdnpKfkuPnxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBB6mS%2FbtsAeDJACOd%2F4z530l3AIKMdnpKfkuPnxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1850&quot; height=&quot;1342&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;1342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;풀의&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;입력 받은 값의 구간합 배열을 만든다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;투포인터를 이용하여 왼쪽은 구간합 시작점 오른쪽은 구간합의 끝점으로 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구간합의 값이 S 보다 작을 경우 오른쪽 포인터를 이동&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;목표&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;합&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;보다&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;크고&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;길이가&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;짧은&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;경우&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정답을&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;갱신&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구간합의 값이 S 보다 클 경우 왼쪽 포인터를 이동 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구간 합을 못찾을 경우 0을 반환&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코드 (Python)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1699884883431&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

def input():
    return sys.stdin.readline().rstrip()

n, s = map(int, input().split())

numList = list(map(int, input().split(&quot; &quot;)))
sumList = [0] * (n + 1)

result = n + 1
rightIndex = 0

for i in range(n):
    sumList[i + 1] = sumList[i] + numList[i]

for leftIndex in range(n):
    # 구간합이 목표 보다 작을 경우 오른쪽 index 증가
    while rightIndex &amp;lt; n and sumList[rightIndex + 1] - sumList[leftIndex] &amp;lt; s:
        rightIndex += 1
    # 구간합 목표를 달성하면 정답 갱신
    if rightIndex &amp;lt; n and sumList[rightIndex + 1] - sumList[leftIndex] &amp;gt;= s:
        result = min(result, rightIndex - leftIndex + 1)

# 구간합을 못찾을 경우
if result &amp;gt; n:
    result = 0

print(result)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <category>1806</category>
      <category>Python</category>
      <category>구간합</category>
      <category>백준</category>
      <category>부분합</category>
      <category>알고리즘</category>
      <category>투포인터</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/106</guid>
      <comments>https://puk0806.tistory.com/106#entry106comment</comments>
      <pubDate>Mon, 13 Nov 2023 23:19:30 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] 모노레포(Mono Repo)란? 장단점</title>
      <link>https://puk0806.tistory.com/105</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;모노레포 란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 레파지토리에서 여러 프로젝트, 모듈 또는 패키지를 관리하는 개발 방식&lt;/li&gt;
&lt;li&gt;모든 소스 코드를 중앙화하여 관리하고 필요한 패키지를 공유하여 사용할 수어 코드의 재사용성과 개발의 협업을 용이하게 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모노레포 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복 코드를 줄이고, 공통 모듈을 사용으로써 코드의 재사용서 높인다.&lt;/li&gt;
&lt;li&gt;모든 서비스가 동일한 환경에서 작동하므로 일관성을 유지하고 호환성을 확보할 수 있다.&lt;/li&gt;
&lt;li&gt;코드의 히스토리를 추적하기 쉽다.&lt;/li&gt;
&lt;li&gt;다른 서비스를 수정 시 추가적인 배포 없이 테스트하고, 함께 빌드 배포를 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모노레포 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레파지토리가 크기가 무거워질 수 있다.&lt;/li&gt;
&lt;li&gt;여러 서비스와 모듈을 포함하여 레퍼지토리의 복잡성을 증가시킬 수 있다.&lt;/li&gt;
&lt;li&gt;권한 관리와 보안 설정이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;모노레포 경험하면서 느낀 점 아쉬웠던 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른&lt;span&gt; &lt;/span&gt;서비스나&lt;span&gt; &lt;/span&gt;공통&lt;span&gt; &lt;/span&gt;모듈의&lt;span&gt; &lt;/span&gt;변경이&lt;span&gt; &lt;/span&gt;필요할&lt;span&gt; &lt;/span&gt;때&lt;span&gt;, &lt;/span&gt;추가적인&lt;span&gt; &lt;/span&gt;배포&lt;span&gt; &lt;/span&gt;없이&lt;span&gt; &lt;/span&gt;신속하게&lt;span&gt; &lt;/span&gt;변경을&lt;span&gt; &lt;/span&gt;확인할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있어서&lt;span&gt; &lt;/span&gt;개발&lt;span&gt; &lt;/span&gt;생산성이&lt;span&gt; &lt;/span&gt;향상되었다.&lt;/li&gt;
&lt;li&gt;다양한&lt;span&gt; &lt;/span&gt;모노레포&lt;span&gt; &lt;/span&gt;관리&lt;span&gt; &lt;/span&gt;도구가&lt;span&gt; &lt;/span&gt;존재한다는&lt;span&gt; &lt;/span&gt;사실을&lt;span&gt; &lt;/span&gt;알게&lt;span&gt; &lt;/span&gt;되었고&lt;span&gt;, &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;도구들의&lt;span&gt; &lt;/span&gt;특징과&lt;span&gt; &lt;/span&gt;장단점을&lt;span&gt; &lt;/span&gt;파악하고&lt;span&gt; &lt;/span&gt;활용하는&lt;span&gt; &lt;/span&gt;것이&lt;span&gt; &lt;/span&gt;중요하다는&lt;span&gt; &lt;/span&gt;것을&lt;span&gt; &lt;/span&gt;느꼈다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://monorepo.tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://monorepo.tools/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NX를 사용하면서 느낀 점&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://nx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nx.dev/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;로컬&lt;span&gt; &lt;/span&gt;캐싱&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;통해&lt;span&gt; &lt;/span&gt;동일한&lt;span&gt; &lt;/span&gt;로컬에서&lt;span&gt; &lt;/span&gt;동일한&lt;span&gt; &lt;/span&gt;작업을&lt;span&gt; &lt;/span&gt;여러&lt;span&gt; &lt;/span&gt;번&lt;span&gt; &lt;/span&gt;빌드하거나&lt;span&gt; &lt;/span&gt;테스트하지&lt;span&gt; &lt;/span&gt;않고&lt;span&gt; &lt;/span&gt;이전&lt;span&gt; &lt;/span&gt;결과를&lt;span&gt; &lt;/span&gt;재사용할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있어&lt;span&gt; &lt;/span&gt;개발자의&lt;span&gt; &lt;/span&gt;생산성을&lt;span&gt;&amp;nbsp;향상시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;로컬&lt;span&gt; &lt;/span&gt;환경에서&lt;span&gt; &lt;/span&gt;테스트를&lt;span&gt; &lt;/span&gt;병렬로&lt;span&gt; &lt;/span&gt;실행하고&lt;span&gt; &lt;/span&gt;변경된&lt;span&gt; &lt;/span&gt;부분만&lt;span&gt; &lt;/span&gt;테스트하는&lt;span&gt; &lt;/span&gt;등의&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;제공하여&lt;span&gt; &lt;/span&gt;코드&lt;span&gt; &lt;/span&gt;변경&lt;span&gt; &lt;/span&gt;후&lt;span&gt; &lt;/span&gt;빠른&lt;span&gt;&amp;nbsp;피드백을 받을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;코드 제너레이터로 페이지, 템플릿 등을 빠르게 생성할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서브 도메인과 공통 모듈 정의를 잘하지 않고 프로젝트를 진행하면 코드의 중복, 유지보수 등 문제 가 발생할 수 있다.&lt;/b&gt; (가장 중요하다고 생각)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>MSA</category>
      <category>MFA</category>
      <category>monorepo</category>
      <category>MSA</category>
      <category>모노레포</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/105</guid>
      <comments>https://puk0806.tistory.com/105#entry105comment</comments>
      <pubDate>Sat, 28 Oct 2023 23:36:33 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Kinesis - Kinesis Data Streams 기본 개념 용어 정리</title>
      <link>https://puk0806.tistory.com/104</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1698300451898&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;What Is Amazon Kinesis Data Streams? - Amazon Kinesis Data Streams&quot; data-og-description=&quot;What Is Amazon Kinesis Data Streams? You can use Amazon Kinesis Data Streams to collect and process large streams of data records in real time. You can create data-processing applications, known as Kinesis Data Streams applications. A typical Kinesis Data &quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/streams/latest/dev/introduction.html&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;What Is Amazon Kinesis Data Streams? - Amazon Kinesis Data Streams&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What Is Amazon Kinesis Data Streams? You can use Amazon Kinesis Data Streams to collect and process large streams of data records in real time. You can create data-processing applications, known as Kinesis Data Streams applications. A typical Kinesis Data&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;before-you-begin&quot; style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kinesis Data Streams&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 실시간 데이터 스트림을 수집, 처리, 분석해 주는 서비스&lt;/li&gt;
&lt;li&gt;aws의 여러 서비스와 통합하기 쉽다. (Kinesis Firehose을 사용하여 S3, Redshift, Opensearch 등으로 전송할 수 있다.)&lt;/li&gt;
&lt;li&gt;스트림을&lt;span&gt; &lt;/span&gt;여러&lt;span&gt; &lt;/span&gt;샤드로&lt;span&gt; &lt;/span&gt;분할하여&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;분산&lt;span&gt; &lt;/span&gt;처리하고&lt;span&gt; &lt;/span&gt;다양한&lt;span&gt; &lt;/span&gt;응용&lt;span&gt; &lt;/span&gt;프로그램이&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;읽을&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있도록&lt;span&gt; &lt;/span&gt;한다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 id=&quot;before-you-begin&quot; style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kinesis Data Streams &lt;span&gt;장점 &lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실시간으로 데이터를 처리할 수 있다.&lt;/li&gt;
&lt;li&gt;데이터 양에 따라 쉽게 스트림의 처리 능력을 확장할 수 있다.&lt;/li&gt;
&lt;li&gt;여러 AWS의 다른 서비스와 쉽게 통합이 가능하다.&lt;/li&gt;
&lt;li&gt;설정된 보존 기간 동안 데이터를 유지하고, 보관이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;before-you-begin&quot; style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kinesis Data Streams&lt;span&gt;&amp;nbsp;단점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비용 관리가 필요하다.&lt;/li&gt;
&lt;li&gt;설정 관리를 위해 AWS 서비스에 대한 이해와 구성이 필요하다.&lt;/li&gt;
&lt;li&gt;실시간 데이터 처리 시스템을 설계하고 구현이 복잡할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #16191f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kinesis 도입 체크&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 실시간 데이터를 처리해야 하는 경우&lt;/li&gt;
&lt;li&gt;다양한 AWS 다른 서비스와 통합 할 경우&lt;/li&gt;
&lt;li&gt;실시간 데이터를 분석하고 모니터링이 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kinesis Data Streams 용어 정리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스트림(Strema)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 순서에 따라 순차적으로 흐르는 데이터 시퀀스를 관리한다.&lt;/li&gt;
&lt;li&gt;고유한 이름을 가지고 데이터 레코드를 저장하는 컨테이너 역할을 한다.&lt;/li&gt;
&lt;li&gt;데이터 흐름을 관리한고, 프로듀서가 생성한 데이터 레코드를 스트림에 저장하며, 컨슈머가 데이터를 읽어 처리하게 도와준다.&lt;/li&gt;
&lt;li&gt;사용자가 브로커를 직접 관리하지 않고 데이터를 저장하고 스트림을 생성, 설정 및 관리에 집중할 수 있게 해 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;샤드(Shard)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 레코드를 저장하고 처리하는 단위&lt;/li&gt;
&lt;li&gt;스트림은 하나 이상의 샤드로 구성된다.&lt;/li&gt;
&lt;li&gt;읽기의 경우 초당 최대 5개 트랜잭션, 초당 최대 2MB&lt;/li&gt;
&lt;li&gt;쓰기의 경우 최대 1000개의 레코드, 초당 최대 1MB&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 레코드(Data Record)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 스트림에 저장되는 데이터 단위&lt;/li&gt;
&lt;li&gt;시퀀스 번호, 파티션키, 본문으로 구성되며 변경할 수 없는 데이터로 구성된다.&lt;/li&gt;
&lt;li&gt;최대 크기는 1MB까지 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파티션 키(Partition Key)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 레코드를 스트림의 샤드에 분배하는 데 사용되는 키&lt;/li&gt;
&lt;li&gt;샤드는 고유한 키를 가지고 있는다.&lt;/li&gt;
&lt;li&gt;데이터 코드의 순서를 보존하며, 연관성 있는 데이터를 그룹화하는데 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시퀀스 번호(Sequence Number)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 레코드의 고유한 식별자&lt;/li&gt;
&lt;li&gt;데이터 레코드가 스트림을 따라 전파될 때 순서를 추적하는 데 사용한다. (일반적으로 시간에 따라 증가)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로듀서(Producer)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레코드를 생성하여 데이터 스트림에 레코드를 넣는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨슈머(consumer)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 스트림에서 레코드를 가져와 처리하는 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>Data Stream</category>
      <category>Kafka</category>
      <category>Kinesis</category>
      <category>Kinesis Data Streams</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/104</guid>
      <comments>https://puk0806.tistory.com/104#entry104comment</comments>
      <pubDate>Thu, 26 Oct 2023 15:07:55 +0900</pubDate>
    </item>
    <item>
      <title>[MFA] 마이크로 프론트엔드 아키텍처 특징 장,단점</title>
      <link>https://puk0806.tistory.com/103</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;마이크로 프론트엔드 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립적으로 제공 가능한 프론트엔드 애플리케이션이 더 큰 전체로 구성되는 아키텍처 스타일&lt;/li&gt;
&lt;li&gt;전통적인 모놀리식 웹 애플리케이션 아키텍처를 보완하기 위해 사용되는 개발 패턴&lt;/li&gt;
&lt;li&gt;애플리케이션을 작은 독립적인 서브 애플리케이션으로 분할하고, 서브 애플리케이션을 모아 하나의 애플리케이션으로 구성하는 방법&lt;/li&gt;
&lt;li&gt;독립된 기술 스택을 가지며, 개발, 테스트 및 배포가 독립적으로 이루어질 수 있다.&lt;/li&gt;
&lt;li&gt;서로 다른 애플리케이션에 느슨하게 결합되어, 하나의 애플리케이션에서 변경을 할 때 다른 부분에 미치는 영향을 최소화한다.&lt;/li&gt;
&lt;li&gt;큰 규모의 애플리케이션을 더 쉽게 관리하고 확장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;덜 복잡하고, 적은 양의 코드를 관리하여 코드의 품질을 높일 수 있다.&lt;/li&gt;
&lt;li&gt;배포의 범위가 줄어들어 빌드 및 배포 시간이 줄고, 장애 파급 범위가 작아진다.&lt;/li&gt;
&lt;li&gt;단일 장애 위험을 피할 수 있다.&lt;/li&gt;
&lt;li&gt;커뮤니케이션 비용이 줄어든다.&lt;/li&gt;
&lt;li&gt;점진적으로 업그레이드 하기에 용이하다.&lt;/li&gt;
&lt;li&gt;애플리케이션을 자유롭게 조립하여 제공할 수 있다.&lt;/li&gt;
&lt;li&gt;서비스 별로 주도적으로 자유롭게 기술 스택을 선택할 수 있다.&lt;/li&gt;
&lt;li&gt;서비스 별로 독립적으로 작업 할 수 있기 때문에 개발 주기가 빨라진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체적인 리소스의 크기가 커져서 성능 저하에 주의해야 한다.&lt;/li&gt;
&lt;li&gt;중복된 코드가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;초기 구축 비용이 발생한다.&lt;/li&gt;
&lt;li&gt;다양한 마이크로 프론트엔드 간의 통합 과정에서 추가적인 복잡성이 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;런타임에 동적으로 통합하는 관정에서 문제가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마이크로 프론트 도입 체크&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 규모가 클 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 수정한 후 사이드 이펙트로 인한 버그가 발생한다.&lt;/li&gt;
&lt;li&gt;새로운 기능을 위해 기존 코드를 활용하기 어렵다.&lt;/li&gt;
&lt;li&gt;간단한 수정 사항을 적용하기 위한 통합, 테스트, 빌드 및 배포 시간이 점점 길어질경우&lt;/li&gt;
&lt;li&gt;작업을 위한 커뮤니케이션이 많아질 경우&lt;/li&gt;
&lt;li&gt;동일한 기능 개발을 위해 여러 곳의 작업자가 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기능적으로 마이크로 앱으로 분해가 가능한 경우&lt;/li&gt;
&lt;li&gt;런타임에 여러 가지 마이크로 앱을 선택적으로 조립해서 제공해야 하는 경우&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>MSA</category>
      <category>MFA</category>
      <category>MSA</category>
      <category>프론트 엔드</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/103</guid>
      <comments>https://puk0806.tistory.com/103#entry103comment</comments>
      <pubDate>Sun, 22 Oct 2023 23:33:09 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] Svelte특징, Svelte Start Example</title>
      <link>https://puk0806.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://svelte.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://svelte.dev/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1694354511118&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;Svelte &amp;bull; Cybernetically enhanced web apps&quot; data-og-description=&quot;complete Built-in scoped styling, state management, motion primitives, form bindings and more &amp;mdash; don't waste time trawling npm for the bare essentials. It's all here.&quot; data-og-host=&quot;svelte.dev&quot; data-og-source-url=&quot;https://svelte.dev/&quot; data-og-url=&quot;https://svelte.dev/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Wg1LK/hyTSzglw0p/X5rLkJSA4XonDjZ7OuHst0/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640,https://scrap.kakaocdn.net/dn/Wn9yC/hyTSuF4Xj7/tcT6OQ0klYVPYNQkzEcck0/img.png?width=960&amp;amp;height=407&amp;amp;face=0_0_960_407&quot;&gt;&lt;a href=&quot;https://svelte.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://svelte.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Wg1LK/hyTSzglw0p/X5rLkJSA4XonDjZ7OuHst0/img.jpg?width=640&amp;amp;height=640&amp;amp;face=0_0_640_640,https://scrap.kakaocdn.net/dn/Wn9yC/hyTSuF4Xj7/tcT6OQ0klYVPYNQkzEcck0/img.png?width=960&amp;amp;height=407&amp;amp;face=0_0_960_407');&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;Svelte &amp;bull; Cybernetically enhanced web apps&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;complete Built-in scoped styling, state management, motion primitives, form bindings and more &amp;mdash; don't waste time trawling npm for the bare essentials. It's all here.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;svelte.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Svelte&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript 프레임워크이다.&lt;/li&gt;
&lt;li&gt;간결한 코드로 코드베이스로 개발 시간 단축과, 높은 가독성을 가진다.&lt;/li&gt;
&lt;li&gt;컴파일 과정에서 코드 최적화 작업을 진행하여 런타임 성능을 향상 시켜 애플리케이션 반응속도 가 빠르다. (No virtual Dom)&lt;/li&gt;
&lt;li&gt;변수나 상태변화를 명시적으로 추적하거 관리할 필요 없이, 컴파일 단계에서 자동으로 감지되며, UI를 업데이트 된다. (Truly reactive)&lt;/li&gt;
&lt;li&gt;Api가 많지 않아서 낮은 러닝 커브를 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Svelte 프로젝트 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sveltejs/template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/sveltejs/template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1695557573538&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - sveltejs/template: Template for building basic applications with Svelte&quot; data-og-description=&quot;Template for building basic applications with Svelte - GitHub - sveltejs/template: Template for building basic applications with Svelte&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/sveltejs/template&quot; data-og-url=&quot;https://github.com/sveltejs/template&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZPCVj/hyTZbGVXeR/C1EuwWoM0pJa7p7yKBxk40/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/sveltejs/template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/sveltejs/template&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZPCVj/hyTZbGVXeR/C1EuwWoM0pJa7p7yKBxk40/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - sveltejs/template: Template for building basic applications with Svelte&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Template for building basic applications with Svelte - GitHub - sveltejs/template: Template for building basic applications with Svelte&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1695557644064&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx degit sveltejs/template [프로젝트명]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FrontEnd</category>
      <category>svelte</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/102</guid>
      <comments>https://puk0806.tistory.com/102#entry102comment</comments>
      <pubDate>Sun, 24 Sep 2023 21:49:10 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP 완벽 가이드]2장 URL과 리소스</title>
      <link>https://puk0806.tistory.com/101</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2장 URL과 리소스&lt;/h2&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.1 인터넷의 리소스 탐색하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리킨다.&lt;/li&gt;
&lt;li&gt;스킴 : 웹 클라이언트가 리소스에 어떻게 접근하는지 알려준다.&lt;/li&gt;
&lt;li&gt;http:/https : 하이퍼 텍스트 전송 프로토콜&lt;/li&gt;
&lt;li&gt;ftp: 파일 전송 프로토콜&lt;/li&gt;
&lt;li&gt;javascript : URL내 JavaScript코드&lt;/li&gt;
&lt;li&gt;mailto : 전자 메일주소&lt;/li&gt;
&lt;li&gt;ssh : 보안 쉘&lt;/li&gt;
&lt;li&gt;참고 : &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;서버 주소 :
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버의 위치로, 웹 클라이언트가 리소스 어디에 호스팅 되어있는지 알려 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리소스 경로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 존재하는 로컬 리소스들 중에서 요청받은 리소스가 무엇인지 알려준다.&lt;/li&gt;
&lt;li&gt;ex)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695216373204&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;서버 경로 : www.joes-hardware.com
리소스 경로 : /seasonal/index-fall.html&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1.1 URL이 있기 전 암흑의 시대&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ftp.joes-hardware.com에 위치한, pub디렉터리의 complete-catalog.xls 파일을 공유하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL을 사용 안 할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ftp.joes-hardware.com에 FTP로 접속한다.&lt;/li&gt;
&lt;li&gt;익명 사용자로 로그인을 한다.&lt;/li&gt;
&lt;li&gt;pub 디렉터리로 이동한다.&lt;/li&gt;
&lt;li&gt;complete-catalog.xls을 내려받는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL을 사용할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;브라우저에서 ftp://ftp.joes-hardware.com/pub/complete-catalog.xls 열어본다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 URL 문법&lt;/h3&gt;
&lt;pre id=&quot;code_1695216597843&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;스킴&amp;gt;://&amp;lt;사용자이름&amp;gt;:&amp;lt;비밀번호&amp;gt;@&amp;lt;호스트&amp;gt;:&amp;lt;포트&amp;gt;/&amp;lt;경로&amp;gt;;&amp;lt;파라미터&amp;gt;?&amp;lt;질의&amp;gt;#&amp;lt;프래그먼트&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스킴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다.&lt;/li&gt;
&lt;li&gt;알파벳으로 시작되어야 한다.&lt;/li&gt;
&lt;li&gt;스킴의 끝은 ':'문자로 구분한다.&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자 이름
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스에 접근하기 위한 이름&lt;/li&gt;
&lt;li&gt;default : anonymous&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비밀번호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 비밀번호&lt;/li&gt;
&lt;li&gt;default : (IE : IEUser, Chrome : chrome@example.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;호스트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스를 호스팅 하는 서버의 호스트 명이나 IP 주소&lt;/li&gt;
&lt;li&gt;ex)&lt;/li&gt;
&lt;li&gt;호스트 명 : &lt;a href=&quot;http://www.joes-hardware.com:80/index.html&quot;&gt;http://www.joes-hardware.com:80/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IP : hjttp://161.58.228.45:80/index.html&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;포트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스를 호스팅 하는 서버가 열어놓은 포트 번호&lt;/li&gt;
&lt;li&gt;default : 스킴에 따라 다르다. (HTTP 기본 포트 : 80)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;경로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스가 서버 내 어디에 있는지를 가리킨다.&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파라미터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터는 key, value의 쌍을 이룬다.&lt;/li&gt;
&lt;li&gt;';'을 통해서 구분한다.&lt;/li&gt;
&lt;li&gt;ex) ftp:prep.ai.mit.deu/pub/gnu;type=d&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;질의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션 파라미터를 전달하는 데 사용한다.&lt;/li&gt;
&lt;li&gt;URL 끝의 '?'로 구분한다.&lt;/li&gt;
&lt;li&gt;특정 문자를 제외하고는 포맷에 제약사항은 없다.&lt;/li&gt;
&lt;li&gt;ex) http:www.joes-hardware.com/inventory-check.cgi?item=12731&amp;amp;color=blue&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프래그먼트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스의 조각이나 일부분을 가리키는 이름&lt;/li&gt;
&lt;li&gt;URL이 특정 객체를 가리키는 경우 사용된다.&lt;/li&gt;
&lt;li&gt;프래그먼트 필드는 서버에 전달되지 않고, 클라이언트에서만 사용된다.&lt;/li&gt;
&lt;li&gt;URL 끝의 '#'로 구분한다.&lt;/li&gt;
&lt;li&gt;ex) &lt;a href=&quot;http://www.joes-hardware.com/tools.html#drills&quot;&gt;http://www.joes-hardware.com/tools.html#drills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;default : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 단축 URL&lt;/h3&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.3.1 상대 URL&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL의 종류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;절대 URL&lt;/li&gt;
&lt;li&gt;리소스에 접근하는데 필요한 모든 정보를 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상대 URL
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL을 짧게 표시하는 방법으로, URL의 모든 정보를 담고 있지 않다.&lt;/li&gt;
&lt;li&gt;모든 정보를 얻기 위해서는 기저(base)라고 하는 다른 URL을 사용해야 한다.&lt;/li&gt;
&lt;li&gt;ex) &lt;a href=&quot;http://www.joes-hardware.com/tools.html**&quot;&gt;http://www.joes-hardware.com/tools.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695217073683&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;a href=&quot;./hammers.html&quot; /&amp;gt;
    
    &amp;lt;!-- 
    - 기저 URL : http://www.joes-hardware.com
    - 상대 URL : /hammers.html
    - 새로운 절대 URL : http://www.joes-hardware.com/hammers.html 
    --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;상대 URL을 절대 URL로 변환하기.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvOTJo/btsuICchTpe/CPTlB8IEIjDPEGkmMMeCk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvOTJo/btsuICchTpe/CPTlB8IEIjDPEGkmMMeCk0/img.png&quot; data-alt=&quot;상대 URL을 절대 URL로 변환하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvOTJo/btsuICchTpe/CPTlB8IEIjDPEGkmMMeCk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvOTJo%2FbtsuICchTpe%2FCPTlB8IEIjDPEGkmMMeCk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;509&quot; height=&quot;481&quot; data-filename=&quot;상대 URL을 절대 URL로 변환하기.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상대 URL을 절대 URL로 변환하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4 안전하지 않은 문자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안전한 전송
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정보가 유실될 위험 없이 URL을 전송할 수 있는 것&lt;/li&gt;
&lt;li&gt;알파벳 외의 문자도 포함하려고 URL 인코딩 규칙이 생겨남&lt;/li&gt;
&lt;li&gt;예약된 문자들은 URL에서 사용하려면 사전에 인코딩을 해야 한다.&lt;/li&gt;
&lt;li&gt;이스케이프를 문자를 이용해 특정 문자를 인코딩 함으로써 완성도를 높였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1695217469110&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  '~' -&amp;gt; %7
  ' ' -&amp;gt; %20
  '%' -&amp;gt; %25&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.6 미래&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL: 특정 시적에 어떤 것이 위치한 곳을 알려준다.&lt;/li&gt;
&lt;li&gt;URN : 객체가 옮겨지더라도 항상 객체를 가리킬 수 있는 이름을 제공&lt;/li&gt;
&lt;li&gt;지속 통합 자원 지시자 (PURL)을 사용하면 URL로 URN 기능을 제공할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PURL : 리소스의 실제&amp;nbsp;URL목록을 관리하고 추적하는 리소스 위치 중개 서버를 두고, 해당 리소스를 우회적으로 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;URN으로 주소 체계를 바꾸는 건 표준 체계를 바꾸는 것이 큰 작업이라 계속 사용 중&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.7 추가 정보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고 : [W3C](&lt;a href=&quot;https://www.w3.org/&quot;&gt;https://www.w3.org/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;참고 : [ietf](&lt;a href=&quot;https://www.ietf.org/&quot;&gt;https://www.ietf.org/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;참고 : [PURL](&lt;a href=&quot;http://purl.oclc.org&quot;&gt;http://purl.oclc.org&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HTTP완벽가이드.jpeg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgrpiU/btsu16PI7lO/J4KKf7K1reEzbnRUd0rB31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgrpiU/btsu16PI7lO/J4KKf7K1reEzbnRUd0rB31/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgrpiU/btsu16PI7lO/J4KKf7K1reEzbnRUd0rB31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgrpiU%2Fbtsu16PI7lO%2FJ4KKf7K1reEzbnRUd0rB31%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;442&quot; data-filename=&quot;HTTP완벽가이드.jpeg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>HTTP</category>
      <category>HTTP</category>
      <category>HTTP 완벽 가이드</category>
      <category>URL</category>
      <category>리소스</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/101</guid>
      <comments>https://puk0806.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 20 Sep 2023 22:48:06 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP완벽 가이드] 1장 HTTP 개관</title>
      <link>https://puk0806.tistory.com/100</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 1 &lt;span&gt;HTTP: &lt;/span&gt;인터넷의&lt;span&gt; &lt;/span&gt;멀티미디어&lt;span&gt; &lt;/span&gt;배달부&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 서버로부터 정보를 브라우저에 전달하는 역할&lt;/li&gt;
&lt;li&gt;신뢰성 있는 프로토콜로, 신뢰성 있는 데이터 전송을 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 웹&lt;span&gt; &lt;/span&gt;클라이언트와&lt;span&gt; &lt;/span&gt;서버&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;웹서버&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹콘텐츠가 존재하는 곳 (HTTP 서버)&lt;/li&gt;
&lt;li&gt;웹&lt;span&gt; &lt;/span&gt;서버는&lt;span&gt; &lt;/span&gt;인터넷의&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;저장하고&lt;span&gt;, HTTP &lt;/span&gt;클라이언트가&lt;span&gt; &lt;/span&gt;요청한&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;클라이언트 요청과정&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;URL 주소 중 도메인 네임 부분을 운 서버에서 검색한다.&lt;/li&gt;
&lt;li&gt;DNS 서버에서 해당 도메인 네임에 해당하는 IP주소를 찾아 사용자가 입력한 URL정보와 함께 전달한다.&lt;/li&gt;
&lt;li&gt;브라우저는 HTTP 프로토콜을 사용하여 요청 메시지를 생성하고 HTTP 요청 메시지는 TCP/IP프로콜을 사용하여 서버로 전송된다.&lt;/li&gt;
&lt;li&gt;서버는 response 메시지를 생성하여 다시 브라우저에게 데이터를 전송한다.&lt;/li&gt;
&lt;li&gt;브라우저는 response를 받아 파싱하여 화면에 렌더링한다.&lt;/li&gt;
&lt;/ol&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.3 리소스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;웹 리소스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 서버 파일 시스템의 파일&lt;/li&gt;
&lt;li&gt;정적 파일: 텍스트 파일, HTML 파일, 이미지/동영상 파일, 그 외 파일&lt;/li&gt;
&lt;li&gt;동적 콘텐츠 리소스: 사용자, 요청한 정보, 시간에 따라 다른 콘텐츠 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3.1 미디어 타입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MIME(Multipurpose Internet Mail Extensions)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 전송객체에 붙는 데이터 포맷 라벨&lt;/li&gt;
&lt;li&gt;이메일 호환을 위해 설계되었음&lt;/li&gt;
&lt;li&gt;주타입 / 부타입&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1694866475229&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTML: text/html
plain ASCII: text/plain
JPEG: image/jpeg
GIF: image/gif
퀵타임: video/quicktime
ppt: application/vnd.ms-powerpoint&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.3.2 URI&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;URI(uniform resource identifier)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 리소스 이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3.3 URL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;URL(uniform resource locator)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 서버의 리소스에 대한 구체적인 위치&lt;/li&gt;
&lt;li&gt;스킴(scheme): 프로토콜 (http://, https://)&lt;/li&gt;
&lt;li&gt;서버의 주소: (www.joes-hardware.com)&lt;/li&gt;
&lt;li&gt;웹 리소스: (/specials/saw-blade.gif)&lt;/li&gt;
&lt;/ul&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.3.4 URN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;URN(uniform resource name)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 이름&lt;/li&gt;
&lt;li&gt;URI는 URL, URN을 포함한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4 트랜잭션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP 트랜잭션&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 명령과 응답 결과로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.4.1 메서드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET: 서버에서 클라이언트로 지정한 리소스를 보내라.&lt;/li&gt;
&lt;li&gt;PUT: 클라이언트에서 서버로 보낸 데이터를 지정한 이름의 리소스로 저장하라.&lt;/li&gt;
&lt;li&gt;DELETE: 지정한 리소스를 서버에서 삭제하라.&lt;/li&gt;
&lt;li&gt;POST: 클라이언트 데이터를 서버 게이트웨이 애플리케이션으로 보내라.&lt;/li&gt;
&lt;li&gt;HEAD: 지정한 리소스에 대한 응답에서, HTTP 헤더 부분만 보내라.&lt;/li&gt;
&lt;li&gt;그 외 CONNECT, **OPTIONS**, TRACE, **PATCH** - [mdn http methods&lt;/li&gt;
&lt;li&gt;참고 : (&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Methods&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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.4.2 상태 코드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;200: ok. 요청이 성공적으로 되었습니다.&lt;/li&gt;
&lt;li&gt;302: 다시 보내라, 다른 곳에 가서 리소스를 가져가라.&lt;/li&gt;
&lt;li&gt;404: 요청받은 리소스를 찾을 수 없습니다.&lt;/li&gt;
&lt;li&gt;참고 : (&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Status&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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.4.3 웹페이지는 여러 객체로 이루어질 수 있다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 페이지에서 대량의 HTTP 트랙잭션 수행 가능&lt;/li&gt;
&lt;/ul&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.5 메시지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요청 메시지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 클라이언트에서 웹 서버로 보낸 HTTP 메세지&lt;/li&gt;
&lt;li&gt;시작줄: 요청 - 무엇을 해야 하는지 / 응답: 무슨일이 일어났는지&lt;/li&gt;
&lt;li&gt;헤더: 요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따릅니다. (구분자 :)&lt;/li&gt;
&lt;li&gt;본문: 메시지 본문 (이미지, 비디오, 오디오, 응용 소프트웨어)&lt;/li&gt;
&lt;li&gt;참고 : (&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Messages#%EC%8B%9C%EC%9E%91_%EC%A4%84&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Messages#%EC%8B%9C%EC%9E%91_%EC%A4%84&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.6 TCP 커넥션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TCP(Transmission Control Protocol)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송 제어 프로토콜&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.6.1 TCP/IP&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류 없는 데이터 전송&lt;/li&gt;
&lt;li&gt;순서에 맞는 전달&lt;/li&gt;
&lt;li&gt;조각나지 않는 데이터 스트림&lt;/li&gt;
&lt;/ul&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.6.2 접속, IP 주소 그리고 포트번호&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP 커넥션: 전화 거는 것과 비슷 (서버에 연결)&lt;/li&gt;
&lt;li&gt;80 포트: HTTP 서버&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.7 프로토콜 버전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP/0.9, HTTP/1.0, HTTP/1.0+, HTTP/1.1, HTTP/2.0&lt;/li&gt;
&lt;li&gt;HTTP/2.0: 책에서는 진행중이라고 되어있지만, 현재 상용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.8 웹이 구성요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프락시(proxy): 클라이언트와 서버 사이에 위치한 HTTP 중개자&lt;/li&gt;
&lt;li&gt;캐시: 많이 찾는 웹페이지를 클라이언트 가까이에 보관하는 HTTP 저장소&lt;/li&gt;
&lt;li&gt;게이트웨이: 다른 애플리케이션과 연결된 특별한 웹 서버&lt;/li&gt;
&lt;li&gt;터널: 단순히 HTTP 통신을 전달하기만 하는 특별한 프락시&lt;/li&gt;
&lt;li&gt;에이전트: 자동화된 HTTP 요청을 만드는 준지능적(semi-intelligent) 웹 클라이언트&lt;/li&gt;
&lt;/ul&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.8.1 프락시&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 모든 HTTP 요청을 받아 (요청을 수정한 뒤에) 서버에 전달&lt;/li&gt;
&lt;li&gt;보안을 위해 사용&lt;/li&gt;
&lt;/ul&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.8.2 캐시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자주 찾는 것의 사본을 저장해 두는, 특별한 종류의 프락시 서버&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.8.3 게이트웨이&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게이트웨이는 다른 서버들의 중개자로 동작하는 특별한 서버&lt;/li&gt;
&lt;li&gt;주로 HTTP 트래픽을 다른 프로토콜로 변환하기 위해 사용&lt;/li&gt;
&lt;/ul&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.8.4 터널&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터널은 두 커넥션 사이의 raw 데이터를 그대로 전달해주는 HTTP 애플리케이션&lt;/li&gt;
&lt;/ul&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.8.5 에이전트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자를 위해 HTTP 요청을 만들어주는 클라이언트 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;HTTP완벽가이드.jpeg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dymXOq/btsugRF10Or/sxY8XopzSFqLmowuC7NMrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dymXOq/btsugRF10Or/sxY8XopzSFqLmowuC7NMrK/img.jpg&quot; data-alt=&quot;HTTP 완벽 가이드 책&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dymXOq/btsugRF10Or/sxY8XopzSFqLmowuC7NMrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdymXOq%2FbtsugRF10Or%2FsxY8XopzSFqLmowuC7NMrK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;399&quot; data-filename=&quot;HTTP완벽가이드.jpeg&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HTTP 완벽 가이드 책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>HTTP</category>
      <category>HTTP</category>
      <category>HTTP 개관</category>
      <category>HTTP 완벽 가이드</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/100</guid>
      <comments>https://puk0806.tistory.com/100#entry100comment</comments>
      <pubDate>Sat, 16 Sep 2023 21:31:19 +0900</pubDate>
    </item>
    <item>
      <title>[React] useEffect 내부에서 비동기 처리하기</title>
      <link>https://puk0806.tistory.com/99</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기 작업을 수행하는 함수 정의하여 호출한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex1) useEffect 내부에서 비동기 처리할 함수 생성후 호출&lt;/p&gt;
&lt;pre id=&quot;code_1691926397285&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
    (async () =&amp;gt; {
      const checkStep = await accessStepCheck();
      if (checkStep === 'NONE') {
        setIsStepLoading(true);
        return;
      }
      accessMove(checkStep);
    })();
  }, []);&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;ex2) useEffect에서 비동기 처리할 함수 호출&lt;/p&gt;
&lt;pre id=&quot;code_1691926593045&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  const accessCheckAndMove = async () =&amp;gt; {
    const checkStep = await accessStepCheck();
    if (checkStep === 'NONE') {
      setIsStepLoading(true);
      return;
    }
    accessMove(checkStep);
  };

  useEffect(() =&amp;gt; {
    accessCheckAndMove();
  }, []);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>async</category>
      <category>await</category>
      <category>react</category>
      <category>useEffect</category>
      <category>비동기</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/99</guid>
      <comments>https://puk0806.tistory.com/99#entry99comment</comments>
      <pubDate>Sun, 13 Aug 2023 20:42:28 +0900</pubDate>
    </item>
    <item>
      <title>[React] Sentry란? React+Sentry - Error Monitoring Example</title>
      <link>https://puk0806.tistory.com/98</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;a href=&quot;https://sentry.io/welcome/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sentry.io/welcome/&lt;/a&gt;&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1690726481841&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;Application Performance Monitoring &amp;amp; Error Tracking Software&quot; data-og-description=&quot;Self-hosted and cloud-based application performance monitoring &amp;amp; error tracking that helps software teams see clearer, solve quicker, &amp;amp; learn continuously.&quot; data-og-host=&quot;sentry.io&quot; data-og-source-url=&quot;https://sentry.io/welcome/&quot; data-og-url=&quot;https://sentry.io/welcome/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3jo4A/hyTvdjc1YQ/K369OMsE51sQ09fRxgPVbK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://sentry.io/welcome/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sentry.io/welcome/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3jo4A/hyTvdjc1YQ/K369OMsE51sQ09fRxgPVbK/img.jpg?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;Application Performance Monitoring &amp;amp; Error Tracking Software&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Self-hosted and cloud-based application performance monitoring &amp;amp; error tracking that helps software teams see clearer, solve quicker, &amp;amp; learn continuously.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sentry.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;Sentry&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류 및 이슈 모니터링 및 오길 플랫폼&lt;/li&gt;
&lt;li&gt;실시간으로 소프트웨어의 문제를 감지하고 해결할 수 있도록 도와주는 서비스&lt;/li&gt;
&lt;li&gt;주요 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어에서 발생하는 오류와 예외 사황을 모니터링하고 수집하여 실시간으로 알려준다.&lt;/li&gt;
&lt;li&gt;사용자가 정의한 이벤트를 로깅하여 어떤 상황에서 추적할 수 있어 디버깅과 서능 문제를 분석하는데 되움이 된다.&lt;/li&gt;
&lt;li&gt;Slack, 이메일 등 다양한 방식으로 알림을 설정할 수 있다.&lt;/li&gt;
&lt;li&gt;오류 및 이슈에 대한 상세 정보를 제공하고, 이슈의 상태를 추적하고 해결과정을 기록한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sentry 설치&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690640496666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add @sentry/react @sentry/tracing

npm install --save @sentry/react @sentry/tracing&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sentry 초기화&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;index 부분에 Sentry 설정 초기화 부분 추가&lt;/li&gt;
&lt;li&gt;Sentry.inti() : Sentry를 설정하고 여러 기능을 활성화시킴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dsn : Sentry에서 제공하는 고유한 DNS값 입력&lt;/li&gt;
&lt;li&gt;integrations : Sentry에서 제공하는 통합 설정 부분
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sentry.BrowserTracing: 브라우저에서 발생한느 트랜잭션을 추적하도록 허용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tracePropagetionTargets: 어떤 URL에서 분산 추적을 사용할지 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sentry.Replay: 브라우저의 세션 재생 기능을 제공하여 사용자들이 겪는 환경 와 오류 상황을 디버깅하는데 도움을 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tracesSampleRate : 성능 모니터링을 위한 트랙잭션 샘플링 비율 설정&lt;/li&gt;
&lt;li&gt;replaySessionSampleRate : 세션 재생을 위한 샘플링 비율&lt;/li&gt;
&lt;li&gt;replayOnErrorSampleRate : 오류가 발생하는 세션에 대해서 세션 재생 샘플링 비율을 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ex) index.js&lt;/h4&gt;
&lt;pre id=&quot;code_1690724187879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import * as Sentry from &quot;@sentry/react&quot;;

Sentry.init({
  dsn: &quot;고유DNS&quot;,
  integrations: [
    new Sentry.BrowserTracing({
      tracePropagationTargets: [&quot;localhost&quot;],
    }),
    new Sentry.Replay(),
  ],.
  tracesSampleRate: 1.0, 
  replaysSessionSampleRate: 0.1,
  replaysOnErrorSampleRate: 1.0, 
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sentry 수동으로 보고 하기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;try-catch 등으로 애플리케이션 내부에서 처리돼서 Sentry로 전달되지 않는다.&lt;/li&gt;
&lt;li&gt;Sentry.captureException()를 사용해서 따로 Sentry에 전달 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1690726223954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
  if (layerInfo.layerList.length &amp;gt; 10) {
    ...
    throw new Error(&quot;레이어 개수 초과&quot;);
  }
} catch (error) {
  ...
  // 발생한 에러를 Sentry에 보고합니다.
  Sentry.captureException(error);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sentry 이슈 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.11.50.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0q8Xz/btspjWG0JkQ/gEyrWFZIcM4qdawOeWBVeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0q8Xz/btspjWG0JkQ/gEyrWFZIcM4qdawOeWBVeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0q8Xz/btspjWG0JkQ/gEyrWFZIcM4qdawOeWBVeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0q8Xz%2FbtspjWG0JkQ%2FgEyrWFZIcM4qdawOeWBVeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1694&quot; height=&quot;446&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.11.50.png&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>FrontEnd</category>
      <category>Monitoring</category>
      <category>react</category>
      <category>Sentry</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/98</guid>
      <comments>https://puk0806.tistory.com/98#entry98comment</comments>
      <pubDate>Sun, 30 Jul 2023 23:18:19 +0900</pubDate>
    </item>
    <item>
      <title>[NestJS] Pipe란? Pipe Validation Example</title>
      <link>https://puk0806.tistory.com/97</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Pipe&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;들어오는 요청 데이터를 변환하거나, 유효성 검사를하여 컨트롤로러 전달하기전에 데이터를 가공하는 기능을 수행한다.&lt;/li&gt;
&lt;li&gt;들어오는 데이터의 유효성을 미리 검사하여 컨트롤러에서 불필요한 작업을 방지할수있다.&lt;/li&gt;
&lt;li&gt;컨트롤러에 반복되는 유혀성 코드를 줄이고, 유효성 검사와 데이터 변환등의 공통 작업을 한곳에서 처리할수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이프 사용 범위&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Global Pipes:&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;애플리케이션 레벨의 파이프를 적용할떄 사용한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;클라이언트에서 들어오는 모든 요청에 적용된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Handler-level Pipes&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;@usePipes()라는 데코레이터 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정 핸들러 메서드에 적용할때 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;핸들러 메소드에 적용되는 파이프로 매개변수에 적용하여 요청 데이터의 변환 또는 유혀성 검사를 수행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Parameter-level Pipes:&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;@Param(),@Query, @Body 같은 데코레이터와 함께 사용하여 파라미터에 파이프를 적용한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정 매개변수에 적용되는 파이프로 데이터 변환 또는 유효성 검사를 수행할 수 있다&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jakekwak.gitbook.io/nestjs/overview/pipes&quot;&gt;https://jakekwak.gitbook.io/nestjs/overview/pipes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689772315759&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;Pipes - nestjs&quot; data-og-description=&quot;import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common'; const types: Function[] = [String, Boolean, Number, Array, Object];&quot; data-og-host=&quot;jakekwak.gitbook.io&quot; data-og-source-url=&quot;https://jakekwak.gitbook.io/nestjs/overview/pipes&quot; data-og-url=&quot;https://jakekwak.gitbook.io/nestjs/overview/pipes&quot; data-og-image=&quot;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://jakekwak.gitbook.io/nestjs/overview/pipes&quot; data-source-url=&quot;https://jakekwak.gitbook.io/nestjs/overview/pipes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Pipes - nestjs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common'; const types: Function[] = [String, Boolean, Number, Array, Object];&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;jakekwak.gitbook.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;h3 data-ke-size=&quot;size23&quot;&gt;파이프에 필요한 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class-validator&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 데이터를 유효성 검사를 제공하는 라이브러리&lt;/li&gt;
&lt;li&gt;참고) &lt;a href=&quot;https://github.com/typestack/class-validator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/typestack/class-validator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class-transformer&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 원하는 형식으로 변환하는 기능을 제공하는 라이브러리&lt;/li&gt;
&lt;li&gt;참고) &lt;a href=&quot;https://github.com/typestack/class-transformer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/typestack/class-transformer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;파이프에 필요한 모듈 설치&lt;/h4&gt;
&lt;pre id=&quot;code_1689768025524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install class-validator class-transformer --save&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;Built-in Pipes Example&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 규칙 생성&lt;/p&gt;
&lt;pre id=&quot;code_1689771231374&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { IsNotEmpty } from 'class-validator';
...

/**단어 만들기 Request*/
export class CreateVocaBffRequest {
  /**
   * 영어 단어명
   *
   * example: word
   */
  @IsNotEmpty()
  word: string;
  
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Custom Pipe Example&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PipeTransform를 implements받아서 구현&lt;/li&gt;
&lt;li&gt;transform()메소드&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫번쨰 인자(value) : 파이프가 변환할 값의 타입&lt;/li&gt;
&lt;li&gt;두번째 인자(metadata: 요청과 관련된 메타데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- custom pipe 생성&lt;/p&gt;
&lt;pre id=&quot;code_1689943773000&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { ArgumentMetadata, PipeTransform } from '@nestjs/common';
...

export class VocaValidationPipe implements PipeTransform {
  transform(value: Voca, metadata: ArgumentMetadata) {
    ...
    
    return value;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@UsePipes로 파이프 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689771462328&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // Built-in Pipe
  @Post('/')
  @UsePipes(ValidationPipe)
  createVoca(
    @Body() createVocaBffRequest: CreateVocaBffRequest,
  ): Promise&amp;lt;CreateVocaBffResponse&amp;gt; {
	...
  }
  
  // Custom Pipe
  @Post('/')
  @UsePipesVocaValidationPipe)
  createVoca(
    @Body() createVocaBffRequest: CreateVocaBffRequest,
  ): Promise&amp;lt;CreateVocaBffResponse&amp;gt; {
	...
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;</description>
      <category>NestJS</category>
      <category>Built In Pipe</category>
      <category>Custome Pipe</category>
      <category>Nest</category>
      <category>pipe</category>
      <category>validation</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/97</guid>
      <comments>https://puk0806.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 21 Jul 2023 21:58:52 +0900</pubDate>
    </item>
    <item>
      <title>[NestJS] Module, Controller, Service, Provider 란? Example</title>
      <link>https://puk0806.tistory.com/96</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Module&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션의 기능과 관련된 컴퍼넌트를 구조화 하는대 사용한다.&lt;/li&gt;
&lt;li&gt;'@Module' 데코레이터를 사용하여 정의한다.&lt;/li&gt;
&lt;li&gt;provider(service,repository), controller, module 등을 포함할 수있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모듈 만들기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nest g module [모듈명]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689479133596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest g module vocas&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;Controller&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 클라이언트의 요청을 처리하고 응답을 반환하는 역할을한다.&lt;/li&gt;
&lt;li&gt;'@Controller' 데코레이터에 경로를 지정하여 해당 컨트롤러의 라우팅 경로를 설정&lt;/li&gt;
&lt;li&gt;Handler : @Get, @Post, @Delete등의 데코레이터를 사용하여 요청 메서드를 지정한다.&lt;/li&gt;
&lt;li&gt;비지니스 로직을 구현하고 Service를 호출하여 데이터 조작 및 비지니스 로직을 처리한다.&lt;/li&gt;
&lt;li&gt;Module의 controllers에 등록해서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;controller 만들기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nest g controller [컨트롤러명]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689479855425&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest g controller vocas&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;Service&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비지니스 로직을 구현하고, 데이터 조작, 외부 api 호출등 같은 작업을 처리하는 클래스&lt;/li&gt;
&lt;li&gt;Controller에서 호출되어 컨트롤러와 데이터베이스, 외부 리소스 사이의 상호작용을 한다.&lt;/li&gt;
&lt;li&gt;'@Injectable' 데코레이터를 사용하여 정의&lt;/li&gt;
&lt;li&gt;Module의 providers에 등록해서 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;service 만들기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nest g service [서비스명]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689480259177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest g service vocas&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;Provider&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의존성 주입을 위해 사용되는 클래스이다.&lt;/li&gt;
&lt;li&gt;'@Injectable' 데코레이터를 사용하여 정의한다.&lt;/li&gt;
&lt;li&gt;주로 service,repository,factory,외부 api 등을 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Example&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;app에 Module에 Module 등록 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) app.module.ts&lt;/p&gt;
&lt;pre id=&quot;code_1689515254233&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

@Module({
  imports: [VocasModule],
  controllers: [],
  providers: [],
})
export class AppModule {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Module에 Contorller,service 등록 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) vocas.module.ts&lt;/p&gt;
&lt;pre id=&quot;code_1689515375227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

@Module({
  controllers: [VocasController],
  providers: [VocasService],
})
export class VocasModule {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Controller 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) vocas.controller.ts&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성자에&amp;nbsp;private&amp;nbsp;접근&amp;nbsp;제한자&amp;nbsp;사용시&amp;nbsp;암묵적으로&amp;nbsp;클래스&amp;nbsp;프로퍼티로&amp;nbsp;선언된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689515408462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

@Controller('vocas')
export class VocasController {
  // 생성자에 private 접근 제한자 사용시 암묵적으로 클래스 프로퍼티로 선언된다.
  constructor(private vocasService: VocasService) {}

  @Get('/')
  getAllVocase(): Promise&amp;lt;GetAllVocasResponse&amp;gt; {
    ...
    return this.vocasService.getAllVocas();
  }
  ...
}&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;Service 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) vocas.service.ts&lt;/p&gt;
&lt;pre id=&quot;code_1689516248021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

@Injectable()
export class VocasService {
  ....

  async getAllVocas(): Promise&amp;lt;GetAllVocasResponse&amp;gt; {
    ...
    return vocas;
  }
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NestJS</category>
      <category>controller</category>
      <category>Module</category>
      <category>Nest</category>
      <category>Provider</category>
      <category>service</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/96</guid>
      <comments>https://puk0806.tistory.com/96#entry96comment</comments>
      <pubDate>Sun, 16 Jul 2023 23:06:45 +0900</pubDate>
    </item>
    <item>
      <title>[Nest]NestJS란? Express 차이점, NestJS Start</title>
      <link>https://puk0806.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.nestjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.nestjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689417716965&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;Documentation | NestJS - A progressive Node.js framework&quot; data-og-description=&quot;Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea&quot; data-og-host=&quot;docs.nestjs.com&quot; data-og-source-url=&quot;https://docs.nestjs.com/&quot; data-og-url=&quot;https://docs.nestjs.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oDAp0/hyTjWcm5ZY/Rpwk5t0rRlM3qO2NMkKSUk/img.png?width=820&amp;amp;height=429&amp;amp;face=0_0_820_429&quot;&gt;&lt;a href=&quot;https://docs.nestjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.nestjs.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oDAp0/hyTjWcm5ZY/Rpwk5t0rRlM3qO2NMkKSUk/img.png?width=820&amp;amp;height=429&amp;amp;face=0_0_820_429');&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;Documentation | NestJS - A progressive Node.js framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.nestjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NestJS&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Node.js를 기반으로 한 프레임워크&lt;/li&gt;
&lt;li&gt;TypeScript를 기본 언어로 지원한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NestJS , Express 차이점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NestJs : 모듈화된 아키텍처를 강조하여 프로젝트 구조를 일관성 있게 유지한다.&lt;/li&gt;
&lt;li&gt;Express: 구조에 대한 강제 사항이 없이 개발자가 직접 프로젝트 구조를 설계하고, 미들웨어와 라우팅을 직접 관리해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Typescript
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NestJs: 기본적으로 TypeScrip를 지원한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Express: JavaScript 기반으로 설계되어 있으며, TypeScript를 사용하기 위해 별도의 설정 작업이 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;의존성 주입 (Dependency Injection)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NestJs: 기본적으로 의존성 주입을 제공한다.&lt;/li&gt;
&lt;li&gt;Express : 의존성 주입을 내장하고 있지 않으며, 개발자가 필요한 경우 직접 구현을 해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Testing
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NestJS: 테스팅을 위한 기능을 내장하고 있으며, 유닛 테스트와 통합 테스를 쉽게 작성할 수 있다.&lt;/li&gt;
&lt;li&gt;Express: 테스트를 위해 별도의 라이브러리나 프레임워크를 선택해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NestJS 클라이언트 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1689424510921&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -g @nestjs/cli&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;NestJS 프로젝트 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nest new [프로젝트명]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689424602388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nest new gugbab-nest-test&lt;/code&gt;&lt;/pre&gt;</description>
      <category>NestJS</category>
      <category>express</category>
      <category>Nest</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/95</guid>
      <comments>https://puk0806.tistory.com/95#entry95comment</comments>
      <pubDate>Sat, 15 Jul 2023 22:02:44 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 11장 서브모듈</title>
      <link>https://puk0806.tistory.com/94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;서브 모듈&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장소 하나가 다른 깃 저장소를 포함하는 형태를 의미한다.&lt;/li&gt;
&lt;li&gt;규모가 큰 저장소를 여러 개로 분리하여 운영할 수 있도로 해준다.&lt;/li&gt;
&lt;li&gt;공통되는 모듈을 분리하여 관리하여 생산성을 높이고 관리를 편하게 할 수 있다.&lt;/li&gt;
&lt;/ul&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;/h4&gt;
&lt;pre id=&quot;code_1689086203303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git submodule add 원격저장소URL 폴더이름&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원격 저장소가 chlid 폴더로 복제된다.&lt;/li&gt;
&lt;li&gt;서브 모듈의 설정 파일인. gitmodules에 추가됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;path : 폴더명&lt;/li&gt;
&lt;li&gt;url : 자식 저장소의 원격 주소 url&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;부모 저장소 복제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 저장소를 clone을 할 경우 sub module 저장소까지 clone 되지 않는다.&lt;/li&gt;
&lt;li&gt;sub module 폴더로 이동후 서브 모듈 초기화 이후 업데이트를 진행해줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689086968306&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone 부모 저장소

cd child

git submodule init

git submodule update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;부모 저장소 업데이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 저장소에 코드 커밋이 발생하면 부모 저장소에서도 커밋이 발생한다.&lt;/li&gt;
&lt;li&gt;부모 저장소를 pull해도 서브 모듈은 자동으로 갱신되지 않아서 따로 업데이트를 진행해 주어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1689088875403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git submodule update&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3d2as/btsniuRTpYG/65FBEStT1b5wiuen26v2xK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3d2as/btsniuRTpYG/65FBEStT1b5wiuen26v2xK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3d2as/btsniuRTpYG/65FBEStT1b5wiuen26v2xK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3d2as%2FbtsniuRTpYG%2F65FBEStT1b5wiuen26v2xK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;1200&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>11장</category>
      <category>git</category>
      <category>git교과서</category>
      <category>서브모듈</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/94</guid>
      <comments>https://puk0806.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 12 Jul 2023 00:22:52 +0900</pubDate>
    </item>
    <item>
      <title>[Tspec] TypeScrip 기반 OpenApi Spec,Swagger 만들기</title>
      <link>https://puk0806.tistory.com/93</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tspec&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript 타입과 JSDoc 기반으로 OpenApi를 자동으로 생성하게 해주는 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ts-spec.github.io/tspec/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ts-spec.github.io/tspec/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688906087746&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;Tspec | Tspec&quot; data-og-description=&quot;Tspec Type-driven API Documentation Auto-generating REST API document based on TypeScript types&quot; data-og-host=&quot;ts-spec.github.io&quot; data-og-source-url=&quot;https://ts-spec.github.io/tspec/&quot; data-og-url=&quot;https://ts-spec.github.io/tspec/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ts-spec.github.io/tspec/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ts-spec.github.io/tspec/&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;Tspec | Tspec&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Tspec Type-driven API Documentation Auto-generating REST API document based on TypeScript types&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ts-spec.github.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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Tspec 사용 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 의존성 주입&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm install tspec&lt;/li&gt;
&lt;li&gt;yarn install tspec&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주의사항&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;never 등 특정 타입들 인식 못하는 버그 있음&lt;/li&gt;
&lt;li&gt;알리아스로 import 하면 타입 인식 못하고 string으로 나오는 버그 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) type.ts&lt;/p&gt;
&lt;pre id=&quot;code_1688906670865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/** 회원 종류 KEY */
export type CodeEnumsMemberType =
  | &quot;ANY&quot;
  | &quot;CORPORATION&quot;
  | &quot;FRANCHISE&quot;
  | &quot;NONE&quot;
  | &quot;PERSONAL&quot;;

/**
 * 로그인 요청 Reqeust
 */
export interface LoginBffRequest {
  /**
   * 회원 아이디
   *
   * example: gugbab01
   **/
...
}

/**
 * 로그인 요청 Response
 */
export interface LoginBffResponse {
  /**
   * 아이디
   *
   * example: gugbab01
   **/
...
}

...&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. swagger router 정의하기&lt;/h4&gt;
&lt;pre id=&quot;code_1688906773443&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Tspec } from &quot;tspec&quot;;
import {
  LoginBffRequest,
  LoginBffResponse,
  UserInfoResponse,
  UserLeaveRequest,
} from &quot;../type/sampleType&quot;;

export type UserApiSpec = Tspec.DefineApiSpec&amp;lt;{
  tags: [&quot;회원&quot;];
  basePath: &quot;/api&quot;;
  paths: {
    &quot;/member&quot;: {
      get: {
        summary: &quot;로그인 회원정보 조회&quot;;
        responses: { 200: UserInfoResponse };
      };
      patch: {
        summary: &quot;회원 탈퇴&quot;;
        body: UserLeaveRequest;
        responses: { 200: true | false };
      };
    };
    &quot;/member/login&quot;: {
      post: {
        summary: &quot;회원 가입&quot;;
        body: LoginBffRequest;
        responses: { 200: LoginBffResponse };
      };
    };
  };
}&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-1OpenApi Spec 확인하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tspec generate : OpenApi Spec json 파일을 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--specPathGlobs : 읽을 패턴 지정&lt;/li&gt;
&lt;li&gt;--outputPath : OpenApi Spec 저장 경로 위치&lt;/li&gt;
&lt;li&gt;--oepnapiTitle: 생성된 문서의 title&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1688909569034&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
	...
	&quot;tspec&quot;: &quot;tspec generate --specPathGlobs ./**/*.ts --outputPath ./gugbab-tspec.json --openapiTitle 'Gugbab Tspec'&quot;
  },&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;4-2 미들 웨어를 통해서 swagger-ui, mock 데이터 설정하기&lt;/h4&gt;
&lt;pre id=&quot;code_1688909710799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import express from &quot;express&quot;;
import { Tspec, TspecDocsMiddleware } from &quot;tspec&quot;;

const server = express();

const options: Tspec.InitTspecServerOptions = {
  specPathGlobs: [&quot;./router/**/*.ts&quot;],
  specVersion: 3,
  openapi: {
    title: &quot;Gugbab Tspec&quot;,
  },
  debug: false,
  ignoreErrors: true,
};

const router = express.Router();

router.get(&quot;/member&quot;, (req, res) =&amp;gt; {
  res.status(200).json({
    userName: &quot;국밥&quot;,
    memberType: &quot;PERSONAL&quot;,
    mobileNumber: &quot;032-1234-1234&quot;,
  });
});

router.post(&quot;/member/login&quot;, (req, res) =&amp;gt; {
  res.status(200).json({
    userId: &quot;gugbab&quot;,
    userName: &quot;국밥&quot;,
    memberType: &quot;PERSONAL&quot;,
    mobileNumber: &quot;032-1234-1234&quot;,
  });
});
router.patch(&quot;/member&quot;, (req, res) =&amp;gt; {
  res.status(200).json(true);
});

async function initServer() {
  server.use(&quot;/api&quot;, router);
  server.use(&quot;/docs&quot;, await TspecDocsMiddleware(options));

  server.listen(9000);
}

initServer();&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;결과 화면&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 10.38.26.png&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FgLlU/btsmUIXFBQF/AeGxq2b3pdEsvajE3gTR41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FgLlU/btsmUIXFBQF/AeGxq2b3pdEsvajE3gTR41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FgLlU/btsmUIXFBQF/AeGxq2b3pdEsvajE3gTR41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgLlU%2FbtsmUIXFBQF%2FAeGxq2b3pdEsvajE3gTR41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1453&quot; height=&quot;951&quot; data-filename=&quot;스크린샷 2023-07-09 오후 10.38.26.png&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 10.37.26.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br2CWO/btsmWkWzuLx/Q104HK1S0QVRg3RcCFqb8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br2CWO/btsmWkWzuLx/Q104HK1S0QVRg3RcCFqb8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br2CWO/btsmWkWzuLx/Q104HK1S0QVRg3RcCFqb8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr2CWO%2FbtsmWkWzuLx%2FQ104HK1S0QVRg3RcCFqb8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1434&quot; height=&quot;825&quot; data-filename=&quot;스크린샷 2023-07-09 오후 10.37.26.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Typescript</category>
      <category>Mock</category>
      <category>openapi</category>
      <category>Tspec</category>
      <category>TypeScript</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/93</guid>
      <comments>https://puk0806.tistory.com/93#entry93comment</comments>
      <pubDate>Sun, 9 Jul 2023 22:42:00 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 10장 배포 관리와 태그</title>
      <link>https://puk0806.tistory.com/92</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;버전&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램을 수정하거나 개선할 때마다 코드를 구분하려고 부여된 식별자&lt;/li&gt;
&lt;li&gt;첫 번째 자리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메이저 버전으로 큰 기능을 변경했을 때 변경&lt;/li&gt;
&lt;li&gt;첫 자리가 0으로 시작하면 아직 초기 개발 중인 제품이라는 의&lt;/li&gt;
&lt;li&gt;메이저 번호 변경 시 하위 버전과 호환성 낮아질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두 번째 자리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마이너 번호 메이저 버전에서 기능 추가/ 변경 사항이 있을 때 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;번째&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패치&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버전&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버그&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;수정&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;등&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;미미한&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;변화가&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;있을&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;때 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;태그&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 커밋의 해시 값을 가리키는 꼬리표&lt;/li&gt;
&lt;li&gt;코드 배포 관리를 위해 주로 사용&lt;/li&gt;
&lt;li&gt;꼬리표&lt;span&gt; &lt;/span&gt;이름과&lt;span&gt; &lt;/span&gt;정보를&lt;span&gt; &lt;/span&gt;포함함&lt;/li&gt;
&lt;li&gt;Lightweight 태그
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 기본적인 태그. 버전 이름만 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;annotated 태그
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석이 달린 태그&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-a
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그 버전&lt;/li&gt;
&lt;li&gt;태그 이름은 중복해서 생성할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-m&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메세지를 작성할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-d
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그 삭제.&lt;/li&gt;
&lt;li&gt;태그는 단순히 커밋의 포인터이므로, 실제 커밋은 삭제되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;show
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그의&lt;span&gt; &lt;/span&gt;상세&lt;span&gt; &lt;/span&gt;정보를&lt;span&gt; &lt;/span&gt;확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;checkout
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그를 이용하여 체크아웃 할때 사용한다.&lt;/li&gt;
&lt;li&gt;태그를 통하여 체크아웃을 할때 추가 커밋이 불가능하다.&lt;/li&gt;
&lt;li&gt;추가커밋 작업이 필요하다면 태그기반으로 새로운 브랜치를 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;push
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그를 동기화 할때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1688697252554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 태그 생성
git tag 태그이름 

// 태그 버전 생성
git tag -a 태그버전

// 메세지와 같이 태그 생성
git tag -a 태그버전 -m 메세지

// 태그 목록 조회
git tag 

// 태그 삭제
git tag -d 태그버전

// 태그 상세 정보 확인
git show 태그버전

// 특정 커밋 태그
git tag -a 태그버전 커밋ID

// 태그를 사용한 체크아웃
git checkout 태그이름

// 태그 브랜치
git checkout -b 브랜치이름 태그이름

// 태그 공유
git push 태그이름

// 전체 태그를 동기화
git push origin --tags

//원격 저장소로 공유된 태그를 삭제
git push --delete origin 태그이름&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kfd1n/btsmGQJk08r/2ULL56nS1RFVQ2U9wp6PlK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kfd1n/btsmGQJk08r/2ULL56nS1RFVQ2U9wp6PlK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kfd1n/btsmGQJk08r/2ULL56nS1RFVQ2U9wp6PlK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKfd1n%2FbtsmGQJk08r%2F2ULL56nS1RFVQ2U9wp6PlK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;1200&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>10장</category>
      <category>git</category>
      <category>git 교과서</category>
      <category>배포 관리</category>
      <category>태그</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/92</guid>
      <comments>https://puk0806.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 7 Jul 2023 11:54:38 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Jenkins Slave Node 추가 Example</title>
      <link>https://puk0806.tistory.com/91</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Slave Node 추가하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Jenkins 관리 -&amp;gt; Nodes and Clouds
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;nodes 추가하기&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Number of executors : 노드에서 동시에 수행할 수 있는 최대 빌드의 수&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Remote root directory : 노드의 디렉터리 경로&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Labels : 해당 노드를 라벨링할 키 값&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Usage : Jenkins 마스터가 해당 노드를 선택하는 규칙 지정&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Launch method : 노드의 접속 방법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-02 오전 12.36.22.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjCgNa/btsl0iT70FP/QQguLsCccEDbZUv7zqo3h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjCgNa/btsl0iT70FP/QQguLsCccEDbZUv7zqo3h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjCgNa/btsl0iT70FP/QQguLsCccEDbZUv7zqo3h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjCgNa%2Fbtsl0iT70FP%2FQQguLsCccEDbZUv7zqo3h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;970&quot; height=&quot;491&quot; data-filename=&quot;스크린샷 2023-07-02 오전 12.36.22.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;491&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;Slave에 접속 가능하면 해당 서버의 정보들이 확인이 가능하다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 결과 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-02 오전 12.33.49.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nis0V/btsl2Tr0Oco/uwBdUuJrCJ3uSNvBWLOHi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nis0V/btsl2Tr0Oco/uwBdUuJrCJ3uSNvBWLOHi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nis0V/btsl2Tr0Oco/uwBdUuJrCJ3uSNvBWLOHi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnis0V%2Fbtsl2Tr0Oco%2FuwBdUuJrCJ3uSNvBWLOHi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2023-07-02 오전 12.33.49.png&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;271&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>DevOps</category>
      <category>devops</category>
      <category>jenkins</category>
      <category>Node</category>
      <category>Slave</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/91</guid>
      <comments>https://puk0806.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 2 Jul 2023 00:43:19 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] gitHub Actions CICD - pipeline Example</title>
      <link>https://puk0806.tistory.com/90</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Github Action&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub에서 제공하는 지속적인 통합 (Continuous Integration) 및 지속적인 배포 (Continuous Deployment) 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이프 라인 만들기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.github/workflows 디렉토리에 저장된다.&lt;/li&gt;
&lt;li&gt;name : 파이프 라인 이름 설정&lt;/li&gt;
&lt;li&gt;on : 파이프라인이 동작할 event Trigger 설정&lt;/li&gt;
&lt;li&gt;jobs: WorkFlow의 job 목록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) build.yml&lt;/p&gt;
&lt;pre id=&quot;code_1688028443963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파이프 라인 이름 설정
name: GUGBAB_GIT_FLOWER_CI

# Event Trigger 설정
on:
  push:
  pull_request:
  # Action 탭에서 Workflow실행 가능 설정
  workflow_dispatch:

# WorkFlow의 job 목록
jobs:
  build:
    # workflow가 실행될 환경
    runs-on: ubuntu-latest
    steps:
      - name: Set up Node.js environment
        uses: actions/setup-node@v3
        with:
          node-version: 18
          check-latest: true
          registry-url: https://registry.npmjs.org/
      - name: Run a one-line script
        run: echo Hello, world! git-flower PipeLine
      - name: Checkout repository
        uses: actions/checkout@v3              
      - name: Print current working directory
        run: |
          pwd
          ls
      - name: Perform a build
        run: |
          yarn install
          yarn build&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;actions 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-30 오후 11.58.03.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2eWd/btsl2R1v2O2/pDgvackg0AXViwWYjoBLF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2eWd/btsl2R1v2O2/pDgvackg0AXViwWYjoBLF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2eWd/btsl2R1v2O2/pDgvackg0AXViwWYjoBLF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2eWd%2Fbtsl2R1v2O2%2FpDgvackg0AXViwWYjoBLF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1852&quot; height=&quot;988&quot; data-filename=&quot;스크린샷 2023-06-30 오후 11.58.03.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;988&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>DevOps</category>
      <category>Actions</category>
      <category>cicd</category>
      <category>git</category>
      <category>github</category>
      <category>PIPELINE</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/90</guid>
      <comments>https://puk0806.tistory.com/90#entry90comment</comments>
      <pubDate>Sat, 1 Jul 2023 00:10:01 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] SonarQube -  Jenkins + SonarQube 연동, Gradle Project 정적 분석 Example</title>
      <link>https://puk0806.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.sonarsource.com/products/sonarqube/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688037548996&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;Code Quality Tool &amp;amp; Secure Analysis with SonarQube&quot; data-og-description=&quot;Empower development teams with a code quality &amp;amp; security solution that deeply integrates into your enterprise environment that enables you to deploy Clean Code securely, consistently and reliably.&quot; data-og-host=&quot;www.sonarsource.com&quot; data-og-source-url=&quot;https://www.sonarsource.com/products/sonarqube/&quot; data-og-url=&quot;https://www.sonarsource.com/products/sonarqube/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbiPms/hyS9GN4vff/VQpoqvHQOjfJAyIlfi2xgk/img.png?width=560&amp;amp;height=300&amp;amp;face=0_0_560_300&quot;&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbiPms/hyS9GN4vff/VQpoqvHQOjfJAyIlfi2xgk/img.png?width=560&amp;amp;height=300&amp;amp;face=0_0_560_300');&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;Code Quality Tool &amp;amp; Secure Analysis with SonarQube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Empower development teams with a code quality &amp;amp; security solution that deeply integrates into your enterprise environment that enables you to deploy Clean Code securely, consistently and reliably.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sonarsource.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SonarQube&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 코드 분석과 코드 품질 관리를 지원하는 오픈 소스 플랫폼&lt;/li&gt;
&lt;li&gt;이슈, 결함, 코드 복잡성등을 분석하여 코드의 품질을 평가하고 개선하여 품질을 향상&lt;/li&gt;
&lt;li&gt;버그 발견, 취약성 검사등을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;sonarqube token 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 default Id : admin , default pw : admin&lt;/li&gt;
&lt;li&gt;My Account -&amp;gt; Security -&amp;gt; User Token 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-29 오후 9.06.21.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmU60x/btslS4mTdYa/9K8Y8xEYjLQPWeCuW2WpK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmU60x/btslS4mTdYa/9K8Y8xEYjLQPWeCuW2WpK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmU60x/btslS4mTdYa/9K8Y8xEYjLQPWeCuW2WpK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmU60x%2FbtslS4mTdYa%2F9K8Y8xEYjLQPWeCuW2WpK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;674&quot; height=&quot;404&quot; data-filename=&quot;스크린샷 2023-06-29 오후 9.06.21.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins + Sonaqube 연동&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plugin 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Jenkins 관리 -&amp;gt; plugins
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;SonarQube Scanner 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Sonarqube 토큰 등록&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;Jenkins 관리 -&amp;gt;&amp;nbsp; Credentials&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;sonaqube Token 등록&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Jenkins Config 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; Systme
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SonaQube servers 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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-filename=&quot;스크린샷 2023-07-01 오후 7.48.30.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leLuE/btsl2ei11j4/IqumXY6WIBvwZaXKfjuJgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leLuE/btsl2ei11j4/IqumXY6WIBvwZaXKfjuJgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leLuE/btsl2ei11j4/IqumXY6WIBvwZaXKfjuJgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleLuE%2Fbtsl2ei11j4%2FIqumXY6WIBvwZaXKfjuJgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;990&quot; height=&quot;759&quot; data-filename=&quot;스크린샷 2023-07-01 오후 7.48.30.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;759&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;h2 data-ke-size=&quot;size26&quot;&gt;Gradle Project + SonarQube 적용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 플러그인 추가&lt;/li&gt;
&lt;li&gt;소나 빌드 실행하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) &lt;span&gt;gradle sonarqube&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688040166021&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;SonarScanner for Gradle&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.sonarqube.org&quot; data-og-source-url=&quot;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&quot; data-og-url=&quot;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/&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;SonarScanner for Gradle&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.sonarqube.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) bulid.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1688040275407&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    ...
    id(&quot;org.sonarqube&quot;) version &quot;4.1.0.3113&quot;
}

...

sonarqube {
    properties {
        property 'sonar.host.url', 'sonarqube 주소'
        property 'sonar.login', '생성된 토큰 Key'
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;분석 결과 화면&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-29 오후 9.40.49.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BEkoA/btslS3VSIH4/JzOD8d53gDqktkHHEKvjJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BEkoA/btslS3VSIH4/JzOD8d53gDqktkHHEKvjJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BEkoA/btslS3VSIH4/JzOD8d53gDqktkHHEKvjJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBEkoA%2FbtslS3VSIH4%2FJzOD8d53gDqktkHHEKvjJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2040&quot; height=&quot;388&quot; data-filename=&quot;스크린샷 2023-06-29 오후 9.40.49.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;388&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>DevOps</category>
      <category>devops</category>
      <category>Gradle</category>
      <category>jenkins</category>
      <category>sonarqube</category>
      <category>정적 분석</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/89</guid>
      <comments>https://puk0806.tistory.com/89#entry89comment</comments>
      <pubDate>Fri, 30 Jun 2023 00:15:17 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 9장 복귀</title>
      <link>https://puk0806.tistory.com/88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드를 되돌리는 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;reset&lt;/li&gt;
&lt;li&gt;revert&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;reset&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커밋을 기준으로 이전 코드로 되돌리는 방법&lt;/li&gt;
&lt;li&gt;기록한 커밋을 취소한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;reset 명령어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git reset [option] [커밋ID]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;soft
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지 영역을 포함한 상태로 복원한다.&lt;/li&gt;
&lt;li&gt;add 명령어로&lt;span&gt; &lt;/span&gt;스테이지&lt;span&gt; &lt;/span&gt;영역에&lt;span&gt; &lt;/span&gt;올려&lt;span&gt; &lt;/span&gt;커밋을&lt;span&gt; &lt;/span&gt;실행하기&lt;span&gt; &lt;/span&gt;직전의&lt;span&gt; &lt;/span&gt;단계로&lt;span&gt; &lt;/span&gt;되돌린다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;mixed&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;영역을&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;포함하지&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;않은&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;상태로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;복원합니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Default 옵션 값이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;a&lt;/span&gt;dd &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;명령어로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;스테이지&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;영역에&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;다시&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;올려서&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;커밋을&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;진행해야한다&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;hard&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;실&lt;/span&gt;제&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;파일이&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;삭제된&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이전&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;상태로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;복원합니다&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;복귀&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;시작의&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;커밋&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;상태와&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;해당&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;커밋의&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;워킹&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;디렉터리까지&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;모두&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;되돌린다&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스테이지 reset
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스테이지&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;영역&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다시&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;unstage&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;상태로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;만들때&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용&lt;/li&gt;
&lt;li&gt;git reset [파일이름]&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;revert&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공개한 저장소에서 이전 상태를 되돌리려고 할때 사용&lt;/li&gt;
&lt;li&gt;기존 커밋을 남겨 두고 취소에 대한 새로운 커밋을 생성한다.&lt;/li&gt;
&lt;li&gt;한&lt;span&gt; &lt;/span&gt;번에&lt;span&gt; &lt;/span&gt;한커밋만&lt;span&gt; &lt;/span&gt;취소가&lt;span&gt; &lt;/span&gt;가능하다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;revert 명령어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git revert [커밋ID]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;리셋과 리버트 비교&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘 다 동작을 취소하고 과거 상태로 되돌릴 때 사용한다.&lt;/li&gt;
&lt;li&gt;리버트와 리셋은 이전 커밋 정보를 삭제하는지 여부에 대한 차이점이 있다.&lt;/li&gt;
&lt;li&gt;원격 저장소에 공개한 커밋이라면 특정 커밋을 삭제하는 것은 다수의 사용자와 공유하는 저장소의 커밋 기록이 깨질 수 있기 때문에 revert를 사용하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vt6vu/btslMo61kAh/MDXVPEvfhLbQoSgX0kqif0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vt6vu/btslMo61kAh/MDXVPEvfhLbQoSgX0kqif0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vt6vu/btslMo61kAh/MDXVPEvfhLbQoSgX0kqif0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvt6vu%2FbtslMo61kAh%2FMDXVPEvfhLbQoSgX0kqif0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;447&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>git 교과서</category>
      <category>Reset</category>
      <category>revert</category>
      <category>복귀</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/88</guid>
      <comments>https://puk0806.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 29 Jun 2023 17:29:03 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Jenkins Pipeline Example</title>
      <link>https://puk0806.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins Pipeline&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Declarative
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구문이 간결하고 가독성이 좋다.&lt;/li&gt;
&lt;li&gt;구조와 흐름을 명시적으로 선언한다.&lt;/li&gt;
&lt;li&gt;자동으로 스테이징과 로깅을 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scripted
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자유로운 스크립팅이 가능하다.&lt;/li&gt;
&lt;li&gt;복잡한 로직과 동적 작업 흐름 구성이 가능하다.&lt;/li&gt;
&lt;li&gt;가독성과 유지 보수성이 낮을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jenkins Pipeline Example&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pipeline item 생성&lt;/li&gt;
&lt;li&gt;pipeline script 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1687783884488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
  ## 실행 가능한 agent 지정
  agent any   
  ## 파이프 라인 정의, 스테이지 블록 설정 영역
  stages {
    stage('Compile') {
      steps {
        echo &quot;Compiled successfully!&quot;;
      }
    }
    stage('Code Analysis') {
      steps {
        echo &quot;Code Analysis completed successfully!&quot;;
      }
    }
    stage('Deploy') {
      steps {
        echo &quot;Deployed successfully!&quot;;
      }
    }
  }
  ## 파이프라인의 단계가 모두 실행된 후에 추가행되느 작업 정의 영역
  post {
    always {
      echo &quot;This will always run&quot;
    }
    success {
      echo &quot;This will run when the run finished successfully&quot;
    }
    failure {
      echo &quot;This will run if failed&quot;
    }
    unstable {
      echo &quot;This will run when the run was marked as unstable&quot;
    }
    changed {
      echo &quot;This will run when the state of the pipeline has changed&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;size18&quot;&gt;빌드 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-26 오후 9.52.40.png&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcko3/btslvK2ZBvp/olKI0e545gkUx7OmkKAOe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcko3/btslvK2ZBvp/olKI0e545gkUx7OmkKAOe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcko3/btslvK2ZBvp/olKI0e545gkUx7OmkKAOe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flcko3%2FbtslvK2ZBvp%2FolKI0e545gkUx7OmkKAOe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1924&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2023-06-26 오후 9.52.40.png&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;682&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>DevOps</category>
      <category>declarative</category>
      <category>jenkins</category>
      <category>PIPELINE</category>
      <category>Scripted</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/87</guid>
      <comments>https://puk0806.tistory.com/87#entry87comment</comments>
      <pubDate>Tue, 27 Jun 2023 00:12:18 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Jenkins Pipeline 시각화 Delivery Pipeline example</title>
      <link>https://puk0806.tistory.com/86</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jenkins Delivery Pipeline&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적 통합(CI) 도구를 사용하여 소프트웨어 제공 과정을 자동화하고 시각화하는 기능을 제공하는 플러그인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Plugin 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Jenkins 관리 -&amp;gt; plugins -&amp;gt; Delivery Pipeline 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt; Item Pipeline 연결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) &lt;b&gt;gugbab-eureka-server main gradle jenkins -&amp;gt; Project gugbab-api-gateway main gradle jenkines&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-26 오후 5.47.03.png&quot; data-origin-width=&quot;2288&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wC3YQ/btsluUSf2bK/kfZkYKuXtPUKMEVXERY650/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wC3YQ/btsluUSf2bK/kfZkYKuXtPUKMEVXERY650/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wC3YQ/btsluUSf2bK/kfZkYKuXtPUKMEVXERY650/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwC3YQ%2FbtsluUSf2bK%2FkfZkYKuXtPUKMEVXERY650%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2288&quot; height=&quot;790&quot; data-filename=&quot;스크린샷 2023-06-26 오후 5.47.03.png&quot; data-origin-width=&quot;2288&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Delivery Pipeline View 만들기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Delivery Pipeline Veiw 만들기&lt;/li&gt;
&lt;li&gt;Pipelines에 시각화할 컴퍼넌트 추가하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-26 오후 6.05.56.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSjFnd/btsluS72Tu1/vycz8hIDAyMN8KwXZiNFtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSjFnd/btsluS72Tu1/vycz8hIDAyMN8KwXZiNFtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSjFnd/btsluS72Tu1/vycz8hIDAyMN8KwXZiNFtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSjFnd%2FbtsluS72Tu1%2Fvycz8hIDAyMN8KwXZiNFtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2300&quot; height=&quot;1382&quot; data-filename=&quot;스크린샷 2023-06-26 오후 6.05.56.png&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1382&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;시각화 결과 화면&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-26 오후 6.06.52.png&quot; data-origin-width=&quot;1718&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HlCsS/btslvAeWQqZ/FC7p5ykvCw34jBN3qUYSOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HlCsS/btslvAeWQqZ/FC7p5ykvCw34jBN3qUYSOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HlCsS/btslvAeWQqZ/FC7p5ykvCw34jBN3qUYSOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHlCsS%2FbtslvAeWQqZ%2FFC7p5ykvCw34jBN3qUYSOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1718&quot; height=&quot;516&quot; data-filename=&quot;스크린샷 2023-06-26 오후 6.06.52.png&quot; data-origin-width=&quot;1718&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>Delivery Pipeline</category>
      <category>devops</category>
      <category>jenkins</category>
      <category>PIPELINE</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/86</guid>
      <comments>https://puk0806.tistory.com/86#entry86comment</comments>
      <pubDate>Mon, 26 Jun 2023 18:08:46 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Ansible Playbook - K8s Script 실행 example</title>
      <link>https://puk0806.tistory.com/85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;K8s&amp;nbsp; script 만들기 참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://puk0806.tistory.com/84&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687357521936&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;[DevOps] Kubernetes yml - Deployment, Services 만들기 Example&quot; data-og-description=&quot;Kubernetes yml apiVersion :Kubernetes API의 버전 kind :리소스의 종류 metadata :name 등리소스에 대한 메타데이터 spec :컨테이너 이미지, 포트, 환경 변수 등 세부 사항 deployment ex) deployment.yml ## Kubernetes API의 버&quot; data-og-host=&quot;puk0806.tistory.com&quot; data-og-source-url=&quot;https://puk0806.tistory.com/84&quot; data-og-url=&quot;https://puk0806.tistory.com/84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j8wMA/hyS5EalRbw/d3hpFcWm36kzUHbUhaHfe1/img.png?width=800&amp;amp;height=308&amp;amp;face=0_0_800_308,https://scrap.kakaocdn.net/dn/bGrBIZ/hyS5wXGA1n/jZenDAdnPBR21C11hW4HI1/img.png?width=800&amp;amp;height=308&amp;amp;face=0_0_800_308,https://scrap.kakaocdn.net/dn/bBKPQD/hyS5uS6kvW/JRbeluodqe8TIU0apMFmw1/img.png?width=848&amp;amp;height=327&amp;amp;face=0_0_848_327&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://puk0806.tistory.com/84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j8wMA/hyS5EalRbw/d3hpFcWm36kzUHbUhaHfe1/img.png?width=800&amp;amp;height=308&amp;amp;face=0_0_800_308,https://scrap.kakaocdn.net/dn/bGrBIZ/hyS5wXGA1n/jZenDAdnPBR21C11hW4HI1/img.png?width=800&amp;amp;height=308&amp;amp;face=0_0_800_308,https://scrap.kakaocdn.net/dn/bBKPQD/hyS5uS6kvW/JRbeluodqe8TIU0apMFmw1/img.png?width=848&amp;amp;height=327&amp;amp;face=0_0_848_327');&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;[DevOps] Kubernetes yml - Deployment, Services 만들기 Example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes yml apiVersion :Kubernetes API의 버전 kind :리소스의 종류 metadata :name 등리소스에 대한 메타데이터 spec :컨테이너 이미지, 포트, 환경 변수 등 세부 사항 deployment ex) deployment.yml ## Kubernetes API의 버&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;puk0806.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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ansible 서버 K8s 접근 권한 추가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ansible 서버 접속&lt;/li&gt;
&lt;li&gt;hosts파일에 접근할 k8s 서버 호스트 설정&lt;/li&gt;
&lt;li&gt;k8s가 있는 서버에 ssh 키 복사
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ssh Key 추가 ssh-copy-id [k8s서버]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-21 오후 11.27.31.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rt1ue/btskRbafaBM/JfrBjy1hF3fZjbDk8h87ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rt1ue/btskRbafaBM/JfrBjy1hF3fZjbDk8h87ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rt1ue/btskRbafaBM/JfrBjy1hF3fZjbDk8h87ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRt1ue%2FbtskRbafaBM%2FJfrBjy1hF3fZjbDk8h87ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1728&quot; height=&quot;938&quot; data-filename=&quot;스크린샷 2023-06-21 오후 11.27.31.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Ansible Playbook&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) playbook.yml&lt;/p&gt;
&lt;pre id=&quot;code_1687358561033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- name: gugbab-ansible-k8s-cicd-deployment-playbook
  hosts: kubernetes

  tasks:
    - name: create test gugbab deployment
      command: /usr/local/bin/kubectl kubectl apply -f /Users/puk0806/K8s/gugbab-devops-deployment.yml&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-filename=&quot;스크린샷 2023-06-21 오후 11.49.24.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgrAw8/btskRuU6dxh/ULhq8p9KlakfgYdmbiiM10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgrAw8/btskRuU6dxh/ULhq8p9KlakfgYdmbiiM10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgrAw8/btskRuU6dxh/ULhq8p9KlakfgYdmbiiM10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgrAw8%2FbtskRuU6dxh%2FULhq8p9KlakfgYdmbiiM10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1728&quot; height=&quot;1162&quot; data-filename=&quot;스크린샷 2023-06-21 오후 11.49.24.png&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1162&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>DevOps</category>
      <category>ansible</category>
      <category>k8s</category>
      <category>playbook</category>
      <category>script</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/85</guid>
      <comments>https://puk0806.tistory.com/85#entry85comment</comments>
      <pubDate>Thu, 22 Jun 2023 00:06:09 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] Kubernetes yml - Deployment, Services 만들기 Example</title>
      <link>https://puk0806.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kubernetes yml&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apiVersion :Kubernetes API&lt;span&gt;의&lt;/span&gt; &lt;span&gt;버전&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;kind :리소스의&lt;span&gt; &lt;/span&gt;종류&lt;/li&gt;
&lt;li&gt;metadata :name 등리소스에&lt;span&gt; &lt;/span&gt;대한&lt;span&gt; &lt;/span&gt;메타데이터&lt;/li&gt;
&lt;li&gt;spec :컨테이너&lt;span&gt; &lt;/span&gt;이미지&lt;span&gt;, &lt;/span&gt;포트&lt;span&gt;, &lt;/span&gt;환경&lt;span&gt; &lt;/span&gt;변수&lt;span&gt; &lt;/span&gt;등&lt;span&gt; &lt;/span&gt;세부&lt;span&gt; &lt;/span&gt;사항&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;deployment&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) deployment.yml&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687332411895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Kubernetes API의 버전
apiVersion: apps/v1
## 리소스의 종류
kind: Deployment
## name등 리소스에 대한 메타데이터
metadata:
  name: gugbab-cicd-deployment
## 컨테이너 이미지, 포트, 환경 변수 등 세부 사항
spec:
  selector:
    matchLabels:
      app: gugbab-cicd-devops-project
  replicas: 2
  template:
    metadata:
      labels:
        app: gugbab-cicd-devops-project
    spec:
      containers:
      - name: gugbab-cicd-devops-project
        image: puk0806/gugbab-cicd-project-ansible
        imagePullPolicy: Always
        ports:
        - containerPort: 8080&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;Service&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;deployment를 외부에서 사용할 수 있게 서비스 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) service.yml&lt;/p&gt;
&lt;pre id=&quot;code_1687332494286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: gugbab-cicd-service
  labels:
    app: gugbab-cicd-devops-project
spec:
  selector:
    app: gugbab-cicd-devops-project
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 32000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;K8s yml 파일 실행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl apply -f [파일명]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-21 오후 4.40.37.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBGXeN/btskRofyMkp/aUdSvSZ2ByEZfOdyrh57ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBGXeN/btskRofyMkp/aUdSvSZ2ByEZfOdyrh57ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBGXeN/btskRofyMkp/aUdSvSZ2ByEZfOdyrh57ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBGXeN%2FbtskRofyMkp%2FaUdSvSZ2ByEZfOdyrh57ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;848&quot; height=&quot;327&quot; data-filename=&quot;스크린샷 2023-06-21 오후 4.40.37.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>Deployment</category>
      <category>devops</category>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>services</category>
      <category>yml</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/84</guid>
      <comments>https://puk0806.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 21 Jun 2023 19:42:07 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 8장 병합과 충돌</title>
      <link>https://puk0806.tistory.com/83</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;병합&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분리된 브랜치를 한 브랜치로 합치는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자동 병합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 기준으로 두 파일의 변경 이력을 비교하여 변경된 파일 내용이 발견되면 자동으로 수정된 코드 내용을 병합&lt;/li&gt;
&lt;li&gt;자동으로 반영하지 못하는 것들은 충돌이 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병합 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;merge&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;fast--forward 병합&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브랜치&lt;span&gt; &lt;/span&gt;경로가&lt;span&gt; &lt;/span&gt;일직선일&lt;span&gt; &lt;/span&gt;경우의&lt;span&gt; &lt;/span&gt;브랜치에서&lt;span&gt; &lt;/span&gt;병합&lt;span&gt; &lt;/span&gt;작업을&lt;span&gt; &lt;/span&gt;할&lt;span&gt; &lt;/span&gt;때&lt;/li&gt;
&lt;li&gt;&lt;span&gt;자식&lt;/span&gt; branch&lt;span&gt;의&lt;/span&gt; &lt;span&gt;시작&lt;/span&gt; &lt;span&gt;커밋을&lt;/span&gt; &lt;span&gt;부모&lt;/span&gt; branch &lt;span&gt;이후의&lt;/span&gt; &lt;span&gt;커밋으로&lt;/span&gt; &lt;span&gt;가리킨다&lt;/span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;3-way 병합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통&lt;span&gt; &lt;/span&gt;조상을&lt;span&gt; &lt;/span&gt;가지는&lt;span&gt; &lt;/span&gt;두&lt;span&gt; &lt;/span&gt;자식branch를병합하는&lt;span&gt; &lt;/span&gt;방식&lt;/li&gt;
&lt;li&gt;git은 공통 조상 커밋을 자동으로 찾아주며, 공통 조상을 기준으로 branch를 병합한다.&lt;/li&gt;
&lt;li&gt;병합을&lt;span&gt; &lt;/span&gt;성공적으로&lt;span&gt; &lt;/span&gt;완료한&lt;span&gt; &lt;/span&gt;후&lt;span&gt; &lt;/span&gt;새로운&lt;span&gt; &lt;/span&gt;커밋&lt;span&gt;(&lt;/span&gt;병합&lt;span&gt; &lt;/span&gt;커밋&lt;span&gt;)&lt;/span&gt;을&lt;span&gt; &lt;/span&gt;새로&lt;span&gt; &lt;/span&gt;생성한다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;rebase&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;시간 순의 순차적 나열이 아닌 &lt;/span&gt;기준&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;브랜치의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;마지막&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;커밋으로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;재정렬&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;두&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;서로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;비교하지&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;않고&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;순차적으로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;커밋&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;병합&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;보통&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; master or main &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치에는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;사용하지&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;않는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;것으로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;한다&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘못&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;활용할&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;경우&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;소스&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이력이&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;꼬일&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;수&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;있다&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;충돌&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌의&lt;span&gt; &lt;/span&gt;원인은&lt;span&gt; &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;사람과&lt;span&gt; &lt;/span&gt;같은&lt;span&gt; &lt;/span&gt;위치의&lt;span&gt; &lt;/span&gt;코드를&lt;span&gt; &lt;/span&gt;동시에&lt;span&gt; 수정시에&lt;/span&gt; 발생&lt;/li&gt;
&lt;li&gt;충돌을&lt;span&gt; &lt;/span&gt;해결하면&lt;span&gt;, &lt;/span&gt;파일은&lt;span&gt; modified &lt;/span&gt;상태가&lt;span&gt; &lt;/span&gt;되는데&lt;span&gt;, &lt;/span&gt;이를&lt;span&gt; &lt;/span&gt;다시&lt;span&gt; &lt;/span&gt;스테이지&lt;span&gt; &lt;/span&gt;영역에&lt;span&gt; &lt;/span&gt;등록하고&lt;span&gt; &lt;/span&gt;병합&lt;span&gt; &lt;/span&gt;커밋을&lt;span&gt; &lt;/span&gt;직접&lt;span&gt; &lt;/span&gt;만들어야&lt;span&gt; &lt;/span&gt;한다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2kIV8/btskIPSXItu/UKnKKWuU2CZq8AIDA8DDiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2kIV8/btskIPSXItu/UKnKKWuU2CZq8AIDA8DDiK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2kIV8/btskIPSXItu/UKnKKWuU2CZq8AIDA8DDiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2kIV8%2FbtskIPSXItu%2FUKnKKWuU2CZq8AIDA8DDiK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;1200&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>9장</category>
      <category>git 교과서</category>
      <category>Merge</category>
      <category>Rebase</category>
      <category>병합</category>
      <category>충돌</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/83</guid>
      <comments>https://puk0806.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 20 Jun 2023 22:45:17 +0900</pubDate>
    </item>
    <item>
      <title>[DevOps] K8s - Kubernetes 란? Kubernetes 기본 명령어</title>
      <link>https://puk0806.tistory.com/82</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://kubernetes.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kubernetes.io/&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1687096385670&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;Production-Grade Container Orchestration&quot; data-og-description=&quot;Production-Grade Container Orchestration&quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/&quot; data-og-url=&quot;https://kubernetes.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jXqvr/hyS2vSv6jj/xUcSxk71AVEPqhqta4xaU0/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/R6Hy2/hyS2EBUxMw/JtmgkKexmsFEV9JPglLfHK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://kubernetes.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jXqvr/hyS2vSv6jj/xUcSxk71AVEPqhqta4xaU0/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/R6Hy2/hyS2EBUxMw/JtmgkKexmsFEV9JPglLfHK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;Production-Grade Container Orchestration&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Production-Grade Container Orchestration&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kubernetes&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너 오케스트레이션 플랫폼으로서 대규모의 애플리케이션을 관리하고 배포하기 위한 플랫폼&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;오케스트레이션&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너 기반의 애플리케이션을 운영할 때, 애플리케이션의 배포, 확장, 로드 밸런싱, 모니터링, 장애 복구 등 다양한 작업을 효율적으로 관리하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kubernetes 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너화 된 애플리케이션 구동&lt;/li&gt;
&lt;li&gt;서비스 디시크버리와 로드밸런싱 기능&lt;/li&gt;
&lt;li&gt;스토리지의 오케시트레이션 기능&lt;/li&gt;
&lt;li&gt;자동화된 배포 기능&lt;/li&gt;
&lt;li&gt;환경 변수, 스크릿 파일 등을 사용하여 애플리케이션을 구성 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Kubernetes 할 수 없는기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 코드 배포, 빌드 기능&lt;/li&gt;
&lt;li&gt;로깅, 모니터링 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;K8s - Pod&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션을 위해 서로 상호 작용해야 하는 컨테이너들의 논리적 집합&lt;/li&gt;
&lt;li&gt;K8s의 배포 및 실행되는 기본 실행 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;K8s - Deployment&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파드의 배포 및 관리를 위한 K8s의 리소스&lt;/li&gt;
&lt;li&gt;ReplicaSet을 기반으로 Pod의 복제본을 관리한다.&lt;/li&gt;
&lt;li&gt;롱링 업데이트, 롤백, 스케일링 등의 기능을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;K8s - Services&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Replicated된 Pods의 네트워크 노출과 로드벨런싱을 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;K8s Minikube 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Minikube - 테스트용도나 개발용도로 간단하게 사용할수있는 K8s 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-18 오후 11.45.54.png&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfGte9/btskgHIevWP/z1nKIEIvsFW1wiKFKXSSsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfGte9/btskgHIevWP/z1nKIEIvsFW1wiKFKXSSsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfGte9/btskgHIevWP/z1nKIEIvsFW1wiKFKXSSsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfGte9%2FbtskgHIevWP%2Fz1nKIEIvsFW1wiKFKXSSsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2764&quot; height=&quot;1424&quot; data-filename=&quot;스크린샷 2023-06-18 오후 11.45.54.png&quot; data-origin-width=&quot;2764&quot; data-origin-height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;K8s 기본 명령어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 가능한 노드 목록 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl get nodes&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용 가능한 파드 목록 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;kubectl get pods&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;현재 배포 중인 리소스 목록 가져오기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;kubectl get deployments&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;현재 사용 중인 services 목록 가져오기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;kubectl get services&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pod 생성&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl run [pods명] --image=[이미지명] --port=[포트번호]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pod 상세 정보 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl describe pods [pods명]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pod 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl delete pod/[pods명]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deployment 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl&amp;nbsp;create deployment [deployment명] --image=[이미지명]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deployment Scale 변경
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl scale deployment [deployment명] --replicas=[pods수]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deployment 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kubectl delete deployment.apps/[deployment명]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1687100476266&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 사용 가능한 노드 목록 확인
kubectl get nodes 
// 사용 가능한 파드 목록 확인
kubectl get pods 
// 현재 배포 중인 리소스 목록 가져오기
kubectl get deployments
// 현재 사용 중인 services 목록 가져오기
kubectl get services

// Nginx 서버 실행
kubectl run gugbab-nginx --image=nginx --port=80
// pod 상세 정보 확인
kubectl describe pods gugbab-nginx
// pod 삭제 삭제
kubectl delete pod/gugbab-nginx

// deployment 생성
kubectl create deployment gugbab-nginx --image=nginx
// deployment Scale 변경
kubectl scale deployment gugbab-nginx --replicas=2
// deployment 삭제
kubectl delete deployment.apps/gugbab-nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-19 오전 12.19.33.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXswLG/btskll4VgAA/1aAZe7AXzka9VfDpKozP41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXswLG/btskll4VgAA/1aAZe7AXzka9VfDpKozP41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXswLG/btskll4VgAA/1aAZe7AXzka9VfDpKozP41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXswLG%2Fbtskll4VgAA%2F1aAZe7AXzka9VfDpKozP41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;315&quot; data-filename=&quot;스크린샷 2023-06-19 오전 12.19.33.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;315&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>DevOps</category>
      <category>devops</category>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>minikube</category>
      <category>오케스트레이션</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/82</guid>
      <comments>https://puk0806.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 19 Jun 2023 00:22:46 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 7장 Stash</title>
      <link>https://puk0806.tistory.com/81</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot;&gt;Stash&amp;nbsp;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot;&gt;커밋되지 않은 변경 내용을 임시 저장할 수 있는 기능이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot;&gt;Stash 명령어&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1686834238131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; * 코드 저장
   
   git stash // 현재 작업들을 임시 스택 영역에 저장
   
   git stash save // git stash와 동일하나, 하단과 같이 메세지를 함께 저장 가능
   
   git stash save &quot;WIP: 메시지~~~&quot; // 각각의 스태시 구별할 수 있도록 메시지 추가 가능
   
   git stash --keep-index // 스테이지 영역의 파일들을 제외하고 스태시
   
   git stash --include-untracked // 등록되지 않은 untracked 상태의 파일을 스태시로 생성 ( 단축어: -u )
   
   * 임시 저장 영역의 스택 목록
   
   git stash list // 스태시 스택 조회
   
   git stash show // 최신 스태시와 현재 워킹 디렉터리 간 차이 간략하게 출력
   
   git stash show -p stash@{0} // 스태시와 현재 워킹 디렉터리 간 상세한 차이 출력
   
   * 임시 저장한 스태시 불러오기
   
   git stash pop // 최신 스태시 가져오기 (가져오기 + 제거)
   
   * 스태시 복원으로 충돌
   
   git stash branch test // 새로운 브랜치 생성과 동시에 스태시의 임시 작업 내용 복원
   
   * 스태시 복사
   
   git stash apply // 스택에서 제거하지 않은 채로 가져오기
   
   git stash apply stash@{1} // 특정 중간 작업 지정하여 적용
   
   * 스태시 삭제
   
   git stash drop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Clean&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;워킹 디렉터리에 있는 추적되지 않는 파일들을 찾아 삭제하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1686834296958&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    git clean // 삭제 명령은 민감해서 몇 가지 옵션을 같이 사용해야 함
    
    git clean -f // 강제 청소
    
    git clean -n // clean 명령어를 사용하여 잘못 삭제하는 것을 미연에 방지하고자 파일을 가상으로 미리 처리해 보고 사용자에게 확인 요청
    
    git clean -d // 추적되지 않는 파일만 별도록 삭제
    
    git clean -x // .gitignore에 등록한 파일까지 같이 삭제하고 싶을 때 사용&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Qr6Q/btsj6mXBk5j/KS7HzdVkkH0g8yUkr2QIXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Qr6Q/btsj6mXBk5j/KS7HzdVkkH0g8yUkr2QIXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Qr6Q/btsj6mXBk5j/KS7HzdVkkH0g8yUkr2QIXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Qr6Q%2Fbtsj6mXBk5j%2FKS7HzdVkkH0g8yUkr2QIXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;396&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>Clean</category>
      <category>git</category>
      <category>git 교과서</category>
      <category>stash</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/81</guid>
      <comments>https://puk0806.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 15 Jun 2023 22:06:12 +0900</pubDate>
    </item>
    <item>
      <title>[IaC] Ansible Playbook Example</title>
      <link>https://puk0806.tistory.com/80</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ansible Playbook&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 원하는 내용을 미리 작성해 놓은 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Playbook 사용법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;playbook yml 작성&lt;/li&gt;
&lt;li&gt;ansible-playbook [playbook명] 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ansible hosts 추가 예시&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ansible의 멱등성 때문에 playbook을 여러번 실행해도 같은 설정이 여러번 적용되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) ansible hosts 추가 예시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오후 11.22.25.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;1062&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/78pZZ/btsjllyTBtV/QIsPB1ixukX98y24Zoe5F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/78pZZ/btsjllyTBtV/QIsPB1ixukX98y24Zoe5F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/78pZZ/btsjllyTBtV/QIsPB1ixukX98y24Zoe5F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F78pZZ%2FbtsjllyTBtV%2FQIsPB1ixukX98y24Zoe5F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2038&quot; height=&quot;1062&quot; data-filename=&quot;스크린샷 2023-06-11 오후 11.22.25.png&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;1062&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>ansible</category>
      <category>playbook</category>
      <category>멱등성</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/80</guid>
      <comments>https://puk0806.tistory.com/80#entry80comment</comments>
      <pubDate>Mon, 12 Jun 2023 00:03:52 +0900</pubDate>
    </item>
    <item>
      <title>[IaC] Ansible이란? Ansible config,SSH 설정, module Test</title>
      <link>https://puk0806.tistory.com/79</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Iac - Infrastructure as Code&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인프라의 정보를 스크립트를 통해서 관리하는 것&lt;/li&gt;
&lt;li&gt;버전 관리를 통한 리소스 관리가 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ansible.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.ansible.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686235621916&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;Ansible is Simple IT Automation&quot; data-og-description=&quot;Ansible is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.&quot; data-og-host=&quot;www.ansible.com&quot; data-og-source-url=&quot;https://www.ansible.com/&quot; data-og-url=&quot;https://www.ansible.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b9XbL2/hySVy3Ikc6/qF9d9E6PoEPNh3TDmrsIR0/img.png?width=1200&amp;amp;height=675&amp;amp;face=780_118_834_176&quot;&gt;&lt;a href=&quot;https://www.ansible.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ansible.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b9XbL2/hySVy3Ikc6/qF9d9E6PoEPNh3TDmrsIR0/img.png?width=1200&amp;amp;height=675&amp;amp;face=780_118_834_176');&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;Ansible is Simple IT Automation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ansible is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ansible&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SSH를 통해 대상 서버에 접속하여 작업을 수행한다.&lt;/li&gt;
&lt;li&gt;에이전트 없이 동작한다.&lt;/li&gt;
&lt;li&gt;여러개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Ansible에서 관리할 서버 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/etc/ansible/hosts - 관리할 서버 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Ansible에서 접속 SSH Key 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ssh-keygen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;키 복사
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ssh-copy-id root@[접속할 서버 IP]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)추가 인증 없이 접속 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오전 12.13.56.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W2hxR/btsjllkVzTi/YtKNNvqzJeo8T13dxzmkH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W2hxR/btsjllkVzTi/YtKNNvqzJeo8T13dxzmkH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W2hxR/btsjllkVzTi/YtKNNvqzJeo8T13dxzmkH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW2hxR%2FbtsjllkVzTi%2FYtKNNvqzJeo8T13dxzmkH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;762&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2023-06-11 오전 12.13.56.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Ansible module 실행 옵션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-i (--inventory-file) : 적용될 호스트들에 대한 파일 정보&lt;/li&gt;
&lt;li&gt;-m (--module-name) : 모듈 설택&lt;/li&gt;
&lt;li&gt;-k (--ask-pass) : 관리자 암호 요청&lt;/li&gt;
&lt;li&gt;-K (--ask-become-pass) : 관리자 권한 상승&lt;/li&gt;
&lt;li&gt;--list-hosts : 적용되는 호스트 목록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) module 사용 예시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-11 오전 12.16.45.png&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJwwM/btsjpDZgDrY/dzLfvzQ5Om1Vxt5Iq8nWrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJwwM/btsjpDZgDrY/dzLfvzQ5Om1Vxt5Iq8nWrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJwwM/btsjpDZgDrY/dzLfvzQ5Om1Vxt5Iq8nWrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJwwM%2FbtsjpDZgDrY%2FdzLfvzQ5Om1Vxt5Iq8nWrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;509&quot; height=&quot;211&quot; data-filename=&quot;스크린샷 2023-06-11 오전 12.16.45.png&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>ansible</category>
      <category>IAC</category>
      <category>Module</category>
      <category>ssh</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/79</guid>
      <comments>https://puk0806.tistory.com/79#entry79comment</comments>
      <pubDate>Sun, 11 Jun 2023 00:24:53 +0900</pubDate>
    </item>
    <item>
      <title>[CICD] Jenkins - 다른 SSH 서버 + Docker Contaner 배포 하기</title>
      <link>https://puk0806.tistory.com/78</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Plugin 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Publish Over SSH&amp;nbsp;설치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;SSH 설정 추가하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; System -&amp;gt; Publish over SSH -&amp;gt; SSH Servers 추가&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hostname : localhost를 사용하면 안 됨.&lt;/li&gt;
&lt;li&gt;password추가, Port 확인하기&lt;/li&gt;
&lt;li&gt;Test Configuration - 접속 가능 테스트 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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-filename=&quot;스크린샷 2023-06-08 오후 9.30.30.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KNVUX/btsjaB2IgME/jcdIDjRPIpqIfdHgMtqYy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KNVUX/btsjaB2IgME/jcdIDjRPIpqIfdHgMtqYy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KNVUX/btsjaB2IgME/jcdIDjRPIpqIfdHgMtqYy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKNVUX%2FbtsjaB2IgME%2FjcdIDjRPIpqIfdHgMtqYy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;982&quot; height=&quot;661&quot; data-filename=&quot;스크린샷 2023-06-08 오후 9.30.30.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;661&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jenkins Items 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빌드 후 조치 -&amp;gt; Send build artifacts over SSH 설정 추가&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Exec command : 복사 이후 실행될 명령어&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-08 오후 10.10.50.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Az5dW/btsjaCN6wm6/gO7sLZhSkyi8X94HYpKae0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Az5dW/btsjaCN6wm6/gO7sLZhSkyi8X94HYpKae0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Az5dW/btsjaCN6wm6/gO7sLZhSkyi8X94HYpKae0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAz5dW%2FbtsjaCN6wm6%2FgO7sLZhSkyi8X94HYpKae0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;697&quot; height=&quot;808&quot; data-filename=&quot;스크린샷 2023-06-08 오후 10.10.50.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>cicd</category>
      <category>docker</category>
      <category>jenkins</category>
      <category>ssh</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/78</guid>
      <comments>https://puk0806.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 8 Jun 2023 22:13:27 +0900</pubDate>
    </item>
    <item>
      <title>[CICD] Jenkins - git CICD 설정, build Trigger example</title>
      <link>https://puk0806.tistory.com/77</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins - Git Docker Config 설정방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://puk0806.tistory.com/76&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686055534852&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;[CICD] Jenkins - Git,Maven,Gradle Plugins 설정 Docker  배포 Example&quot; data-og-description=&quot;Jenkins Start 설명 https://puk0806.tistory.com/75 [CICD] Docker Container - Jenkins Start Example https://www.jenkins.io/ Jenkins Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Li&quot; data-og-host=&quot;puk0806.tistory.com&quot; data-og-source-url=&quot;https://puk0806.tistory.com/76&quot; data-og-url=&quot;https://puk0806.tistory.com/76&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnC4Jn/hySTVLjwOX/87G8uu5CPBTvZ1ygc2IwUk/img.png?width=651&amp;amp;height=419&amp;amp;face=0_0_651_419,https://scrap.kakaocdn.net/dn/hKe1P/hySTT7OitZ/87oU1l8ZKVPli6gKSDNVO0/img.png?width=651&amp;amp;height=419&amp;amp;face=0_0_651_419,https://scrap.kakaocdn.net/dn/kxhoC/hySTQwsQZa/oGSlctM8L3ewANKNmbsRmK/img.png?width=2520&amp;amp;height=1344&amp;amp;face=0_0_2520_1344&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://puk0806.tistory.com/76&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnC4Jn/hySTVLjwOX/87G8uu5CPBTvZ1ygc2IwUk/img.png?width=651&amp;amp;height=419&amp;amp;face=0_0_651_419,https://scrap.kakaocdn.net/dn/hKe1P/hySTT7OitZ/87oU1l8ZKVPli6gKSDNVO0/img.png?width=651&amp;amp;height=419&amp;amp;face=0_0_651_419,https://scrap.kakaocdn.net/dn/kxhoC/hySTQwsQZa/oGSlctM8L3ewANKNmbsRmK/img.png?width=2520&amp;amp;height=1344&amp;amp;face=0_0_2520_1344');&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;[CICD] Jenkins - Git,Maven,Gradle Plugins 설정 Docker 배포 Example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins Start 설명 https://puk0806.tistory.com/75 [CICD] Docker Container - Jenkins Start Example https://www.jenkins.io/ Jenkins Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Li&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;puk0806.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CICD&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CI&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적인 통합으로 여러 개발자 들이 동시에 작업하는 경우 발생할 수 있는 코드 충돌이나 통합 오류를 방지하기 위한 개발 방법론&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CD&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적인 배포로 CI의 결과물을 실제 사용자에게 배포하는 프로세스이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빌드 유발 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Build periodically&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;변경이 되지 않아서도 설정해놓은 시간마다 트리거&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Poll SCM&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;commit에 대한 내용이 있을때만 설정해 시간마다 체크 후 build 트리거&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;Cron job&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;유닉스 계열 운영 체제에서 주기적으로 실행되는 작업을 자동화하기위해 사용되는 스켈중링&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;* * * * * : 앞에서부터 분,시,일,월,요일 의미 // 테스트를 위해 항상으로 설정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-06 오후 9.29.39.png&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A7KhX/btsiQJlJGbG/qV9nzrEPNmGD4Is9m57n90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A7KhX/btsiQJlJGbG/qV9nzrEPNmGD4Is9m57n90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A7KhX/btsiQJlJGbG/qV9nzrEPNmGD4Is9m57n90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA7KhX%2FbtsiQJlJGbG%2FqV9nzrEPNmGD4Is9m57n90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;715&quot; height=&quot;558&quot; data-filename=&quot;스크린샷 2023-06-06 오후 9.29.39.png&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>build</category>
      <category>cicd</category>
      <category>git</category>
      <category>jenkins</category>
      <category>Tregger</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/77</guid>
      <comments>https://puk0806.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 7 Jun 2023 00:17:49 +0900</pubDate>
    </item>
    <item>
      <title>[CICD] Jenkins - Git,Maven,Gradle Plugins 설정 Docker  배포 Example</title>
      <link>https://puk0806.tistory.com/76</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins Start 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/75&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://puk0806.tistory.com/75&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686034972911&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;[CICD] Docker Container - Jenkins Start Example&quot; data-og-description=&quot;https://www.jenkins.io/ Jenkins Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Linux, macOS and other Unix-like operating systems. www.jenkins.io https://puk0806.tistory.com/55 [Doc&quot; data-og-host=&quot;puk0806.tistory.com&quot; data-og-source-url=&quot;https://puk0806.tistory.com/75&quot; data-og-url=&quot;https://puk0806.tistory.com/75&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PahdT/hySTS1LgbJ/zMB2rVVkvkP9xF2xqCo7SK/img.png?width=800&amp;amp;height=130&amp;amp;face=0_0_800_130,https://scrap.kakaocdn.net/dn/dqXtmg/hySTH6ZKP2/MkeB1pA0LrhM1rkRerpr41/img.png?width=800&amp;amp;height=130&amp;amp;face=0_0_800_130,https://scrap.kakaocdn.net/dn/i48eN/hySTNMUofx/ATiNNqJ5ZKIkvaoho4hHA0/img.png?width=3456&amp;amp;height=2234&amp;amp;face=0_0_3456_2234&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/75&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://puk0806.tistory.com/75&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PahdT/hySTS1LgbJ/zMB2rVVkvkP9xF2xqCo7SK/img.png?width=800&amp;amp;height=130&amp;amp;face=0_0_800_130,https://scrap.kakaocdn.net/dn/dqXtmg/hySTH6ZKP2/MkeB1pA0LrhM1rkRerpr41/img.png?width=800&amp;amp;height=130&amp;amp;face=0_0_800_130,https://scrap.kakaocdn.net/dn/i48eN/hySTNMUofx/ATiNNqJ5ZKIkvaoho4hHA0/img.png?width=3456&amp;amp;height=2234&amp;amp;face=0_0_3456_2234');&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;[CICD] Docker Container - Jenkins Start Example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.jenkins.io/ Jenkins Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Linux, macOS and other Unix-like operating systems. www.jenkins.io https://puk0806.tistory.com/55 [Doc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;puk0806.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plugin 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; plugins
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub plugin 설치&lt;/li&gt;
&lt;li&gt;Gradle Plugin&amp;nbsp;설치&lt;/li&gt;
&lt;li&gt;Maven Integration plugin 설치&lt;/li&gt;
&lt;li&gt;Deploy to container Plugin 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 추가하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins가 설치된 PC에 명령어가 사용 가능한 확인 해야한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker exec -it [컨테이너명] [사용할 쉘명]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;git 설정 추가하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; Tools -&amp;gt; git 커멘드 설정&lt;/li&gt;
&lt;li&gt;git 설치확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git --version&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-05 오후 10.50.35.png&quot; data-origin-width=&quot;2180&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MnzR4/btsiOg5sptk/YWDMEerlIHCbkeJSOkhfWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MnzR4/btsiOg5sptk/YWDMEerlIHCbkeJSOkhfWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MnzR4/btsiOg5sptk/YWDMEerlIHCbkeJSOkhfWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnzR4%2FbtsiOg5sptk%2FYWDMEerlIHCbkeJSOkhfWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2180&quot; height=&quot;808&quot; data-filename=&quot;스크린샷 2023-06-05 오후 10.50.35.png&quot; data-origin-width=&quot;2180&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Gradle 설정 추가하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; Tools -&amp;gt; Gradle 설정 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-05 오후 11.12.38.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfxzC0/btsiPin80EU/cScqG2YLqQziFNqSdCuj2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfxzC0/btsiPin80EU/cScqG2YLqQziFNqSdCuj2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfxzC0/btsiPin80EU/cScqG2YLqQziFNqSdCuj2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfxzC0%2FbtsiPin80EU%2FcScqG2YLqQziFNqSdCuj2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2520&quot; height=&quot;1344&quot; data-filename=&quot;스크린샷 2023-06-05 오후 11.12.38.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Maven 설정 추가하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 관리 -&amp;gt; Tools -&amp;gt; Maven 설정 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-05 오후 11.13.44.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QqSjk/btsiFNJLXJo/8q0vVhTIMUXcyAnbYkmddK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QqSjk/btsiFNJLXJo/8q0vVhTIMUXcyAnbYkmddK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QqSjk/btsiFNJLXJo/8q0vVhTIMUXcyAnbYkmddK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQqSjk%2FbtsiFNJLXJo%2F8q0vVhTIMUXcyAnbYkmddK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2520&quot; height=&quot;1344&quot; data-filename=&quot;스크린샷 2023-06-05 오후 11.13.44.png&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins Items 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gradle의 경우 FreestyleProject, Maven경우 maven Project 생성&lt;/li&gt;
&lt;li&gt;git repository 연동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;private repository 라면 credetials를 추가해줘야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;build 파일 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;build 설정 파일 설정&lt;/li&gt;
&lt;li&gt;build 옵션 설정&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;clean compile package&lt;/li&gt;
&lt;li&gt;clean&amp;nbsp;compileJava&amp;nbsp;jar&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;clean : 빌드되어 있다면 빌드 내용 삭제 (target 폴더 제거)&lt;/li&gt;
&lt;li&gt;complile : 소스 코드를 컴파일 실행&lt;/li&gt;
&lt;li&gt;compileJava : java소스 컴파일 실행&lt;/li&gt;
&lt;li&gt;package : 빌드된 소스 코드를 package 하는 명령어 jar, war 파일로 만들어준다.&lt;/li&gt;
&lt;li&gt;jar : 빌드된 소스 코드를 jar 파일로 만들어준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빌드 후 작업 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Container 올리는 설정 추가&lt;/li&gt;
&lt;li&gt;jar 파일의 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;빌드후 조치 -&amp;gt; Archive the artifacts 선택&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #14141f; text-align: start;&quot;&gt;jar파일 경로 경로 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;war 파일의 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Deploy war/ear to a container&lt;/li&gt;
&lt;li&gt;war 파일 파일 경로 설정&lt;/li&gt;
&lt;li&gt; AddContainer Tomcat 추가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tomcat 배포 권한 추가&lt;/li&gt;
&lt;li&gt;tomcat url 설정 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-06 오후 5.26.29.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chdPMx/btsiO4X6zGZ/Pmcso7uFmIik9Bn2uO0tFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chdPMx/btsiO4X6zGZ/Pmcso7uFmIik9Bn2uO0tFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chdPMx/btsiO4X6zGZ/Pmcso7uFmIik9Bn2uO0tFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchdPMx%2FbtsiO4X6zGZ%2FPmcso7uFmIik9Bn2uO0tFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;419&quot; data-filename=&quot;스크린샷 2023-06-06 오후 5.26.29.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>cicd</category>
      <category>config</category>
      <category>git</category>
      <category>Gradle</category>
      <category>jenkins</category>
      <category>maven</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/76</guid>
      <comments>https://puk0806.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 6 Jun 2023 17:27:30 +0900</pubDate>
    </item>
    <item>
      <title>[CICD] Docker Container - Jenkins Start Example</title>
      <link>https://puk0806.tistory.com/75</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jenkins.io/&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1685861784276&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;Jenkins&quot; data-og-description=&quot;Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Linux, macOS and other Unix-like operating systems.&quot; data-og-host=&quot;www.jenkins.io&quot; data-og-source-url=&quot;https://www.jenkins.io/&quot; data-og-url=&quot;https://www.jenkins.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/by3Y4J/hySRTTYf9T/r7Dl7FXuk2lhTHPJPgIbDK/img.png?width=866&amp;amp;height=1226&amp;amp;face=0_0_866_1226,https://scrap.kakaocdn.net/dn/cI4GZ0/hySRQ30OuW/A8RAkWp7IKjxijF7mSe3XK/img.png?width=1204&amp;amp;height=676&amp;amp;face=509_159_668_333&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jenkins.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/by3Y4J/hySRTTYf9T/r7Dl7FXuk2lhTHPJPgIbDK/img.png?width=866&amp;amp;height=1226&amp;amp;face=0_0_866_1226,https://scrap.kakaocdn.net/dn/cI4GZ0/hySRQ30OuW/A8RAkWp7IKjxijF7mSe3XK/img.png?width=1204&amp;amp;height=676&amp;amp;face=509_159_668_333');&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;Jenkins&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Easy installation Jenkins is a self-contained Java-based program, ready to run out-of-the-box, with packages for Windows, Linux, macOS and other Unix-like operating systems.&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;a href=&quot;https://puk0806.tistory.com/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://puk0806.tistory.com/55&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685861916678&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;[Docker] docker Image, Container 란? docker example&quot; data-og-description=&quot;https://www.docker.com/ Docker: Accelerated, Containerized Application Development Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code. www.docker.com Image C&quot; data-og-host=&quot;puk0806.tistory.com&quot; data-og-source-url=&quot;https://puk0806.tistory.com/55&quot; data-og-url=&quot;https://puk0806.tistory.com/55&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IVjYH/hySRY12Tq5/5KUlfX9CLdkb41b0yt5q4K/img.png?width=800&amp;amp;height=245&amp;amp;face=0_0_800_245,https://scrap.kakaocdn.net/dn/b6kdFq/hySR33l3Gw/yKn7L3eoa7kP9SZP5kgwT0/img.png?width=800&amp;amp;height=245&amp;amp;face=0_0_800_245,https://scrap.kakaocdn.net/dn/3Wdut/hySRYVhlYg/CFjKHfOA4d5v3oqh0SLKLK/img.png?width=1868&amp;amp;height=574&amp;amp;face=0_0_1868_574&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://puk0806.tistory.com/55&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IVjYH/hySRY12Tq5/5KUlfX9CLdkb41b0yt5q4K/img.png?width=800&amp;amp;height=245&amp;amp;face=0_0_800_245,https://scrap.kakaocdn.net/dn/b6kdFq/hySR33l3Gw/yKn7L3eoa7kP9SZP5kgwT0/img.png?width=800&amp;amp;height=245&amp;amp;face=0_0_800_245,https://scrap.kakaocdn.net/dn/3Wdut/hySRYVhlYg/CFjKHfOA4d5v3oqh0SLKLK/img.png?width=1868&amp;amp;height=574&amp;amp;face=0_0_1868_574');&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;[Docker] docker Image, Container 란? docker example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.docker.com/ Docker: Accelerated, Containerized Application Development Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code. www.docker.com Image C&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;puk0806.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jenkins&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CI/CD 도구로, 애플리케이션 개발 및 배포 과정을 자동화할 수 있도록 도와주는 오픈소스&lt;/li&gt;
&lt;li&gt;참고 &lt;a href=&quot;https://github.com/jenkinsci/docker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/jenkinsci/docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1685862059626&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jenkinsci/docker: Docker official jenkins repo&quot; data-og-description=&quot;Docker official jenkins repo. Contribute to jenkinsci/docker development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jenkinsci/docker&quot; data-og-url=&quot;https://github.com/jenkinsci/docker&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KHezH/hySRZs66XW/5N44dkkZ13xw2WXIAcLrck/img.png?width=740&amp;amp;height=370&amp;amp;face=0_0_740_370&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/docker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jenkinsci/docker&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KHezH/hySRZs66XW/5N44dkkZ13xw2WXIAcLrck/img.png?width=740&amp;amp;height=370&amp;amp;face=0_0_740_370');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jenkinsci/docker: Docker official jenkins repo&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker official jenkins repo. Contribute to jenkinsci/docker development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Docker Jenkins 이미지 다운&lt;/h4&gt;
&lt;pre id=&quot;code_1685862004416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull jenkins/jenkins:lts-jdk11&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Docker Jenkins Container 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1685862468040&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure jenkins/jenkins:lts-jdk11&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-04 오후 4.21.24.png&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crw8F9/btsitZJ3i0h/3ZjQJPfOUVahPjbTg2MDpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crw8F9/btsitZJ3i0h/3ZjQJPfOUVahPjbTg2MDpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crw8F9/btsitZJ3i0h/3ZjQJPfOUVahPjbTg2MDpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrw8F9%2FbtsitZJ3i0h%2F3ZjQJPfOUVahPjbTg2MDpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2666&quot; height=&quot;434&quot; data-filename=&quot;스크린샷 2023-06-04 오후 4.21.24.png&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;434&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Docker logs로 default password 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker logs [컨테이너명]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-06-04 오후 4.23.03.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LRM61/btsiuBWsqQT/fV5d5G8P6ZpGlBW1GCVR00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LRM61/btsiuBWsqQT/fV5d5G8P6ZpGlBW1GCVR00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LRM61/btsiuBWsqQT/fV5d5G8P6ZpGlBW1GCVR00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLRM61%2FbtsiuBWsqQT%2FfV5d5G8P6ZpGlBW1GCVR00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;118&quot; data-filename=&quot;edited_스크린샷 2023-06-04 오후 4.23.03.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jenkins JDK 설정 안되있으면 해주기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins 서버에 접속&lt;/li&gt;
&lt;li&gt;Tools 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jenkins Item 생성 빌드 테스트&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-04 오후 5.08.28.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;2234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bekO7n/btsitAc2a4V/GK3AgCvSgqqL2k6TpEOOGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bekO7n/btsitAc2a4V/GK3AgCvSgqqL2k6TpEOOGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bekO7n/btsitAc2a4V/GK3AgCvSgqqL2k6TpEOOGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbekO7n%2FbtsitAc2a4V%2FGK3AgCvSgqqL2k6TpEOOGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;3456&quot; height=&quot;2234&quot; data-filename=&quot;스크린샷 2023-06-04 오후 5.08.28.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;2234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>cicd</category>
      <category>docker</category>
      <category>jenkins</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/75</guid>
      <comments>https://puk0806.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 5 Jun 2023 00:12:25 +0900</pubDate>
    </item>
    <item>
      <title>[Jest] React - Jest Use CustomProvider, useEvent Example</title>
      <link>https://puk0806.tistory.com/74</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jest Test Provider 주입 하는 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. render 시에 직접 주입한다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;option으로 wrapper로 Provider를 주입한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) gugbab.test.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1685807122404&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { render, screen } from &quot;@testing-library/react&quot;;
...


test(&quot;gugbab1 상품 개수 증가후 가격 계산 테스트&quot;, async () =&amp;gt; {
  render(&amp;lt;Type orderType=&quot;products&quot; /&amp;gt;, { wrapper: OrderContextProvider });
  ...
 }&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. customRender를 사용한다.&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Provider를 주입 받는 util render를 만들어 해당 render를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) render-utils&lt;/p&gt;
&lt;pre id=&quot;code_1685807210032&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { render } from &quot;@testing-library/react&quot;;
import { OrderContextProvider } from &quot;./contexts/OrderContext&quot;;

const customRender = (ui, options) =&amp;gt;
  render(ui, { wrapper: OrderContextProvider, ...options });

export * from &quot;@testing-library/react&quot;;

export { customRender as render };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) gugbab.test.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1685807331432&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { render, screen } from &quot;../../../render-utils&quot;;
...


test(&quot;gugbab1 상품 개수 증가후 가격 계산 테스트&quot;, async () =&amp;gt; {
  render(&amp;lt;Type orderType=&quot;products&quot; /&amp;gt;);
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Jest Text Example&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;describe
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비슷&lt;span&gt; &lt;/span&gt;한&lt;span&gt; &lt;/span&gt;테스트를&lt;span&gt; &lt;/span&gt;묶을때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;useEvent&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이벤트를 테스트 할때 사용한다.&lt;/li&gt;
&lt;li&gt;userEvent.type사용하기전userEvent.clear를 해주는것이 좋다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;등록된&lt;span&gt; &lt;/span&gt;이벤트&lt;span&gt; &lt;/span&gt;핸들러를&lt;span&gt; &lt;/span&gt;제거하여&lt;span&gt; &lt;/span&gt;테스트&lt;span&gt; &lt;/span&gt;중에&lt;span&gt; &lt;/span&gt;예기치&lt;span&gt; &lt;/span&gt;않은&lt;span&gt; &lt;/span&gt;동작이&lt;span&gt; &lt;/span&gt;발생하는&lt;span&gt; &lt;/span&gt;것을&lt;span&gt; &lt;/span&gt;방지하기&lt;span&gt; &lt;/span&gt;위해서이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) gugbab.test.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1685808092862&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비슷 한 테스트를 묶을떄 사용
describe(&quot;상품과 옵션 총 가격 구하는 테스트&quot;, () =&amp;gt; {
  test(&quot;상품 증가이후 총 가격 확인 테스트&quot;, async () =&amp;gt; {
    render(&amp;lt;OrderPage /&amp;gt;);

    const total = screen.getByText(&quot;Total Price:&quot;, { exact: false });
    expect(total).toHaveTextContent(&quot;0&quot;);

    const gugbab1Input = await screen.findByRole(&quot;spinbutton&quot;, {
      name: &quot;gugbab1&quot;,
    });

    // 등록된 이벤트 핸들러를 제거하여 테스트 중에 예기치 않은 동작이 발생하는 것을 방지하기 위해서
    userEvent.clear(gugbab1Input);
    userEvent.type(gugbab1Input, &quot;1&quot;);

    expect(total).toHaveTextContent(&quot;1000&quot;);
  });

  test(&quot;옵션 증가이후 총 가격 확인 테스트&quot;, async () =&amp;gt; {
    ...
  });

  test(&quot;상품과 옵션을 변경시 총가격 테스트&quot;, async () =&amp;gt; {
    ...
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>CustompProvider</category>
      <category>jest</category>
      <category>jest test</category>
      <category>TDD</category>
      <category>useEvent</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/74</guid>
      <comments>https://puk0806.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 4 Jun 2023 01:03:46 +0900</pubDate>
    </item>
    <item>
      <title>[Git 교과서] 6장-2 Branch</title>
      <link>https://puk0806.tistory.com/73</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot;&gt;&lt;b&gt;Branch&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/66&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://puk0806.tistory.com/66&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685789393357&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;[Git 교과서] 6장-1 Branch&quot; data-og-description=&quot;Branch 나뭇가지, 지사, 분점 등 줄기 하나에서 뻗어나온 갈림길을 의미한다. 저장공간 하나에서 가상의 또 다른 저장 공간을 만드는 것이다. Branch 특징 가상 폴더 작업 폴더를 실제로 복사하지 않&quot; data-og-host=&quot;puk0806.tistory.com&quot; data-og-source-url=&quot;https://puk0806.tistory.com/66&quot; data-og-url=&quot;https://puk0806.tistory.com/66&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pBiOL/hySRYmW4qN/zkMHQTTtksv8eqRrHy6UQ0/img.jpg?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/oK8cY/hySQHmPa6y/U0xeqwt1mOnQE5EvFROPgk/img.jpg?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/7MOcE/hySRU5ULZs/2fTJDdvuaKx2NZPqknfWV0/img.jpg?width=934&amp;amp;height=1200&amp;amp;face=0_0_934_1200&quot;&gt;&lt;a href=&quot;https://puk0806.tistory.com/66&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://puk0806.tistory.com/66&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pBiOL/hySRYmW4qN/zkMHQTTtksv8eqRrHy6UQ0/img.jpg?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/oK8cY/hySQHmPa6y/U0xeqwt1mOnQE5EvFROPgk/img.jpg?width=800&amp;amp;height=1027&amp;amp;face=0_0_800_1027,https://scrap.kakaocdn.net/dn/7MOcE/hySRU5ULZs/2fTJDdvuaKx2NZPqknfWV0/img.jpg?width=934&amp;amp;height=1200&amp;amp;face=0_0_934_1200');&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;[Git 교과서] 6장-1 Branch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Branch 나뭇가지, 지사, 분점 등 줄기 하나에서 뻗어나온 갈림길을 의미한다. 저장공간 하나에서 가상의 또 다른 저장 공간을 만드는 것이다. Branch 특징 가상 폴더 작업 폴더를 실제로 복사하지 않&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;puk0806.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;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;원격 브랜치&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리모트 브랜치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원격&lt;span&gt; &lt;/span&gt;저장소에&lt;span&gt; &lt;/span&gt;생성한&lt;span&gt; &lt;/span&gt;브랜치를&lt;span&gt; &lt;/span&gt;리모트&lt;span&gt; &lt;/span&gt;브랜치라고&lt;span&gt; &lt;/span&gt;하며&lt;span&gt;, &lt;/span&gt;로컬에&lt;span&gt; &lt;/span&gt;생성된&lt;span&gt; &lt;/span&gt;브랜치를&lt;span&gt; &lt;/span&gt;서버로&lt;span&gt; &lt;/span&gt;공유할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;리모트&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치는&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;보통&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;별칭&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이름&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;과&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;같은&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;형태로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;사용한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;저장소를 복제(git clone) 하면 트래킹 브랜치가 하나만 표시된다. 복제할 당시 모든 브랜치를 복제하지 않았기 때문이다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;불필요한 브랜치를 한번에 다 가져오는 것은 효율성과 연관있다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;다른&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치를&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;풀&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;작업으로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;받아&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;트래킹&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치를&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;활성화&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;하거나&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;직접&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;트래킹&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치를&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;지정할&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;수&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;있다.&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685789628146&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git push 원격저장소별칭 브랜치명
$ git push -u origin master // 선택한 브랜치를 원격 서버로 전달한다.
$ git branch -r // 원격 저장소의 리모트 브랜치 목록 보기
$ git branch -a // 모든 브랜치의 정보를 확인하기
$ git branch -vv // 복제 저장소의 트래킹 브랜치 확인하기
$ git push --set-upstream origin 브랜치명 // 현재 내 로컬 브랜치와 원격저장소의 연결할 브랜치 명령&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;원격 브랜치 복사
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원격&lt;span&gt; &lt;/span&gt;저장소와&lt;span&gt; &lt;/span&gt;로컬&lt;span&gt; &lt;/span&gt;저장소의&lt;span&gt; &lt;/span&gt;브랜치&lt;span&gt; &lt;/span&gt;목록은&lt;span&gt; &lt;/span&gt;서로&lt;span&gt; &lt;/span&gt;다를&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있음&lt;span&gt;, &lt;/span&gt;따라서&lt;span&gt; &lt;/span&gt;동기화가&lt;span&gt; &lt;/span&gt;필요하다.&lt;/li&gt;
&lt;li&gt;다른 개발자가 생성한 브랜치 목록 등 변경된 브랜치 목록을 동기화 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685789783792&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git fetch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브랜치 페치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fetch 는 원격 저장소의 리모트 브랜치 내용의 변경점을 내려받을 뿐, 자동으로 병합되지는 않는다.&lt;/li&gt;
&lt;li&gt;병합이&lt;span&gt; &lt;/span&gt;필요한&lt;span&gt; &lt;/span&gt;경우&lt;span&gt; `git merge &lt;/span&gt;원격저장소별칭&lt;span&gt;/&lt;/span&gt;브랜치명&lt;span&gt;` &lt;/span&gt;으로&lt;span&gt; &lt;/span&gt;명령을&lt;span&gt; &lt;/span&gt;실행해야&lt;span&gt; &lt;/span&gt;한다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브랜치&lt;span&gt; &lt;/span&gt;삭제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브랜치를 삭제한다는 것은 브랜치 내용과 커밋을 모두 삭제한다는 의미. 따라서 삭제를 할 때는 주의가 필요하다.&lt;/li&gt;
&lt;li&gt;현재 자신이 바라보고 있는 브랜치는 삭제할 수 없다.&lt;/li&gt;
&lt;li&gt;삭제를 위해서는 다른 브랜치로 잠시 이동해야&amp;nbsp;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;일반적인 삭제 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;d` 옵션은 스테이지 상태가 깨끗할 때만 삭제를 허용&lt;span&gt;- &lt;/span&gt;병합되지&lt;span&gt; &lt;/span&gt;않은&lt;span&gt; &lt;/span&gt;브랜치는&lt;span&gt; `-d` &lt;/span&gt;옵션으로&lt;span&gt; &lt;/span&gt;삭제할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;없다.&lt;/li&gt;
&lt;li&gt;add 명령어로 스테이지의 인덱스가 변경된 상태거나, 워킹 디렉터리가 작업한 기록이 있을 때에는 삭제하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685789957309&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git branch -d 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강제 삭제 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인&lt;span&gt; &lt;/span&gt;삭제&lt;span&gt; &lt;/span&gt;방법으로&lt;span&gt; &lt;/span&gt;삭제가&lt;span&gt; &lt;/span&gt;불가능&lt;span&gt; &lt;/span&gt;할&lt;span&gt; &lt;/span&gt;경우&lt;span&gt; 사용한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;옵션을&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;대문자&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; `-D` &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;로&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;브랜치를&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;강제&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;삭제&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685790003494&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git branch -D 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리모트 브랜치를 삭제하는 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원격&lt;span&gt; &lt;/span&gt;저장소의&lt;span&gt; &lt;/span&gt;브랜치&lt;span&gt; &lt;/span&gt;삭제는&lt;span&gt; &lt;/span&gt;신중하게&lt;span&gt; &lt;/span&gt;삭제해야&lt;span&gt;&amp;nbsp;한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685790058264&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git push origin --delete 리모트브랜치명&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCj8qD/btsiyVlZfgD/GttDmuevasJG0of27G14S1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCj8qD/btsiyVlZfgD/GttDmuevasJG0of27G14S1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCj8qD/btsiyVlZfgD/GttDmuevasJG0of27G14S1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCj8qD%2FbtsiyVlZfgD%2FGttDmuevasJG0of27G14S1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;259&quot; height=&quot;1200&quot; data-filename=&quot;Git 교과서.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git</category>
      <category>branch</category>
      <category>git</category>
      <category>git 교과서</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/73</guid>
      <comments>https://puk0806.tistory.com/73#entry73comment</comments>
      <pubDate>Sat, 3 Jun 2023 20:02:16 +0900</pubDate>
    </item>
    <item>
      <title>[React] Mock Server Work Create Use Example</title>
      <link>https://puk0806.tistory.com/72</link>
      <description>&lt;pre id=&quot;code_1685533537993&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;@testing-library/jest-dom&quot;;

import { server } from &quot;./mocks/server&quot;;

// 모든 테스트 서버를 생성
beforeAll(() =&amp;gt; server.listen());

// 테스트 이후에 핸들러 초기화
afterEach(() =&amp;gt; server.resetHandlers());

// 테스트 이후에 서버 종료
afterAll(() =&amp;gt; server.close());&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mock Server&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제&amp;nbsp;서버와&amp;nbsp;유사한&amp;nbsp;동작을&amp;nbsp;하는&amp;nbsp;가짜&amp;nbsp;서버이다.&lt;/li&gt;
&lt;li&gt;서버를 향한 네트워크 요청을 가로채서 모의 응답을 내려주는 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Msw 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1685532373989&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install msw&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;api handler 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) handlers.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1685532458770&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { rest } from &quot;msw&quot;;

export const handlers = [
  rest.get(&quot;http://localhost:5000/test&quot;, (req, res, ctx) =&amp;gt; {
    return res(
      ctx.json(
      ...
      )
    );
  }),
];&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;server 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) server.tsx&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 만든 handler 주입&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685532735974&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { setupServer } from &quot;msw/node&quot;;
import { handlers } from &quot;./handlers&quot;;

// mocking server 생성
export const server = setupServer(...handlers)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;server config 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ex) setupTests.tsx&lt;/p&gt;
&lt;pre id=&quot;code_1685533631610&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import &quot;@testing-library/jest-dom&quot;;

import { server } from &quot;./mocks/server&quot;;

// 모든 테스트 서버를 생성
beforeAll(() =&amp;gt; server.listen());

// 테스트 이후에 핸들러 초기화
afterEach(() =&amp;gt; server.resetHandlers());

// 테스트 이후에 서버 종료
afterAll(() =&amp;gt; server.close());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>Mock</category>
      <category>mock api</category>
      <category>Mock server</category>
      <category>MSK</category>
      <category>react</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/72</guid>
      <comments>https://puk0806.tistory.com/72#entry72comment</comments>
      <pubDate>Fri, 2 Jun 2023 00:11:22 +0900</pubDate>
    </item>
    <item>
      <title>[Error] Jest - Axios SyntaxError: Cannot use import statement outside a module</title>
      <link>https://puk0806.tistory.com/71</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;jest에서 Axios를 yarn add 하고 테스트를 하는데 아래 에러 발생&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SyntaxError:&amp;nbsp;Cannot&amp;nbsp;use&amp;nbsp;import&amp;nbsp;statement&amp;nbsp;outside&amp;nbsp;a&amp;nbsp;module&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;발생 원인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jest에서 해당 모듈을 찾을 수 없다고 나옴&lt;/li&gt;
&lt;li&gt;yarn add시 버전을 명시에 주지 않아서 최신 릴리즈 버전 추가&lt;/li&gt;
&lt;li&gt;해당 버전은 jest에 지원하지 않아서 에러 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;해결 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;axios의 버전을 낮춰주니 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Error</category>
      <category>axios</category>
      <category>error</category>
      <category>jest</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/71</guid>
      <comments>https://puk0806.tistory.com/71#entry71comment</comments>
      <pubDate>Thu, 1 Jun 2023 17:17:50 +0900</pubDate>
    </item>
    <item>
      <title>[Dcoker] Zipkin, Monitoring(Prometheus + Grafana) Container Create Example</title>
      <link>https://puk0806.tistory.com/70</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Zipkin&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zipkin.io/pages/quickstart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zipkin.io/pages/quickstart&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685332080904&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;Quickstart &amp;middot; OpenZipkin&quot; data-og-description=&quot;Quickstart In this section we&amp;rsquo;ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source. If you are familiar with Docker, this is the preferred method t&quot; data-og-host=&quot;zipkin.io&quot; data-og-source-url=&quot;https://zipkin.io/pages/quickstart&quot; data-og-url=&quot;https://zipkin.io/pages/quickstart&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://zipkin.io/pages/quickstart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zipkin.io/pages/quickstart&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;Quickstart &amp;middot; OpenZipkin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Quickstart In this section we&amp;rsquo;ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source. If you are familiar with Docker, this is the preferred method t&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zipkin.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;size18&quot;&gt;컨테이너 생성&lt;/p&gt;
&lt;pre id=&quot;code_1685332057941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 9411:9411 --network gugbab-network --name zipkin openzipkin/zipkin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-29 오후 12.49.02.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baGcdO/btshAA5Vwjm/7KDv3710k58ltWQkIMHR3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baGcdO/btshAA5Vwjm/7KDv3710k58ltWQkIMHR3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baGcdO/btshAA5Vwjm/7KDv3710k58ltWQkIMHR3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaGcdO%2FbtshAA5Vwjm%2F7KDv3710k58ltWQkIMHR3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1210&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2023-05-29 오후 12.49.02.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;204&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Prometheus&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://prometheus.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://prometheus.io/download/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685332398950&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download | Prometheus&quot; data-og-description=&quot;An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.&quot; data-og-host=&quot;prometheus.io&quot; data-og-source-url=&quot;https://prometheus.io/download/&quot; data-og-url=&quot;https://prometheus.io/download/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0oYvK/hySNjkQpJO/dz7A4F5dMRTJOjOZ6PrKk1/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192&quot;&gt;&lt;a href=&quot;https://prometheus.io/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://prometheus.io/download/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0oYvK/hySNjkQpJO/dz7A4F5dMRTJOjOZ6PrKk1/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192');&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 | Prometheus&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;prometheus.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://hub.docker.com/r/prom/prometheus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hub.docker.com/r/prom/prometheus&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685332413762&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;Docker&quot; data-og-description=&quot;&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/r/prom/prometheus&quot; data-og-url=&quot;https://hub.docker.com/r/prom/prometheus&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hub.docker.com/r/prom/prometheus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/r/prom/prometheus&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;Docker&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;hub.docker.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 style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt; 볼륨으로 가져갈 설정파일 수정&lt;/p&gt;
&lt;pre id=&quot;code_1685333432328&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
scrape_configs:
  - job_name: &quot;prometheus&quot;

    static_configs:
      - targets: [&quot;prometheus:9090&quot;]	# docker컨테이너에 올라갈 이름
  - job_name: &quot;gugbab-api-gateway&quot;
    scrape_interval: 15s  # 간격 설정
    metrics_path: &quot;/actuator/prometheus&quot; # 어디에 수집된 데이터를 시계열 데이토 바꿀지
    static_configs: # 서버 설정
      - targets: [&quot;api-gateway:7501&quot;]	# docker컨테이너에 올라갈 이름      
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 생성&lt;/p&gt;
&lt;pre id=&quot;code_1685332754743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 9090:9090 --network gugbab-network --name prometheus -v /Users/puk0806/Prometheus/prometheus-2.44.0-rc.2.darwin-amd64/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus&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-filename=&quot;스크린샷 2023-05-29 오후 12.59.53.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bo1Ph/btshA0QF3vX/KXrufkqWyH7ZX3IBG9BR50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bo1Ph/btshA0QF3vX/KXrufkqWyH7ZX3IBG9BR50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bo1Ph/btshA0QF3vX/KXrufkqWyH7ZX3IBG9BR50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBo1Ph%2FbtshA0QF3vX%2FKXrufkqWyH7ZX3IBG9BR50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2023-05-29 오후 12.59.53.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;204&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;h3 data-ke-size=&quot;size23&quot;&gt;Grafana&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://grafana.com/grafana/download?pg=get&amp;amp;plcmt=selfmanaged-box1-cta1&amp;amp;platform=docker&quot;&gt;https://grafana.com/grafana/download?pg=get&amp;amp;plcmt=selfmanaged-box1-cta1&amp;amp;platform=docker&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1685332466467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Grafana | Grafana Labs&quot; data-og-description=&quot;Overview of how to download and install different versions of Grafana on different operating systems.&quot; data-og-host=&quot;grafana.com&quot; data-og-source-url=&quot;https://grafana.com/grafana/download?pg=get&amp;amp;plcmt=selfmanaged-box1-cta1&amp;amp;platform=docker&quot; data-og-url=&quot;https://grafana.com/grafana/download?pg=get&amp;amp;platform=docker&amp;amp;plcmt=selfmanaged-box1-cta1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/o15Gz/hySNeRm8Oj/oTuNteKr6xQZ0C44cmtmk0/img.png?width=900&amp;amp;height=780&amp;amp;face=0_0_900_780&quot;&gt;&lt;a href=&quot;https://grafana.com/grafana/download?pg=get&amp;amp;plcmt=selfmanaged-box1-cta1&amp;amp;platform=docker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://grafana.com/grafana/download?pg=get&amp;amp;plcmt=selfmanaged-box1-cta1&amp;amp;platform=docker&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/o15Gz/hySNeRm8Oj/oTuNteKr6xQZ0C44cmtmk0/img.png?width=900&amp;amp;height=780&amp;amp;face=0_0_900_780');&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 Grafana | Grafana Labs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Overview of how to download and install different versions of Grafana on different operating systems.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;grafana.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 생성&lt;/p&gt;
&lt;pre id=&quot;code_1685333563539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 3000:3000 --network gugbab-network --name grafana grafana/grafana&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-29 오후 1.13.32.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R4O45/btshKQ7a44V/G0E1MGxu2DN2PClDesUSFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R4O45/btshKQ7a44V/G0E1MGxu2DN2PClDesUSFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R4O45/btshKQ7a44V/G0E1MGxu2DN2PClDesUSFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR4O45%2FbtshKQ7a44V%2FG0E1MGxu2DN2PClDesUSFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1224&quot; height=&quot;200&quot; data-filename=&quot;스크린샷 2023-05-29 오후 1.13.32.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>docker</category>
      <category>grafana</category>
      <category>Prometheus</category>
      <category>zipkin</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/70</guid>
      <comments>https://puk0806.tistory.com/70#entry70comment</comments>
      <pubDate>Wed, 31 May 2023 00:13:56 +0900</pubDate>
    </item>
    <item>
      <title>[Docker]Kafka + Zookeeper docker-compose Example</title>
      <link>https://puk0806.tistory.com/69</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;docker-compose&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 컨테이너로부터 이루어진 서비스를 구축할때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Kafka docker-compose.yml 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kafka 브로커를 이용할때 정확한 IP가 필요해서 IP 설정 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685240226169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '2'
services:
  zookeeper:
    image: gugbab/zookeeper
    ports:
      - &quot;2181:2181&quot;
    networks:
      my-network:
        ipv4_address: 172.18.0.100
  kafka:
    image: gugbab/kafka
    ports:
      - &quot;9092:9092&quot;
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 172.18.0.100
      KAFKA_CREATE_TOPICS: &quot;gugbab_test:1:1&quot;
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - zookeeper
    networks:
      my-network:
        ipv4_address: 172.18.0.101

networks:
  my-network:
    name: gugbab-network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;docker-compose 실행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker-compose -f [파일명] up -d&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너 생성 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-28 오전 11.26.22.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9cHO/btshArnl2sN/kSZ0QjVqWg6cTwoB9POkY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9cHO/btshArnl2sN/kSZ0QjVqWg6cTwoB9POkY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9cHO/btshArnl2sN/kSZ0QjVqWg6cTwoB9POkY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK9cHO%2FbtshArnl2sN%2FkSZ0QjVqWg6cTwoB9POkY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;3456&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2023-05-28 오전 11.26.22.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DevOps</category>
      <category>docker</category>
      <category>docker-compose</category>
      <category>Kafka</category>
      <category>zookeeper</category>
      <author>차노도리</author>
      <guid isPermaLink="true">https://puk0806.tistory.com/69</guid>
      <comments>https://puk0806.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 30 May 2023 00:04:43 +0900</pubDate>
    </item>
  </channel>
</rss>