<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Kwangkki</title>
    <link>https://drakon.tistory.com/</link>
    <description>무엇이든 배운 것을 정리합니다</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 01:45:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Kwangkki</managingEditor>
    <image>
      <title>Kwangkki</title>
      <url>https://tistory1.daumcdn.net/tistory/4784310/attach/5934a67c156e4cb5999adaf3f7ee8b46</url>
      <link>https://drakon.tistory.com</link>
    </image>
    <item>
      <title>무이자 할부 vs 일시불 뭐가 더 유리할까</title>
      <link>https://drakon.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;돈에 관련된 책을 보다가&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;무이자 할부는 좋지 않다는 내용을 보고 혹시 무이자 할부는 복리나 이자 개념에서 불리한 결제인가? 궁금해졌다. &lt;/span&gt;물론 이 책은 무이자 할부가 나쁘다는 것이 아니라 이런 소비 습관이 문제라고 말한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;어쨌든 무이자 할부가 이자나 복리 관점에서 일시불 결제와 비교 시 손해되는 부분이 있나 궁금해져서 둘을 비교해 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아래 비교는 단순히 이자 개념에서 비교하며, 일반적으로 무이자 할부가 갖는 단점인 포인트 혜택, 신용등급 하락 등의 가치는 제외했다. 실제 결제 시에는 여러 상황을 고려해서 비교하는 것이 좋다!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;미래가치(FV)와 현재가치(PV)의 개념&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;둘을 비교하기 위해서 돈의 미래가치와 현재가치를 계산하여 비교했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;미래가치(FV, Future Value) : 특정 자산이 미래에 갖게 될 가치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;현재가치(PV, Present Value) : 미래에 갖게 될 돈을 현시점으로 환산한 가치 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;일단, 동일한 전제를 세웠다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-spread=&quot;false&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예적금을 하고 있다는 가정 아래, 돈의 현재가치를 계산한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;100만 원,&lt;/b&gt;&amp;nbsp;&lt;b&gt;1년 정기 예금,&lt;/b&gt;&amp;nbsp;&lt;b&gt;연이율 2%&lt;/b&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 style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 기준으로 미래가치를 구해본다. 공식은 다음과 같다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&lt;b&gt;FV(미래가치)&lt;/b&gt; = &lt;b&gt;PV(현재가치)&lt;/b&gt; x (1 + r)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;* r:&amp;nbsp; 이율&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;FV = 1,000,000 x (1 + 0.02)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;FV = 1,020,000&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;어려울 것 없다. 1년 연이자 2%로 계산해서 1년 뒤에는 102만원이 된다는 말이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;미래가치는&lt;/b&gt; &lt;b&gt;102만원&lt;/b&gt;이라는 뜻이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그럼 반대로 현재가치도 구할 수 있다. 공식은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;PV(현재가치) = FV(미래가치) / (1 + r)^n&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;*n : 기간(년수)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;연이율이기 때문에 n은 년수로 잡는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;PV = 1,020,000 / (1 + 0.02)^1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;PV = 1,000,000&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;현재가치는 100만원이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;동일한 이율 조건에서 이런식으로 현재가치를 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이처럼 미래가치와 현재가치의 상관관계는 간단한 수식으로 풀이된다.&lt;/span&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;&lt;span style=&quot;color: #409d00; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;일시불 결제 vs 무이자 할부 비교&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그렇다면, 같은 &lt;b&gt;100만 원의 물품&lt;/b&gt;을 구매할 때, 일시불 결제와 무이자 할부의 현재가치를 계산해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;일시불 결제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;일시불 결제는 현재 시점에서 &lt;b&gt;모든 금액을 지불&lt;/b&gt;한다. 따라서 현재가치는 단순히 &lt;b&gt;100만 원&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;PV(현재가치) = 1,000,000&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;무이자 할부 5개월&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;무이자 할부 5개월은 매달 &lt;b&gt;20만 원&lt;/b&gt;씩 납부하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;무이자 할부의 현재가치를 계산하려면, 각 납부금액을 월 단위 이율로 할인해서 합산한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;연이율: 2%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;월이율 : 0.02 &amp;divide; 12 = 0.0016 (0.16%)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;할인계수 : 1 / (1 + 0.0016)^n&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 style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;각 월의 현재가치는 다음과 같이 계산한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;월납부금액 할인계수를 적용하여 현재가치&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 99.4189%; height: 210px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;월&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;납부금액(원)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;할인계수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;현재가치(원)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;200,000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1 / (1.0016)^1 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;199,680 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;200,000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1 / (1.0016)^2 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;199,360 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;200,000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1 / (1.0016)^3 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;199,040 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;200,000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1 / (1.0016)^4 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;198,720 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.88372%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7984%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;200,000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.7168%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1 / (1.0016)^5 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9746%; text-align: right;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;198,400&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각 월의 현재가치를 모두 더한 총 현재가치는 아래와 같다.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;PV(&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;현재가치&lt;/span&gt;&lt;/b&gt;)&amp;nbsp; = 995,200&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;일시불 결제&lt;/b&gt; 현재가치 :&amp;nbsp;&lt;b&gt;1,000,000원&lt;br /&gt;&lt;/b&gt;&lt;b&gt;무이자 할부&lt;/b&gt; 현재가치: &lt;b&gt;995,200원&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;현재 시점에서 비교하면 무이자할부 결제가 유리&lt;/b&gt;하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;왜냐하면 시간가치가 더해지기 때문이다. 무이자 할부는 당장 돈을 다 쓰지 않고 천천히 나눠서 갚기 때문에, 그동안 남아 있는 돈으로 이자 수익을 얻을 수 있기 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지금까지 얄팍한 예시를 통해 정말 무이자할부가 나쁜지 비교해봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;근데 더 깊이 따지고 들자면, 사실 &lt;b&gt;시간가치는 일시불 결제에도 적용&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;100만원 짜리 물건을 구매하기 위해 과거 1년동안 예금해서 모았다면 &lt;b&gt;결과는 비슷하기 때문이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오히려 무이자할부는 미래가치에 기대기 때문에 예측불가능한 변수에 취약하고, 신용등급 하락에도 영향을 줄 수 있으며, 카드 혜택을 받지 못할 수도 있다는 단점도 존재한다. &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그렇기 때문에, 책에서 말했 듯 현명한 소비 습관은 일시불 결제가 맞다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그냥 궁금해서 계산해봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;gpt말에 따르면 &lt;b&gt;&quot;과거의 시간 가치는 수익을 만들고, 현재의 시간 가치는 기회를 만든다.&quot;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-05-01 at 1.44.32 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFIu2y/btsNHUDV40m/U3mgekZ7S2Vdcm8K49SUi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFIu2y/btsNHUDV40m/U3mgekZ7S2Vdcm8K49SUi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFIu2y/btsNHUDV40m/U3mgekZ7S2Vdcm8K49SUi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFIu2y%2FbtsNHUDV40m%2FU3mgekZ7S2Vdcm8K49SUi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1352&quot; height=&quot;284&quot; data-filename=&quot;Screenshot 2025-05-01 at 1.44.32 PM.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;참고자료 :&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;유튜브 : 모르면 손해! 일시불 vs 무이자 할부 | 무이자 할부가 더 이득인 수학적 이유&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;계산은 gpt가 도와줌&lt;/span&gt;&lt;/p&gt;</description>
      <category>기타 등등 </category>
      <category>결제</category>
      <category>경제</category>
      <category>무이자할부</category>
      <category>미래가치</category>
      <category>일시불</category>
      <category>현재가치</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/160</guid>
      <comments>https://drakon.tistory.com/160#entry160comment</comments>
      <pubDate>Thu, 1 May 2025 13:30:51 +0900</pubDate>
    </item>
    <item>
      <title>proxmox 설치하기 (feat: ventoy usb)</title>
      <link>https://drakon.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버로 쓰던 컴퓨터 CPU에 문제가 있어 부품을 모두 갈고 하는 김에 proxmox os로 서버 컴퓨터를 리뉴얼(?) 해봤습니다.&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; ️ &lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;하드웨어 리뉴얼&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.&amp;nbsp; CPU&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 VM이든 컨테이너든 여러 개를 돌려야하기 때문에 코어 수가 높아야 된다고 해서 6코어를 알아봤습니다. 근데 가격이 생각해둔 예산을 훨씬 웃돌아서 4코어로 다시 찾아봤고, 4코어는 중고 기준으로 5만원 내로 괜찮은게 많더라고요. 하나 더 고려한 것은 CPU에 내장 그래픽이 내장된 제품으로 찾아봤고 최종적으로 AMD의 2200G로 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- AMD 라이젠 3-1세대 2200G (레이븐 릿지)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;당근에서 2만원에 구매&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-27 001.jpeg&quot; data-origin-width=&quot;2158&quot; data-origin-height=&quot;1727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GP69X/btsL0ZaoYcr/hxyWNybjEKuDVFAxizg0p1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GP69X/btsL0ZaoYcr/hxyWNybjEKuDVFAxizg0p1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GP69X/btsL0ZaoYcr/hxyWNybjEKuDVFAxizg0p1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGP69X%2FbtsL0ZaoYcr%2FhxyWNybjEKuDVFAxizg0p1%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;500&quot; height=&quot;400&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-27 001.jpeg&quot; data-origin-width=&quot;2158&quot; data-origin-height=&quot;1727&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;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;2. 메인보드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMD cpu를 샀기때문에 당연히 amd 메인보드를 알아봤습니다. 메인보드는 중고로 사기에 고장 위험도 있고해서 새 제품으로 알아봤습니다. 잘 모르기 때문에 RAM 소켓 정도만 확인했고 가격은 5~6만원 대로 알아봤어요. 다나와에 찾다가 선택한 것은.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- ASUS PRIME A520M-K 대원씨티에스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다나와에서 6만원 대에 구매&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;KakaoTalk_Photo_2025-01-25-12-44-27 002.jpeg&quot; data-origin-width=&quot;2075&quot; data-origin-height=&quot;2171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blthGv/btsL1EQR9Pl/x1Gf5Lsxdyjq62ZIW6qHl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blthGv/btsL1EQR9Pl/x1Gf5Lsxdyjq62ZIW6qHl0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blthGv/btsL1EQR9Pl/x1Gf5Lsxdyjq62ZIW6qHl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblthGv%2FbtsL1EQR9Pl%2Fx1Gf5Lsxdyjq62ZIW6qHl0%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;500&quot; height=&quot;523&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-27 002.jpeg&quot; data-origin-width=&quot;2075&quot; data-origin-height=&quot;2171&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;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;3. RAM&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램은 8기가 DDR4 중 저렴한 것으로 선택했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;&lt;b&gt;마이크론&lt;/b&gt;&lt;/span&gt;&lt;b&gt; Crucial DDR4-3200 CL22 &lt;/b&gt;&lt;span&gt;&lt;b&gt;대원씨티에스&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (8GB)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다나와에서 1만 6000원대 구매&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;Screenshot 2025-01-25 at 1.15.36 PM.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vYGxA/btsL1XQce9e/qR4R01yE4RrbxOzkSyzii1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vYGxA/btsL1XQce9e/qR4R01yE4RrbxOzkSyzii1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vYGxA/btsL1XQce9e/qR4R01yE4RrbxOzkSyzii1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvYGxA%2FbtsL1XQce9e%2FqR4R01yE4RrbxOzkSyzii1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;220&quot; data-filename=&quot;Screenshot 2025-01-25 at 1.15.36 PM.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;468&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;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;4. 파워&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 쓰던 파워가 약해서 500으로 업그레이드 했습니다. 오토팬이 적용된 것을 구매&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 앱코 XPERT 고효율 파워서플라이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠팡에서 3만 5천원 대에 구매&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-25 at 1.15.15 PM.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n97zW/btsL2aBIQp9/aiwxpazvBSFlKX3XQnFLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n97zW/btsL2aBIQp9/aiwxpazvBSFlKX3XQnFLk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n97zW/btsL2aBIQp9/aiwxpazvBSFlKX3XQnFLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn97zW%2FbtsL2aBIQp9%2FaiwxpazvBSFlKX3XQnFLk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;423&quot; data-filename=&quot;Screenshot 2025-01-25 at 1.15.15 PM.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;1026&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;&lt;b&gt;합체&lt;/b&gt;&lt;/h3&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;edited_432.jpg&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;2067&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emj3NN/btsL9vlLF0R/m5lQsV6HA3EE9gjPrSFw1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emj3NN/btsL9vlLF0R/m5lQsV6HA3EE9gjPrSFw1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emj3NN/btsL9vlLF0R/m5lQsV6HA3EE9gjPrSFw1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Femj3NN%2FbtsL9vlLF0R%2Fm5lQsV6HA3EE9gjPrSFw1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;889&quot; data-filename=&quot;edited_432.jpg&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;2067&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전에 쓰던 메인보드 일체형 cpu였던 j3455는 소음이 아예 없는 수준이었는데 이젠 cpu 팬소리 때문인지 작은 소음이 생긴다는 거..ㅠ&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;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;i&gt;&lt;b&gt; 본격적인 PROXMOX 설치&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;proxmox란?&lt;br /&gt;프록스목스는 가상화 관리를 쉽게 도와주는 운영체제다. 오픈소스 기반으로 무료로 사용할 수 있으며, 간단한 클라우드를 구축할 때 사용하기 좋다. 특히 터미널이 아니라 GUI로 VM이나 컨테이너를 손쉽게 관리할 수 있다는 장점이있다.&amp;nbsp;&lt;/blockquote&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. ventoy로 proxmox 부팅 USB 만들기&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ventoy란?&lt;br /&gt;ventoy로 하나의 USB에 여러 개의 ISO파일(운영체제파일)을 넣고 부팅 USB를 만들 수 있다. 이 USB로 부팅 시 넣은 ISO 파일 중 하나를 선택해서 부팅할 수 있다. 예를들어 Window, Linux, macOS 중 선택해서 부팅할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 설명과 같이 ventoy로 usb를 부팅하면 부팅 시 어떤 OS로 부팅할지 선택할 수 있는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 proxmox 하나만 부팅할 예정이지만 향후 확장성을 위해 ventoy로 만들어봤습니다.&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;준비물은 2가지 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ventoy 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ventoy.net/en/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ventoy.net/en/download.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740200190036&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;Ventoy&quot; data-og-description=&quot;Ventoy is an open source tool to create bootable USB drive for ISO files. With ventoy, you don't need to format the disk again and again, you just need to copy the iso file to the USB drive and boot it.&quot; data-og-host=&quot;www.ventoy.net&quot; data-og-source-url=&quot;https://www.ventoy.net/en/download.html&quot; data-og-url=&quot;https://www.ventoy.net/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.ventoy.net/en/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ventoy.net/en/download.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;Ventoy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ventoy is an open source tool to create bootable USB drive for ISO files. With ventoy, you don't need to format the disk again and again, you just need to copy the iso file to the USB drive and boot it.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ventoy.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;2. proxmox virtual-environment iso 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740202255221&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;Downloads&quot; data-og-description=&quot;Proxmox VE 8.3 ISO Installer Version 8.3-1 File Size 1.45 GB Last Updated November 21, 2024 SHA256SUM b5c2d10d6492d2d763e648bc8562d0f77a90c39fac3a664e676e795735198b45&quot; data-og-host=&quot;www.proxmox.com&quot; data-og-source-url=&quot;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&quot; data-og-url=&quot;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFiTCQ/hyYjEwIJZw/mUS0vW7PBqR7ARkMqXi44K/img.png?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698,https://scrap.kakaocdn.net/dn/Hd1oE/hyYjvfvZ0m/KP74ok0lC2TXSUlhlKNyoK/img.png?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698&quot;&gt;&lt;a href=&quot;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.proxmox.com/en/downloads/proxmox-virtual-environment&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFiTCQ/hyYjEwIJZw/mUS0vW7PBqR7ARkMqXi44K/img.png?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698,https://scrap.kakaocdn.net/dn/Hd1oE/hyYjvfvZ0m/KP74ok0lC2TXSUlhlKNyoK/img.png?width=1240&amp;amp;height=698&amp;amp;face=0_0_1240_698');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Downloads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Proxmox VE 8.3 ISO Installer Version 8.3-1 File Size 1.45 GB Last Updated November 21, 2024 SHA256SUM b5c2d10d6492d2d763e648bc8562d0f77a90c39fac3a664e676e795735198b45&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.proxmox.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개가 준비되면 ventoy를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. USB를 포맷하고 꽂으면 Device에서 선택할 수 있는데요. USB를 선택하고 Install을 누릅니다.&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;{2B7CFD4B-0951-4262-B7E2-33ED20904450}.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RxLPc/btsMt5mxfBE/Ali2kV3fneJMUlDKvebea1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RxLPc/btsMt5mxfBE/Ali2kV3fneJMUlDKvebea1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RxLPc/btsMt5mxfBE/Ali2kV3fneJMUlDKvebea1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRxLPc%2FbtsMt5mxfBE%2FAli2kV3fneJMUlDKvebea1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;541&quot; height=&quot;436&quot; data-filename=&quot;{2B7CFD4B-0951-4262-B7E2-33ED20904450}.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다음과 같이 USB 이름이 Ventoy로 바꼈으면 성공&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;{2075A714-EA22-4B94-88B5-E9241F90913D}.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6IEbJ/btsMtFuNC18/5PvSUfojmgKxmUv7fhgK11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6IEbJ/btsMtFuNC18/5PvSUfojmgKxmUv7fhgK11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6IEbJ/btsMtFuNC18/5PvSUfojmgKxmUv7fhgK11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6IEbJ%2FbtsMtFuNC18%2F5PvSUfojmgKxmUv7fhgK11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;284&quot; height=&quot;127&quot; data-filename=&quot;{2075A714-EA22-4B94-88B5-E9241F90913D}.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 여기에 다운받았던 proxmox-vo 파일을 복붙합니다.&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;{D894AF91-0CC8-4060-AB27-0DA6B65F335E}.png&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baOI3j/btsMsaiwrUp/yUjHAbb9k31ERoWWVjT0H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baOI3j/btsMsaiwrUp/yUjHAbb9k31ERoWWVjT0H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baOI3j/btsMsaiwrUp/yUjHAbb9k31ERoWWVjT0H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaOI3j%2FbtsMsaiwrUp%2FyUjHAbb9k31ERoWWVjT0H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;171&quot; height=&quot;122&quot; data-filename=&quot;{D894AF91-0CC8-4060-AB27-0DA6B65F335E}.png&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 서버 컴퓨터에 부팅한 usb를 꽂고 실행합니다.&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;저 같은 경우 바이어스 모드에서 usb default 부팅 옵션을 설정했습니다.&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;ASUS 메인보드 기준 F2를 광클해서 바이어스 모드에 진입했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu 서버가 기본 부팅으로 잡혀있어서 USB인 UEFI:SanDisk로 변경했습니다.&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;KakaoTalk_Photo_2025-01-25-12-44-29 010.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br0P66/btsMr8YXx62/UPNYpW21ZF7ulMxTbNUQR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br0P66/btsMr8YXx62/UPNYpW21ZF7ulMxTbNUQR0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br0P66/btsMr8YXx62/UPNYpW21ZF7ulMxTbNUQR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr0P66%2FbtsMr8YXx62%2FUPNYpW21ZF7ulMxTbNUQR0%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 010.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재부팅하면 ventoy 설정 창이 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 설정했던 proxmox-ve iso를 선택할 수 있는 창이 뜨면 성공입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 011.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdR7QO/btsMsQjg5LM/mKqIvnwUkh33cxnSYDISp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdR7QO/btsMsQjg5LM/mKqIvnwUkh33cxnSYDISp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdR7QO/btsMsQjg5LM/mKqIvnwUkh33cxnSYDISp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdR7QO%2FbtsMsQjg5LM%2FmKqIvnwUkh33cxnSYDISp1%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 011.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PROXMOX 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proxmox 설치 옵션인데 잘 몰라서 쭉쭉 넘겼습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 012.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D94fs/btsMutUDWca/ibwmcXL2mhd0AME9iPsaNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D94fs/btsMutUDWca/ibwmcXL2mhd0AME9iPsaNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D94fs/btsMutUDWca/ibwmcXL2mhd0AME9iPsaNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD94fs%2FbtsMutUDWca%2FibwmcXL2mhd0AME9iPsaNk%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 012.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 013.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8QnUt/btsMr071Xs8/SAnFcXGXKTcfomyyeAMdjK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8QnUt/btsMr071Xs8/SAnFcXGXKTcfomyyeAMdjK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8QnUt/btsMr071Xs8/SAnFcXGXKTcfomyyeAMdjK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8QnUt%2FbtsMr071Xs8%2FSAnFcXGXKTcfomyyeAMdjK%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 013.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 014.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Qcf8/btsMtOSuyhq/Sa7WMRGneevZ0rkoRQT3P1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Qcf8/btsMtOSuyhq/Sa7WMRGneevZ0rkoRQT3P1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Qcf8/btsMtOSuyhq/Sa7WMRGneevZ0rkoRQT3P1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Qcf8%2FbtsMtOSuyhq%2FSa7WMRGneevZ0rkoRQT3P1%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-29 014.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 015.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YoBs5/btsMts3fbOW/Q35znJbzQS9EjwjOsMGKV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YoBs5/btsMts3fbOW/Q35znJbzQS9EjwjOsMGKV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YoBs5/btsMts3fbOW/Q35znJbzQS9EjwjOsMGKV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYoBs5%2FbtsMts3fbOW%2FQ35znJbzQS9EjwjOsMGKV0%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 015.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&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;설치가 다되고 나서 재부팅되면서 아래 화면이 떴습니다. Proxmox VE GNU/Linux 선택했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 016.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b45zX6/btsMsWDF7R6/gpZyCZguGzpc8sKkpKTIfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b45zX6/btsMsWDF7R6/gpZyCZguGzpc8sKkpKTIfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b45zX6/btsMsWDF7R6/gpZyCZguGzpc8sKkpKTIfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb45zX6%2FbtsMsWDF7R6%2FgpZyCZguGzpc8sKkpKTIfK%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 016.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 진입되면 성공입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 017.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EMR3s/btsMtsWuWbk/kGO3UkyVfksBTzowwWPbyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EMR3s/btsMtsWuWbk/kGO3UkyVfksBTzowwWPbyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EMR3s/btsMtsWuWbk/kGO3UkyVfksBTzowwWPbyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEMR3s%2FbtsMtsWuWbk%2FkGO3UkyVfksBTzowwWPbyK%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;4032&quot; height=&quot;2268&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-25-12-44-30 017.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 서버컴퓨터는 여기까지 설정하면 끝입니다. 이 상태로 두면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Proxmox 접속하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 컴퓨터로 돌아가서 proxmox 서버에 접속을 시도해봅니다. 개인적으로 여기서 꽤 헤맸는데요.&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;proxmox 서버에서 봤던 url(https://192.168.100.2:8006/)로 접속하면 무한 로딩을 돌다가 timeout이 났습니다.&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;Screenshot 2025-03-09 at 2.00.15 PM.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tj0RH/btsMFzAOOkp/573Co6JrkRKJskLeLDhalk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tj0RH/btsMFzAOOkp/573Co6JrkRKJskLeLDhalk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tj0RH/btsMFzAOOkp/573Co6JrkRKJskLeLDhalk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTj0RH%2FbtsMFzAOOkp%2F573Co6JrkRKJskLeLDhalk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1396&quot; height=&quot;906&quot; data-filename=&quot;Screenshot 2025-03-09 at 2.00.15 PM.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;서버컴퓨터로 다시 돌아가 firewall 방화벽도 비활성화 해보고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;서버 컴퓨터에 LAN 선을 다시 꽂고 재기동 해봤지만 여전히 ping이 찍히지 않고 실패했었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-02-22 at 2.55.10 PM.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbGuO4/btsMtec8aiP/z3MgPKhQgf0ZNKM9xYYlzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbGuO4/btsMtec8aiP/z3MgPKhQgf0ZNKM9xYYlzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbGuO4/btsMtec8aiP/z3MgPKhQgf0ZNKM9xYYlzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbGuO4%2FbtsMtec8aiP%2Fz3MgPKhQgf0ZNKM9xYYlzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;376&quot; data-filename=&quot;Screenshot 2025-02-22 at 2.55.10 PM.png&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 공유기에서 고정 서버 컴퓨터를 고정 IP를 할당하는 것으로 문제가 해결되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 iptime 공유를 사용하기 때문에 iptime 공유기 설정에서 고정 IP를 할당했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Screenshot 2025-02-04 at 9.53.48 PM.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCHADu/btsMrZOPMY9/iFOyLEZjLKW9gmzp3Oelt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCHADu/btsMrZOPMY9/iFOyLEZjLKW9gmzp3Oelt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCHADu/btsMrZOPMY9/iFOyLEZjLKW9gmzp3Oelt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCHADu%2FbtsMrZOPMY9%2FiFOyLEZjLKW9gmzp3Oelt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1558&quot; height=&quot;811&quot; data-filename=&quot;Screenshot 2025-02-04 at 9.53.48 PM.png&quot; data-origin-width=&quot;1558&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍⚡️/server</category>
      <category>Proxmox</category>
      <category>ventoy</category>
      <category>서버컴퓨터</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/159</guid>
      <comments>https://drakon.tistory.com/159#entry159comment</comments>
      <pubDate>Fri, 24 Jan 2025 13:50:35 +0900</pubDate>
    </item>
    <item>
      <title>vite 빌드 case 에러와 html2pdf.js 버전 오류</title>
      <link>https://drakon.tistory.com/158</link>
      <description>&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. vite 빌드 시 case 에러&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-08 104527.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSiWNH/btsLJUmE9K5/zgJoulkXXKp2f2S9s7jhYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSiWNH/btsLJUmE9K5/zgJoulkXXKp2f2S9s7jhYK/img.png&quot; data-alt=&quot;빌드 중 에러 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSiWNH/btsLJUmE9K5/zgJoulkXXKp2f2S9s7jhYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSiWNH%2FbtsLJUmE9K5%2FzgJoulkXXKp2f2S9s7jhYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1160&quot; height=&quot;853&quot; data-filename=&quot;스크린샷 2025-01-08 104527.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빌드 중 에러 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;머지 후 CICD가 잘 돌다가 갑자기 에러가 발생했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[vite:esbuild-transpile] Transform failed with 1 error:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ERROR: Unexpected &quot;case&quot;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분명 로컬에서 빌드할 때는 에러가 발생하지 않았는데 말이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 CICD가 도는 yml 파일의 명령어를 체크해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//bitbucket-pipelines.yml
