<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>soon's_dev.log</title>
        <link>https://velog.io/</link>
        <description>Just Keep Coding... 🧑🏻‍💻</description>
        <lastBuildDate>Mon, 21 Feb 2022 11:49:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>soon's_dev.log</title>
            <url>https://images.velog.io/images/dev_jaesoon/profile/52fc214c-91c6-435b-a408-0a4517bf28fa/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. soon's_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_jaesoon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[노개북 TIL] Clean Code Assignment 4]]></title>
            <link>https://velog.io/@dev_jaesoon/%EB%85%B8%EA%B0%9C%EB%B6%81-TIL-Clean-Code-Assignment-4</link>
            <guid>https://velog.io/@dev_jaesoon/%EB%85%B8%EA%B0%9C%EB%B6%81-TIL-Clean-Code-Assignment-4</guid>
            <pubDate>Mon, 21 Feb 2022 11:49:34 GMT</pubDate>
            <description><![CDATA[<h1 id="til-today-i-learned">TIL (Today I Learned)</h1>
<h4 id="20220122">2022.01.22</h4>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<p>복습 : 다른 사람들의 TIL을 보며 지금까지 읽었던 부분도 복습하고, 잘 쓴 TIL 읽으며 부족한 부분도 채워나가고</p>
<h3 id="최애-til-을-찾아라">최애 TIL 을 찾아라!</h3>
<ol>
<li><a href="https://nomadcoders.co/community/thread/2253">https://nomadcoders.co/community/thread/2253</a><ul>
<li>학교에서 프로젝트를 하면서, 여러 변수 표기법을 통해 좋은 변수명을 짓기 위해 고민했다.</li>
<li>예제로 작성된 개선 코드를 보면서 좋은 코드를 만들기 위해 고민했던 때가 떠올랐다.</li>
</ul>
</li>
<li><a href="https://velog.io/@inkyu0103/Books-Clean-Code-TIL-2">https://velog.io/@inkyu0103/Books-Clean-Code-TIL-2</a><ul>
<li>책에 작성된 예제를 함께 활용하여, 스스로 이해한 과정을 자세히 담아 두었다.</li>
</ul>
</li>
<li><a href="https://nomadcoders.co/community/thread/2215">https://nomadcoders.co/community/thread/2215</a><ul>
<li>협업에 대한 소감을 자세히 작성하면서 함께 공감하면서 볼 수 있었다.</li>
<li>같은 고민을 했던 것이 떠올랐고, 협업에서의 나의 태도를 되돌아 보게 되었다.</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노개북 TIL] Clean Code Assignment 2]]></title>
            <link>https://velog.io/@dev_jaesoon/%EB%85%B8%EA%B0%9C%EB%B6%81-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-TIL-Clean-Code-Day-2</link>
            <guid>https://velog.io/@dev_jaesoon/%EB%85%B8%EA%B0%9C%EB%B6%81-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-TIL-Clean-Code-Day-2</guid>
            <pubDate>Sat, 19 Feb 2022 11:53:32 GMT</pubDate>
            <description><![CDATA[<h1 id="til-today-i-learned">TIL (Today I Learned)</h1>
<h4 id="20220122">2022.01.22</h4>
<h3 id="오늘-읽은-범위">오늘 읽은 범위</h3>
<p>1장. 깨끗한 코드</p>
<h3 id="책에서-기억하고-싶은-내용을-써보세요">책에서 기억하고 싶은 내용을 써보세요.</h3>
<ol>
<li>나쁜 코드로 치르는 대가<ul>
<li>나쁜 코드가 쌓일수록 팀 생산성은 떨어진다 (생산성 대 시간 그래프)</li>
<li>원대한 재설계의 꿈과 원초적 난제🤔 (기한이 중요? 깨끗한 코드를 유지하는 것이 중요?)</li>
<li>코드 감각을 유지하면서, 나쁜 코드를 좋은 코드로 우아👸🏻하게 바꾸자!</li>
</ul>
</li>
<li>우리는 저자다<ul>
<li>@autor 필드 -&gt; 코드작성의 책임 ✍🏻</li>
<li>새 코드를 짜면서 끊임없이 기존 코드를 읽기 때문에 읽는 비율이 높다!</li>
<li>읽기 쉬운 코드 == 생산성</li>
</ul>
</li>
</ol>
<h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요">오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3>
<ul>
<li>학교 수업 중 교수님께서 내주시는 과제를 수행하거나 팀프로젝트를 하면서도 &quot;아 이 코드가 맞나???&quot; 는 생각이 떠오르면서 나쁜 코드를 만들고 있다는 느낌을 자주 받았다.</li>
<li>완성 후 조금만 더 조금만 더 바꿔보자! 라고 생각하며 항상 고민하지만, 어느새 보면 제출기한이 되어 나쁜 코드를 그대로 제출하고 있었다.</li>
<li>물론 그 코드를 주말에 다시 펼쳐보았을 때 알 수 없는 코드들 뿐이었고, 그 문제를 다시 푸는데는 더 많은 시간이 소요되었다.</li>
<li>이러한 문제를 해결하기 위해서는 다른 사람의 좋은 코드를 보고 코드 감각을 유지하는 것이 중요할 듯 하다!</li>
</ul>
<h3 id="궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요">궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.</h3>
<ul>
<li>르블랑의 법칙? (LeBlanc&#39;s Law states)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2021년 회고 - 0년차 개발자로써의 출발 (1)]]></title>
            <link>https://velog.io/@dev_jaesoon/2021%EB%85%84-%ED%9A%8C%EA%B3%A0-0%EB%85%84%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C%EC%8D%A8%EC%9D%98-%EC%B6%9C%EB%B0%9C-1</link>
            <guid>https://velog.io/@dev_jaesoon/2021%EB%85%84-%ED%9A%8C%EA%B3%A0-0%EB%85%84%EC%B0%A8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C%EC%8D%A8%EC%9D%98-%EC%B6%9C%EB%B0%9C-1</guid>
            <pubDate>Sat, 15 Jan 2022 11:51:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>매번 여러 개발 커뮤니티들을 둘러보면서 꼭 해보고 싶다고 생각한 것이 졸업 전 회고록을 작성하는 것이었다. 하지만, 연말을 연도의 끝자리 숫자가 바뀌는 정도로 무감각했기 때문일까? 아니면 내가 게을렀기 때문일까? 2021년 회고록 작성은 미루고 미뤄졌다.</p>
</blockquote>
<blockquote>
<p>그러던 중 아르바이트 중 손을 다쳐 통원 치료를 하게되면서 무념무상으로 기다리는 시간이 많아졌고, 생각도 많아지면서 회고록을 작성하게 되었다. 벌써 2022년 1월 중 반이 지나가 버렸지만, 2021년 뿐만 아니라 개발자가 되기 위해 달려온 2019년과 2020년의 나 스스로도 되돌아보는 계기가 되었으면 한다.</p>
</blockquote>
<h3 id="🤔-2021년-총평">🤔 2021년 총평</h3>
<ul>
<li>2019년, <em>”이 곳에서는 제가 발전할 수 없을 것 같습니다.!”</em> 라고 자신있게 외치며 6년 간의 군생활을 뛰쳐 나왔을 때부터 일본 IT 기업에 내정을 받기까지 약 2년이라는 시간이 흘렀다.</li>
<li>그런 나에게 2021년은 짧고 굵었던 2년의 노력에 대해 종합 평가를 받고 매우 빠르게 지나간 한 해였다.</li>
</ul>
<h3 id="🔥-2021년의-시작">🔥 2021년의 시작</h3>
<ul>
<li>2학년 2학기를 보냈던 20년 말에는 모든 학교 일정이 졸업 캡스톤 프로젝트에 맞춰 진행되고 있었다. 나는 21년 전반기에 모든 취업 활동을 끝내고, 후반기에는 <strong>나만의 시간을 가지고 싶다는 강한 의지(?)</strong> 가 있었는데, 하지만 이대로 가다가는 언제 취업 준비를 시작할 수 있을 것이며, 과연 목표대로 취업활동을 내년 전반기에 끝낼 수 있을까? 라는 의문이 들었다.</li>
<li>그래서 나는 2학년 여름방학에 잠을 쪼개 서비스를 개발하고 교내에 릴리즈한 경험을 살려, 2학기의 모든 시간을 끌어모아 캡스톤 프로젝트 개발에 투자했고, 그 결과 20년 11월 쯤 내 담당 파트의 90% 가량을 완성할 수 있었다. 그리고, 그 때 부터는 매주 정기적으로 있던 지도 교수님 PM시간을 쪼개어 <strong>본격적인 취업 준비를 시작</strong>하였다. (지도 교수님 죄송합니다😭)</li>
<li>하루 중 집에 있는 시간을 제외하고 학교에서 온전하게 쓸 수 있는 내 시간이 대략 8-11시간 정도 있었다. 그래서 내 집중력이 제일 약한 점심시간 이후 1-2시간 정도는 강의실 여기저기를 돌아다니며, 프로젝트에 어려움을 겪는 팀원을 도와주는데 사용했고, <strong>나머지 남는 6-9시간은 이력서와 엔트리 시트(한국으로 치면 자기소개서), 포트폴리오를 작성</strong>했다.</li>
</ul>
<h3 id="😥-2021년의-고난">😥 2021년의 고난</h3>
<ul>
<li>이력서는 회사마다 들어가는 내용이 대동소이 했기 때문에 크게 어려운 점이 없었지만, 그에 비해 엔트리 시트와 포트폴리오를 작성하는 것은 정말 쉽지 않았다. 매일 밤 늦게까지 자취방에서 고민하고 다듬은 내용을 글로 작성하여 취업 컨설턴트 분과 일본어 교수님께 첨삭을 받았지만, <strong>기업의 면접관을 설득할 수 있는 나만의 이야기</strong>를 만들어 내는 것은 쉽지 않았다.</li>
<li>지금 되돌아서 생각을 해보면, 초반에 의지가 너무 넘쳤던 탓 일까? 3월에 개강을 하고 일본 기업들의 설명회와 면접 일정이 하나씩 잡히면서 오히려 내 자신감은 떨어졌던 것 같다. 그러던 중 3월 중순 쯤에 <strong>입사 1지망 기업인 SoftBank 의 1차 면접 일정</strong>이 잡히게 되었고, COVID-19 로 인해 온라인 면접을 진행한다고 했기 때문에 서류는 운좋게 붙었지만 1차 합격 확률은 당연히 “0%” 겠구나 하고 생각하고 있었다.</li>
<li>그런데 이게 왠일인가? 1차 면접은 질문 3가지 항목에 대하여 영상을 제출하는 AI 면접이었다. 교수님들과 주변 친구들은 AI 가 판별하니 어떻게 운으로라도 합격하기 어렵겠다는 분위기가 팽배했다. 하지만 반대로 나는 AI 면접이 열심히 준비만 잘 하면 분위기를 역전할 수 있는 좋은 기회라고 생각했고, 매일 2시간씩 일본어 대본을 연습해 파파고에게 들려주고, 틀린 부분을 체크하며 수정한 결과 <strong>SoftBank 1차 면접에 합격</strong>할 수 있었다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React .env 사용하기]]></title>
            <link>https://velog.io/@dev_jaesoon/React-.env-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev_jaesoon/React-.env-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 27 Dec 2020 13:16:46 GMT</pubDate>
            <description><![CDATA[<p>React 에서 <code>create-react-app</code> 으로 프로젝트 생성 시, <code>.env</code> 파일에 <code>REACT_APP</code> 을 앞에 붙에서 환경 변수를 만들 수 있다.</p>
<blockquote>
<p>참고자료 : <a href="https://create-react-app.dev/docs/adding-custom-environment-variables/">https://create-react-app.dev/docs/adding-custom-environment-variables/</a></p>
</blockquote>
<h3 id="env-파일-생성">.env 파일 생성</h3>
<ul>
<li>root 파일에 .env 파일을 생성</li>
</ul>
<h3 id="env-선언-방법">.env 선언 방법</h3>
<ul>
<li>다음과 같이 REACT_APP 을 앞에 붙여 변수를 선언하면 된다.</li>
<li>.env 파일은 수정 시, 꼭 다시 <code>npm start</code> 를 해주어야 한다.</li>
</ul>
<pre><code>REACT_APP_GOOGLE_MAP_KEY=...</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[B013:最遅出社時刻]]></title>
            <link>https://velog.io/@dev_jaesoon/B013%E6%9C%80%E9%81%85%E5%87%BA%E7%A4%BE%E6%99%82%E5%88%BB</link>
            <guid>https://velog.io/@dev_jaesoon/B013%E6%9C%80%E9%81%85%E5%87%BA%E7%A4%BE%E6%99%82%E5%88%BB</guid>
            <pubDate>Mon, 21 Dec 2020 15:11:35 GMT</pubDate>
            <description><![CDATA[<h2 id="問題">問題</h2>
<blockquote>
</blockquote>
<p>平日の朝、できるだけ長く寝ていたいと思ったあなたは、「何時に家を出発すれば遅刻せずに出社できるか？」ということを常々考えています。</p>
<blockquote>
</blockquote>
<p>あなたの通勤ルートは次のようになっています。</p>
<blockquote>
</blockquote>
<pre><code>1. 自宅から配座（ぱいざ）駅まで a 分間歩く。
2. 配座駅に着いた後、一番早く来た電車に b 分間電車に乗って儀野（ぎの）駅に到着する。
　(駅に到着してから電車に乗り込むまでの時間は考慮せず、駅に到着した時刻の電車にも乗り込めるものとします)
3. 儀野駅から会社まで c 分間歩く。</code></pre><blockquote>
</blockquote>
<p>あなたの会社では 8:59 までに出社すれば遅刻扱いにはなりません。 何時に自宅を出れば遅刻せずに出社できるでしょうか？
このような時間の中で最も遅い時刻を求めるプログラムを書いてください。</p>
<blockquote>
</blockquote>
<p>例えば、以下の入力例1の場合</p>
<pre><code>入力例1
30 30 10
3
6 0
7 0
8 0</code></pre><blockquote>
</blockquote>
<p>配座駅には 6:00, 7:00, 8:00 に電車が来ます。
7:30 に自宅を出れば 8:00 の電車に乗ることができて、8:40 に出社できます。
よって出力は以下のようになります。</p>
<pre><code>出力例1
07:30</code></pre><h2 id="解決">解決</h2>
<pre><code class="language-JAVA">import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let&#39;s チャレンジ！！

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] tmpTimes = line.split(&quot;\\s&quot;);
        int[] times = new int[tmpTimes.length];

        for(int i = 0; i &lt; times.length; i++) {
            times[i] = Integer.parseInt(tmpTimes[i]);
        }

        int hour = 8;
        int minutes = 59;

        int trainHour = 0;
        int trainMinutes = 0;

        int requiredTime = times[1] + times[2];
        int tmpHour = requiredTime / 60;
        int tmpMinutes = requiredTime % 60;

        hour -= tmpHour;
        minutes -= tmpMinutes;

        if (minutes &lt; 0) {
            hour -= 1;
            minutes += 60;
        }

        // Maginot Time
        // System.out.println(hour + &quot; : &quot; + minutes);

        int count = Integer.parseInt(sc.nextLine());

        // &lt;&lt;-- check train time table --&gt;&gt;
        for (int i = 0; i &lt; count; i++) {
            String tmpTimeTable = sc.nextLine();
            String[] timeTable = tmpTimeTable.split(&quot;\\s&quot;);

            int hourTimeTable = Integer.parseInt(timeTable[0]);
            int minutesTimeTable = Integer.parseInt(timeTable[1]);

            if (hourTimeTable &lt;= hour &amp;&amp; minutesTimeTable &lt;= minutes) {
                trainHour = hourTimeTable;
                trainMinutes = minutesTimeTable;
            }
        }

        trainMinutes -= times[0];

        if (trainMinutes &lt; 0) {
            trainHour -= 1;
            trainMinutes += 60;
        }

        System.out.println(
            ((trainHour &lt; 10) ? &quot;0&quot; + trainHour : trainHour) + &quot;:&quot; +
            ((trainMinutes &lt; 10) ? &quot;0&quot; + trainMinutes : trainMinutes)
        );
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[B055:タクシー料金]]></title>
            <link>https://velog.io/@dev_jaesoon/B055%E3%82%BF%E3%82%AF%E3%82%B7%E3%83%BC%E6%96%99%E9%87%91</link>
            <guid>https://velog.io/@dev_jaesoon/B055%E3%82%BF%E3%82%AF%E3%82%B7%E3%83%BC%E6%96%99%E9%87%91</guid>
            <pubDate>Mon, 21 Dec 2020 14:22:15 GMT</pubDate>
            <description><![CDATA[<h2 id="問題">問題</h2>
<blockquote>
</blockquote>
<p>PAIZAタウンでは、公共交通の手段としてタクシーが発達しています。
様々な料金のタクシーがあるため、初乗りが安くても最終的な運賃が高いタクシーを拾ってしまうかもしれません。</p>
<blockquote>
</blockquote>
<p>タクシーの運賃は初乗り距離と初乗り運賃、加算距離、加算運賃で決まります。
タクシーの乗車距離が初乗り距離未満の場合は、初乗り運賃だけで移動することができます。
初乗り距離と同じ距離だけ乗車した段階で、運賃に加算運賃が追加され、以後加算距離を移動する毎に加算運賃が追加されていきます。</p>
<blockquote>
</blockquote>
<p>あなたは今いる場所から X メートル離れた場所へ、 1 台のタクシーで移動しようとしています。
利用可能なタクシー N 台の料金のパラメータが与えられるので、タクシーで X メートル移動した際の最安値と最高値を計算してください。</p>
<blockquote>
</blockquote>
<p>例えば、 入力例 1 の場合は以下のように 600円 が最安値となり、 800円 が最高値となります。
1 番目のタクシーは初乗り距離以上なので加算距離 1 つ分が追加され 600円 かかります。
2 番目のタクシーは初乗り距離までで到着するので、初乗り運賃のみで 800円 かかります。</p>
<h2 id="解決">解決</h2>
<pre><code class="language-JAVA">import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let&#39;s チャレンジ！！

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] values = line.split(&quot;\\s&quot;);

        int numOfTaxi = Integer.parseInt(values[0]);
        int distance = Integer.parseInt(values[1]);
        int minCharge = 0;
        int maxCharge = 0;

        for (int i = 0; i &lt; numOfTaxi; i++) {
            String[] taxiInfo = sc.nextLine().split(&quot;\\s&quot;);

            // &lt;&lt;-- default --&gt;&gt;
            int defaultDistance = Integer.parseInt(taxiInfo[0]);
            int defaultCharge = Integer.parseInt(taxiInfo[1]);

            // &lt;&lt;-- addition --&gt;&gt;
            int additionDistance = Integer.parseInt(taxiInfo[2]);
            int additionCharge = Integer.parseInt(taxiInfo[3]);

            // &lt;&lt;-- result --&gt;&gt;
            int additionResult = 0;
            int chargeResult = 0;

            // check distance
            if (distance &gt;= defaultDistance) {
                int remainDistance = distance - defaultDistance;
                int additionCount = (remainDistance + additionDistance) / additionDistance;
                additionResult = additionCount * additionCharge;
            }

            chargeResult = defaultCharge + additionResult;

            // &lt;&lt;-- minCharge --&gt;&gt;
            if (minCharge == 0) {
                minCharge = chargeResult;
            } else if (minCharge &gt; chargeResult) {
                minCharge = chargeResult;
            }

            // &lt;&lt;-- maxCharge --&gt;&gt;
            if (maxCharge == 0) {
                maxCharge = chargeResult;
            } else if (maxCharge &lt; chargeResult) {
                maxCharge = chargeResult;
            }
        }
        System.out.println(minCharge + &quot; &quot; + maxCharge);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 설치하기]]></title>
            <link>https://velog.io/@dev_jaesoon/Docker-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev_jaesoon/Docker-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 19 Dec 2020 14:43:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 자료는 아래 블로그를 참고하여 만들어졌습니다.</p>
</blockquote>
<ul>
<li><a href="https://medium.com/@shaul1991/%EC%B4%88%EB%B3%B4%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%9D%BC%EC%A7%80-docker-%EC%84%A4%EC%B9%98%ED%95%B4%EB%B3%B4%EC%9E%90-d3d6a11ea098">[초보개발자 일지] Docker 설치해보자</a></li>
<li><a href="https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html">초보를 위한 도커 안내서 - 도커란 무엇인가?</a></li>
</ul>
<h2 id="why-docker">Why Docker??</h2>
<p>&quot;Docker&quot; 는 linux container를 쉽게 생성하고 관리할 수 있도록 도와주는 <strong>컨테이너 가상화 프로그램</strong>입니다. Docker 를 사용하면 <em>애플리케이션 개발 및 구축, 테스트, 배포를 신속하게</em> 할 수 있습니다. </p>
<p>저 같은 경우에는 아래와 같은 경우에 장점을 느낄 수 있었습니다.</p>
<ol>
<li><strong>Back-End 서버 개발 및 구축</strong> 시, 동시에 여러 버전을 사용하여 테스트</li>
<li><strong>Docker Compose</strong>로 다중 컨테이너를 손쉽게 관리</li>
<li><strong>이미지를 활용</strong>하여 버전관리, 롤백, 배포를 빠르게 할 수 있음</li>
<li><strong>Revese Proxy</strong> 로 WEB / API Server 를 단일서버에서 운용</li>
</ol>
<p>실제 현업에서는 CI/CD 파이프라인 구성을 통해, 지속적인 배포 환경을 구축하기도 합니다.</p>
<blockquote>
<p>참고자료 : 우아한 형제들 기술 블로그 
<a href="https://woowabros.github.io/experience/2018/06/26/bros-cicd.html">https://woowabros.github.io/experience/2018/06/26/bros-cicd.html</a></p>
</blockquote>
<h2 id="docker-설치하기">Docker 설치하기</h2>
<h4 id="docker-저장소-설정">Docker 저장소 설정</h4>
<pre><code class="language-bash">$ sudo apt-get update

# 패키지 다운로드
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# Docker GPG 키 추가
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Docker GPG 키 등록 확인
$ sudo apt-key fingerprint 0EBFCD88

# Docker 저장소 등록
$ sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;</code></pre>
<h4 id="docker-engine-설치">Docker Engine 설치</h4>
<pre><code class="language-bash">$ sudo apt-get update

# Docker 최신버전 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io 

# Docker 버전 확인
$ docker -v</code></pre>
<h4 id="docker-compose-설치">Docker Compose 설치</h4>
<pre><code class="language-bash">$ sudo curl -L &quot;https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

$ docker-compose --version</code></pre>
]]></description>
        </item>
    </channel>
</rss>