<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>deong_gu.log</title>
        <link>https://velog.io/</link>
        <description>큰 것을 작게, 작은 것을 구체적이게, 개발자답게</description>
        <lastBuildDate>Thu, 13 Mar 2025 23:55:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>deong_gu.log</title>
            <url>https://velog.velcdn.com/images/deong_gu/profile/67bbfdca-0846-4703-ac3f-46682658ea3a/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. deong_gu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/deong_gu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[정의] 메모리, 변수, 식별자]]></title>
            <link>https://velog.io/@deong_gu/%EC%A0%95%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9D%EB%B3%84%EC%9E%90-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@deong_gu/%EC%A0%95%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9D%EB%B3%84%EC%9E%90-%EB%B3%80%EC%88%98</guid>
            <pubDate>Thu, 13 Mar 2025 23:55:08 GMT</pubDate>
            <description><![CDATA[<h2 id="intro">Intro</h2>
<p>&nbsp; 자바스크립트를 공부하면서 메모리에 대한 생각을 깊게 해본 적이 없었다. 개발 공부를 시작하면서 처음 들었던 강의가 우리의 언어를 컴퓨터의 언어로 바꾸려면 어떻게 해야하는가에 대한 내용이었는데, 이때 <code>2진수와 비트, 메모리 주소, 포인터</code>등의 개념을 학습했다. 대략적으로 이해는 했었지만 최종적으로 나에게 메모리는 네모박스들의 집합에 불과했다.
 &nbsp; 그리고 cs관련 서적을 읽으면서 빛의 속도는 일정하기 때문에 하드웨어적 한계가 존재하기때문에 메모리의 낭비를 최소화하고, 효율적으로 사용해야함을 알게되었다.
 &nbsp; 최근에는 자바 언어를 공부하면서 메모리를 좀 더 신경쓰게되었고, 자연스럽게 자바스크립트에서도 메모리 관련 이슈나 원리에 대해서 알아보게되었다. 그래서 제일 직관적인 데이터 타입을 정리하기 전에 메모리와 관련된 간단한 내용을 정리해보려한다.</p>
<hr>
<h2 id="개념">개념</h2>
<h3 id="메모리">메모리</h3>
<p><em><strong>데이터를 저장할 수 있는 메모리 셀의 집합체</strong></em></p>
<p> 각 셀은 고유의 메모리 주소를 갖는다.</p>
<p> &nbsp;  정의를 쉽게 이해하기 위해서 네모 상자들의 집합이라고 표현했는데, 제 표현이 이해되실거라고 생각한다. 그리고 드는 의문점 각 셀은 메모리 주소를 가지는 데, 이 <code>메모리 주소를 저장하는 공간이 또 존재하는 것인가?</code> 메모리의 메모리?</p>
<blockquote>
<p> 💡 <strong>메모리 주소 자체는 일반적으로 메모리에 저장되지 않는다.</strong>
메모리 주소는 CPU와 메모리 컨트롤러가 연산하는 하드웨어적인 개념, 다만 <code>포인터 변수나 레지스터를 통해 주소를 가리키는 값</code>이 메모리에 저장될 수 있다.</p>
</blockquote>
<p>역시 말이 안되는 구조였다. 이해 완료.</p>
<blockquote>
<p>Started from the bottom</p>
</blockquote>
<p> &nbsp; 어제 프로젝트 팀원이었던 분께서 언급한 노래 제목인데, 개념을 이해하기 위해서는 <code>가장 작은 것부터 접근하는 것</code>이 좋다고 생각한다. 정의에서 메모리는 메모리 셀들의 집합체라고 했으니, 그럼 메모리 셀, 즉 네모상자부터 접근해서 이해해야한다. 이 네모상자들은 하나하나가 데이터를 저장할 수 있는 가장 작은 단위이고, 비트<code>bit</code>라는 기본 단위로 구성되어있다. 이러한 <strong>비트는 0 또는 1만 표현할 수 있는 최소 단위의 메모리 조각</strong>이다.</p>
<hr>
<h4 id="⏸️여기서-잠깐">⏸️여기서 잠깐!</h4>
<p> &nbsp; 그런데 왜 비트를 가장 작은 단위로 사용할까? 사실 컴퓨터의 언어는 0,1로 이루어져있기 때문에 비트<code>bit</code>로 표현할 수 있으니까라고 단순히 생각해왔다. cs 서적이나, 메모리에 대한 생각이 없었다면 지금까지도 그렇게만 생각하고 있었을 것 같다. 하지만 지금의 지식으로 다시 답을 해보자면 <strong><code>효율성</code></strong> 때문이다.</p>
<p> cs서적에서 나온 표현을 인용하자면</p>
<blockquote>
<p><strong>왜 컴퓨터가 10진 숫자가 아니라 비트를 사용할까?</strong> 분명한 이유는 <strong>컴퓨터에는 손가락이 없기 때문이다.</strong>
손가락이 한 숫자를 표현하기 때문에 그리 효율적이지 않을 것이다.
만약 각 손가락을 비트를 표현하는 데 사용한다면 1000개가 넘는 숫자를 셀 수 있을 것이다.</p>
</blockquote>
<p>그 효율성을 설명하기 위해서는 컴퓨터 언어의 역사를 이야기해야할 것 같아서 여기서 멈춰야겠다.</p>
<hr>
<p> &nbsp;메모리에 값을 저장한다고 했는데, 값의 형태는 여러 가지이므로 이를 어떻게 0,1의 형태로 저장할 것인지가 문제가 된다. 이 내용을 구체적으로 다루기에는 정리글로는 부족하고 연재 시리즈물이 되어야하지 않을까 싶다. 그리고 메모리에 대해서 정리한 이유는 데이터 타입을 이해하기 위한 사전지식으로 쉽게 이해하기 위함이었다.
 &nbsp;결국 메모리에는 값들이 저장이 되는데, 이를 위해 <strong>적절한 크기의 공간을 확보하는 과정</strong>이 필요하며, 이 과정이 데이터 타입에 의해 결정된다. 물론 저장된 값들을 참조할 때도 데이터 타입에 따라 해당 메모리를 어떻게 해석할지 결정해야한다.</p>
<p> &nbsp;이 내용을 쉽게 이해하기 위한 개념으로 변수와 식별자를 들 수 있다. 설명만으로는 이해하기 쉽지 않고 혼용하여 사용하는 경우가 많지만, 예시(그림, 코드)를 보면 이해하는데 도움이 될 것이다.</p>
<h3 id="변수">변수</h3>
<p><em>*<em>변할 수 있는 데이터를 저장하는 공간
*</em></em> <em><strong>하나의 값을 저장하기 위해 확보한 메모리 공간 자체</strong></em></p>
<h3 id="식별자">식별자</h3>
<p><em><strong>데이터를 식별하는 이름</strong></em>
메모리 공간을 가리키는 이름(메모리 주소를 기억)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/8c90e363-aa8e-4a46-a99b-7aa5b06823fc/image.png" alt="변수,식별자"></p>
<pre><code class="language-js">
let age = 25;  // 변수명 &#39;age&#39; → 식별자
const name = &quot;John&quot;; // 변수명 &#39;name&#39; → 식별자

function greet() {  // 함수명 &#39;greet&#39; → 식별자
    console.log(&quot;Hello!&quot;);
}

class Person {  // 클래스명 &#39;Person&#39; → 식별자
    constructor(name) {
        this.name = name;  // 객체 속성 &#39;name&#39; → 식별자
    }
}

const user = {
    id: 1,        // 속성명 &#39;id&#39; → 식별자
    username: &quot;Alice&quot;,  // 속성명 &#39;username&#39; → 식별자
};

function add(a, b) {  // 매개변수 &#39;a&#39;, &#39;b&#39; → 식별자
    return a + b;
}
</code></pre>
<p>식별자의 경우, 실행 컨텍스트에 등록되는데, 실행 컨텍스트에 대한 내용은 추후에 정리하고 이번 정리에선 메모리에 값이 저장되는 느낌과 이를 어떤 형태로 저장하고 참조할 수 있는 지 느낌만 알아가자.</p>
<p><strong>모든 데이터는 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[정의] 값, 표현식, 문, 리터럴, 토큰, 데이터 타입 ]]></title>
            <link>https://velog.io/@deong_gu/%EC%A0%95%EC%9D%98-%EA%B0%92-%ED%91%9C%ED%98%84%EC%8B%9D-%EB%AC%B8-%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%86%A0%ED%81%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@deong_gu/%EC%A0%95%EC%9D%98-%EA%B0%92-%ED%91%9C%ED%98%84%EC%8B%9D-%EB%AC%B8-%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%86%A0%ED%81%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85</guid>
            <pubDate>Wed, 12 Mar 2025 00:05:16 GMT</pubDate>
            <description><![CDATA[<h2 id="intro">Intro</h2>
<p>기계적으로 코드를 작성하면서 변수는 이렇게 정의하고 작성해야지, 함수는 이런 형식으로 작성해야지하면서 <strong>왜 그렇게 작성해야지?</strong> 하는 생각을 하지 않은 것 같다. 이러면 안되겠다. 하면서 기본기에 충실하자이에 자바스크립트 학습 서적을 펼치고 데이터 타입 챕터에서 알게된 개념들이 왜 코드를 이런 형태로 작성해야되는지 설명해주었다.
개념들의 정의가 꼬리에 꼬리를 무는 식으로 되어있어서 쉽게 이해할 수 있었다.</p>
<h2 id="개념">개념</h2>
<h3 id="값">값</h3>
<p><em><strong>표현식이 평가되어 생성된 결과</strong></em></p>
<blockquote>
<p>여기서 <strong>평가</strong>란 식을 해석해서 값을 생성하거나 참조하는 것
 (원시값과 참조값을 떠올릴 수 있었다. 추후에 등장예정)</p>
</blockquote>
<p> 자연스럽게 그럼 표현식은 뭐야? 라는 생각이 들고</p>
<h3 id="표현식">표현식</h3>
<p><em><strong>값으로 평가될 수 있는 문</strong></em></p>
<p>앞선 개념과 합쳐서 생각해보면
<strong>표현식이 평가되면 새로운 값을 생성하거나 기존값을 참조한다.</strong> (원시값, 참조값)</p>
<pre><code class="language-js">const add = function (a, b) {
  return a + b;
};

5 + 3  // 8 (값이 생김)
&quot;Hello&quot;.toUpperCase()  // &quot;HELLO!&quot; (값이 생김)
const add = (a, b) =&gt; a + b;  // 함수 표현식 (값이 변수에 할당됨)
</code></pre>
<p>이해를 바탕으로 암기하려고 하는데, 머릿 속에서는 계속
<strong>평가되어 값을 반환하는 문</strong>이라고 떠오르고 혹시나 chat gpt를 활용해서 질문하니 통과(<strong>표현식은 값을 생성하는 코드 조각이고, 항상 값을 반환한다.</strong>), 근데 이렇게 생각하면 또 의문이 들었다. 표현식이 아닌 문은 어떤 것들이 있을까? 그전에 문이 멀까?</p>
<h3 id="문">문</h3>
<p><em><strong>프로그램을 구성하는 기본 단위이자 최소 실행 단위</strong></em></p>
<blockquote>
<p>문의 집합으로 이뤄진 것이 바로 <strong>프로그램</strong>이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.
<strong>프로그램</strong>은 어떤 일을 하기 위해 순서와 절차에 따라 처리하는 명령어들의 집합</p>
</blockquote>
<p>그렇다면 표현식이 아닌 문은 어떤 것들일까? 하는 궁금증이 생겨서 알아보았다.</p>
<p>표현식이 아니다 =&gt; <strong>값을 생성하지 않고, 참조하지 않는다.</strong>
문 =&gt; <strong>코드를 실행하지만, 값으로 평가되지 않는다</strong></p>
<pre><code class="language-js">// 변수 선언 (표현식이 아님)
let x;

// 조건문 (표현식이 아님)
if (x &gt; 10) {
  console.log(&quot;x는 10보다 크다&quot;);
}

// 반복문 (표현식이 아님)
for (let i = 0; i &lt; 5; i++) {
  console.log(i);
}

// 함수 선언 (표현식이 아님)
function greet() {
  console.log(&quot;Hello!&quot;);
}

function add(a, b) {
  return a + b;
}
</code></pre>
<p>예시를 보고 이해가 되었지만, 브라우저 개발자도구 콘솔창이던지, nodejs 환경에서 <code>console.log(&quot;안녕&quot;)</code>(표현식이 아닌 문)를(을) 실행해보면 뒤이어 출력되는 undefined가 궁금해졌다.</p>
<p>이것 또한 undefined라는 데이터 타입의 원시값에 대해서 알아야하므로 
간단히 <code>변수 선언 후 초기화되지 않은 경우, 함수가 값을 반환하지 않는 경우, 객체나 배열의 존재하지 않는 프로퍼티나 인덱스를 접근할 경우, 함수에 인자를 전달하지 않은 경우</code>, 
자세한건 추후에 알아보기로 하자.</p>
<p><strong>TMI</strong> : 타입스크립트를 사용하는데 undefined가 너무 싫습니다. 😢</p>
<p>앞선 예시 코드에서도 이건 선언문이다, 표현식이다, 변수 선언이다, 반복문이다라고 주석을 달았지만, 왜 그렇게 생겼는지에 의문을 가지지 않았다. 당연히 저런 형태는 반복문이고, 조건문이다라고 생각하고 사용을 했지. 이렇듯 코드를 작성할때 편하게 사용하고 있는 저런 형태를 <strong>리터럴</strong>이라고 한다.</p>
<h3 id="리터럴">리터럴</h3>
<p><em><strong>사람이 이해할 수 있는 문자 또는 약속된 기호를 이용하여 값을 생성하는 표기법</strong></em></p>
<blockquote>
<p>자바스크립트 엔진은 코드가 실행되는 시점인 _<strong>런타임</strong>_에 리터럴을 평가해 값을 생성한다.</p>
</blockquote>
<p>처음 리터럴이라는 용어정의를 보았을 때, 한 번에 이해되지 않았는데, 예시를 보고 한 번에 이해하게되었다.</p>
<pre><code class="language-js">
let age = 25;  // 숫자 리터럴
let greeting = `Hello, ${name}!`; // 템플릿 리터럴
let fruits = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;];  // 배열 리터럴
let person = {
  name: &quot;deonggu&quot;,  // 키-값 쌍으로 정의된 객체 리터럴
  age: 30
};
let isAdult = true;  // 불리언 리터럴
let emptyValue = null;  // null 리터럴
</code></pre>
<p>위의 개념들을 이해했다면 이제 자바스크립트 코드를 보면서 어? 이건 표현식이네, 이건 표현식이 아닌 문이네?, 값이 이거고 이건 리터럴로 표현되어있네 라는 개발자들만의 이야기를 가볍게 할 수 있지 않을까</p>
<hr>
<p>이과 출신은 아니지만, 문을 좀 더 나누면? 쪼개면 어떨까? 또 다른 개념이 있을지? 마치 단어가 문장이 되듯이
<strong>토큰이 문이 되듯이</strong></p>
<h3 id="토큰">토큰</h3>
<p><em>*<em>코드에서 문법적인 의미를 가지는 최소 단위로, 문법적으로 더 이상 나눌 수 없는 기본요소
*</em></em></p>
<p>사실 토큰 정의를 보면서 openAI Api를 사용할 때, 요청 및 사용 토큰 수로 더 익숙한 느낌이다. 결국에는 더이상 쪼갤 수 없는 느낌</p>
<hr>
<p>제목에는 데이터 타입을 적었지만, 사실 데이터 타입은 방대한 양이라 옮겨적거나 받아적는것도 양이 많을거 같아서 추후에 자세히 정리할 생각을 했다.</p>
<p>그래도 들어가기 전
데이터 타입의 내용이 아니라 데이터 타입을 한 문장으로 표현한다면?</p>
<h3 id="데이터-타입">데이터 타입</h3>
<p><em><strong>값의 특성을 결정하는 분류</strong></em></p>
<blockquote>
<p>자바스크립트의 모든 갓은 데이터 타입을 갖는다.
메모리에 2진수, 즉 비트의 나열로 저장된다. 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.</p>
</blockquote>
<p>데이터 타입을 그냥 단순히 값의 종류라고 표현하고 다녔는데, 이해시키기 위한 정도의 표현이고, 엄밀히 말하면 정확하지 않은 표현이었다. (다들 똑똑해서 찾아봤겠지..ㅠㅠ)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-26]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-26</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-26</guid>
            <pubDate>Tue, 26 Mar 2024 15:39:07 GMT</pubDate>
            <description><![CDATA[<ul>
<li>포트폴리오 프로젝트 진행 중<ul>
<li>Plot scene(두 번째 씬) 관련 이벤트 마무리<ul>
<li>Phaser 프레임 워크 Scene 객체 anims, twins 메서드 활용해서 연쇄 이벤트 구현</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-14]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-14</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-14</guid>
            <pubDate>Thu, 14 Mar 2024 14:03:18 GMT</pubDate>
            <description><![CDATA[<ul>
<li>포트폴리오 프로젝트 진행 중<ul>
<li>대화창(dialog box) 틀 만들기</li>
<li>phaser로 대화창 관련 컨테이너 구성 (관련 메서드 공부)</li>
<li>로직 설계 및 기획</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-12]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-12</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-12</guid>
            <pubDate>Tue, 12 Mar 2024 15:31:51 GMT</pubDate>
            <description><![CDATA[<ul>
<li>포트폴리오 프로젝트 진행 중<ul>
<li>Phaser3 공부 ( 2D 애니메이션 및 게임 구현)<ul>
<li>충돌 감지 이벤트, 코드 리팩토링, 애니메이션, 지형 적용 등</li>
</ul>
</li>
<li>Tiled 프로그램 공부 (맵 생성, 오브젝트 생성)<ul>
<li>지형 생성, 관련 옵션 설정</li>
</ul>
</li>
<li>Piskel 프로그램 다루기 (캐릭터 생성 sprite sheet)<ul>
<li>애니메이션을 위한 픽셀 캐릭터 수정</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-11]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-11</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-11</guid>
            <pubDate>Mon, 11 Mar 2024 07:13:50 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>리눅스 명령어 정리 (강의 내용 정리) - 시스템,프로세스 관련 명령어(ps, systemctl등)
<a href="https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL"><strong><em>[해당글] 리눅스 명령어 (SHELL)</em></strong></a></p>
</li>
<li><p>코딩 문제 풀이 - <a href="https://www.acmicpc.net/problem/1018"><em><strong>[백준 1018번 실버4] 체스판 다시 칠하기</strong></em></a>
브루트포스 알고리즘으로 풀이</p>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs
.readFileSync(&quot;/dev/stdin&quot;)
.toString()
.trim()
.split(&quot;\n&quot;)
.map((x) =&gt; x.replace(&quot;\r&quot;, &quot;&quot;));
</code></pre>
</li>
</ul>
<p>const [N, M] = input[0].split(&quot; &quot;).map(Number);
const board = input.slice(1).map((el) =&gt; el.split(&quot;&quot;));</p>
<p>let result = Number.MAX_SAFE_INTEGER;</p>
<p>function solution(row, col, bd) {
  let change = 0;
  const check = [&quot;WBWBWBWB&quot;, &quot;BWBWBWBW&quot;];
  for (let i = 0; i &lt; 8; i++) {
    let r = row + i;
    for (let j = 0; j &lt; 8; j++) {
      let c = col + j;
      if (bd[r][c] !== check[r % 2][j]) change++;
    }
  }</p>
<p>  return Math.min(change, 64 - change);
}</p>
<p>for (let i = 0; i &lt;= N - 8; i++) {
  for (let j = 0; j &lt;= M - 8; j++) {
    let count = solution(i, j, board);
    if (result &gt; count) result = count;
  }
}</p>
<p>console.log(result);</p>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스]]></title>
            <link>https://velog.io/@deong_gu/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</link>
            <guid>https://velog.io/@deong_gu/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</guid>
            <pubDate>Sun, 10 Mar 2024 13:13:07 GMT</pubDate>
            <description><![CDATA[<h1 id="프로세스">프로세스</h1>
<p>간단한 이해를 목적으로 강의를 정리한 글입니다.
자세한 내용과 정확한 용어를 원하시는 분께서는 구글링과 다른 블로그를 참고해주시길 바랍니다.</p>
<hr>
<p>CPU(연산장치)와 RAM(저장장치), 이 두 장치만 있다고 프로그램이 작동되지않는다.</p>
<p>그 이유로 RAM의 용량 한계와 휘발성 메모리이므로 컴퓨터를 종료 시에 데이터가 다 사라지는 점을 들 수 있다.</p>
<p>그래서 HDD, SSD 같은 저장 장치를 추가한 후, 여기에 프로그램을 설치한다.</p>
<p>프로그램을 설치하는 것이 프로세스가 아니라 RAM으로 실행에 필요한 부분을 끌어올리는 <strong>로드</strong>를 거치고 <strong>RAM에 프로그램이 존재하는 것</strong>을 프로세스라고 한다.
프로세스에 프로그램이 있다는 것은 <strong>현재 실행 중</strong>임을 의미한다.</p>
<p>이 상태에서 CPU와 RAM에 있는 프로그램이 커뮤니케이션이 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/61fe39a0-e03a-4124-a1c8-e4acc405f03d/image.png" alt="프로세스"></p>
<p>CPU를 비유하자면 한 명의 노동자로 볼 수 있다.
그런데 그렇게 되면 계속 실행되어야하는 서버와 같은 프로그램을 <strong>하나의 프로세스로 실행해야하기 때문에 다른 작업을 할 수 없다.</strong> (다른 프로그램을 실행할 수 없다.)</p>
<p>그래서 나온 개념이 <strong>스레드 Thread</strong>이다.
실,수명을 의미하는 단어인데, CPU에서 뻗어나오는 여러 개의 실가닥으로 생각하면 이해하기 편할 것이다. 실 가닥 하나하나가 각각 프로그램이라고 생각하면 된다.</p>
<p>여러 프로세스를 실행할 때, CPU(하나의 처리장치)가 왔다갔다하는 작업이 필요한 데, 이럴때 <strong>타임 슬라이싱 Time slicing</strong>이 필요하다. </p>
<blockquote>
<p>하나의 처리 장치에 두 가지 이상의 처리를 시간적으로 교차ㆍ배치하는 컴퓨터 시스템 조작 기법
<a href="https://wordrow.kr/%EC%9D%98%EB%AF%B8/%ED%83%80%EC%9E%84%20%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1/">[<em><strong>출처] 타임 슬라이싱</strong></em></a></p>
</blockquote>
<p>그런데 이를 위해서 (프로세스를 왔다갔다하려면) 현재 진행되는 상황(문맥, 흐름, 전후사정)을 기억해야지 다시 돌아왔을 때 제대로 진행이 되기 때문에 <strong>문맥 교환Context switching</strong> 이라는 작업이 필요하다.</p>
<blockquote>
<p><strong>문맥 교환(</strong>文脈交換, context switch)이란 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
<a href="https://ko.wikipedia.org/wiki/%EB%AC%B8%EB%A7%A5_%EA%B5%90%ED%99%98"><strong>[위키백과]</strong> <em><strong>문맥 교환</strong></em></a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/4802e072-19eb-4143-b264-3749317e0849/image.png" alt="스레드, 타임슬라이싱, 컨텍스트 스위칭"></p>
<p>그리고 스레드와 타임 슬라이싱 컨텍스트 스위칭을 이용해서 여러 프로세스를 진행하기 위해서는 어떤 프로세스에 100%로 집중(작업)을 하면 안된다. 100%로 프로세스를 실행하고 있으면 프로세스를 종료시킬 수도 없다.</p>
<p>이를 해결하기 위해서 실행되는 프로세스에 <strong>슬립</strong>이라는 작업이 필요하다. <strong>잠깐동안 프로세스를 멈추고</strong>, 그 틈에 다른 프로세스를 실행해서 여러 프로세스를 다룰 수 있게 된다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/46d78751-2106-475c-b189-4cc4c3709623/image.png" alt="프로세스 요약"></p>
<hr>
<p>[참고 자료]</p>
<p>[K-디지털] AWS 리눅스 기반 클라우드 데브옵스 기초 실무 과정 - 데어 프로그래밍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-10]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-10</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-10</guid>
            <pubDate>Sun, 10 Mar 2024 08:25:08 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>코딩문제풀이 </p>
<ul>
<li><p>[_<strong>[프로그래머스 lv1] 2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물</strong>_]
(<a href="https://school.programmers.co.kr/learn/courses/30/lessons/258712">https://school.programmers.co.kr/learn/courses/30/lessons/258712</a>)
<code>이차원 배열</code>과 <code>해시테이블</code>을 이용해서 풀이</p>
<pre><code class="language-js">function solution(friends, gifts) {
 const result = [];
 const giftNumber = {};

 const friendsIndex = {};
 friends.forEach((friend, idx) =&gt; {
   friendsIndex[friend] = idx;
   giftNumber[idx] = [0, 0, 0];
   result[idx] = 0;
 });

 const list = Array.from({ length: friends.length })
   .fill()
   .map(() =&gt; Array(friends.length).fill(0));

 gifts.forEach((gift) =&gt; {
   const [give, take] = gift.split(&quot; &quot;);
   list[friendsIndex[give]][friendsIndex[take]]++;
   giftNumber[friendsIndex[give]][0]++;
   giftNumber[friendsIndex[take]][1]++;
   giftNumber[friendsIndex[give]][2] =
     giftNumber[friendsIndex[give]][0] - giftNumber[friendsIndex[give]][1];
   giftNumber[friendsIndex[take]][2] =
     giftNumber[friendsIndex[take]][0] - giftNumber[friendsIndex[take]][1];
 });

 friends.forEach((friend, idx) =&gt; {
   for (let i = idx; i &lt; friends.length; i++) {
     if (idx === i) continue;

     if (list[idx][i] &gt; list[i][idx]) {
       result[idx]++;
     } else if (list[idx][i] &lt; list[i][idx]) {
       result[i]++;
     } else {
       if (giftNumber[idx][2] &gt; giftNumber[i][2]) {
         result[idx]++;
       }
       if (giftNumber[idx][2] &lt; giftNumber[i][2]) {
         result[i]++;
       }
     }
   }
 });

 return Math.max(...result);
}
</code></pre>
</li>
</ul>
<ul>
<li>[_<strong>[백준 2164번 실버4] 카드2</strong>_]
(<a href="https://www.acmicpc.net/problem/2164">https://www.acmicpc.net/problem/2164</a>)
<code>자바스크립트</code>로 queue, deque를 이용해서 풀려고 했지만 시간 초과로 실패해서 <code>파이썬 deque 라이브러리</code>를 이용하여 풀이<pre><code class="language-js">from collections import deque
</code></pre>
</li>
</ul>
<p>A = int(6)
card = list(range(A,0,-1))</p>
<p>d = deque(card)</p>
<p>while len(d) != 1:
  d.pop()
  d.appendleft(d.pop())</p>
<p>print(d[0])</p>
<ul>
<li>[<em><strong>[백준 10816번 실버4] 숫자 카드 2</strong>_] (<a href="https://www.acmicpc.net/problem/10816">https://www.acmicpc.net/problem/10816</a>)
<code>해시 테이블</code> 이용해서 풀이 (<code>{key: value}</code>) 
유사문제 [</em><strong>[백준 1920번 실버4] 수찾기</strong>_](<a href="https://www.acmicpc.net/problem/1920">https://www.acmicpc.net/problem/1920</a>) 도 코드가 똑같아서 같이 풀이<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs
.readFileSync(&quot;doc.txt&quot;)
.toString()
.trim()
.split(&quot;\n&quot;)
.map((x) =&gt; x.replace(&quot;\r&quot;, &quot;&quot;));
</code></pre>
</li>
</ul>
<p>const N = +input[0];
const M = +input[2];</p>
<p>const card = input[1].split(&quot; &quot;);
const quition = input[3].split(&quot; &quot;);</p>
<p>const result = [];
const obj = {};</p>
<p>card.forEach((el) =&gt; (obj[el] ? obj[el]++ : (obj[el] = 1)));</p>
<p>quition.forEach((el) =&gt; (obj[el] ? result.push(obj[el]) : result.push(0)));</p>
<p>console.log(result.join(&quot; &quot;));</p>
<p>```</p>
<ul>
<li>AWS 강의 내용 복습 - <a href="https://velog.io/@deong_gu/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4"><em><strong>[해당글] 프로세스</strong></em></a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2034-03-08]]></title>
            <link>https://velog.io/@deong_gu/TIL-2034-03-08</link>
            <guid>https://velog.io/@deong_gu/TIL-2034-03-08</guid>
            <pubDate>Fri, 08 Mar 2024 02:56:22 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>코딩문제풀이 - <a href="https://school.programmers.co.kr/learn/courses/30/lessons/250137">[링크] <strong><em>프로그래머스 Lv1 붕대 감기</em></strong></a></p>
<pre><code class="language-js">function solution(bandage, health, attacks) {
  const time = attacks[attacks.length-1][0];
  let result = health;

  const [ct, rps, ph] = bandage;
  let cs = 0;
  const attackObj = {}
  attacks.forEach((el) =&gt; attackObj[el[0]] = el[1]);

  for(let i = 1; i &lt; time+1; i++){

      if(attackObj[i]){
          cs = 0;
          result -= attackObj[i];
          if(result &lt;= 0) return -1;
          continue;
      }else{
          result+= rps;
          cs++;

          if(result &gt; health) result = health;
          if(cs === ct){
              result+= ph;
              cs = 0;
              if(result &gt; health) result = health;
          }
      }

  }

  return result;
}</code></pre>
</li>
<li><p>리눅스 명령어 정리 (강의 복습 겸 정리)
<a href="https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL">[해당글] <em><strong>리눅스 명령어</strong></em></a></p>
</li>
<li><p>포트폴리오를 위한 asset 파일(NPC) 만들기 + NPC 인사 애니메이션 추가 및 충돌 설정 (미완)</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-07]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-07</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-07</guid>
            <pubDate>Thu, 07 Mar 2024 08:16:36 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>코딩문제풀이 - <a href="https://www.acmicpc.net/problem/5397"><strong><em>백준 5397번 키로거</em></strong></a></p>
<ul>
<li><strong>연결리스트</strong>로 풀이<pre><code class="language-js">const input = fs
.readFileSync(&quot;doc.txt&quot;)
.toString()
.trim()
.split(&quot;\n&quot;)
.map((x) =&gt; x.replace(/\r/, &quot;&quot;));
</code></pre>
</li>
</ul>
<p>let result = &quot;&quot;;
const N = input[0];
const cmdList = input.slice(1);</p>
<p>for (let i = 0; i &lt; N; i++) {
let index = 0;
const cursor = { prev: null, next: null };
const node = {};</p>
<p>cmdList[i].split(&quot;&quot;).forEach((cmd) =&gt; {
  const prev = cursor.prev;
  const next = cursor.next;</p>
<p>  if (cmd === &quot;&lt;&quot; &amp;&amp; prev !== null) {</p>
<pre><code>cursor.prev = node[prev].prev;
cursor.next = prev;</code></pre><p>  }</p>
<p>  if (cmd === &quot;&gt;&quot; &amp;&amp; next !== null) {</p>
<pre><code>cursor.prev = next;
cursor.next = node[next].next;</code></pre><p>  }</p>
<p>  if (cmd === &quot;-&quot; &amp;&amp; prev !== null) {</p>
<pre><code>next !== null ? (node[next].prev = node[prev].prev) : null;
node[prev].prev !== null ? (node[node[prev].prev].next = next) : null;
cursor.prev = node[prev].prev;
delete node[prev];</code></pre><p>  }</p>
<p>  if (cmd !== &quot;&gt;&quot; &amp;&amp; cmd !== &quot;&lt;&quot; &amp;&amp; cmd !== &quot;-&quot;) {</p>
<pre><code>node[++index] = { prev: prev, next: next, char: cmd };
cursor.prev = index;
next !== null ? (node[next].prev = index) : null;
prev !== null ? (node[prev].next = index) : null;</code></pre><p>  }
});</p>
<p>for (let key in node) {
  if (node[key].prev === null) {</p>
<pre><code>let currentKey = key;
while (currentKey !== null) {
  result += node[currentKey].char;
  currentKey = node[currentKey].next;
}</code></pre><p>  }
}</p>
<p>if (i !== N - 1) result += &quot;\n&quot;;
}</p>
<p>console.log(result);```</p>
<ul>
<li>리눅스 명령어 정리하기 (AWS강의 복습 겸 정리)
<a href="https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL">[<strong>해당 글</strong>] <em><strong>리눅스 핵심 명령어</strong></em></a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-05]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-05</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-05</guid>
            <pubDate>Wed, 06 Mar 2024 01:49:14 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>알고리즘 공부 - 다익스트라 </p>
<ul>
<li><p><a href="https://www.youtube.com/watch?v=611B-9zk2o4"><em><strong>[참고] 동빈나님 유튜브 영상</strong></em></a></p>
</li>
<li><p><a href="https://www.youtube.com/watch?v=o9BnvwgPT-o"><em><strong>[참고] 바킹독님 유튜브 영상</strong></em></a></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>코딩 문제 풀이 - <strong>연결리스트, 스택</strong>을 사용한 풀이(<a href="https://www.acmicpc.net/problem/1406"><em><strong>백준 1406번 에디터</strong></em></a>)</p>
<ul>
<li>스택<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs
.readFileSync(&quot;/dev/stdin&quot;)
.toString()
.trim()
.split(&quot;\n&quot;)
.map((x) =&gt; x.replace(/\r/, &quot;&quot;));
</code></pre>
</li>
</ul>
<p>const chars = input[0].split(&quot;&quot;);
const right = [];
const cmdList = input.slice(2);
cmdList.forEach((cmd) =&gt; {
const [key, char] = cmd.split(&quot; &quot;);
if (cmd === &quot;L&quot;) {
  if (chars.length &gt; 0) right.push(chars.pop());
}
if (cmd === &quot;D&quot;) {
  if (right.length &gt; 0) chars.push(right.pop());
}</p>
<p>if (cmd === &quot;B&quot;) chars.pop();
if (cmd[0] === &quot;P&quot;) chars.push(char);
});
console.log(chars.concat(right.reverse()).join(&quot;&quot;));```</p>
<ul>
<li>연결리스트<pre><code class="language-js">const fs = require(&quot;fs&quot;);
const input = fs
.readFileSync(&quot;/dev/stdin&quot;)
.toString()
.trim()
.split(&quot;\n&quot;)
.map((x) =&gt; x.replace(/\r/, &quot;&quot;));
</code></pre>
</li>
</ul>
<p>const chars = input[0].split(&quot;&quot;);
const N = input[0].length - 1;
const cmdList = input.slice(2);</p>
<p>let current = { prev: N, next: null };</p>
<p>const nodeObj = {};
const createNode = (key, state = true, prev = null, next = null) =&gt; ({
key,
state,
prev,
next,
});</p>
<p>const deleteNode = () =&gt; {
const prev = current.prev;
const next = current.next;</p>
<p>if (prev !== null) {
  nodeObj[prev].state = false;
  next !== null ? (nodeObj[next].prev = nodeObj[prev].prev) : null;
  nodeObj[prev].prev !== null</p>
<pre><code>? (nodeObj[nodeObj[prev].prev].next = next)
: null;</code></pre><p>  current.prev = nodeObj[prev].prev;
}
};</p>
<p>const insertNode = (char) =&gt; {
const prev = current.prev;
const next = current.next;
const randomNumber = Math.random();
nodeObj[randomNumber] = createNode(char, true, prev, next);
current.prev = randomNumber;
next !== null ? (nodeObj[next].prev = randomNumber) : null;
prev !== null ? (nodeObj[prev].next = randomNumber) : null;
};</p>
<p>const moveNode = (direction) =&gt; {
const prev = current.prev;
const next = current.next;</p>
<p>if (direction === &quot;L&quot;) {
  if (prev !== null) {</p>
<pre><code>current.prev = nodeObj[prev].prev;
current.next = prev;</code></pre><p>  }
} else {
  if (next !== null) {</p>
<pre><code>current.prev = next;
current.next = nodeObj[next].next;</code></pre><p>  }
}
};</p>
<p>chars.forEach((char, idx) =&gt; {
nodeObj[idx] = createNode(char, true, null, null);
if (idx &gt; 0) {
  nodeObj[idx].prev = idx - 1;
  nodeObj[idx].key = char;
}
if (idx &lt; chars.length - 1) {
  nodeObj[idx].next = idx + 1;
  nodeObj[idx].key = char;
}
});</p>
<p>cmdList.forEach((cmd) =&gt; {
if (cmd === &quot;L&quot; || cmd === &quot;D&quot;) {
  moveNode(cmd);
} else if (cmd === &quot;B&quot;) {
  deleteNode();
} else {
  const [key, char] = cmd.split(&quot; &quot;);
  insertNode(char);
}
});</p>
<p>let result = &quot;&quot;;
for (let key in nodeObj) {
if (nodeObj[key].state === true &amp;&amp; nodeObj[key].prev === null) {
  let currentKey = key;
  while (currentKey !== null) {</p>
<pre><code>result += nodeObj[currentKey].key;
currentKey = nodeObj[currentKey].next;</code></pre><p>  }
}
}</p>
<p>console.log(result);```</p>
</li>
</ul>
<ul>
<li>리눅스 우분투 명령어 apt에 대한 내용 정리 (<a href="https://velog.io/@deong_gu/apt"><em><strong>[정리] apt를 사용하는 이유</strong></em></a>)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 2024-03-04]]></title>
            <link>https://velog.io/@deong_gu/TIL-2024-03-04</link>
            <guid>https://velog.io/@deong_gu/TIL-2024-03-04</guid>
            <pubDate>Mon, 04 Mar 2024 12:44:20 GMT</pubDate>
            <description><![CDATA[<ul>
<li>프로그래머스 코딩테스트 문제 풀이
2021 카카오 채용연계형 인턴십 3번 문제 - 표 편집</li>
<li><em>양방향 링크드리스트*</em>를 이용해서 풀이</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[apt를 사용하는 이유]]></title>
            <link>https://velog.io/@deong_gu/apt</link>
            <guid>https://velog.io/@deong_gu/apt</guid>
            <pubDate>Fri, 01 Mar 2024 14:08:58 GMT</pubDate>
            <description><![CDATA[<p>강의 내용을 정리한 글입니다.
참고하시길 바랍니다.
전문적이거나 구체적인 내용은 공식문서나 구글링을 하시길 바랍니다.</p>
<hr>
<p>우리들이 보통 프로그램을 설치할 때, 이용하고자하는 프로그램의 공식 페이지에서 들어가서 설치 버튼을 누르고 진행하면 설치가 완료된다.</p>
<p>하지만 설치를 할 때, 보이지 않는 곳에서 여러 과정을 거친다.
보통 <strong>프로그램을 하드디스크에 복사하고 시작프로그램 등록, 관련 포트 개방, 환경변수 등록 등 여러가지 설정들 관련한 과정</strong>이 있다.</p>
<ul>
<li>Windows OS를 기준으로 설치 과정 흐름
<img src="https://velog.velcdn.com/images/deong_gu/post/e179f095-f84d-4ef1-9eba-0e4e3b802574/image.png" alt="window 일반적인 설치 과정"></li>
</ul>
<h2 id="apt-명령어를-사용하는-이유">apt 명령어를 사용하는 이유</h2>
<p>그러면 <strong>우분투(os)</strong>에서는 어떤 과정을 거치는가?</p>
<p>우분투도 마찬가지로 사이트에서 다운로드를 하는데, windows와는 다르게 .zip, .msi 등이 아니라 다른 파일을 다운로드 하게된다.</p>
<p>그리고 CLI 환경이기 때문에 설치하는 방법 또한 다르다.
이에 따라서 사이트로 이동해서 다운받고, 압축파일일 경우 압축을 풀고, 설치파일일 경우 설치 방법(명령어)을 배워야하는 상황이 생긴다.
심지어 앞서 언급했던 과정을 모두 거쳐야하므로 귀찮고 힘이 든다.</p>
<p>이런 점들을 보완하기 위해 <em><strong>우분투 레포지토리 (ubuntu repository)</strong></em> 를 이용하게 되는데, 이를 위해서 apt 명령어를 사용한다.</p>
<p>우분투 레포지토리에는 여러가지 프로그램이 다 들어가 있고, 새로운 프로그램들이 계속 등록된다. (없는 프로그램도 존재한다.)
이로인해 우리는 프로그램 설치를 위해 사이트를 방문할 필요성이 사라진다.
추가적으로 앞서 언급했던 과정들이 자동으로 세팅 되기 때문에 편리하다.</p>
<ol>
<li><p>그러면 <strong>어떻게 우분투 레포지토리에 접근할 수 있는가?</strong>
/etc/apt/sources.list에 레포지토리 경로를 등록하면된다. (기본 저장소가 저장되어있다.)
만약 기본 저장소에 새로운 프로그램이 없을 경우, /etc/apt/sources.list.d/에 PPA, 개인저장소의 주소를 추가하면 된다.</p>
</li>
<li><p>그 이후에는 우분투 레포지토리 즉 <strong>저장소 경로를 통해 시스템이 사용 가능한 소프트웨어 패키지를 확인하고 패키지 목록을 업데이트</strong>해야한다. 이때 사용하는 명령어가 <strong>apt update</strong> 이다.
이 명령어는 시스템이 사용 가능한 새로운 패키지와 패키지 버전을 확인하고, 이를 로컬 패키지 데이터베이스에 반영하여 나중에 설치나 업그레이드에 사용할 수 있도록 한다. </p>
</li>
<li><p>목록을 업데이트 한 이후에 <strong>원하는 프로그램을 찾은 다음에 설치</strong>하면 된다. 이때 사용하는 명령어는 <strong>apt install 프로그램명</strong> 이다.</p>
</li>
</ol>
<h2 id="왜-apt-update-명령을-실행할까요">왜 apt update 명령을 실행할까요?</h2>
<h3 id="패키지-목록-업데이트">패키지 목록 업데이트</h3>
<p>저장소에 있는 패키지 목록을 로컬 시스템에 가져온다. 이는 새로운 패키지가 추가되었거나 기존 패키지의 버전이 업데이트된 경우 해당 정보를 가져오는 과정이다.</p>
<h3 id="의존성-해결">의존성 해결</h3>
<p>패키지를 설치할 때 해당 패키지가 의존하는 다른 패키지들도 함께 설치되어야 할 수 있다. 업데이트된 패키지 목록을 사용하면 시스템은 필요한 모든 의존성 패키지를 찾아내고 설치할 수 있다.</p>
<h3 id="버전-충돌-방지">버전 충돌 방지</h3>
<p>시스템에 설치된 패키지와 호환되는 새로운 패키지 버전을 확인한다. 이렇게 하면 새로운 패키지를 설치할 때 시스템에 이미 설치된 패키지와 충돌하는 버전이 없도록 보장할 수 있다.</p>
<blockquote>
<p>&quot;<strong>apt update</strong>&quot;를 실행하여 패키지 목록을 업데이트한 후에 패키지를 설치하는 것은 시스템의 안정성과 호환성을 유지하기 위한 중요한 단계이다.
-<em><strong>chat gpt</strong></em>-</p>
</blockquote>
<blockquote>
<p><strong>apt</strong>는 Debian 기반 Linux 서버 및 서버 인스턴스에서 애플리케이션 및 라이브러리와 같은 소프트웨어 패키지를 관리할 수 있습니다.
<em><strong>AWS 문서</strong></em> </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/baa5efbe-907b-4165-819a-0e07f0204787/image.png" alt="ubuntu 설치 과정"></p>
<hr>
<p>[참고 자료]</p>
<p>[K-디지털] AWS 리눅스 기반 클라우드 데브옵스 기초 실무 과정 - 데어 프로그래밍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 명령어 (SHELL)]]></title>
            <link>https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL</link>
            <guid>https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL</guid>
            <pubDate>Wed, 28 Feb 2024 10:46:02 GMT</pubDate>
            <description><![CDATA[<p>현재 보시는 글에서 사용하는 이미지들은 강의 화면을 캡처한 것입니다.
MobaXterm이라는 프로그램을 사용해서 AWS EC2 서버에 원격 접속한 상태에서 명령어를 실행한 이미지입니다.</p>
<hr>
<h1 id="리눅스-명령어">리눅스 명령어</h1>
<p>SHELL - 사용자 - OS(우분투) - 컴퓨터가 대화하기 위해서 필요한 언어</p>
<h2 id="clear">clear</h2>
<p>화면을 깔끔하게 해주는 명령어</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/fd7e4af9-866d-4c90-94b2-5a5b4c79fa1a/image.png" alt="clear before"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/bcf96052-339a-4491-a968-3e43e37ab0ab/image.png" alt="clear after"></p>
<h2 id="pwd">pwd</h2>
<p>현재 경로를 알 수 있는 명령어 (현재 위치)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/2ecc9358-4f59-4931-8cc7-048f9fad4976/image.png" alt="pwd"></p>
<h2 id="cd">cd</h2>
<p>폴더 이동을 하는 명령어</p>
<ul>
<li><h3 id="cd-"><code>cd ..</code></h3>
<p>상위 폴더로 이동하는 명령어</p>
</li>
<li><h3 id="cd-경로"><code>cd 경로</code></h3>
<p>해당 경로로 이동하는 명령어</p>
<ul>
<li>절대경로 <img src="https://velog.velcdn.com/images/deong_gu/post/0e12784b-05ee-42fd-8c72-38f0c2202f2a/image.png" alt="절대경로">
상대경로 <img src="https://velog.velcdn.com/images/deong_gu/post/72666f7f-80d1-435a-9d12-cad03a10ec8d/image.png" alt="상대경로">
<img src="https://velog.velcdn.com/images/deong_gu/post/7c0ac7fd-082a-4f04-87e1-044abadcc220/image.png" alt="cd"></li>
</ul>
</li>
</ul>
<h2 id="ls">ls</h2>
<p>현재 폴더에 있는 모든 파일과 폴더의 상태를 보여주는 명령어</p>
<ul>
<li><h3 id="ls--l"><code>ls -l</code></h3>
<p>(옵션) 자세히 보기</p>
<ul>
<li>맨 앞의 철자가 <strong>-</strong>면 파일</li>
<li>맨 앞의 철자가 <strong>d</strong>면 폴더</li>
<li>맨 앞의 철자가 <strong>l</strong>이면 링크 파일</li>
</ul>
</li>
<li><h3 id="ls--a"><code>ls -a</code></h3>
<p>(옵션) 모든 파일 보기 (숨김파일 포함)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/12a73d3e-8056-4cd1-bd0e-73b667b23c3d/image.png" alt="ls"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/ad37cbcd-0844-41a7-8c53-59add55ac8a1/image.png" alt="ls -l"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/d8fdb1eb-0d14-4290-b6de-f2bf72790b7f/image.png" alt="ls -a"></p>
</li>
</ul>
<h2 id="mkdir">mkdir</h2>
<p>폴더를 생성하는 명령어 (mkdir 폴더명)
<img src="https://velog.velcdn.com/images/deong_gu/post/e857a621-ba93-41f1-b655-8dc93a66ea4f/image.png" alt="mkdir"></p>
<h2 id="touch">touch</h2>
<p>파일을 생성하는 명령어 (touch 파일명)
<img src="https://velog.velcdn.com/images/deong_gu/post/3c8349bc-6eee-4354-b910-bfbf8b9ec3fb/image.png" alt="touch"></p>
<h2 id="rm">rm</h2>
<p>삭제하는 명령어 
( 폴더 삭제 --&gt; rm -r 폴더명, 
파일 삭제 --&gt; rm 파일명 )</p>
<ul>
<li><h3 id="rm--f"><code>rm -f</code></h3>
<p>(옵션) 삭제할 때, 삭제되지 않는 것을 강제로 삭제하기</p>
</li>
<li><h3 id="rm--r"><code>rm -r</code></h3>
<p>(옵션) 폴더를 삭제할 때, 폴더 안에 있는 내용들(파일)까지 함께 삭제하기</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/c7258ec4-512b-48d1-bc99-1ac95783102b/image.png" alt="rm -f, rm -r"></p>
</li>
</ul>
<h2 id="cp">cp</h2>
<p>복사 명령어</p>
<ul>
<li><h3 id="cp-파일명1-파일명2"><code>cp 파일명1 파일명2</code></h3>
<p>파일명1을 복사하여 파일명2로 생성</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/77971eb6-12c7-41c5-9e1f-1acde6d3057c/image.png" alt="cp"></p>
</li>
</ul>
<h2 id="mv">mv</h2>
<p>파일을 이동시키는 명령어
파일명을 변경 가능하다</p>
<ul>
<li><h3 id="mv-파일명-폴더명"><code>mv 파일명 폴더명</code></h3>
<p>파일을 폴더로 이동</p>
</li>
<li><h3 id="mv-파일명1-폴더명-파일명2"><code>mv 파일명1 폴더명 파일명2</code></h3>
<p>파일명1을 폴더로 이동시킨다음, 파일명2로 이름을 바꾼다</p>
</li>
<li><h3 id="mv-파일명1-파일명2"><code>mv 파일명1 파일명2</code></h3>
<p>파일명1을 파일명2로 이름을 바꾼다</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/8e52a246-9d28-4434-a2fa-d71732a1908e/image.png" alt="mv"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/f32c33b1-305c-4c56-950c-e6ecb724d535/image.png" alt="mv 파일명1 파일명2"></p>
<h2 id="ln">ln</h2>
<p>링크파일을 만들때 사용하는 명령어</p>
<ul>
<li><h3 id="ln--s소프트링크"><code>ln -s(소프트링크)</code></h3>
(옵션) 바로가기 파일을 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/af9265bd-b5c4-4081-9fdc-2afa622d375e/image.png" alt="ln -s"></p>
<h2 id="grep">grep</h2>
<p>특정 문자열을 찾을 때 사용하는 명령어
파이프라인과 함께 사용하는 경우가 많다.
<img src="https://velog.velcdn.com/images/deong_gu/post/c6b4e895-493f-4654-b32e-58d8127be3af/image.png" alt="grep"></p>
<ul>
<li><h3 id="grep--v"><code>grep -v</code></h3>
지정된 패턴과 일치하는 항목을 제외한다.
<img src="https://velog.velcdn.com/images/deong_gu/post/e2767a98-a079-4d26-a634-b638ec7f1c75/image.png" alt="grep -v"></li>
</ul>
<h2 id="awk">awk</h2>
<blockquote>
<p><strong>AWK</strong>(오크;Aho Weinberger Kernighan)는 유닉스에서 처음 개발된 일반 스크립트 언어이다. AWK의 기본 기능은 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력하는 것
<a href="https://ko.wikipedia.org/wiki/AWK"><strong><em>[위키백과] AWK</em></strong></a></p>
</blockquote>
<p>레코드(행)을 공백 문자로 분리(토큰화)하여 $1 첫번째 필드, $2 두번째 필드... 등으로 분리하여 처리할 수 있게 해준다.
<img src="https://velog.velcdn.com/images/deong_gu/post/586bcf3c-119b-49d8-b417-ca516ab84819/image.png" alt="awk 토큰화"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/8246edba-3d8c-4f8f-a106-1aeaf1554a48/image.png" alt="awk"></p>
<h2 id="netstat">netstat</h2>
<ul>
<li><h3 id="netstat--nlpt"><code>netstat -nlpt</code></h3>
<p>TCP listening 상태의 포트와 프로그램을 보여준다</p>
<p>처음 사용 시에 net-tools를 설치하라는 로그가 화면에 표시된다. <code>sudo apt install net-tools</code> 로 설치 후에 명령어를 사용하면 된다.</p>
<ul>
<li>(옵션) <code>-n</code> 프로세스의 포트번호</li>
<li>(옵션) <code>-l</code> 프로세스의 연결 상태</li>
<li>(옵션) <code>-p</code> 프로세스를 사용하고 있는 서비스명</li>
<li>(옵션) <code>-t</code> tcp로 연결된 포트</li>
</ul>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/734b7cb9-a835-4974-918e-0e5d1663e69a/image.png" alt="netstat -nlpt"></p>
</li>
</ul>
<h2 id="lsb_release--a">lsb_release -a</h2>
<p>우분투 버전과 코드명을 확인할 수 있는 명령어</p>
<h2 id="apt">apt</h2>
<p><a href="https://velog.io/@deong_gu/apt"><strong>[참고글]_ 왜 apt 명령어를 사용하는가?_</strong></a></p>
<ul>
<li><h3 id="apt-cache"><code>apt-cache</code></h3>
업데이트한 패키지 목록을 나타내는 명령어.</li>
</ul>
<ul>
<li><p><code>apt-cache search &lt;name&gt;</code>
apt에서 설치 가능한 패키지를 검색한다.
<img src="https://velog.velcdn.com/images/deong_gu/post/9735735f-c537-4582-944f-c77b705293b5/image.png" alt="apt-cache search"></p>
<ul>
<li><h3 id="apt-list"><code>apt list</code></h3>
업데이트한 패키지 목록을 나타내는 명령어.
<img src="https://velog.velcdn.com/images/deong_gu/post/2d530ff7-e3fd-4f46-8625-30f693b23274/image.png" alt="apt list | grep tomcat"></li>
</ul>
</li>
</ul>
<ul>
<li><h3 id="apt-update"><code>apt update</code></h3>
<p>공식 저장소에서 패키지 목록을 로컬 저장소로 업데이트하는 명령어. (+ sudo 권한 부여)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/126e4d1b-4ac9-4811-83e7-77c484d2a2be/image.png" alt="apt update"></p>
</li>
</ul>
<ul>
<li><h3 id="apt-install"><code>apt install</code></h3>
<p>패키지를 설치하는 명령어
<img src="https://velog.velcdn.com/images/deong_gu/post/9ad56ab5-3961-46a1-ae3e-93539049b450/image.png" alt="apt install"></p>
<ul>
<li>(옵션) <code>-y</code> 설치 진행 여부를 묻지 않고 진행</li>
</ul>
</li>
<li><h3 id="apt-remove"><code>apt remove</code></h3>
<p>패키지를 삭제하는 명령어 (설정 파일은 지우지 않는다)</p>
<ul>
<li><code>sudo apt --purge remove</code> <strong>설정 파일까지</strong> 모두 지운다
<img src="https://velog.velcdn.com/images/deong_gu/post/e7e78cd3-5bb4-4867-998a-d26e0e24a990/image.png" alt="apt remove --purge"></li>
</ul>
</li>
</ul>
<ul>
<li><h3 id="add-apt-repository-저장소이름"><code>add-apt-repository 저장소이름</code></h3>
<p>저장소를 추가하는 명령어 (ex PPA 개인 패키지 저장소)
<img src="https://velog.velcdn.com/images/deong_gu/post/f5a014d2-acfd-4842-b543-41e4ebd19376/image.png" alt="sudo add-apt-repository 저장소"></p>
<ul>
<li><code>sudo add-apt-repository --remove 저장소이름</code> 저장소를 삭제한다</li>
</ul>
</li>
</ul>
<h2 id="systemctl">systemctl</h2>
<p>서비스 제어 명령어
<a href="https://velog.io/@deong_gu/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4"><strong><em>[참고글] 프로세스</em></strong></a></p>
<ul>
<li><h3 id="sudo-systemctl-list-unit-files"><code>sudo systemctl list-unit-files</code></h3>
<p>전체 시스템 목록을 보여준다.
<img src="https://velog.velcdn.com/images/deong_gu/post/59aff2b6-5d12-4b33-957c-5934ad83150c/image.png" alt="systemctl list-unit-files"></p>
</li>
<li><h3 id="sudo-systemctl-status-서비스명"><code>sudo systemctl status 서비스명</code></h3>
<p>서비스의 상태를 확인한다.
<img src="https://velog.velcdn.com/images/deong_gu/post/5b464704-f309-4a64-8980-4f6cf93b0ca4/image.png" alt="systemctl status"></p>
</li>
<li><h3 id="sudo-systemctl-stop-서비스명"><code>sudo systemctl stop 서비스명</code></h3>
<p>서비스를 종료한다. 실행 중인 프로세스를 종료시킨다.
<img src="https://velog.velcdn.com/images/deong_gu/post/c7bc0579-1f63-46d3-a53a-3ca5b585e066/image.png" alt="systemctl stop"></p>
</li>
<li><h3 id="sudo-systemctl-start-서비스명"><code>sudo systemctl start 서비스명</code></h3>
<p>서비스를 시작한다.</p>
</li>
</ul>
<h2 id="ps--ef">ps -ef</h2>
<p>현재 실행중인 프로세스 목록을 보여주는 명령어
<img src="https://velog.velcdn.com/images/deong_gu/post/943fbed4-b2aa-406c-9220-80ae2b2e543a/image.png" alt="ps -ef"></p>
<h2 id="kill">kill</h2>
<p>프로세스에 간단한 메시지를 보내는 명령어
프로세스에 시그널을 보내 원하는 작업을 하게 하는 명령어
프로세스를 종료하는데 많이 사용된다.</p>
<ul>
<li><h3 id="kill--l"><code>kill -l</code></h3>
<p>kill 종료 옵션을 보여준다.
<img src="https://velog.velcdn.com/images/deong_gu/post/5eb32bfc-457f-41c8-9311-9f62bf5bbead/image.png" alt="kill -l"></p>
</li>
<li><h3 id="kill--9-pid"><code>kill -9 [PID]</code></h3>
<p>프로세스를 강제 종료한다.</p>
</li>
</ul>
<hr>
<h2 id="알아둬야할-것">+알아둬야할 것</h2>
<ul>
<li><h3 id="--help"><code>--help</code></h3>
<p>모든 명령어의 사용법을 알려주는 명령어 (리눅스 도움말 명령어)
ex) <code>ls --help</code>, <code>rm --help</code> 등
<img src="https://velog.velcdn.com/images/deong_gu/post/59164b5e-c014-455f-ace0-0475f5e3bb02/image.png" alt="--help"></p>
</li>
<li><h3 id="모든-파일">모든 파일</h3>
<p>숨김파일, 기본파일, 기본폴더를 말한다.
숨김파일은 보통 OS의 중요한 파일이고, &quot;<strong>.파일명</strong>&quot;의 형태를 가진다.</p>
</li>
</ul>
<ul>
<li><h3 id="옵션은-동시에-여러-개를-적용할-수-있다">옵션은 동시에 여러 개를 적용할 수 있다.</h3>
<p>ex) <code>ls -al</code> 숨김파일을 포함하여 자세히 보기
<img src="https://velog.velcdn.com/images/deong_gu/post/f7fce90b-91dc-4e90-a9fc-3a414a46fb75/image.png" alt="ls -al"></p>
</li>
<li><h3 id="ctrl--c"><code>ctrl + c</code></h3>
<p>취소</p>
</li>
<li><h3 id="bin-폴더">bin 폴더</h3>
<p>실행파일(초록색)이 모여 있는 곳</p>
</li>
</ul>
<ul>
<li><h3 id="파이프라인-">파이프라인 <code>|</code></h3>
<p>앞에 실행한 명령어의 출력 결과를 뒤에 실행하는 명령어의 입력 값으로 넣어준다</p>
<p>ex) <code>apt-cache search tomcat | grep tomcat</code> tomcat에 대한 검색 내용에서 tomcat을 찾기
<img src="https://velog.velcdn.com/images/deong_gu/post/f08edd0c-4b8d-4e14-a6bf-3713d6bd8e82/image.png" alt="파이프라인"></p>
</li>
</ul>
<ul>
<li><h3 id="리눅스-최상위-관리자---root">리눅스 최상위 관리자 - <code>root</code></h3>
</li>
<li><h3 id="백틱--은-치환명령어-으로-감싼-부분을-실행결과로-치환한다">백틱 <code>(``)</code> 은 치환명령어 <code>``</code>으로 감싼 부분을 실행결과로 치환한다.</h3>
</li>
<li><h3 id="etcinitd로-이동해서-실행-파일을-실행-또는-중지-할-수-있다"><code>/etc/init.d</code>로 이동해서 실행 파일을 실행 또는 중지 할 수 있다.</h3>
<p><code>sudo [실행파일명] start</code>
<code>sudo [실행파일명] stop</code>
<img src="https://velog.velcdn.com/images/deong_gu/post/aca2284d-d6e8-40db-996d-3c27610cf71a/image.png" alt="/etc/init.d"></p>
</li>
</ul>
<hr>
<p>[참고 자료]</p>
<p>[K-디지털] AWS 리눅스 기반 클라우드 데브옵스 기초 실무 과정 - 데어 프로그래밍</p>
<p><a href="https://arer.tistory.com/198"><strong><em>리눅스 파이프라인 - J. deo의 그알정보:티스토리</em></strong></a> </p>
<p><a href="https://blog.naver.com/ncloud24/221388026417"><em><strong>netstat 명령어를 통한 네트워크 상태 확인 방법 - 엔클라우드24</strong></em></a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RSA]]></title>
            <link>https://velog.io/@deong_gu/RSA</link>
            <guid>https://velog.io/@deong_gu/RSA</guid>
            <pubDate>Tue, 27 Feb 2024 12:14:19 GMT</pubDate>
            <description><![CDATA[<p>RSA에 대해서 심오하게 살펴보는 것이 아니라 쉽게 이해할 수 있도록 정리한 글입니다.
강의를 정리해서 적어놓은 글이니 참고바랍니다.</p>
<hr>
<p>AWS EC2에 접속하려면 private key가 필요하다. 이때 사용한 key가 RSA 형식의 암호키다.
RSA에 대해 알아보자.</p>
<h1 id="rsa">RSA</h1>
<h2 id="대칭키-vs-공개키-기반-암호화-방식rsa">대칭키 VS 공개키 기반 암호화 방식(RSA)</h2>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/113e36b7-b0bc-4499-8d05-f5ca02051aca/image.png" alt="대칭키 방식 VS 공개키 기반 암호화 방식"></p>
<p>데이터를 통신할 때, 제3자가 도중에 데이터를 가로채는 위험이 존재한다.
그래서 데이터를 암호화해야하는데, 이를 위한 암호화 키가 필요하다.</p>
<p><strong>대칭키 방식</strong>의 경우, 데이터를 암호화, 복호화할 때 같은 키를 사용한다. 그래서 대칭키도 통신으로 전송해야한다. (송신자와 수신자가 암호키를 공유해야한다)
하지만 그렇게 되면 대칭키 또한 노출될 위험이 있다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/89089693-4307-4a7d-ad7c-e0e626332527/image.png" alt="RSA"></p>
<p><strong>RSA 방식</strong>은 공개키 기반 암호화 방식이다.
송신자와 수신자 둘 다 각각 키를 두 개를 사용한다.</p>
<h3 id="데이터-전송방법"><strong>데이터 전송방법</strong></h3>
<ol>
<li>데이터를 <strong>수신자의 공개키</strong>로 잠근다. (암호화)</li>
<li>그 데이터를 다시 <strong>송신자의 비밀키</strong>로 잠근다. (전자서명)</li>
<li><strong>전송</strong>한다.</li>
</ol>
<h3 id="데이터-받는-방법"><strong>데이터 받는 방법</strong></h3>
<ol>
<li>데이터를 <strong>송신자의 공개키</strong>로 연다. (전자서명 검증)</li>
<li>열리면 <strong>수신자의 비밀키</strong>로 연다. (데이터 복호화)</li>
</ol>
<hr>
<h2 id="요약">요약</h2>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/c166248b-18ca-4b94-ac16-cc204944d177/image.png" alt="요약"></p>
<blockquote>
<p>암호화(수신자의 공개키) - 전자서명(송신자의 비밀키) - 서명 검증(송신자의 공개키) - 복호화(수신자의 비밀키)</p>
</blockquote>
<hr>
<h2 id="aws에서의-rsa">AWS에서의 RSA</h2>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/9a2de445-c27f-447a-8ea6-6101a494d5b2/image.png" alt="AWS에서의 RSA"></p>
<p>AWS EC2 서버에 원격 접속을 하고 숨겨진 폴더를 살펴보면 Authorized_Key 파일이 있는데, 이것이 <strong>공개키</strong>이다.</p>
<p>우리가 접속할 때, <strong>비밀키</strong>를 이용해서 인증하여 완료되면 세션을 생성할 수 있다. (<strong>전자서명</strong> 인증)</p>
<p>(세션이 생성됐다고 하는 의미는 네트워크 공부하면 더 자세히 알 수 있습니다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 서버]]></title>
            <link>https://velog.io/@deong_gu/AWS-EC2-%EC%84%9C%EB%B2%84</link>
            <guid>https://velog.io/@deong_gu/AWS-EC2-%EC%84%9C%EB%B2%84</guid>
            <pubDate>Mon, 26 Feb 2024 09:10:02 GMT</pubDate>
            <description><![CDATA[<p>AWS EC2에 대한 자세한 내용은 공식사이트 문서를 참조하시길 바랍니다.</p>
<p>간단하게 이해하기 위해 <strong>강의 내용을 정리하는 글</strong>입니다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/84d39614-fba0-4bb3-93ee-dae67e63a316/image.png" alt="EC2 1/2"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/f730fa6c-4de2-427a-bcb7-ee200dfe7aaf/image.png" alt="EC2 2/2"></p>
<h2 id="ec2">EC2</h2>
<p>AWS는 전세계에 리전을 가지고 있다.
즉, 서울, 도쿄, 유럽, 동남아시아, 미국 등 <strong>많은 지역에 많은 컴퓨터</strong>를 가지고 있다. </p>
<p>AWS EC2 서버를 이용한다는 것은 AWS에서 인프라를 제공 받는 것이고 이를 쉽게 말하면 <strong>빈 컴퓨터를 임대하는 것</strong>을 말한다. </p>
<p>EC2 서버 임대하는 방법은 아래 글을 참조하기바랍니다.</p>
<ol>
<li><p><a href="log.io/@deong_gu/AWS-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-1.-aws-%EA%B3%84%EC%A0%95-%EB%A7%8C%EB%93%A4%EA%B8%B0">AWS 회원가입</a></p>
</li>
<li><p><a href="https://velog.io/@deong_gu/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A0%91%EC%86%8D%ED%95%B4%EB%B3%B4%EA%B8%B0">EC2 인스턴스 생성 및 접속 방법</a></p>
</li>
</ol>
<p>위의 과정을 한 문장으로 요약하면</p>
<blockquote>
<p>AWS 사이트에 접속을 해서 운영체제(OS)를 선택해서 컴퓨터를 임대한다.</p>
</blockquote>
<hr>
<h2 id="원격-접속과-방화벽">원격 접속과 방화벽</h2>
<p>AWS가 소유하고 있는, 다양한 지역에 있는, 수많은 컴퓨터 중 하나를 임대했기 때문에 우리가 이 컴퓨터에 접속하기 위해서는, 우리 로컬 컴퓨터에서 임대한 컴퓨터(클라우드 컴퓨터)로 <strong>원격 접속</strong>을 해야한다. </p>
<p>하지만 모든 사람들이 내가 임대한 컴퓨터를 접속하게 되면 문제가 발생하기 때문에 이 클라우드 컴퓨터의 경우 <strong>방화벽</strong>을 가지고 있다.
(내가 빌린 컴퓨터야!!! 보호하자!!)</p>
<p>결국 로컬 컴퓨터에서 임대한 컴퓨터로 IP주소를 가지고 원격 접속을 하게 되는데 이때 어떤 프로그램을 선택하게되는데, 보통 <strong>22번 포트 사용</strong>하게 된다.</p>
<p>하지만 방화벽은 모든 포트 차단 (포트 번호 0~ 65535까지 차단)한 상태이고, 이를 풀려면(원하는 포트를 개방) <strong>인바운드 규칙을 작성</strong>해야한다. (22번 포트 개방)</p>
<p>ex) 어떤 IP의 어떤 포트로 접근을 허용, 어떤 보안 그룹을 가지고 있는 서버의 접속을 허용 등</p>
<hr>
<h2 id="원격-접속을-위해-22번-포트를-개방한-이유">원격 접속을 위해 22번 포트를 개방한 이유</h2>
<p>22번 포트는 <strong>SSH(Secure Shell)</strong>라는 프로그램에 접속 가능하다.</p>
<h3 id="shell">Shell</h3>
<p>보통 <strong>하드웨어(CPU, RAM)</strong>를 우리가 직접 <strong>제어하는 것은 어렵다</strong>.
(인베디드 개발자들도 웬만해서 직접 건드리지 않는다.)
따라서 <strong>OS(운영체제)의 도움</strong>이 필요하다.</p>
<p>결국 흐름을 보면</p>
<ol>
<li>사람(개발자)이(가) OS에게 <strong>명령</strong>을 내린다.</li>
<li>OS가 하드웨어 <strong>제어</strong></li>
</ol>
<p>이때</p>
<blockquote>
<p><strong>사람이 OS에게 명령을 내릴 때 사용하는 언어가 바로 Shell이다.</strong></p>
</blockquote>
<p>운영체제에 따라 shell 언어가 다르다. (윈도우, 리눅스 등)
ex) cd 폴더 이동, mkdir 폴더 생성, dir 해당 폴더 검색 등</p>
<p>OS는 Shell 명령을 받아서 컨버팅(번역)해서 하드웨어를 제어한다.
사람입장에서는 하드웨어를 직접 제어하는 것이 아니라 편하다.</p>
<h3 id="22번-포트에-접속했다는-것의-의미">22번 포트에 접속했다는 것의 의미</h3>
<p>22번 포트에 접속했다는 것은 Secure Shell로 접속했다는것
이렇게 되면 <strong>shell명령을 원격으로 내릴수 있다.</strong>
이러한 환경을 CLI(Command Line interface)환경이라고 한다. 
(<strong>명령어</strong>를 작성하는 환경)
ex) 터미널</p>
<blockquote>
<p>로컬 컴퓨터에서 AWS 컴퓨터로 원격 접속한다. 그곳에서 OS에게 Shell명령을 내릴 수 있다. =&gt; OS가 하드웨어를 제어한다.</p>
</blockquote>
<h3 id="왜-secure가-붙는가">왜 Secure가 붙는가?</h3>
<p>우리가 내리는 명령 중에 민감한 정보를 입력하는 경우 (비밀번호, 아이디등)에 Secure가 적용되있지 않으면 중간에서 데이터를 노출당할 수 있다. 사용하면 내 데이터가 암호화되서 전송된다.
컴퓨터에 전송되면 디코딩(번역)된다.</p>
<hr>
<h2 id="흐름-요약-정리">흐름 요약 정리</h2>
<ol>
<li>리전에 컴퓨터를 임대 </li>
<li>운영체제 설치</li>
<li>컴퓨터에 원격접속을 위해 인바운드 규칙으로 22번 포트를 개방</li>
<li>프로그램을 이용해서 원격으로 접속 (다양한 접속 방법이 존재함)</li>
<li>우리가 내리는 명령어가 다른 사람들에게 노출되는 것을 막기 위해 secure shell을 사용 (그냥 shell이 아니라) 암호화가 되서 전달</li>
<li>CLI 환경에서 명령어를 통해 원하는 작업을 한다.</li>
</ol>
<hr>
<p>[참고 자료]</p>
<p>[K-디지털] AWS 리눅스 기반 클라우드 데브옵스 기초 실무 과정 - 데어프로그래밍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Packet, IP, Port]]></title>
            <link>https://velog.io/@deong_gu/Packet-IP-Port</link>
            <guid>https://velog.io/@deong_gu/Packet-IP-Port</guid>
            <pubDate>Sun, 25 Feb 2024 07:15:46 GMT</pubDate>
            <description><![CDATA[<h1 id="용어-설명">용어 설명</h1>
<h2 id="패킷-packet"><a href="https://developer.mozilla.org/ko/docs/Glossary/Packet">패킷 (Packet)</a></h2>
<blockquote>
<p>패킷 또는 네트워크 패킷은 네트워크를 통해 전송되는 형식화된 데이터 덩어리입니다. 네트워크 패킷의 주요 컴포넌트는 사용자 데이터와 제어 정보입니다. 사용자 데이터는 &#39;페이로드(payload)&#39;로 알려져 있습니다. 제어정보는 페이로드를 전달하기 위한 정보입니다. 소스와 목적지에 대한 네트워크 주소, 순서 정보, 오류 감지 코드로 구성되며 일반적으로 패킷 헤더와 푸터에서 발견됩니다.</p>
</blockquote>
<blockquote>
<p>정보 기술에서 패킷 방식의 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다. </p>
</blockquote>
<blockquote>
<p>데이터(정보)를 일정 크기로 자른 것</p>
</blockquote>
<blockquote>
<p>네트워크에서 출발지와 목적지 간에 라우팅 되는 데이터 단위 </p>
</blockquote>
<blockquote>
<p>네트워크를 통해 전송하기 쉽도록 자른 데이터의 전송 단위이다.</p>
</blockquote>
<blockquote>
<p>패킷은 컴퓨터 네트워크에서 데이터를 전송하는 기본 단위입니다.
The basic unit of communication between a source and a destination in a network.</p>
</blockquote>
<hr>
<h1 id="데이터-교환-방식-통신">데이터 교환 방식 (통신)</h1>
<h2 id="1-서킷-스위칭circuit-switching--회선-교환-방식">1. 서킷 스위칭(Circuit switching) / 회선 교환 방식</h2>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/522509b6-d214-46d9-a0de-79eb6a239bc9/image.png" alt="서킷 스위칭"></p>
<p>A와 B가 통신을 할 때 다이렉트하게 전선으로 연결하여 데이터를 전달하는게 가장 빠르고 효율적이다.</p>
<p>상대방이 많아지면 선이 많아짐 =&gt; 비용이 많이듦</p>
<h2 id="2-패킷-스위칭packet-switching">2. 패킷 스위칭(Packet switching)</h2>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/2f64f296-dbd9-48df-9647-907999a2a69c/image.png" alt="패킷 스위칭 1/3"></p>
<h3 id="흐름">흐름</h3>
<ol>
<li>데이터를 잘게 쪼개서 (패킷) 전달</li>
<li>라우터에서 데이터를 받아서 패킷 포워딩
(다양한 라우터가 존재할 수 있다)</li>
<li>어디로 갈 지 라우터가 결정</li>
<li>다시 라우터에서 패킷 포워딩</li>
<li>목적지에 도착</li>
<li>재조립</li>
</ol>
<p>온전한 재조립을 하기 위해서 필요한 <strong>헤더</strong>
----------헤더---------- ----데이터----
순서 | 출발지 | 목적지  </p>
<h3 id="패킷-스위칭의-장점">패킷 스위칭의 장점</h3>
<p>선이 늘어날 필요가 없다. =&gt; 비용이 적게듦</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/d21c451d-dd01-4142-8de1-fa57aa4a5514/image.png" alt="패킷 스위칭 2/3"></p>
<h3 id="if-데이터를-패킷으로-쪼개지-않으면-어떻게-되는가">if 데이터를 패킷으로 쪼개지 않으면 어떻게 되는가?</h3>
<p>동시에 데이터를 전달할 때, 패킷으로 쪼개지 않고 한 번에 많은 데이터(ex 1GB)를 어느 한 곳에서 보내게 될 경우, 다른 곳은 wait가 걸리게 된다. =&gt; <strong>동시에 보내지 못함</strong></p>
<h3 id="ip-주소-퍼블릭ip-공인ip">IP 주소 (퍼블릭IP, 공인IP)</h3>
<p>목적지 주소가 간단하다면 전 세계 수많은 컴퓨터를 구분하기 힘들고 충돌가능성이 존재한다.</p>
<p>따라서 유일한 값으로 정숫값을 사용 (0 ~ 42억 9천/ 0.0.0.0 ~ 255.255.255.255) =&gt; <strong>IPv4 방식</strong> (ex 122.331.23.12)</p>
<h3 id="port-포트번호">Port 포트번호</h3>
<p>컴퓨터가 전달 받은 데이터를 (통신이 되는) 어떤 프로그램에게 전달해야하는 지 모른다.</p>
<p>=&gt; 포트번호(<strong>정숫값</strong>/ 2Byte / 2^16 )를 붙여서 데이터를 보내야한다.</p>
<p>=&gt; 목적지에 도착 후에 <strong>프로그램을 선택</strong></p>
<h3 id="요약-사진">요약 사진</h3>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/6ed3fa4d-9af6-40af-87b5-662974af1a8d/image.png" alt="패킷 스위칭 3/3"></p>
<hr>
<h1 id="참고-자료">[참고 자료]</h1>
<p><a href="https://developer.mozilla.org/ko/docs/Glossary/Packet">[mozilla] 패킷 정의</a></p>
<p><a href="http://www.ktword.co.kr/test/view/view.php?no=421">[정보통신기술용어해설] 패킷</a></p>
<p><a href="https://engineerinsight.tistory.com/302">[Network] Packet: 패킷의 개념, 생성 원리</a></p>
<p><a href="https://kongit.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%8C%A8%ED%82%B7Network-Packet%EC%9D%B4%EB%9E%80-%EC%A0%95%EC%9D%98-%ED%8C%A8%ED%82%B7-%EC%86%90%EC%8B%A4">[콩코미의 IT Story] 네트워크 패킷이란? 정의/ 패킷 손실</a></p>
<p>[K-디지털] AWS 리눅스 기반 클라우드 데브옵스 기초 실무 과정 강의자료 - 데어 프로그래밍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 인스턴스 생성 및 접속해보기]]></title>
            <link>https://velog.io/@deong_gu/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A0%91%EC%86%8D%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@deong_gu/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%A0%91%EC%86%8D%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 21 Feb 2024 14:46:58 GMT</pubDate>
            <description><![CDATA[<p>AWS EC2에 대한 자세한 내용은 아래 공식 문서를 참고하시길 바랍니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/d597e55f-d8a1-4a23-bb04-ded59ec50a9e/image.png" alt="AWS EC2"></p>
<blockquote>
<p>AWS 클라우드에서 Amazon EC2를 통해 확장 가능 컴퓨팅 용량을 활용하면 하드웨어의 제약 없이 애플리케이션을 개발하고 배포할 수 있습니다.
docs.aws.amazon.com</p>
</blockquote>
<p><a href="https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html">https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html</a></p>
<hr>
<h2 id="인스턴스-생성하기">인스턴스 생성하기</h2>
<p>AWS 페이지 로그인하면 <strong>콘솔 홈</strong>으로 이동하게됩니다.
<strong>검색창을 클릭</strong>해서 <strong>EC2를 검색</strong>하거나
이전에 이용했다면 최근에 방문한 서비스에서 찾아서 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/89dadbf0-33ca-482e-9155-421bfb4c2fde/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/2b845e9f-76db-4092-a388-560327814c8f/image.png" alt=""></p>
<hr>
<p>EC2 서버를 이용하기 위해서는 인스턴스를 생성해야합니다.
그러기 위해서는 인스턴스 관리 페이지로 이동해야합니다.
방법은 <strong>인스턴스 클릭</strong></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/92ffa893-d9c3-4eaf-91b5-ef212c0cf46b/image.png" alt=""></p>
<hr>
<p>그전에 <strong>원하는 리전을 선택</strong>하고 넘어갑시다.
(전세계적으로 배치된 컴퓨터 중 어느 지역(나라)에 위치한 컴퓨터를 사용할 것인지)</p>
<p>우측 상단에 계정명(사용자명) 왼쪽의 드롭다운 메뉴를 클릭해서 선택</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/61dcab2e-6cb6-4673-b41f-36c7c0ff68cc/image.png" alt=""></p>
<hr>
<p>인스턴스 관리 페이지에서 <strong>인스턴스 시작 클릭</strong>으로 인스턴스 생성 페이지로 이동</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/a70c6d43-68ec-45c5-88bd-5b123a238d80/image.png" alt=""></p>
<hr>
<p>EC2 인스턴스 이름 설정하기</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/e0dc937c-b4d0-48a5-ad65-09a1082a0f54/image.png" alt=""></p>
<hr>
<p>사용하고자하는 소프트웨어 구성(OS 운영체제) 결정하기
프리 티어를 사용하기 때문에 <strong>프리 티어 사용 가능</strong>이라고 적혀 있는 버전 AMI(Amazon Machine Image)를 선택해야합니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/ee61c8f3-220f-42cc-8b6f-e1f4b10c1876/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/c75322e0-1baf-4067-bb82-5de05ac7503c/image.png" alt=""></p>
<hr>
<p><strong>인스턴스 유형 (cpu, 용량) 선택</strong>하기
성능에 따라 다양하게 선택이 가능합니다.
<strong>프리 티어 사용 가능</strong>이라고 적힌 유형을 선택</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/3cef4e54-cc02-4d2a-828a-101194ce5451/image.png" alt=""></p>
<hr>
<p>EC2 인스턴스 서버에 접속하기 위해 필요한 <strong>키 페어 생성</strong>
키가 없으면 <strong>새 키 페어 생성</strong>을 클릭</p>
<p>처음 인스턴스를 생성할 경우 그냥 <strong>기본 설정</strong>을 사용해도 상관없습니다.
(다른 설정은 구글링이나 최상단 EC2 공식 문서 참조)
(키페어 유형 중에 RSA 방식이 궁금하다면 해당 <a href="https://velog.io/@deong_gu/RSA"><em><strong>링크</strong></em></a>를 참조바람) </p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/0e3db83d-883d-41e5-b327-553c39620921/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/ebda4b8e-ee66-4f77-8156-0f115058b000/image.png" alt=""></p>
<hr>
<p>인스턴스의 보안을 위해서 접근가능한 포트나 조건등을 설정할 수 있는 <strong>보안그룹</strong>인데, 생성 이후 추가 설정 가능하기 때문에 처음 인스턴스 생성 시에는 <strong>기본 값</strong>으로 놔두고 진행해도됩니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/7717f8db-9493-43d9-acc5-c671c5426e73/image.png" alt=""></p>
<hr>
<p>인스턴스 서버의 <strong>용량을 설정</strong>하기 (앞서 선택했던 유형의 용량이 최대범위)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/08d1ac0c-bcd6-4820-8873-3569b6c93e59/image.png" alt=""></p>
<hr>
<p>기본적인 설정을 마무리했고, 우측 요약탭에 있는 <strong>인스턴스 시작 버튼을 클릭</strong>하는 것으로 마무리합니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/cc05f1d3-75d5-4cd8-b019-e428c600d034/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/3d44b643-868f-4dd7-a3d4-70ca1aafca7f/image.png" alt=""></p>
<hr>
<h2 id="인스턴스-접속하기">인스턴스 접속하기</h2>
<p>생성한 인스턴스에 접속하는 방법에는 여러 가지가 존재합니다.</p>
<ol>
<li>프로그램(ex MobaXterm)을 이용해서 접속</li>
<li>CLI로 접속</li>
<li>EC2 인스턴스 페이지에서 바로 접속(연결)</li>
</ol>
<hr>
<h3 id="프로그램을-이용해서-접속">프로그램을 이용해서 접속</h3>
<p>여러가지 관련 프로그램들이 많지만, 저의 경우 MobaXterm이라는 무료프로그램을 이용해서 편하고 직관적으로 접속하였습니다.</p>
<p><a href="https://mobaxterm.mobatek.net/">https://mobaxterm.mobatek.net/</a></p>
<p>프로그램 실행 후, 좌측 상단 메뉴 중에 <strong>Session</strong> 클릭
열리는 창에서 상단에 있는 <strong>SSH</strong>를 클릭(선택)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/7b9d5a3f-7fd2-4671-805d-7c7923657ffc/image.png" alt=""></p>
<p><strong>Remote host</strong>에는 <strong>EC2 인스턴스 관리 페이지</strong>에서 생성한 인스턴스를 클릭 후에 아래 세부 정보 탭의 <strong>퍼블릭 IPv4주소</strong>를 입력</p>
<p>Specify username에는 <strong>ubuntu</strong>를 입력 (os에따라 다를 수 있음)</p>
<p>이후 아래에 Advanced SSH settings에서 Use private key를 설정
우측 문서모양 아이콘을 클릭해서 인스턴스 생성 페이지에서 만들었던 키 페어 파일을 선택</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/e3047db1-c83f-4a0b-8f00-3ab54f9e86c8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/fef56051-c206-46e2-85eb-ab3724c3fa6c/image.png" alt=""></p>
<p>설정 끝 
OK 클릭하면 인스턴스에 접속합니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/d7df4544-d20a-459f-b88b-40df5a2c27bf/image.png" alt=""></p>
<hr>
<h3 id="cli로-접속">CLI로 접속</h3>
<p>키 페어가 있는 위치로 이동 후에 파일명을 명령어에 입력하거나
명령어에 키 페어 위치 포함하여 입력하는 방법이 있습니다. (결국에는 같음)</p>
<p>키 페어 파일에는 권한이 없기 때문에 먼저 권한 설정을 해주어야한다. (리눅스 명령어는 해당 <a href="https://velog.io/@deong_gu/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-SHELL"><strong><em>링크</em></strong></a>를 참고하시길 바랍니다.)</p>
<p>경로는 터미널(CLI)에 파일을 드래그앤드롭하면 알 수 있습니다. 직접 입력해도 상관없음</p>
<p>IP주소는 <strong>인스턴스 관리 페이지</strong>에서 인스턴스를 선택하고 아래 세부정보에 있는 <strong>퍼블릭 IPv4주소</strong>를 사용하면 됩니다.</p>
<pre><code>// 사용자에게 읽기+쓰기+실행 권한 부여
chmod 700 파일명.pem

// 인스턴스 접속
ssh -i 파일명.pem 사용자명@ip주소
ssh -i 경로/파일명.pem 사용자명@ip주소

ex) ssh -i test.pem ubuntu@13.125.252.60
    ssh -i /c/Users/3/Desktop/test.pem ubuntu@13.125.252.60
</code></pre><p><img src="https://velog.velcdn.com/images/deong_gu/post/6cf8a132-8286-4f8a-b0ee-ac0ac9a76407/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/e354f604-dc72-4a70-8164-840186347f1e/image.png" alt=""></p>
<hr>
<h3 id="ec2-인스턴스-페이지에서-바로-접속">EC2 인스턴스 페이지에서 바로 접속</h3>
<p>인스턴스 페이지에서 접속하려는 인스턴스를 선택하고 <strong>상단에 연결 버튼</strong> 클릭</p>
<p>넘어온 페이지에서 <strong>연결 버튼</strong> 누르면 인스턴스에 접속 완료</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/65107f69-534d-4d36-bab5-9516b995ad60/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/7f334ace-87de-4a71-b476-3fdab2a49d0e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/97b352ac-5a2c-42a2-80a4-225de8b22031/image.png" alt=""></p>
<hr>
<p>EC2 인스턴스를 생성하고 접속하는 과정을 정리했는데, AWS는 EC2 이외에도 많은 기능들을 제공하고 있으니, 다양하게 활용해보시길 바랍니다.</p>
<p>사용하지 않는 인스턴스는 바로바로 종료하시길 바랍니다.
(인스턴스 선택 후에 인스턴스 상태 버튼 클릭 후, 인스턴스 종료하면 됩니다. 종료되기까지 시간이 조금 걸리니 당황하실 필요없습니다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS 시작하기 1. aws 계정 만들기]]></title>
            <link>https://velog.io/@deong_gu/AWS-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-1.-aws-%EA%B3%84%EC%A0%95-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@deong_gu/AWS-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-1.-aws-%EA%B3%84%EC%A0%95-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 19 Feb 2024 12:54:09 GMT</pubDate>
            <description><![CDATA[<p>AWS를 처음 이용하는 경우</p>
<p>보통 프리티어로 무료로 프로젝트를 배포하려는 목적인 경우가 많다.</p>
<p><strong>먼저 계정을 만들어야한다.</strong></p>
<hr>
<p>사용하시는 검색엔진 ex) google, naver 등 에서 <strong>aws</strong>를 검색
<strong>Amazon Web Services</strong> 클릭</p>
<p>![aws 키워드 검색]
(<a href="https://velog.velcdn.com/images/deong_gu/post/4195fd61-7e62-4a95-adc6-f6826c16cfc0/image.png">https://velog.velcdn.com/images/deong_gu/post/4195fd61-7e62-4a95-adc6-f6826c16cfc0/image.png</a>)</p>
<p>클릭하면 aws 페이지가 열립니다.
우측 상단의 <strong>콘솔에 로그인</strong> 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/282a29f7-355d-401f-bd9e-4e4cea8612d6/image.png" alt="aws 첫페이지"></p>
<p>aws 로그인 페이지로 이동하게되는데 처음 이용하는거면 계정이 없기때문에 <strong>AWS 계정 새로 만들기</strong> 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/bf32b3f4-3847-4f21-8dce-01b08cc6ed5b/image.png" alt="aws 로그인 페이지"></p>
<p>사용가능한 <strong>이메일 주소</strong>를 입력하고, 계정이름은 <strong>영어</strong>로 작성 (한글 안됩니다. 이외 라틴 문자 기반 언어 가능)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/ebdf2caf-21a9-4fc5-93a9-1ad16927e80c/image.png" alt="aws 계정 회원가입 페이지"></p>
<p>작성하신 이메일 주소로 확인코드를 받게되는데, 코드 작성 후 <strong>확인</strong> 버튼 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/a2b68cff-7f64-47b1-af05-9c342875593b/image.png" alt="aws 계정 회원가입 이메일 확인"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/96daac5f-1dc5-4585-9ffe-240e546436aa/image.png" alt="이메일 확인 코드"></p>
<p>사용할 암호 작성 후 <strong>계속(1/5단계)</strong> 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/ec4a9b07-8ab7-4f07-b9fe-30de532de1d0/image.png" alt="aws 계정 회원가입 1단계 암호 설정"></p>
<p><strong>회원 기본 정보</strong>를 작성해주시면 되는데, 저는 한글로 작성했습니다.
왼쪽에 보시면 프리 티어 혜택이 나와습니다. (우리가 aws를 연습에 사용하는 이유 : <strong>무료</strong>)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/8444e74b-0b7e-4860-ad7a-2ec04271892d/image.png" alt="aws 계정 회원가입 2단계 정보 입력"></p>
<p>결제를 위한 신용카드(체크카드도 가능) 정보를 입력
주의해야할 사항이 <strong>해외결제가 가능</strong>해야한다. (카드에 visa나 마스터카드등 마크있는지 확인하는 것이 가장 빠른 방법)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/4092c9a8-0fc9-4b61-a5dc-30de9a041f6f/image.png" alt="aws 계정 회원가입 3단계 신용카드 입력"></p>
<p>결제 가능 여부를 확인하기 위한 <strong>카드정보 입력</strong> (1원 결제)</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/91c9e4fe-7ea2-455f-b3fb-ac80dbd4c4aa/image.png" alt="aws 계정 회원가입 4단계 카드정보 입력"></p>
<p>본인 확인을 위한 수단을 정하고 클릭</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/fc571143-4e73-4d7b-a1a1-228eefcfe29b/image.png" alt="aws 계정 회원가입 4단계 본인 확인"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/7d869840-222d-4888-90a0-91cbc048a68c/image.png" alt="aws 계정 회원가입 4단계 본인 확인 코드 입력"></p>
<p>배포 연습만을 위하고 왠만하면 <strong>기본 지원 - 무료</strong>를 선택해주시면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/9cb34ca9-59f6-4876-9cba-64aa4fc00165/image.png" alt="aws 계정 회원가입 5단계 플랜 선택"></p>
<p><img src="https://velog.velcdn.com/images/deong_gu/post/1c456ab4-bf76-4f01-acb9-fe68b7586d15/image.png" alt="aws 계정 회원가입 5단계 완료"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS 배포를 위해 필요한 학습 범위]]></title>
            <link>https://velog.io/@deong_gu/AWS-%EB%B0%B0%ED%8F%AC%EB%A5%BC-%EC%9C%84%ED%95%B4-%ED%95%84%EC%9A%94%ED%95%9C-%ED%95%99%EC%8A%B5-%EB%B2%94%EC%9C%84</link>
            <guid>https://velog.io/@deong_gu/AWS-%EB%B0%B0%ED%8F%AC%EB%A5%BC-%EC%9C%84%ED%95%B4-%ED%95%84%EC%9A%94%ED%95%9C-%ED%95%99%EC%8A%B5-%EB%B2%94%EC%9C%84</guid>
            <pubDate>Sat, 17 Feb 2024 12:42:14 GMT</pubDate>
            <description><![CDATA[<h3 id="ec2">EC2</h3>
<ul>
<li>클라우드 서비스에 내 프로젝트를 단순배포하기 위해 환경을 구축
Iaas (인프라 - 물리적 컴퓨터 제공)</li>
</ul>
<hr>
<h3 id="shell-script">Shell Script</h3>
<ul>
<li>클라우드 서비스에 내 프로젝트를 배포를 간편하게 한다</li>
</ul>
<hr>
<h3 id="elastic-beanstalk">Elastic Beanstalk</h3>
<ul>
<li>클라우드 서비스에 <strong>환경 구축 없이</strong> 내 프로젝트를 배포한다.
Paas (플랫폼 - 물리적 컴퓨터(플랫폼)</li>
</ul>
<hr>
<h3 id="cicd-도구-github-action-젠킨스-트래비스">CI/CD 도구 (Github Action, 젠킨스, 트래비스)</h3>
<ul>
<li>클라우드 서비스에 배포 자동화를 구축해본다.</li>
</ul>
<hr>
<h3 id="로드밸런서-롤링-배포">로드밸런서, 롤링 배포</h3>
<ul>
<li>클라우드 서비스에 무중단 배포를 해본다.</li>
</ul>
<hr>
<h3 id="network-road-balancer">Network road Balancer</h3>
<ul>
<li>정적 IP할당</li>
</ul>
<hr>
<h3 id="aws-배포-흐름">AWS 배포 흐름</h3>
<ul>
<li>온디멘드
<img src="https://velog.velcdn.com/images/deong_gu/post/a95126e0-9971-49b5-8e80-c5d5a9705f5f/image.jpg" alt="aws 배포 흐름"></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>