...
 script:
    - npm install -g pnpm@9.1.1 &amp;amp;&amp;amp; pnpm install &amp;amp;&amp;amp; pnpm run build-dev
...&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;빌드 될 때마다 pnpm 9.1.1 버전을 설치하고 pnpm install 하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서 pnpm install 했더니 이제 같은 에러가 발생한다.&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;pnpm install 후 에러가 발생하니 버전 충돌 문제가 예상되었다.&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;스크린샷 2025-01-08 111858.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MmMma/btsLJzQC5Z9/sbji6cMN2xDaSWyXv2zc40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MmMma/btsLJzQC5Z9/sbji6cMN2xDaSWyXv2zc40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MmMma/btsLJzQC5Z9/sbji6cMN2xDaSWyXv2zc40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMmMma%2FbtsLJzQC5Z9%2Fsbji6cMN2xDaSWyXv2zc40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;595&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2025-01-08 111858.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;194&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 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. html2pdf.js 다운그레이드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 문제인 것 같아 gpt에 package.json을 첨부해서 물어봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그랬더니 뜬금없이 &lt;b&gt;html2pdf.js를 다운그레이드 해보라는 것.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-08 112130.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x1WlP/btsLKJ5LM0J/xIs8UNAKVm55xoQcPgW4A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x1WlP/btsLKJ5LM0J/xIs8UNAKVm55xoQcPgW4A1/img.png&quot; data-alt=&quot;cursor에 내장된 gpt chat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x1WlP/btsLKJ5LM0J/xIs8UNAKVm55xoQcPgW4A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx1WlP%2FbtsLKJ5LM0J%2FxIs8UNAKVm55xoQcPgW4A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;597&quot; height=&quot;328&quot; data-filename=&quot;스크린샷 2025-01-08 112130.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cursor에 내장된 gpt chat&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도대체 왜 다운그레이를 하라는 거지? html2pdf.js 깃허브를 찾아가봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에 떡하니 경고 문구가 있었다. &lt;b&gt;0.10.x 버전을 사용하지 말고 0.9.3 버전을 사용하라는 경고다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 0.10.2 버전으로 사용하고 있었다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-08 112352.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M7ulE/btsLL42ha4S/Kkq6k8JLs49Liv5PSW1jW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M7ulE/btsLL42ha4S/Kkq6k8JLs49Liv5PSW1jW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M7ulE/btsLL42ha4S/Kkq6k8JLs49Liv5PSW1jW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM7ulE%2FbtsLL42ha4S%2FKkq6k8JLs49Liv5PSW1jW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;857&quot; height=&quot;199&quot; data-filename=&quot;스크린샷 2025-01-08 112352.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.9.3 버전으로 다운그레이드 후 빌드를 다시 돌려 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 조금 다른 에러 메세지가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;jsPDF - PDF Document creaion from JavaScript&lt;/span&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;스크린샷 2025-01-08 112722.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sl5Me/btsLJtCY8UY/XQVjetxnRqsKCeHJTN7dKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sl5Me/btsLJtCY8UY/XQVjetxnRqsKCeHJTN7dKK/img.png&quot; data-alt=&quot;새로운 에러가 추가되었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sl5Me/btsLJtCY8UY/XQVjetxnRqsKCeHJTN7dKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsl5Me%2FbtsLJtCY8UY%2FXQVjetxnRqsKCeHJTN7dKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;654&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2025-01-08 112722.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;244&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. jsPDF 버전 업&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html2pdf.js 라이브러리의 의존성 라이브러리 중에 jsPDF가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html2pdf.js를 0.9.3버전으로 다운그레이드 하면서 jsPDF의 버전(1.4.x 버전)도 확 낮아졌는데 그것이 문제가 되는 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그래서 overrides로 jsPDF의 버전만 올려 봤다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;//package.json
 &quot;devDependencies&quot;: {
		...
  },
  &quot;overrides&quot;: {
    &quot;jspdf&quot;: &quot;2.5.2&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;기존 package-lock.json을 삭제하고 다시 install 해서 jspdf 버전업이 잘 적용되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;//package-lock.json
 &quot;html2pdf.js&quot;: {
      &quot;version&quot;: &quot;0.9.3&quot;,
      &quot;resolved&quot;: &quot;&amp;lt;https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.9.3.tgz&amp;gt;&quot;,
      &quot;integrity&quot;: &quot;sha512-M254g3Z+ZsjtQFDxJlU6E8Zgb8xOpCBQQM1lFPn4Lq+myAdWoYtMFnwlVo/eOI9R1cG75+YmMSDQofkugwOV/Q==&quot;,
      &quot;requires&quot;: {
        &quot;es6-promise&quot;: &quot;^4.2.5&quot;,
        &quot;html2canvas&quot;: &quot;^1.0.0-alpha.12&quot;,
        &quot;jspdf&quot;: &quot;2.5.2&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;p data-ke-size=&quot;size16&quot;&gt;그래도 &lt;b&gt;여전히 빌드 에러가 발생&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 여러 테스트를 하다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jspdf를 html2pdf.js에 의존하지 않고 따로 사용하니 잘 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 html2pdf.js를 삭제하고 &lt;b&gt;jspdf와 html2canvas만 사용해서 pdf 다운로드 기능을 구현&lt;/b&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러고 빌드 했더니 별 문제 없이 빌드가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. rollup 업데이트 이슈&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 빌드 에러를 해결 후&lt;/b&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음날 구글을 뒤져보니 깃허브에 아래 글이 올라왔다.&lt;/p&gt;
&lt;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://github.com/vitejs/vite/issues/19147&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/vitejs/vite/issues/19147&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736570240812&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;Vite-6.0.7 appears to transpile &amp;#96;case&amp;#96; statements incorrectly &amp;middot; Issue #19147 &amp;middot; vitejs/vite&quot; data-og-description=&quot;Describe the bug Taking the base example from StackBlitz, importing js2pdf-2.5.1 and attempting to build fails with an error about unexpected case. Output fails with the following: Error during bui...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/vitejs/vite/issues/19147&quot; data-og-url=&quot;https://github.com/vitejs/vite/issues/19147&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJCLMn/hyX0sXJqYv/s9wgJtUialoHGaBx5Bdum1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bciAy8/hyX0rdsO52/fawGMX7zxok0JRKd8WKDp1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/vitejs/vite/issues/19147&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/vitejs/vite/issues/19147&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJCLMn/hyX0sXJqYv/s9wgJtUialoHGaBx5Bdum1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bciAy8/hyX0rdsO52/fawGMX7zxok0JRKd8WKDp1/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;Vite-6.0.7 appears to transpile `case` statements incorrectly &amp;middot; Issue #19147 &amp;middot; vitejs/vite&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug Taking the base example from StackBlitz, importing js2pdf-2.5.1 and attempting to build fails with an error about unexpected case. Output fails with the following: Error during bui...&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;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;나와 같은 빌드 에러가 발생했고 rollup을 다운그레이드하면 해결된다는 거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rollup은 vite에 내장된 번들러인데 이 rollup이 잘못된 버전을 업데이트 한 모양이다.&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;다음날 바로 rollup 새로운 버전이 업데이트됐고 정말 그 문제였나 싶어 어제와 같은 상황으로 돌아가서 테스트 해보니 에러 없이 빌드가 잘 된다.&lt;br /&gt;&lt;br /&gt;vite의 rollup과 esbuild에 관한 설명은 아래 링크를~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.vite.dev/guide/why.html&quot;&gt;https://ko.vite.dev/guide/why.html&lt;/a&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;&lt;b&gt;배운점 : npm 버전 관리 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 나는 package.json을 바꾸지도 않았는데 왜 pnpm install 과정에서 &lt;b&gt;rollup이 자동으로 업데이트 되었을까&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 package.json의 ^4.9.2 와 같이 버전 앞에 ^ (캐럿) 이 붙어있어서였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐럿이 붙으면 패치 또는 마이너 레벨 업데이트 범위 내에서 업그레이드가 될 수 있다는 뜻이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 아래와 같이 작성한다면,&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;rollup&quot;: &quot;^4.5.2&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;주요 버전을 뜻하는 가장 앞자리인 4가 바뀌지 않는 범위 내에서 최신 버전(4.5.7, 4.6.5)으로 설치한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 버전으로 고정하고 싶다면 ^나 ~를 붙이지 않고 기입해야한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;ldquo;rollup&amp;rdquo;: &amp;ldquo;4.5.2&amp;rdquo;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 글은 아래 정말 자세하게 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&quot;&gt;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736570267794&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;Understanding npm Versioning&quot; data-og-description=&quot;In the world of software development with JavaScript and TypeScript, it is crucial to manage the...&quot; data-og-host=&quot;dev.to&quot; data-og-source-url=&quot;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&quot; data-og-url=&quot;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fNwu2/hyX0wlyoVC/dCmKqz1xSSb1AkJg8wKAj1/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/bGxjyw/hyX0lYCQl6/sIDHOZ1xUE2KTtaHLlEHDk/img.png?width=1000&amp;amp;height=420&amp;amp;face=95_292_137_338,https://scrap.kakaocdn.net/dn/cbJOJF/hyXWskJlws/l0FmPzFEGiMIKbiIJtr9ck/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.to/typescripttv/understanding-npm-versioning-3hn4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fNwu2/hyX0wlyoVC/dCmKqz1xSSb1AkJg8wKAj1/img.png?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500,https://scrap.kakaocdn.net/dn/bGxjyw/hyX0lYCQl6/sIDHOZ1xUE2KTtaHLlEHDk/img.png?width=1000&amp;amp;height=420&amp;amp;face=95_292_137_338,https://scrap.kakaocdn.net/dn/cbJOJF/hyXWskJlws/l0FmPzFEGiMIKbiIJtr9ck/img.png?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&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;Understanding npm Versioning&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In the world of software development with JavaScript and TypeScript, it is crucial to manage the...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.to&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;&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;아무튼 node는 버전 문제로 꼬이는 경우가 종종있는데 버전 관리를 제대로 이해하는 계기가 되었다.&lt;/p&gt;</description>
      <category>프로그래밍⚡️/node</category>
      <category>node</category>
      <category>npm에러</category>
      <category>rollup에러</category>
      <category>vite에러</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/158</guid>
      <comments>https://drakon.tistory.com/158#entry158comment</comments>
      <pubDate>Sat, 11 Jan 2025 13:49:39 +0900</pubDate>
    </item>
    <item>
      <title>2024년을 회고합니다</title>
      <link>https://drakon.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #4d4d4d;&quot;&gt;2024년 내 성장을 정량적이고 가시적으로 정리하고 싶었지만 이내 감성적이고 마는 나의 회고. 다른 분들의 회고를 읽으며 동기부여도 받고 생각도 넓어졌으니 보답하는 마음으로 누군가에게 영감이 되었으면 하는 마음으로 썼습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;2024 블로그 정산&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d4d4d;&quot;&gt;내 블로그는 얼마나 성장했고, 어떤 게시물이 가장 인기가 많았나&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-01 at 12.59.40 PM.png&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/enidnz/btsLC3b0iUj/Hm5Wui5qECkZkMPM2Hrk21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/enidnz/btsLC3b0iUj/Hm5Wui5qECkZkMPM2Hrk21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/enidnz/btsLC3b0iUj/Hm5Wui5qECkZkMPM2Hrk21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fenidnz%2FbtsLC3b0iUj%2FHm5Wui5qECkZkMPM2Hrk21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1796&quot; height=&quot;782&quot; data-filename=&quot;Screenshot 2025-01-01 at 12.59.40 PM.png&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d4d4d;&quot;&gt;2024년 총 조회수는 &lt;span style=&quot;color: #006dd7;&quot;&gt;37,200&lt;/span&gt;&amp;nbsp;한달 평균 &lt;span style=&quot;color: #006dd7;&quot;&gt;3,100&lt;/span&gt;의 조회수를 달성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d4d4d;&quot;&gt;2023년에 비해 3배 높은 조회수를 달성했다. 블로그 글도 와인처럼 숙성이 되나? 농익을 수록 SEO 지수가 높아지는 느낌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-01 at 1.04.21 PM (1).png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A3lmM/btsLAY4t9XC/AQy9iCHZcDrEXvJ2DYuc2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A3lmM/btsLAY4t9XC/AQy9iCHZcDrEXvJ2DYuc2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A3lmM/btsLAY4t9XC/AQy9iCHZcDrEXvJ2DYuc2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA3lmM%2FbtsLAY4t9XC%2FAQy9iCHZcDrEXvJ2DYuc2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1844&quot; height=&quot;998&quot; data-filename=&quot;Screenshot 2025-01-01 at 1.04.21 PM (1).png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d4d4d;&quot;&gt;대부분 구글 검색 유입이다. 효자 게시글은 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;자작나스 만들기&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #4d4d4d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;피그마 관련&lt;/span&gt;&lt;/b&gt; 글 확실히 이론적인 글 보다는 내가 직접해보고 작성한 글이 인기가 많다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d4d4d;&quot;&gt;독서 후기를 제외한 프로그래밍 관련 글은 10개. 쓰다 중단했거나 발행하지 못한 글은 5개 정도가 있다. 내 이해가 부족해서 쓰고도 무슨 말인지 모르겠는 글은 발행하지 못했다. 블로그는 내가 세운 꾸준함의 지표 같은거라 통계를 보며 뿌듯함을 느낄수도 아쉬움을 느낄수도 있다. 올해는 그 무엇도 느끼지 못했으니 평균의 꾸준함을 가진 셈친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;WORK&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;MES 프로젝트 (spring)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;2023 &lt;span style=&quot;color: #006dd7;&quot;&gt;React로 만든 웹앱(PWA) 프로젝트&lt;/span&gt;를 마무리하고, 2024년 1월부터는 자바 조금, SQL 조금, 제이쿼리 조금 배워 &lt;span style=&quot;color: #006dd7;&quot;&gt;스프링 기반 프로젝트&lt;/span&gt;에 투입됐다. 6개월 가량 프로젝트를 진행했고 깊은 이해는 못했지만 평소 궁금했던 웹의 작동 원리를 조금 이해하게 되었다. 프론트엔드만 공부해오던 나에게는 소중한 시간이었다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 것들&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;데이터는 어디에 존재하는가.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터는 물리적으로 어디에 존재하는지 궁금했었는데 회사 서버 컴퓨터가 있고 SSH로 접속해 이것저것 둘러볼 기회가 많았다. PROXMOX로 서버를 가상화하고 어떤 서버에는 DB 서버를, 어떤 서버에는 node 혹은 tomcat 서버를 돌리는지, 무더운 여름 서버가 꺼지는 일, 디도스 공격으로 서버가 다운되는 일을 어깨너머 구경하며 서당개 풍월 읊듯 배워나갔다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;SCM 프로젝트 (&lt;b&gt;Vue3&lt;/b&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하반기에는 새로 수주받은 프로젝트로 회사를 떠나 강남으로 출퇴근했다. 기획, 퍼블, 백엔드, 프론트엔드가 나누어진 전형적인 si 프로젝트에 프론트엔드 개발자로 합류했다.&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;프로젝트 레포지토리가 만들어지는 순간부터 끝까지 참여했기 때문에 많이 배울 수있었다. 20년차 프리랜서 분께 이것저것 많은 이야기도 들었고 가르침도 받았다. &amp;lsquo;단순해요&amp;rsquo;를 습관처럼 내뱉으며 최신 자바스크립트 문법과 기술 트렌드를 놓치지 않고 세련된 코드를 작성하는 모습을 보며 오래 일하는 사람은 어떤 사람인가를 알게되었다.&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;12월에 맞춰 마무리가 되었고 기술적인 부분, &lt;span style=&quot;color: #006dd7;&quot;&gt;si의 업무 프로세스, 수발주 시스템(SCM ), vue3&lt;/span&gt; 등 많은 것을 얻었던 프로젝트였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;사이드프로젝트&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2025-01-01 at 2.23.55 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QaaAo/btsLBtCVru7/k1FhRz3C4htkcvAGCjne31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QaaAo/btsLBtCVru7/k1FhRz3C4htkcvAGCjne31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QaaAo/btsLBtCVru7/k1FhRz3C4htkcvAGCjne31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQaaAo%2FbtsLBtCVru7%2Fk1FhRz3C4htkcvAGCjne31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1574&quot; height=&quot;404&quot; data-filename=&quot;Screenshot 2025-01-01 at 2.23.55 PM.png&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;404&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;사이드프로젝트 빈도를 단순 잔디로만 본다면 보통 주말과 공휴일에 몰려있고, si 프로젝트에 참여한 뒤로 주말 출근이 잦았기에 사이드프로젝트를 진행하지 못했다. 크게는 당근북스 (사내 도서 대여 서비스), 간단한 프로그램 몇개와 스터디했던 커밋이 있다.&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;제대로 기획하고 시작했던 사이드프로젝트가 없었기에 아쉽다. 얼마전부터 기획하고 있는 프로젝트가 있는데 2025년에는 꾸준히 하나만 팔 예정.&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;Frame 9@2x.png&quot; data-origin-width=&quot;3862&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLgGJw/btsLz8zid4k/ikKcO7hmdOm0mhjfzk4li0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLgGJw/btsLz8zid4k/ikKcO7hmdOm0mhjfzk4li0/img.png&quot; data-alt=&quot;2024 사이드프로젝트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLgGJw/btsLz8zid4k/ikKcO7hmdOm0mhjfzk4li0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLgGJw%2FbtsLz8zid4k%2FikKcO7hmdOm0mhjfzk4li0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;3862&quot; height=&quot;888&quot; data-filename=&quot;Frame 9@2x.png&quot; data-origin-width=&quot;3862&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2024 사이드프로젝트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;독서&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 해 동안 평일 퇴근 후, 주말 아침에 독서하는 습관을 들였다. 문제는 습관이 된 후로 책을 많이 읽게 되었지만 그 외 시간에는 잘 읽히지 않는다는 거. 2023년까지만 해도 일년에 0~1 권을 읽던 사람이었고 독서에 흥미를 붙이기 위해 여러 노력을 기울인 결과 2024년은 대략 20권의 책을 독파했다.&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;Frame 7.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3MSp6/btsLC1yqWnE/TkVAgvRetSoHqjGEQ7mbRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3MSp6/btsLC1yqWnE/TkVAgvRetSoHqjGEQ7mbRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3MSp6/btsLC1yqWnE/TkVAgvRetSoHqjGEQ7mbRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3MSp6%2FbtsLC1yqWnE%2FTkVAgvRetSoHqjGEQ7mbRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1920&quot; height=&quot;553&quot; data-filename=&quot;Frame 7.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;독서로 배운 점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스스로의 가치관이 많이 유순해졌으며 세상을 보는 눈이 넓어졌다. 기대했던 어휘력은 크게 늘지 않았다. &amp;lsquo;가치관이 유순해졌다&amp;rsquo;는 고집스럽고 편견에 휩싸여있던 마음 혹은 생각을 내려놓았다는 뜻. 이것은 이래야해 저것은 저래야해 같은 거 말이다. 서른 쯤 되면 각 개성이 가진 성질이 뚜렷 &amp;amp; 또렷해지기에 주변 반응에 쉽사리 흔들리지 않고 개성을 지키게 되었는데, 이쯤 나는 더 유순 &amp;amp; 유려해졌기에 더 많은 것을 받아들이고 융화할 수 있게 되었다. 독서 덕분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;취미&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유일한 취미라면 카페 찾아다니기. 맛도 뭣도 잘 모르지만 아는 척 돌아다니고 있다. 비싼 게이샤 원두를 주문했을 때 혹시 커피 일 하시냐고 사장님이 물어보기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame 8.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcfXPf/btsLCtBYicB/Gx0rcBXyRk2OKokUFVTXkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcfXPf/btsLCtBYicB/Gx0rcBXyRk2OKokUFVTXkK/img.png&quot; data-alt=&quot;사진이 별로 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcfXPf/btsLCtBYicB/Gx0rcBXyRk2OKokUFVTXkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcfXPf%2FbtsLCtBYicB%2FGx0rcBXyRk2OKokUFVTXkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;275&quot; data-filename=&quot;Frame 8.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진이 별로 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막은 좋아하는 웹툰의 명대사로 마무리 한다. 살벌한 대사지만&amp;hellip;&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;KakaoTalk_Photo_2025-01-01-15-14-01.jpeg&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX5Rnk/btsLC0GjPhy/6Zs8o2KIdD1W80iGZCoV00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX5Rnk/btsLC0GjPhy/6Zs8o2KIdD1W80iGZCoV00/img.jpg&quot; data-alt=&quot;광마회귀&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX5Rnk/btsLC0GjPhy/6Zs8o2KIdD1W80iGZCoV00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX5Rnk%2FbtsLC0GjPhy%2F6Zs8o2KIdD1W80iGZCoV00%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;500&quot; height=&quot;818&quot; data-filename=&quot;KakaoTalk_Photo_2025-01-01-15-14-01.jpeg&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;광마회귀&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>회고 </category>
      <category>2024회고</category>
      <category>개발자회고</category>
      <category>그냥회고</category>
      <category>독서</category>
      <category>회고</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/157</guid>
      <comments>https://drakon.tistory.com/157#entry157comment</comments>
      <pubDate>Wed, 1 Jan 2025 15:33:32 +0900</pubDate>
    </item>
    <item>
      <title>커서(Cursor) IDE 사용기</title>
      <link>https://drakon.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gpt를 사용하다가, 코파일럿을 사용하다가 최종적으로 Cursor(커서)만 사용하고 있는 요즘. 커서의 마술 같은 성능에 놀라기도 하고 무섭기도 하고; 어쨌든 많은 도움을 받고 있는데요. 커서에게 어떤 도움을 받고 있는지 블로그로 남겨봅니다.&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;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Cursor&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 소개하자면 커서는 AI를 탑재한 IDE이며, vscode 기반이기 때문에 vscode 사용자라면 누구나 손쉽게 적응할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.cursor.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732541352851&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;Cursor&quot; data-og-description=&quot;Built to make you extraordinarily productive, Cursor is the best way to code with AI.&quot; data-og-host=&quot;www.cursor.com&quot; data-og-source-url=&quot;https://www.cursor.com/&quot; data-og-url=&quot;https://www.cursor.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cE8PIN/hyXDiIoIv7/gNoGtZSCnNpjPe3TSsXv2k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bodsdI/hyXDbJjsAA/ETSzhAAhC1JsRNjmdwGs60/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cursor.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cE8PIN/hyXDiIoIv7/gNoGtZSCnNpjPe3TSsXv2k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bodsdI/hyXDbJjsAA/ETSzhAAhC1JsRNjmdwGs60/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cursor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Built to make you extraordinarily productive, Cursor is the best way to code with AI.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cursor.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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 사용법이랄게 크게 없습니다. 대부분의 기능은 vscode와 동일하다고 보시면 됩니다. 딱 세 가지만 외우면 되는데요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl(command) + L : 인공지능 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Chat&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl(command) + K : 코드 수정 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tab : 자동 추천 완성&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Ctrl + L&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + L 은 GPT에 질문하는 것과 같습니다. 장점은 드래그한 코드를 그대로 질문할 수 있다는 거.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다른 관련 스크립트  파일을 추가할 수 있다는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.41.41 PM.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QtIcT/btsKUhJEjt7/8i1dhySTZOO1FKl58GjkBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QtIcT/btsKUhJEjt7/8i1dhySTZOO1FKl58GjkBK/img.png&quot; data-alt=&quot;드래그한 코드가 Chat에 그대로 옮겨집니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QtIcT/btsKUhJEjt7/8i1dhySTZOO1FKl58GjkBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQtIcT%2FbtsKUhJEjt7%2F8i1dhySTZOO1FKl58GjkBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2172&quot; height=&quot;1192&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.41.41 PM.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;드래그한 코드가 Chat에 그대로 옮겨집니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.41.53 PM.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DHpPY/btsKVCTgNrO/ZXGkf1SuEUaCnV7Zy7RBOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DHpPY/btsKVCTgNrO/ZXGkf1SuEUaCnV7Zy7RBOK/img.png&quot; data-alt=&quot;다른 파일을 추가 참조할 수 있습니다. 이게 정말 편리해요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DHpPY/btsKVCTgNrO/ZXGkf1SuEUaCnV7Zy7RBOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDHpPY%2FbtsKVCTgNrO%2FZXGkf1SuEUaCnV7Zy7RBOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;936&quot; height=&quot;374&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.41.53 PM.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다른 파일을 추가 참조할 수 있습니다. 이게 정말 편리해요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 엔진은 선택해서 사용할 수 있습니다. claude와 gpt가 제일 낫더라고요.&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;Screenshot 2024-11-24 at 1.43.28 PM.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgHS9p/btsKTAWUsaL/mfB0jXo9HaEUIBfabmck60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgHS9p/btsKTAWUsaL/mfB0jXo9HaEUIBfabmck60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgHS9p/btsKTAWUsaL/mfB0jXo9HaEUIBfabmck60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgHS9p%2FbtsKTAWUsaL%2FmfB0jXo9HaEUIBfabmck60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;496&quot; height=&quot;672&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.43.28 PM.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Ctrl + K&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문하거나 명령한 대로 코드를 직접 바꿔줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이런식으로 사용하기도 합니다. 텍스트를 복사해와서 객체로 바꾸는 등.. 타이핑이 귀찮은 작업을 맡기고 있습니다.. (더 잘 활용하지 못해 미안해..)&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;Screen Recording 2024-11-24 at 1.06.47 PM.gif&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UL3p2/btsKUiaEwe4/8kMQ1b7V5ySLwS68xL7TG0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UL3p2/btsKUiaEwe4/8kMQ1b7V5ySLwS68xL7TG0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UL3p2/btsKUiaEwe4/8kMQ1b7V5ySLwS68xL7TG0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/UL3p2/btsKUiaEwe4/8kMQ1b7V5ySLwS68xL7TG0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1574&quot; height=&quot;730&quot; data-filename=&quot;Screen Recording 2024-11-24 at 1.06.47 PM.gif&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;730&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;TAB&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 위 두개는 그렇게 많이 활용하지는 않습니다. 제가 가장 많이 활용하는 것은 커서 꽃이자 핵심! TAB 기능인데요. 커서가 코드를 추천하고, tab을 누르면 코드가 완성됩니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 활용하고 있는 예시를 몇개 보여드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반복적 코드 작성에 최고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서는 반복될 것 같은 코드는 거의 정확하게 자동완성 추천합니다. 예를들어 api 호출하는 구조를 만든들 때 아래 기본 틀을 잡습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1732421562375&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import request from '@/axios/index'

const prefixUrl = '/common/community/test'
const URL = {
  LIST: `${prefixUrl}/list`,
  DETAIL: `${prefixUrl}/detail`

}

/**
 * @param {object} data
 * @param {number} data.name - 이름
 * @param {number} data.id - 고유 번호
 * @param {string} data.title - 제목
 * @param {string} data.regDt - 등록일
 * @param {string} data.editDt - 수정일
 * @param {string} data.viewCnt - 조회수
 */


export const getTestList = async (params) =&amp;gt; {
  const option = {
    url: URL.LIST,
    params
  }
  return await request.get(option)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도까지만 틀을 잡아주면 나머지는 커서가 대부분 해결해줍니다.&lt;/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;위에 list 호출하는 함수를 하나 만들었으니 이제 detail 조회 함수를 만든다고 했을 때, 리스트 함수를 기반으로 detail 함수 또한 완성해줍니다.&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;Nov-24-2024 13-14-23.gif&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsPfau/btsKVykmkmd/DhzBkAbyG7IUWm8UKehSk1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsPfau/btsKVykmkmd/DhzBkAbyG7IUWm8UKehSk1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsPfau/btsKVykmkmd/DhzBkAbyG7IUWm8UKehSk1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dsPfau/btsKVykmkmd/DhzBkAbyG7IUWm8UKehSk1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;580&quot; data-filename=&quot;Nov-24-2024 13-14-23.gif&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;580&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZab9/btsKTYiQ5Bz/ehy45Dy67zJBv58R0Dncok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZab9/btsKTYiQ5Bz/ehy45Dy67zJBv58R0Dncok/img.png&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;746&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.05.29 PM.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.6997%; margin-right: 10px;&quot; data-widthpercent=&quot;40.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZab9/btsKTYiQ5Bz/ehy45Dy67zJBv58R0Dncok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZab9%2FbtsKTYiQ5Bz%2Fehy45Dy67zJBv58R0Dncok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1086&quot; height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btisz8/btsKTUnxf2I/UqEGzbSrx7jM9G6BYQISc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btisz8/btsKTUnxf2I/UqEGzbSrx7jM9G6BYQISc1/img.png&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;534&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.05.25 PM.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.1375%;&quot; data-widthpercent=&quot;59.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btisz8/btsKTUnxf2I/UqEGzbSrx7jM9G6BYQISc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtisz8%2FbtsKTUnxf2I%2FUqEGzbSrx7jM9G6BYQISc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1158&quot; height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;회색 처리는 추천이며, tab을 누르면 코드로 완성됩니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 저장하는 api를 만들어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S까지 입력했는데 독심술이라도 있는지 save를 추천합니다.&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;Screenshot 2024-11-24 at 1.16.15 PM.png&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkgyxT/btsKUxZE7Zf/pA003rWAKMU05WS4NLJAr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkgyxT/btsKUxZE7Zf/pA003rWAKMU05WS4NLJAr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkgyxT/btsKUxZE7Zf/pA003rWAKMU05WS4NLJAr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkgyxT%2FbtsKUxZE7Zf%2FpA003rWAKMU05WS4NLJAr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1328&quot; height=&quot;370&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.16.15 PM.png&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tab으로 완성하고, 함수쪽으로 내려가봅니다.&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;Screenshot 2024-11-24 at 1.16.24 PM.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u3UHP/btsKT62fzUZ/lNbEFp3QIJrZI5hw173kR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u3UHP/btsKT62fzUZ/lNbEFp3QIJrZI5hw173kR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u3UHP/btsKT62fzUZ/lNbEFp3QIJrZI5hw173kR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu3UHP%2FbtsKT62fzUZ%2FlNbEFp3QIJrZI5hw173kR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1120&quot; height=&quot;526&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.16.24 PM.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 대기 중입니다. 무서운놈..&lt;/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;Screenshot 2024-11-24 at 1.16.40 PM.png&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxeeh/btsKVClqkFz/hX3aPS3FliijTKHs7JCPh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxeeh/btsKVClqkFz/hX3aPS3FliijTKHs7JCPh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxeeh/btsKVClqkFz/hX3aPS3FliijTKHs7JCPh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzxeeh%2FbtsKVClqkFz%2FhX3aPS3FliijTKHs7JCPh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1102&quot; height=&quot;562&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.16.40 PM.png&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;562&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;심지어 get 요청이 아니라 post 요청인 것까지 캐치했습니다.&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;22222.gif&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sslXq/btsKTnQ2nbs/PgL4LF6NXSX4MZ9aBrDn6k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sslXq/btsKTnQ2nbs/PgL4LF6NXSX4MZ9aBrDn6k/img.gif&quot; data-alt=&quot;gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sslXq/btsKTnQ2nbs/PgL4LF6NXSX4MZ9aBrDn6k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/sslXq/btsKTnQ2nbs/PgL4LF6NXSX4MZ9aBrDn6k/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;580&quot; data-filename=&quot;22222.gif&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gif&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수를 다 짜주는 커서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 함수명만 잘 지어도 아래처럼 코드 추천을 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 예시는 tree 구조로 메뉴를 만든 vue 파일인데요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선택한 요소의 부모 폴더를 찾는 함수를 만들고 싶어 'getParentMenu'라는 함수명까지만 입력했는데 부모 폴더를 찾는 코드를 추천해주더라고요. 정말 똑똑합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.17.25 PM.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSVHCN/btsKT1mlFfx/XkRcH3wjjJ4SIoKyEIjKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSVHCN/btsKT1mlFfx/XkRcH3wjjJ4SIoKyEIjKWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSVHCN/btsKT1mlFfx/XkRcH3wjjJ4SIoKyEIjKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSVHCN%2FbtsKT1mlFfx%2FXkRcH3wjjJ4SIoKyEIjKWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1528&quot; height=&quot;430&quot; data-filename=&quot;Screenshot 2024-11-24 at 1.17.25 PM.png&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;추천&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나만 알고 싶기에는 너무 신세계라 여기저기 추천하고 다녔는데요. 같은 팀 동료분들께 추천했더니 설치하고 세팅하는 게 귀찮을 것 같다는 반응도 많더라고요. 아마 기존 사용하던 vscode 설정을 옮기기가 귀찮다고 생각하신 것 같아요. 근데 사용 중인 vscode의 설정이나 익스텐션을 그대로 동기화하기 때문에 귀찮을 것도 없다는 거! (무슨 커서 영업사원 같네요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여튼 커서 덕에 현재 진행 중인 프로젝트에 도움을 많이 받았고, 일감도 빨리 쳐낼 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 근데 심각한 단점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커서를 신나게 사용하다가 2주 무료 기간이 종료되어 커서 기능을 이용하지 못했는데요. 갑자기 바보가 된 느낌이었습니다. 코드를 어떻게 쳐야하는지 잠시 말문이 막히는 느낌. 함수명 지어놓고 자동완성만을 기다리는 내 모습... 커서를 많이 사용하면 아마 바보가 되고 말겁니다. 뭐든 똑같겠지만 적당히, 적절하게 잘 써야한다는 거~&lt;/p&gt;</description>
      <category>프로그래밍⚡️/기타 등등</category>
      <category>aiide</category>
      <category>cursor</category>
      <category>VSCode</category>
      <category>커서</category>
      <category>후기</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/151</guid>
      <comments>https://drakon.tistory.com/151#entry151comment</comments>
      <pubDate>Wed, 25 Sep 2024 22:28:49 +0900</pubDate>
    </item>
    <item>
      <title>pending 된 api 요청 중도 취소하기</title>
      <link>https://drakon.tistory.com/146</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 웹에서 프로젝트를 만들며 api 요청 시간이 조금 소요되는 api가 있습니다. 문제는 이 api 요청 중에 다른 페이지로 이동하면 요청이 pending 상태에 계속 머물게 된다는 것인데요.&lt;br&gt;&amp;nbsp;&lt;br&gt;아래 사진으로 설명해보겠습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006DD7;&quot;&gt;API 요청 pending&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt;[홈]&lt;/b&gt;에서 요청했던 plcProduction이라는 api 요청이 다른 페이지로 이동해도 여전히 pending입니다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYlAjU/btsIRwObU2y/ewEz0PxWc3jBqSVDkIJAE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYlAjU/btsIRwObU2y/ewEz0PxWc3jBqSVDkIJAE0/img.png&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;1014&quot; style=&quot;width: 49.7043%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYlAjU/btsIRwObU2y/ewEz0PxWc3jBqSVDkIJAE0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYlAjU%2FbtsIRwObU2y%2FewEz0PxWc3jBqSVDkIJAE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1552&quot; height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M3Mm1/btsIQHvXpSu/guROwH0MdhfVeZ63ctZWxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M3Mm1/btsIQHvXpSu/guROwH0MdhfVeZ63ctZWxk/img.png&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;1002&quot; style=&quot;width: 49.1329%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M3Mm1/btsIQHvXpSu/guROwH0MdhfVeZ63ctZWxk/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM3Mm1%2FbtsIQHvXpSu%2FguROwH0MdhfVeZ63ctZWxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1516&quot; height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이것이 왜 문제가 되냐하면, 유저가 페이지를 빠르게 여러번 이동하면 pending 요청이 쌓이게됩니다.&lt;br&gt;만약 빠르게 4번을 왔다 갔다 한다면 4개의 pending이 쌓이게 되겠죠?&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjZ0aC/btsIO1CAWvw/ePOTz5cGx50CKkCFqOV3R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjZ0aC/btsIO1CAWvw/ePOTz5cGx50CKkCFqOV3R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjZ0aC/btsIO1CAWvw/ePOTz5cGx50CKkCFqOV3R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjZ0aC%2FbtsIO1CAWvw%2FePOTz5cGx50CKkCFqOV3R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1524&quot; height=&quot;273&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;이를 해결하기 위해 찾아보니 axios에서는 &lt;b&gt;CancelToken&lt;/b&gt;을 제공한다는 것을 알았습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006DD7;&quot;&gt;axios CancelToken 적용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 api 요청 코드&lt;/b&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// 참고로 리액트입니다!
const fetchData = async () =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const res = await axios.get(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`${import.meta.env.VITE_SERVER_URL}/plcProduction`
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setPlcProduction(res.data);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (error) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(error);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;};&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;cancelToken 적용&lt;/b&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;const fetchData = async (source: CancelTokenSource) =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const res = await axios.get(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`${import.meta.env.VITE_DB_SERVER_URL}/plcProduction`,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ cancelToken: source.token }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setPlcProduction(res.data);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (error) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error(&quot;Error fetching data:&quot;, error);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;};

&amp;nbsp;&amp;nbsp;useEffect(() =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const source = axios.CancelToken.source();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetchData(source);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return () =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source.cancel(&quot;Component unmounted&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;}, []);&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;특별히 어려울 것은 없지만, 중요한 것은 &lt;b&gt;axios.CancelToken.source() 생성을 useEffect 내에서&lt;/b&gt; 해줘야 한다는 것인데요.&lt;br&gt;그래야 컴포넌트가 마운트될 때마다 새로운 토큰을 생성하기 때문입니다. 그렇지 않으면 리렌더링 되어도 cancel 상태가 적용된 토큰을 사용하게 되고, 새로운 api 요청을 하지 않게 됩니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006DD7;&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이제 pending 상태에서 페이지를 이동하게 되면 status가 canceled되는 것을 알 수 있다.  cancel을 적용한 덕분에 db connection pool에 요청이 쌓이지 않게 됩니다.&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeBRhl/btsIPj38Na8/zJ2LKLrkFkGEgGNtEBEx81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeBRhl/btsIPj38Na8/zJ2LKLrkFkGEgGNtEBEx81/img.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1021&quot; style=&quot;width: 51.2085%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeBRhl/btsIPj38Na8/zJ2LKLrkFkGEgGNtEBEx81/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeBRhl%2FbtsIPj38Na8%2FzJ2LKLrkFkGEgGNtEBEx81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1544&quot; height=&quot;1021&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I3JMk/btsIQJ8jLMw/Yg2EraRWJtv5iNHP1kekV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I3JMk/btsIQJ8jLMw/Yg2EraRWJtv5iNHP1kekV0/img.png&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1011&quot; style=&quot;width: 47.6287%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I3JMk/btsIQJ8jLMw/Yg2EraRWJtv5iNHP1kekV0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI3JMk%2FbtsIQJ8jLMw%2FYg2EraRWJtv5iNHP1kekV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1422&quot; height=&quot;1011&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;그 외  더 다양한 방법을 알고 싶으시다면 아래 참고자료 블로그를 추천드립니다!&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://velog.io/@eunbinn/cancel-promises-javascript?utm_source=substack&amp;amp;utm_medium=email&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://velog.io/@eunbinn/cancel-promises-javascript?utm_source=substack&amp;amp;utm_medium=email&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;[번역] 자바스크립트에서 프로미스를 취소하는 방법&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;보통 fetch는 signal, XHR은 abort를 사용해 요청을 취소하는데요, 일반적인 프로미스는 어떻게 취소할 수 있을까요? 이 글에서는 그 방법으로 프로미스의 결과를 폐기 또는 무시하는 방법을 설명하고&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@eunbinn/cancel-promises-javascript?utm_source=substack&amp;amp;utm_medium=email&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CTGCk/hyWGS4yTYC/kJkasx0bihQTvWYepwXTRk/img.jpg?width=1080&amp;amp;height=720&amp;amp;face=0_0_1080_720,https://scrap.kakaocdn.net/dn/bBKqjB/hyWGQ6KaAy/FkveuqpvkfCd4QJcaIr8N0/img.jpg?width=1080&amp;amp;height=720&amp;amp;face=0_0_1080_720,https://scrap.kakaocdn.net/dn/cwTcTS/hyWGSwJrR0/eblj58CvGmHkZV8xoA4oxK/img.jpg?width=1034&amp;amp;height=1586&amp;amp;face=0_0_1034_1586&quot; data-og-url=&quot;https://velog.io/@eunbinn/cancel-promises-javascript&quot;&gt;&lt;a href=&quot;https://velog.io/@eunbinn/cancel-promises-javascript&quot; target=&quot;_blank&quot; data-source-url=&quot;https://velog.io/@eunbinn/cancel-promises-javascript?utm_source=substack&amp;amp;utm_medium=email&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CTGCk/hyWGS4yTYC/kJkasx0bihQTvWYepwXTRk/img.jpg?width=1080&amp;amp;height=720&amp;amp;face=0_0_1080_720,https://scrap.kakaocdn.net/dn/bBKqjB/hyWGQ6KaAy/FkveuqpvkfCd4QJcaIr8N0/img.jpg?width=1080&amp;amp;height=720&amp;amp;face=0_0_1080_720,https://scrap.kakaocdn.net/dn/cwTcTS/hyWGSwJrR0/eblj58CvGmHkZV8xoA4oxK/img.jpg?width=1034&amp;amp;height=1586&amp;amp;face=0_0_1034_1586')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;[번역] 자바스크립트에서 프로미스를 취소하는 방법&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;보통 fetch는 signal, XHR은 abort를 사용해 요청을 취소하는데요, 일반적인 프로미스는 어떻게 취소할 수 있을까요? 이 글에서는 그 방법으로 프로미스의 결과를 폐기 또는 무시하는 방법을 설명하고&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;velog.io&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;br&gt;&lt;a href=&quot;https://axios-http.com/kr/docs/cancellation&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://axios-http.com/kr/docs/cancellation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;요청 취소 |&amp;nbsp;Axios Docs&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;요청 취소 취소 토큰을 이용해 요청을 취소할 수 있습니다. Axios의 취소 토큰 API는 중단된 proposal-cancelable-promises을 기반으로 하고 있습니다. 아래와 같이 CancelToken.source 팩토리를 사용하여 취소 &quot; data-og-host=&quot;axios-http.com&quot; data-og-source-url=&quot;https://axios-http.com/kr/docs/cancellation&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://axios-http.com/kr/docs/cancellation&quot;&gt;&lt;a href=&quot;https://axios-http.com/kr/docs/cancellation&quot; target=&quot;_blank&quot; data-source-url=&quot;https://axios-http.com/kr/docs/cancellation&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;요청 취소 |&amp;nbsp;Axios Docs&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;요청 취소 취소 토큰을 이용해 요청을 취소할 수 있습니다. Axios의 취소 토큰 API는 중단된 proposal-cancelable-promises을 기반으로 하고 있습니다. 아래와 같이 CancelToken.source 팩토리를 사용하여 취소 &lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;axios-http.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍⚡️/React</category>
      <category>api요청취소</category>
      <category>axioscancel</category>
      <category>axios취소</category>
      <category>cancelToken</category>
      <category>react</category>
      <category>리액트</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/146</guid>
      <comments>https://drakon.tistory.com/146#entry146comment</comments>
      <pubDate>Sun, 28 Jul 2024 14:18:31 +0900</pubDate>
    </item>
    <item>
      <title>콘웨이의 인생 게임은 어떤 소리를 만들어낼까?</title>
      <link>https://drakon.tistory.com/142</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;콘웨이 게임이라고 불리기도하는 인생 게임(Life game)을 아시나요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1970년 &amp;lt;사이언티픽 아메리칸&amp;gt;에 처음 소개된 게임인데요. 수학자 '존 호튼 콘웨이'가 고안해낸 게임이기에 '콘웨이의 인생 게임'이라고도 부릅니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;콘웨이의 인생 게임&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 게임의 규칙 간단합니다. 바둑판 같은 수많은 칸이 있고, 칸에 색이 칠해져있다면 살아있는 세포(Cell)이며 색이 없다면 죽은 세포입니다. 게임을 시작하면 처음 임의 칸 몇 개가 검은색으로 칠해져있고 이 1세대 세포가 규칙에 따라 다음 세대 세포로 태어나거나 죽습니다. 이 과정에서 세포는 전혀 예상치 못한 결과로 이어지기도하며 일정한 패턴을 만들기도 합니다. 자세한 규칙은 생략하고 어떤 게임인지 영상을 첨부하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=xP5-iIeKXE8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/A7iMT/hyWln6dwVG/aU6QHufJpkEIKh453sFKq1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Life in life&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xP5-iIeKXE8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;콘웨이 게임에서 찾은 의미&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘웨이 게임은 단순간 게임을 넘어 다양한 의미로 해석되는데요. 자아복제, 삶과 죽음, 인공지능, 불완전성 원리 등과 이어지기도 합니다. 저는 그 중에서도 인류 또는 우주의 시뮬레이션과 유사하다고 느꼈습니다. 처음 게임이 시작될 때 세포가 빠르게 번식하며 화면을 모두 채울 듯이 많아졌다가 갑자기 개체 수가 줄어들다가 소멸하기도 하며 번식을 중단하고 일정 패턴만 반복하기도 합니다. 이 과정을 지켜보고 있자면 짧은 시간에 이 작은 세계의 흥망성쇠가 반복된다는 느낌을 받을 수 있습니다. 그래서 과장해서 빗대어 게임 한 번에 인류의 탄생부터 종말까지의 시뮬레이션이지 않나 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;급 궁금해진, 콘웨이 게임이 만들어 내는 소리&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 이런 망상을 하다가 그렇다면 이 인류의 탄생과 종말이 내는 소리는 어떠할지 너무 궁금해졌습니다. 그래서 다음과 같이 조금 구상해봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Cell에 각각 번호를 부여한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Cell에 색이 칠해진다면(세포가 살아난다면) 해당 Cell의 번호의 헤르츠(hz)를 오디오로 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;개발 시작&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 콘웨이 게임 공수&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 콘웨이 게임을 깃허브에 검색해서 자바스크립트로 구성된 프로젝트를 하나 clone 받았습니다. 참고로 아래 링크인데 여러 언어로 콘웨이 게임을 만든 것을 보고 감탄했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/conwaysgame&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/conwaysgame&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Audio 객체 생성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 window 기능에 오디오 기능을 사용할 수 있는 API가 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718632702016&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const audioContext = new window.AudioContext()&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;이 API에는 파형 타입, 볼륨 설정, 주파수 설정, 소리 재생과 같은 기능을 제공하더라고요. 딱 제가 필요한 기능들로 구성되어있었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1718633738379&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export function playSounds(frequency, duration) {
  const oscillator = audioContext.createOscillator();
  oscillator.type = &quot;sine&quot;; //파형 설정
  oscillator.frequency.setValueAtTime(frequency, audioContext.currentTime); // 주파수 설정

  // 초기 볼륨 설정, 혹시 몰라 0.01 굉장히 작게 설정했음.
  const gainNode = audioContext.createGain();
  gainNode.gain.setValueAtTime(0.01, audioContext.currentTime); 

  oscillator.connect(gainNode);
  gainNode.connect(audioContext.destination);

  // 소리 재생 시작
  oscillator.start();

  // 소리 재생 중지
  setTimeout(() =&amp;gt; {
    oscillator.stop();
  }, duration);
}&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;b&gt;3. 각 Cell 번호 부여&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 Cell 컴포넌트가 반복문으로 구현되었기 때문에 간단하게 id에 props로 넘겨받은 index 값을 매겨주었습니다.&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;Screenshot 2024-06-17 at 11.05.00 PM.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bitgWK/btsH1DhSrTI/FwqUWiZSI1hmvMwmkLCOJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bitgWK/btsH1DhSrTI/FwqUWiZSI1hmvMwmkLCOJ1/img.png&quot; data-alt=&quot;징그럽지만 모든 Cell에 번호가 매겨졌습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bitgWK/btsH1DhSrTI/FwqUWiZSI1hmvMwmkLCOJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbitgWK%2FbtsH1DhSrTI%2FFwqUWiZSI1hmvMwmkLCOJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;524&quot; height=&quot;301&quot; data-filename=&quot;Screenshot 2024-06-17 at 11.05.00 PM.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;징그럽지만 모든 Cell에 번호가 매겨졌습니다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Cell에 색이 칠해질 때 Audio 함수 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cell에 색이 칠해지는 원리는 'background color: black' css 속성을 가진 class 명(아래 사진에서는 'populated')을 동적받는 것입니다. 이 class 명은 부모 컴포넌트로 부터 props로 받습니다. 그래서 간단하게 조건문으로 props를 받을 때 Audio 함수를 실행했습니다.&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;Screenshot 2024-06-17 at 11.16.32 PM.png&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA3TRh/btsH2mtariF/pVpELjUww3OdYE1hQ9ZGmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA3TRh/btsH2mtariF/pVpELjUww3OdYE1hQ9ZGmk/img.png&quot; data-alt=&quot;class에 populated를 받으면 검은색으로 칠해진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA3TRh/btsH2mtariF/pVpELjUww3OdYE1hQ9ZGmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA3TRh%2FbtsH2mtariF%2FpVpELjUww3OdYE1hQ9ZGmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;502&quot; height=&quot;216&quot; data-filename=&quot;Screenshot 2024-06-17 at 11.16.32 PM.png&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;class에 populated를 받으면 검은색으로 칠해진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718633819401&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 검은색이 칠해질 때 함수 발동, 소리가 정말 많이 겹치기 때문에 0.1초 아주 짧게 소리가 나도록 설정했음
if (props.populated) {
  playSounds(props.num, 100);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1차 결과물&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 기괴한 소리를 냅니다..ㅋㅋㅋ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/447514367&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dhzicQ/hyWoKyIpbR/Rq2iCtoRP7y7CVKnEsAhzK/img.jpg?width=226&amp;amp;height=222&amp;amp;face=0_0_226_222,https://scrap.kakaocdn.net/dn/fG7XL/hyWlme9cCl/1wkvZwdr4kKuii5XSeLJAk/img.jpg?width=226&amp;amp;height=222&amp;amp;face=0_0_226_222&quot; data-video-width=&quot;452&quot; data-video-height=&quot;444&quot; data-video-origin-width=&quot;226&quot; data-video-origin-height=&quot;222&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/447514367?service=daum_tistory&quot; width=&quot;452&quot; height=&quot;444&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;공상과학~sound~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 문제점 &amp;amp; 디벨롭&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오디오 객체 생성 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 오디오를 입히고 실행했을 때 엄청난 과부하가 일어나서 CPU가 미친 듯이 뛰었습니다. 알고보니 소리 재생 함수가 실행될 때마다 Audio 객체를 생성했기 때문이었습니다. 당장 새로운 조건문을 추가한 오디오 생성하는 함수를 따로 만들었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1718635198997&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function createAudioContext() {
  if (!window.AudioContext) {
    throw new Error(&quot;not supported in this browser&quot;);
  }
//오디오 콘텍스트가 없을 때만 생성
  if (!audioContext) {
    audioContext = new window.AudioContext();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 다이내믹한 음역대(?)를 위해 주파수 간격 up&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 대역은 2만대까지도 사용할 수 있는데 Cell 개수는 400개였기 0~400hz만 출력하는 부분이 너무 아쉬웠습니다. 그래서 hz에 곱셈을 추가해 더 다이내믹한 주파수 출력을 구현했습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718635437511&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; playSounds(this.props.num * 2, 100);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파형 Change 기능 추가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window.AudioContext 에는 파형 타입을 설정할 수 있는 부분이 있더라고요. 아 이거 재밌겠다 싶어서 파형을 바꾸는 기능을 추가했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1718635580292&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 총 4가지 종류의 파형
this.soundType = [&quot;sine&quot;, &quot;square&quot;, &quot;sawtooth&quot;, &quot;triangle&quot;];

changeSoundType() {
	this.currentIndex = (this.currentIndex + 1) % this.soundType.length;
	this.currentSound = this.soundType[this.currentIndex];
}&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;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최종본&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/a7hQCvmAucI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/a7hQCvmAucI&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=a7hQCvmAucI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/boVdqB/hyWoHBZoo2/vlDxQgDAF08lUQ6RYJiDJk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;What sounds will &quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/a7hQCvmAucI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 이게 인생 시뮬레이션, 세포 분열의 소리구나~ 하고 들으면 신비롭습니다. ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간만에 재밌는 작업이었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 github 주소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/MadHeo/conway-sounds&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/MadHeo/conway-sounds&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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; - 당신이 수학을 모르는 이유.(feat.불완전성의 원리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Inventing Game of Life(John Conway) - Numberphil&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;a href=&quot;https://curryyou.tistory.com/453&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://curryyou.tistory.com/453&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍⚡️/기타 등등</category>
      <category>conwaygame</category>
      <category>gameoflife</category>
      <category>인생게임</category>
      <category>콘웨이게임</category>
      <category>콘웨이인생게임</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/142</guid>
      <comments>https://drakon.tistory.com/142#entry142comment</comments>
      <pubDate>Sun, 16 Jun 2024 20:28:53 +0900</pubDate>
    </item>
    <item>
      <title>npm 라이브러리 등록하기, 오픈소스에 기여해 봤습니다</title>
      <link>https://drakon.tistory.com/140</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;한창 오픈소스 문화에 관심을 가졌을 때 무작정 npm에 라이브러리 하나를 등록했었습니다.  한국 욕설을 * 표시로 바꾸는 라이브러리인데요. 욕설 json 파일을 불러와 반복문으로 필터하는 간단한 기능입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;문제는 json 파일을 import하는 과정이나 라이브러리르 import하는 과정에서 module 설정을 제대로 이해하지 못해 다운로드 해도 사용할 수 없는 상태였습니다. 그렇게 방치된지 8개월이 지나고, 급! 생각나서 리팩토링 해봤습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오픈소스 라이선스&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;제가 만든 라이브러리는 다른 오픈소스를 수정하여 재배포한 것인데요. 오픈소스라고 마구 퍼다 나를 수 있는 것은 아닙니다. 오픈소스에도 제약의 강도에 따른 라이선스가 존재하는데요. 크게 MIT, BSD, GPL 정도가 있습니다. NPM 라이브러리에도 라이선스가 모두 존재합니다.&lt;br /&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;782&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkKSLP/btsHCBReR4j/6bcMyKhbNdtt0Wil9kFvp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkKSLP/btsHCBReR4j/6bcMyKhbNdtt0Wil9kFvp0/img.png&quot; data-alt=&quot;npm 라이브러리 상세페이지에 보면 license 탭이 존재합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkKSLP/btsHCBReR4j/6bcMyKhbNdtt0Wil9kFvp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkKSLP%2FbtsHCBReR4j%2F6bcMyKhbNdtt0Wil9kFvp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;350&quot; height=&quot;312&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;npm 라이브러리 상세페이지에 보면 license 탭이 존재합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BSD&lt;/b&gt;는 그 유명한 BSD 운영체제에서 비롯되었습니다. 유닉스의 횡포에 대항하던 빌 조이를 비롯한 버클리 대학생들이 만든 BSD OS 말이죠. 오픈소스 혁명의 시발점이이나 다름없기 때문에 그 의미가 남다릅니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;GPL은 수정, 배포에 좀 더 까다로운 조건이 붙는데요. 오픈소스의 아버지라고도 불리는 리처드 스톨만이 설립한 자유소프트웨어재단에서 제창한 라이선스입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이런 오픈소스 라이선스의 역사적 배경을 일일이 뜯어보면 정말 재밌는 이야기가 많습니다. 혹시 오픈소스의 역사에 대해 궁금하시다면 제가 예전에 쓴 글을 추천드립니다!&lt;br /&gt;&lt;a href=&quot;https://drakon.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://drakon.tistory.com/77&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;약간 사담처럼 되었는데요. 어쨌든, 제가 만든 라이브러리는 MIT 라이선스를 보유한 '&lt;a href=&quot;https://github.com/web-mech/badwords&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;badwords&lt;/span&gt;&lt;/a&gt;'라는 라이브러리를 베이스로 만들었습니다. MIT 라이선스는 가장 자유로운 라이선스 중 하나로 원작자의 &lt;span style=&quot;color: #000000;&quot;&gt;저작권만 고지한다면&lt;/span&gt; 수정, 병합, 복사, 사용, 배포에 제약이 없습죠. 아 그리고 한국용 올라온 욕필터 라이브러리가 하나 더 있더라고요. 이 분의 코드도 참고 했습니다! '&lt;a href=&quot;https://www.npmjs.com/package/badwords-ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;badwords-ko'&lt;/span&gt;&lt;/a&gt;.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오픈소스 수정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;온전한 제 창작물을 오픈소스로 만들면 가장 좋겠지만 본신 실력도 부족하거니와, 기존 오픈소스를 수정, 재창작, 디벨롭하는 것이야 말로 오픈소스 문화의 묘미이기 때문에 수정 및 재배포를 해보았습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;1. 필터 기능 디벨롭&lt;/b&gt;&lt;br /&gt;기존 라이브러리에는 욕이 포함된 단어 덩어리 모두 필터가 되거나 혹은 모두 필터가 안 되는 현상이 있었습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;export default function TestPage() {
&amp;nbsp;&amp;nbsp;const filter = new Filter();
&amp;nbsp;&amp;nbsp;filter.addWords(&quot;funk&quot;);
&amp;nbsp;&amp;nbsp;console.log(filter.clean(&quot;funkyou&quot;));
&amp;nbsp;&amp;nbsp;console.log(filter.clean(&quot;funk you&quot;));
&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;filter.addWords(&quot;욕&quot;);
&amp;nbsp;&amp;nbsp;console.log(filter.clean(&quot;욕입니다&quot;));
&amp;nbsp;&amp;nbsp;console.log(filter.clean(&quot;욕 입니다&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;콘솔 출력 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxF5XA/btsHBSTO7Zf/58eTDCor5gNLcClNBhG83K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxF5XA/btsHBSTO7Zf/58eTDCor5gNLcClNBhG83K/img.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;104&quot; style=&quot;width: 51.4401%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxF5XA/btsHBSTO7Zf/58eTDCor5gNLcClNBhG83K/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxF5XA%2FbtsHBSTO7Zf%2F58eTDCor5gNLcClNBhG83K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;400&quot; height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGp1p/btsHBl3fPOz/ZAkhNXYoy8SOpEf2sLbntK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGp1p/btsHBl3fPOz/ZAkhNXYoy8SOpEf2sLbntK/img.png&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;114&quot; style=&quot;width: 47.3971%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGp1p/btsHBl3fPOz/ZAkhNXYoy8SOpEf2sLbntK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGp1p%2FbtsHBl3fPOz%2FZAkhNXYoy8SOpEf2sLbntK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;404&quot; height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이 라이브러리는 처음에 isProfane 메서드로 문장에 욕이 포함되어있는지를 확인합니다. 만약 isProfance가 true를 뱉으면 다음 단계인 replaceWord 메서드로 넘어가는데요. 여기서 단어가 포함된 모든 덩어리를 *로 치환합니다. 그래서 아래와 같이 수정했습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;기존&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;replaceWord(string) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.replace(this.regex, '')
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.replace(this.replaceRegex, this.placeHolder);
&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;수정&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;replaceWord(string) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const filterWord = this.list.find((word) =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.match(new RegExp(word, &quot;gi&quot;)); //정규표현식으로 단어 검색하여 리스트와 매치
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (filterWord) { // 필터된 욕이 존재하면 *로 치환
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.replace(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new RegExp(filterWord, &quot;gi&quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.placeHolder.repeat(filterWord.length)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;우선 filterWord에서 find를 욕 리스트와 match해서 해당하는 욕만을 가려냅니다. 다음 조건문에서는 필터된 단어를 *로 치환한 후 return 하게 됩니다. 핵심은 filterWord로 욕만 가려내 치환한다는 간단한 수정입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;2. 욕 리스트 수정&lt;/b&gt;&lt;br /&gt;제가 왜 굳이 한국 욕 필터 라이브러리를 만들기로 마음 먹었냐하면, 제대로 된 한국 욕 리스트를 찾기 힘들었기 때문입니다. 그래서 인터넷에 공개된 욕 리스트들과 제가 생각하는 욕들을 합쳐서 새로운 리스트를 만들었습니다. 필터 기능보다 이 작업이 핵심이라 생각하고 거의 일주일 동안 욕 리스트 만드는 작업만 했더랬죠.. 물론 addwords 메서드로 욕 배열을 추가할 수 있습니다!&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그 외 한국어에 맞춰 필터 메서드를 좀 더 수정한 후 배포했습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;아 그리고 기존 commonJS 방식의 module.export 방식을 ES6의 export default 방식으로 변경했었는데, 이런 경우 ES6의 모듈 방식을 지원하지 않는 프로젝트에서는 사용이 힘들다고 하더라고요. 이 부분은 좀 더 찾아보고 다시 바꿔볼 예정입니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오픈소스 배포&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예전에 라이브러리 저장소를 개인 서버에서 운영하시는 분을 보고 '와 저런 방식으로도 할 수 있구나' 감탄한 적이 있었습니다. 하지만 저는 뉴비이기 때문에 npm의 저장소에 배포를 했습니다 하하&lt;br /&gt;&amp;nbsp;&lt;br /&gt;저의 경우 이미 배포된 라이브러리기 때문에 업데이트만 하면 되었습니다. 그래서 무척 간단했죠. 터미널에서 npm 로그인 후, npm publish만 입력했을 뿐..&lt;br /&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;710&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgNnni/btsHBnti1aM/90VLqSxDGK6HkSj4bk8Kw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgNnni/btsHBnti1aM/90VLqSxDGK6HkSj4bk8Kw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgNnni/btsHBnti1aM/90VLqSxDGK6HkSj4bk8Kw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgNnni%2FbtsHBnti1aM%2F90VLqSxDGK6HkSj4bk8Kw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;162&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;물론, 버전업을 해줘야합니다. 저는 불안정한 상태여서 0.0.X로 배포했었는데요. 이번에 1.0.1 버전으로 정식 배포했습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://www.npmjs.com/package/badword-filter-ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://www.npmjs.com/package/badword-filter-ko&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;badword-filter-ko&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;한국 욕을 필터링 할 수 있습니다. 욕 리스트도 있습니다. 보기만 해도 어지러운 욕들입니다 . Latest version: 1.0.1, last published: 6 days ago. Start using badword-filter-ko in your project by running &amp;#96;npm i badword-filter-k&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/badword-filter-ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vv7xi/hyV9TX3k6c/7lo5R5kzMCeL8KXp4PHr50/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot; data-og-url=&quot;https://www.npmjs.com/package/badword-filter-ko&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/badword-filter-ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/badword-filter-ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vv7xi/hyV9TX3k6c/7lo5R5kzMCeL8KXp4PHr50/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;badword-filter-ko&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한국 욕을 필터링 할 수 있습니다. 욕 리스트도 있습니다. 보기만 해도 어지러운 욕들입니다 . Latest version: 1.0.1, last published: 6 days ago. Start using badword-filter-ko in your project by running `npm i badword-filter-k&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오픈소스 기여&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정말 간단한 프로젝트였지만 평소 동경하던 오픈소스 문화에 동참했다는 사실만으로 상당한 만족감을 느끼고 있습니다. 오픈소스 기여는 뛰어난 개발자들의 전유물이라고만 생각했었는데요. 책에서 본 어느 구절의 따뜻한 응원에 용기를 얻어 정말 보잘 것 없는 기능, 코드가 되었더라도 '해보자' 마음 먹었고, 도전 해봤습니다. 제가 받았던 응원을 공유하며 마무리. 그리고 다음 목표는 컨트리뷰션에 도전해보는 것!&lt;br /&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;1280&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MgLuZ/btsHA0kMNsX/v9XCEfXKm4k4KeJIJKBck1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MgLuZ/btsHA0kMNsX/v9XCEfXKm4k4KeJIJKBck1/img.jpg&quot; data-alt=&quot;&amp;amp;amp;lt;개발자 원칙&amp;amp;amp;gt; 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MgLuZ/btsHA0kMNsX/v9XCEfXKm4k4KeJIJKBck1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMgLuZ%2FbtsHA0kMNsX%2Fv9XCEfXKm4k4KeJIJKBck1%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;700&quot; height=&quot;697&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;amp;lt;개발자 원칙&amp;amp;gt; 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>프로그래밍⚡️/기타 등등</category>
      <category>node</category>
      <category>NPM</category>
      <category>npm배포</category>
      <category>라이브러리</category>
      <category>라이브러리만들기</category>
      <category>오픈소스</category>
      <category>오픈소스기여</category>
      <category>욕필터</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/140</guid>
      <comments>https://drakon.tistory.com/140#entry140comment</comments>
      <pubDate>Sat, 25 May 2024 10:35:00 +0900</pubDate>
    </item>
    <item>
      <title>개발자의 글쓰기 (김철수)</title>
      <link>https://drakon.tistory.com/139</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 글쓰기 강연에서 추천했던 책이었나. 잘 모르겠지만 교보문고에서 발견하고 e-book으로 구매해서 읽어봤다.&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;Screenshot 2024-05-12 at 1.11.36 PM.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/larLB/btsHmxWLQV4/jpTHZQx8S6HAKxx0Uw2Zo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/larLB/btsHmxWLQV4/jpTHZQx8S6HAKxx0Uw2Zo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/larLB/btsHmxWLQV4/jpTHZQx8S6HAKxx0Uw2Zo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlarLB%2FbtsHmxWLQV4%2FjpTHZQx8S6HAKxx0Uw2Zo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;300&quot; height=&quot;397&quot; data-filename=&quot;Screenshot 2024-05-12 at 1.11.36 PM.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 목차를 보면 알 수 있겠지만 일반 글쓰기 책과 다르게 개발자 맞춤 주제가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 네이밍, 주석 쓰기, 릴리스 노트, 에러메시지, 개발가이드, 기술 블록, 심지어 SI 제안서 작성 팁까지 담았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 상사를 고려하는 비즈니스 관점 글쓰기 부분이 인상 깊었는데, 내 상사나 비개발 부서에서는 시스템 에러나 장애를 비즈니스에 주는 영향으로 보기 때문에 그래서 이 에러는 언제 해결되는지, 이 에러로 몇명의 유저가 손해를 보는건지가 더 궁금하다는 것이다. 그렇기 때문에 이 에러의 원인을 구구절절 설명할 필요는 없으며 어떻게 보고하면 좋을지에 대한 내용인데, 전직 비개발 부서 팀원으로써 상당히 공감되는 부분이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 읽다 보면 저자인 김철수님이 개발자로 일하면서 정말 다양한 업무를 경험했다는 것을 알수 있다. 어쩌면, 몇몇 개발자들은 '개발자가 이런 거까지 (해야 or 알아야) 해?'라고 말할 수도 있을 만큼. 뛰어난 개발자임에 더불어 자신이 만드는 제품에 진심이기에 니 일이네, 내 일이네 구분 짓지 않는 그의 태도나 마음가짐이, 글쓰기 책임에도 불구하고 내가 이 책에서 얻은 가장 큰 부분이다. 어쩌면 이 책에서 글쓰기 방법이나 팁은 그리 중요한 부분이 아니었을지도 모르겠다는 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기억에 남는 구절&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #666666;&quot;&gt;'세상이 이상한 것 같지만, '가진 것이 망치뿐이면 모든 것이 못으로 보인다.(if all you have is a hammer, everything looks like a nail).&quot; 라는 말처럼 각자 자기 위치와 입장에서 최선을 다하는 것 뿐이다. 일단 이 사실을 인정하자. 그래야 윗사람에게 장애 보고를 할 때 그들과 같은 비즈니스 관점에서 할 수 있다.'&lt;/span&gt;&lt;/p&gt;</description>
      <category>읽은 책 </category>
      <category>개발자글쓰기</category>
      <category>개발자의글쓰기</category>
      <category>기술블로그</category>
      <category>김철수</category>
      <category>비즈니스관점글쓰기</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/139</guid>
      <comments>https://drakon.tistory.com/139#entry139comment</comments>
      <pubDate>Sun, 12 May 2024 13:12:20 +0900</pubDate>
    </item>
    <item>
      <title>맥북으로 우분투 부팅 USB 만들기 +usb 강제 초기화</title>
      <link>https://drakon.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버 컴퓨터에 우분투를 설치하기 위해 맥북으로 우분투 부팅 USB 만들어 봤습니다. Rufus 같은 간편한 이미지 라이팅 소프트웨어도 있지만, 터미널로 직접 이미지 파일을 가공(?)하고 USB에 넣은 과정을 공유합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;1.&amp;nbsp; USB 포맷&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 USB를 포맷합니다. 우분투는 4G를 넘지 않기 때문에 Format 유형을 &lt;b&gt;MS-DOS(FAT32)&lt;/b&gt;로 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 MAC OS Extended로 포맷 후 우분투 부팅 USB로 만들었더니 우분투 설치까지는 되었으나, 실행이 되지 않아 두번째는 MS-DOS(FAT32)로 해봤습니다. (정확히 이 문제인지는 모르겠지만 MS-DOS(FAT32)로 부팅 후에는 우분투 설치에 성공했었습니다.)&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;Screenshot 2024-05-04 at 11.40.29 AM.png&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QhEtd/btsHb5rIMAk/My3tesnHjBMbE6CPwJBiw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QhEtd/btsHb5rIMAk/My3tesnHjBMbE6CPwJBiw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QhEtd/btsHb5rIMAk/My3tesnHjBMbE6CPwJBiw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQhEtd%2FbtsHb5rIMAk%2FMy3tesnHjBMbE6CPwJBiw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;640&quot; height=&quot;404&quot; data-filename=&quot;Screenshot 2024-05-04 at 11.40.29 AM.png&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2. 우분투 설치 파일 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우분투 다운로드 링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download&quot;&gt;https://ubuntu.com/download&lt;/a&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;저는 server 용도로 사용할 예정이라 server로 다운 받았습니다. 확장자는 iso로 다운됩니다.&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;Screenshot 2024-05-04 at 11.47.38 AM.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPNAAy/btsHbiSWqaI/U5XSBuKaNyLj9RB3515NaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPNAAy/btsHbiSWqaI/U5XSBuKaNyLj9RB3515NaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPNAAy/btsHbiSWqaI/U5XSBuKaNyLj9RB3515NaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPNAAy%2FbtsHbiSWqaI%2FU5XSBuKaNyLj9RB3515NaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;300&quot; height=&quot;291&quot; data-filename=&quot;Screenshot 2024-05-04 at 11.47.38 AM.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3. 터미널에서 파일 설치한 폴더로 이동&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥북 터미널을 키고 ubuntu 파일을 다운로드한 폴더로 이동합니다. 저는 ubuntu-usb라는 폴더에 다운로드 했습니다.&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;Screenshot 2024-05-04 at 11.50.11 AM.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KtyAR/btsHcm7QrjJ/zk04uVyKttmzSqMN6ni6hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KtyAR/btsHcm7QrjJ/zk04uVyKttmzSqMN6ni6hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KtyAR/btsHcm7QrjJ/zk04uVyKttmzSqMN6ni6hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKtyAR%2FbtsHcm7QrjJ%2Fzk04uVyKttmzSqMN6ni6hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;291&quot; data-filename=&quot;Screenshot 2024-05-04 at 11.50.11 AM.png&quot; data-origin-width=&quot;1172&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;4. iso파일 usb 드라이브로 변환하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 경로에서 아래 명령어를 입력합니다. &lt;b&gt;hdiutil&lt;/b&gt;은 디스크 이미지 파일을 생성하고 변환할 수 있는 기능을 제공합니다. 아래는 &lt;b&gt;UDRW(&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;UDIF read/write image&lt;/span&gt;)형태로 변환&lt;/b&gt;하는 명령어인데요. &lt;b&gt;-o ubuntu.iso&lt;/b&gt;는 파일 이름을 ubuntu.iso로 바꾼다는 뜻입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1714791827683&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hdiutil convert -format UDRW -o ubuntu.iso ubuntu-24.04-live-server-amd64.iso&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;명령어를 입력하면 ubuntu.iso.dmg 파일이 생성된 것을 확인할 수 있습니다.&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;Screenshot 2024-05-04 at 12.11.40 PM.png&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5uQsY/btsHbQ9qyRn/ECMAXERwgj655serS8CDsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5uQsY/btsHbQ9qyRn/ECMAXERwgj655serS8CDsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5uQsY/btsHbQ9qyRn/ECMAXERwgj655serS8CDsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5uQsY%2FbtsHbQ9qyRn%2FECMAXERwgj655serS8CDsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;293&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.11.40 PM.png&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;5. 파일 확장자 iso로 변경하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB 드라이브로 변환은 했지만 .dmg 확장자로 바뀌게 되었습니다. 저는 제 서버컴퓨터에 사용할 USB로 만들어야하기 때문에 확장자를 다시 iso로 변경할 필요가 있습니다. 파일명을 바꾸는 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1714792559979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv ubuntu.iso.dmg ubuntu.iso&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;Screenshot 2024-05-04 at 12.16.41 PM.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AMULy/btsHcsAbtRA/q68VmkJhuHkrF7nrGuczek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AMULy/btsHcsAbtRA/q68VmkJhuHkrF7nrGuczek/img.png&quot; data-alt=&quot;최종 파일 생성 완료!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AMULy/btsHcsAbtRA/q68VmkJhuHkrF7nrGuczek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAMULy%2FbtsHcsAbtRA%2Fq68VmkJhuHkrF7nrGuczek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;234&quot; height=&quot;266&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.16.41 PM.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;266&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;6. 맥북에 USB 연결하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맥북에 USB를 연결하기 전, 현재 내 맥북의 disk를 체크하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714792784181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;diskutil list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;저는 현재 /dev/disk0과 /dev/disk3을 사용 중입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.19.33 PM.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxpaO/btsHbTLPGOi/MpPoRn7IFn4H6RODP4y8Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxpaO/btsHbTLPGOi/MpPoRn7IFn4H6RODP4y8Qk/img.png&quot; data-alt=&quot;사용중인 disk 넘버 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxpaO/btsHbTLPGOi/MpPoRn7IFn4H6RODP4y8Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxpaO%2FbtsHbTLPGOi%2FMpPoRn7IFn4H6RODP4y8Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;277&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.19.33 PM.png&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용중인 disk 넘버 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;USB를 연결 후&lt;/b&gt; 다시 diskutil list를 확인합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;저 같은 경우에는 16GB의 /dev/disk4가 새로 생겼습니다. 이것이 USB disk겠죠.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.21.31 PM.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RWPmg/btsHcpwKah8/EJ68VniQgwHdb9DdTvUL11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RWPmg/btsHcpwKah8/EJ68VniQgwHdb9DdTvUL11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RWPmg/btsHcpwKah8/EJ68VniQgwHdb9DdTvUL11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRWPmg%2FbtsHcpwKah8%2FEJ68VniQgwHdb9DdTvUL11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;356&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.21.31 PM.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;7. USB unmount 하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;USB에 iso 파일을 쓰기 전에 unmount를 해줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714794895000&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;diskutil unmountDisk /dev/disk4&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;만약 mount 상태에서 dd 명령어를 입력하면 다른 프로세스가 개입할 수도 있기 때문이라고 합니다. 굳히 해야하나 싶어 unmount하지 않고 쓰기 명령어를 실행했더니 FAIL 되더라고요.&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;Screenshot 2024-05-04 at 12.56.52 PM.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GDwdh/btsHbewfQ2A/n1ATk4wXLMxdjL6o2QHYc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GDwdh/btsHbewfQ2A/n1ATk4wXLMxdjL6o2QHYc0/img.png&quot; data-alt=&quot;unmount 하지 않고 dd 명령어 실행 시 FAIL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GDwdh/btsHbewfQ2A/n1ATk4wXLMxdjL6o2QHYc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGDwdh%2FbtsHbewfQ2A%2Fn1ATk4wXLMxdjL6o2QHYc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1140&quot; height=&quot;172&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.56.52 PM.png&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;unmount 하지 않고 dd 명령어 실행 시 FAIL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;8. USB에 iso 이미지 파일 쓰기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unmount 했다면 USB에 iso 파일을 넣는 작업을 진행하면 됩니다. dd 명령어를 사용해서 iso 이미지 파일을 USB에 씁니다(write).&lt;/p&gt;
&lt;pre id=&quot;code_1714793228661&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo dd if=./ubuntu.iso of=/dev/disk4 bs=1m&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;완료 되기까지 시간이 꽤 걸렸습니다. 거의 10분 정도 걸렸네요. 아래와 같이 완료 메세지가 뜨기 전까지는 차분히 기다리시 길..!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.59.28 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGJ26K/btsHaus1LFY/iGNYfuOvKVumahqQnSPWI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGJ26K/btsHaus1LFY/iGNYfuOvKVumahqQnSPWI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGJ26K/btsHaus1LFY/iGNYfuOvKVumahqQnSPWI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGJ26K%2FbtsHaus1LFY%2FiGNYfuOvKVumahqQnSPWI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;184&quot; data-filename=&quot;Screenshot 2024-05-04 at 12.59.28 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;9. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;diskutil list를 해보면, usb disk의 파티션 구조가 바뀐 것을 보니 제대로 쓰기가 된 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-04 at 1.03.44 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ659p/btsHaVRr7bx/zKYaYoqI1GXylpkm2IykK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ659p/btsHaVRr7bx/zKYaYoqI1GXylpkm2IykK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ659p/btsHaVRr7bx/zKYaYoqI1GXylpkm2IykK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ659p%2FbtsHaVRr7bx%2FzKYaYoqI1GXylpkm2IykK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;500&quot; height=&quot;384&quot; data-filename=&quot;Screenshot 2024-05-04 at 1.03.44 PM.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제대로 쓰기가 된 것 같다면 eject하여 USB를 안전하게 제거 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1714795508425&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;diskutil eject /dev/disk4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이상으로 ubuntu 부팅 USB가 만들어졌습니다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;+ 부팅 USB 포맷하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만약 우분투 USB를 다시 만들어야 한다면 USB를 초기화해야 하는데요. USB가 5.2MB로 인식되고 Erase 옵션이 적용 되지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-05-04 at 1.06.59 PM.png&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcNbJF/btsHcteMHNd/ieDjLeRjWAwntISHpDeTpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcNbJF/btsHcteMHNd/ieDjLeRjWAwntISHpDeTpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcNbJF/btsHcteMHNd/ieDjLeRjWAwntISHpDeTpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcNbJF%2FbtsHcteMHNd%2FieDjLeRjWAwntISHpDeTpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2184&quot; height=&quot;954&quot; data-filename=&quot;Screenshot 2024-05-04 at 1.06.59 PM.png&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;USB 파티션 구조를 인식하지 못하고 있기 때문에 일반적인 erase 옵션이 먹히지 않습니다.&amp;nbsp; 이럴 때는 MBR(Master Boot Record) 옵션을 이용하면 정상적으로 포맷됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1714795666335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;diskutil eraseDisk FAT32 USB MBR /dev/disk4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;--&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://parkaparka.tistory.com/31&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://parkaparka.tistory.com/31&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://www.itmaya.co.kr/wboard/view.php?wb=tech&amp;amp;idx=58&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.itmaya.co.kr/wboard/view.php?wb=tech&amp;amp;idx=58&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍⚡️/server</category>
      <category>ubuntuusb</category>
      <category>맥북usb초기화</category>
      <category>맥북usb포맷</category>
      <category>맥북우분투</category>
      <category>맥북우분투usb</category>
      <category>우분투USB</category>
      <author>Kwangkki</author>
      <guid isPermaLink="true">https://drakon.tistory.com/137</guid>
      <comments>https://drakon.tistory.com/137#entry137comment</comments>
      <pubDate>Sat, 4 May 2024 12:12:47 +0900</pubDate>
    </item>
  </channel>
</rss>