<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>nabang kim</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 27 Sep 2021 00:13:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>nabang kim</title>
            <url>https://images.velog.io/images/heewonkim-dev/profile/78c18b2d-ab69-4823-955a-3d971cdc2ac3/IMG_4465-min.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. nabang kim. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/heewonkim-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Today I Learned [2021. 9. 27. Mon]]]></title>
            <link>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-27.-Mon</link>
            <guid>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-27.-Mon</guid>
            <pubDate>Mon, 27 Sep 2021 00:13:13 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 27일 월요일의 배운 내용을 기록한 문서입니다.<br>(내용은 바로 밑에 링크를 달아두었고 대신 Achievement Goal을 적어두었습니다.🙂)</p>
<p>👉🏻<strong>문서 1번</strong>: <a href="https://velog.io/@heewonkim-dev/AWS-TIL-05">https://velog.io/@heewonkim-dev/AWS-TIL-05</a></p>
<p><br><br></p>
<h2 id="achievement-goals">Achievement Goals</h2>
<ul>
<li>배포 자동화에 정의와 이점에 대해 설명할 수 있다.</li>
<li>배포 파이프라인이 무엇인지 정의할 수 있다.</li>
<li>파이프라인을 구성하는 단계(Stages)와 작업(Actions)에 대해 설명할 수 있다.</li>
<li>AWS 개발자 도구를 활용하여 파이프라인을 구축할 수 있다.</li>
<li>배포 자동화 파이프라인 구축 과정에서 문제가 발생할 경우, log 파일과 공식 문서를 통해 해결할 수 있다.</li>
<li>AWS에서 제공하는 IAM 서비스를 이해하고 사용할 수 있다.<ul>
<li>그룹, 사용자, 정책, 역할의 차이점과 특징에 대해서 이해할 수 있다.</li>
<li>IAM 정책에 대해 이해하고 특정 주체에게 권한을 부여할 수 있다.</li>
<li>IAM 보안 모범 사례에 대해 찾아보고, 서비스를 이용하며 적용할 수 있다.</li>
</ul>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS TIL 05]]></title>
            <link>https://velog.io/@heewonkim-dev/AWS-TIL-05</link>
            <guid>https://velog.io/@heewonkim-dev/AWS-TIL-05</guid>
            <pubDate>Mon, 27 Sep 2021 00:12:52 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 27일에 작성된 문서 입니다.
aws 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="배포-자동화">배포 자동화</h2>
<h3 id="한-번의-클릭-명령어-입력으로-전체-배포-과정을-자동으로-진행">한 번의 클릭, 명령어 입력으로 전체 배포 과정을 자동으로 진행</h3>
<ul>
<li>반복적인 배포 과정을 자동화해 시간 절약.</li>
<li>휴먼 에러(Human Error) 방지.<ul>
<li>휴먼 에러 : 사람이 수동 배포 과정을 진행하는 중에 생기는 실수</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="배포-자동화-파이프라인">배포 자동화 파이프라인</h2>
<h3 id="소스-코드의-관리부터-실제-서비스로의-배포-과정">소스 코드의 관리부터 실제 서비스로의 배포 과정</h3>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/HoOJ0FHkL-1621330144336.png" alt=""> </p>
<ul>
<li>파이프라인은 전체 배포 과정을 여러 단계(Stages)로 분리 <ul>
<li>각 단계는 파이프라인 안에서 순차적 실행<ul>
<li>단계마다 주어진 작업(Actions) 수행</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<blockquote>
<p>파이프라인에는 대표적으로 쓰이는 세 가지 단계가 존재합니다. 
각 단계의 이름 및 수행하는 작업에 대해서 알아보겠습니다.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="left">단계 이름</th>
<th align="left">수행 작업</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. Source 단계</strong></td>
<td align="left">원격 저장소에 관리되는<strong>소스 코드에 변경이 일어날 경우, 이를 감지하고 다음 단계로 전달</strong></td>
</tr>
<tr>
<td align="left"><strong>2. Build 단계</strong></td>
<td align="left">Source 단계에서 전달받은 코드를 <strong>컴파일, 빌드, 테스트하여 가공.</strong></td>
</tr>
<tr>
<td align="left"></td>
<td align="left">Build 단계를 거쳐 <strong>생성된 결과물을 다음 단계로 전달</strong></td>
</tr>
<tr>
<td align="left"><strong>3. Deploy 단계</strong></td>
<td align="left">Build 단계로부터 전달받은 <strong>결과물을 실제 서비스에 반영</strong></td>
</tr>
</tbody></table>
<p><br><br>
<br></p>
<h2 id="aws-개발자-도구">AWS 개발자 도구</h2>
<h3 id="개발자-도구-섹션-제공-서비스로-배포-자동화-파이프라인을-구축">개발자 도구 섹션 제공 서비스로 배포 자동화 파이프라인을 구축.</h3>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/7zc2sedy_-1621319369901.png" alt=""></p>
<br>  

<h3 id="codecommit--source-단계를-구성할-때-이용">CodeCommit : Source 단계를 구성할 때 이용</h3>
<h4 id="github과-유사한-서비스를-제공하는-버전-관리-도구">GitHub과 유사한 서비스를 제공하는 버전 관리 도구.</h4>
<ul>
<li>CodeCommit 서비스는 <strong>보안 기능</strong>에 강점. </li>
<li>CodeCommit을 사용할 때는 <strong>과금 가능성</strong>을 고려해야 한다. <ul>
<li>프리티어 한계 이상으로 사용할 시 사용 요금이 부과될 수도 있다. </li>
<li><strong>사이드 프로젝트나 가볍게 작성한 소스 코드를 저장해야 할 경우 GitHub</strong>을 이용하는 것이 효과적.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="codebuild--build-단계에서-이용">CodeBuild : Build 단계에서 이용</h3>
<ul>
<li>유닛 테스트, 컴파일, 빌드와 같은 <strong>빌드 단계에서 필수적으로 실행되어야 할 작업을 명령어러 실행</strong>할 수 있다.</li>
</ul>
<p><br><br></p>
<h3 id="codedeploy--deploy-단계를-구성할-때-이용">CodeDeploy : Deploy 단계를 구성할 때 이용</h3>
<ul>
<li>실행되는 <strong>서버 애플리케이션에 실시간으로 변경 사항을 전달</strong>할 수 있다. </li>
<li>S3 서비스 버킷을 통해 업로드된 <strong>정적 웹 사이트에 변경 사항을 실시간으로 전달하고 반영</strong>할 수 있다.</li>
</ul>
<p><br><br></p>
<h3 id="codepipeline-각-단계를-연결하는-파이프라인을-구축할-때-이용">CodePipeline: 각 단계를 연결하는 파이프라인을 구축할 때 이용</h3>
<ul>
<li>프리티어 계정에 <strong>두 개 이상의 파이프라인을 생성하면 추가 요금</strong>이 부여될 수 있다.</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Today I Learned [2021. 9. 17. Fri]]]></title>
            <link>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-17.-Fri</link>
            <guid>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-17.-Fri</guid>
            <pubDate>Fri, 17 Sep 2021 02:53:52 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 17일 금요일의 배운 내용을 기록한 문서입니다.<br>(내용은 바로 밑에 링크를 달아두었고 대신 Achievement Goal을 적어두었습니다.🙂)</p>
<p>👉🏻<strong>문서 1번</strong>: <a href="https://velog.io/@heewonkim-dev/Docker-TIL-01">https://velog.io/@heewonkim-dev/Docker-TIL-01</a>
👉🏻<strong>문서 2번</strong>: <a href="https://velog.io/@heewonkim-dev/Docker-TIL-02">https://velog.io/@heewonkim-dev/Docker-TIL-02</a>
👉🏻<strong>문서 3번</strong>: <a href="https://velog.io/@heewonkim-dev/Docker-TIL-03">https://velog.io/@heewonkim-dev/Docker-TIL-03</a></p>
<p><br><br></p>
<h2 id="achievement-goals">Achievement Goals</h2>
<ul>
<li>Docker Hub에서 Docker Image를 검색하고, 사용할 수 있다.</li>
<li>한 개의 Docker Image를 이용해서 Container를 구축할 수 있다.</li>
<li>두 개 이상의 Docker Container를 이용해서 Container를 구축할 수 있다.</li>
<li>아래의 주요 키워드에 대해서 이해하고 CLI에서 명령어를 사용해서 제어할 수 있다.<ul>
<li>Docker</li>
<li>Docker Hub</li>
<li>Docker Image</li>
<li>Docker Container</li>
<li>Docker Compose</li>
</ul>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker TIL 03]]></title>
            <link>https://velog.io/@heewonkim-dev/Docker-TIL-03</link>
            <guid>https://velog.io/@heewonkim-dev/Docker-TIL-03</guid>
            <pubDate>Fri, 17 Sep 2021 02:53:23 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 17일에 작성된 문서 3번 입니다.
docker 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="docker-컨테이너에-파일-복사">Docker 컨테이너에 파일 복사</h2>
<ul>
<li><p>로컬에 있는 파일과 도커 이미지를 연결하는 방법 </p>
<ol>
<li><p>*<em>CP(Copy) 를 이용하는 방법 *</em></p>
<ul>
<li>CP(Copy) : 호스트와 컨테이너 사이에 파일을 <strong>복사(Copy)</strong></li>
</ul>
</li>
<li><p><strong>Docker Volume 기능을 이용하는 방법</strong></p>
<ul>
<li><strong>Volume</strong> : <strong>호스트와 컨테이너 사이에 공간</strong>을 <strong>마운트(Mount)</strong><ul>
<li>마운트 : <ul>
<li><strong>저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용</strong></li>
<li>마치 *<em>하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업. *</em></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<p><br><br>
<br><br></p>
<h2 id="httpd-웹-서버">httpd 웹 서버</h2>
<h4 id="apache-http-server-실행할-수-있는-오픈소스-웹-서버-소프트웨어">Apache HTTP Server 실행할 수 있는 오픈소스 웹 서버 소프트웨어</h4>
<blockquote>
<p>httpd 는 <code>/usr/local/apache2/htdocs/</code> 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 합니다.</p>
</blockquote>
<p>*<em>1. <code>codestates/pacman-canvas</code> 레포지토리 클론.
*</em></p>
<pre><code class="language-jsx">    git clone https://github.com/codestates/pacman-canvas

    //pacman-canvas 레포지토리를 클론</code></pre>
<p>*<em>2. <code>docker container run</code>로 httpd 실행.
*</em></p>
<pre><code class="language-jsx">    docker container run --name 컨테이너_이름 -p 818:80 httpd

    // httpd를 실행
    // -p : 로컬호스트의 포트와 컨테이너의 포트를 연결
    // 818포트가 로컬호스트의 포트
    // 80번은 컨테이너의 포트</code></pre>
<p> <img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/_TQS1k8lm-1622894439523.png" alt=""></p>
<br>

<p>*<em>3.  <code>127.0.0.1:818</code>, <code>localhost:818</code>로 웹 서버가 작동하고 있는지 확인
*</em>    </p>
<ul>
<li><p>*<em><code>127.0.0.1</code> 과 <code>localhost</code> *</em>를 이용하면 *<em>로컬 컴퓨터의 IP 주소로 <code>redirecting</code> *</em>할 수 있다. </p>
<ul>
<li><p><strong>DNS 설정으로 인해 <code>localhost</code> 로 접속이 안 되고 <code>127.0.0.1</code> 만 접속 가능</strong>!</p>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/CexZ6c3oa-1622438218209.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<br>   


<p>*<em>4.  새로운 터미널을 열어 <code>docker container cp</code> 입력해 로컬호스트에 있는 파일을 컨테이너에 전달.
*</em>       </p>
<ul>
<li><code>docker container cp</code> : 앞 경로의 파일을 뒤 경로에 복사.    </li>
</ul>
<pre><code class="language-jsx">    docker container cp ./ 
    컨테이너_이름:/usr/local/apache2/htdocs/

    //현재 폴더의 파일을 뒤 경로에 복사</code></pre>
<p>*<em>5.  <code>127.0.0.1:818</code> 혹은 <code>localhost:818</code> 에 접속해서 게임 서버가 구동되는지 확인
*</em>    </p>
<p><br><br>
<br><br></p>
<h2 id="docker-이미지-만들기">Docker 이미지 만들기</h2>
<h3 id="1-구동한-docker-container를-이미지로-만드는-방법">1. 구동한 Docker Container를 이미지로 만드는 방법</h3>
<p>** 1. <code>docker container commit</code> 이용
** </p>
<pre><code class="language-jsx">    docker container commit 컨테이너_이름 my_pacman:1.0

    //구동한 Docker Container를 commit</code></pre>
<p>   <img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/v0GNYzzEl-1623214766732.png" alt=""></p>
<p>*<em>2. 생성된 이미지를 900 포트에서 웹 서버로 구동
*</em>    </p>
<pre><code class="language-jsx">    docker run --name my_web2 -p 900:80 my_pacman:1.0
    //900 포트에서 웹 서버로 이미지를 구동</code></pre>
<p>*<em>3.<code>127.0.0.1:900</code> 혹은 <code>localhost:900</code> 을 통해 웹 서버가 작동하고 있는지 확인.
*</em>
<br>
<br></p>
<h3 id="2-docker-image-빌드를-위한-파일인-dockerfile-로-만드는-방법">2. Docker Image 빌드를 위한 파일인 Dockerfile 로 만드는 방법</h3>
<ul>
<li><p>Dockerfile 을 만들고, *<em>Dockerfile 대로 이미지를 <code>build</code> *</em>하는 방법.</p>
<ul>
<li>Dockerfile = 이미지 파일의 설명서.    <pre><code class="language-jsx">//현재 경로에 있는 파일을 생성할 이미지 경로에 
//복사하는 명령의 Dockerfile 소스 코드
</code></pre>
</li>
</ul>
<p>FROM httpd:2.4 
// 베이스 이미지를 httpd:2.4 로 사용합니다.</p>
<p>COPY ./ /usr/local/apache2/htdocs/ 
// # 호스트의 현재 경로에 있는 파일을 생성할 이미지를
// /usr/local/apache2/htdocs/ 에 복사합니다.</p>
<pre><code></code></pre></li>
</ul>
<ol>
<li><strong><code>docker build</code> : Dockerfile로 도커 이미지 파일을 생성.</strong></li>
</ol>
<pre><code class="language-jsx">     // --tag 는 name:tag 형식으로 이미지를 생성할 수 있다.
     // 지정한 경로에 있는 Dockerfile을 찾아서 빌드

     docker build --tag my_pacman:2.0 . 
     // &quot;.&quot;을 명령어에 꼭 포함! 

     //docker build는 Dockerfile로 도커 이미지 파일을 생성</code></pre>
<ol start="2">
<li>생성된 이미지를 이용해 901 포트에 웹 서버 구동</li>
</ol>
<pre><code class="language-jsx">    docker run --name my_web3 -p 901:80 my_pacman:2.0

    //901 포트에서 웹 서버로 이미지를 구동</code></pre>
<ol start="3">
<li><strong><code>127.0.0.1:901</code> 혹은 <code>localhost:901</code> 을 통해 웹 서버가 작동하고 있는지 확인.</strong></li>
</ol>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker TIL 02]]></title>
            <link>https://velog.io/@heewonkim-dev/Docker-TIL-02</link>
            <guid>https://velog.io/@heewonkim-dev/Docker-TIL-02</guid>
            <pubDate>Fri, 17 Sep 2021 02:25:59 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 17일에 작성된 문서 2번 입니다.
docker 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="도커-이용하기">도커 이용하기</h2>
<blockquote>
<p><strong>도커 이미지가 실행되면 도커 컨테이너</strong>가 됩니다.</p>
</blockquote>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/DhSHvnlg6-1622776255323.png" alt=""></p>
<p><br><br>
<br></p>
<h2 id="dockerwhalesay"><code>docker/whalesay</code></h2>
<ul>
<li><strong><code>docker/whalesay</code></strong> 구성 : <ul>
<li><strong>레지스트리 계정</strong></li>
<li><strong>레포지토리 이름</strong></li>
<li><strong>태그</strong></li>
</ul>
</li>
</ul>
<p><img src="https://i.imgur.com/28RmqUB.png" alt=""></p>
<h3 id="1-레지스트리registry">1. 레지스트리(Registry)</h3>
<ul>
<li>Docker Hub : <code>https://hub.docker.com/</code><ul>
<li>도커 <strong>이미지 관리 공간</strong></li>
<li>다른 것을 지정하지 않는다면, <strong>도커 허브(Docker Hub)가 기본 레지스트리.</strong><ul>
<li>Docker Hub</li>
<li>Private Docker Hub</li>
<li>회사 내부용 레지스트리</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="2-레포지토리repository">2. 레포지토리(Repository)</h3>
<ul>
<li>레지스트리 내 <strong>도커 이미지가 저장되는 공간</strong>.<ul>
<li><strong>GitHub의 레포지토리</strong>와 유사.</li>
</ul>
</li>
</ul>
<br>

<h3 id="3-태그tag">3. 태그(Tag)</h3>
<ul>
<li><strong>같은 이미지여도 버전 별 내용이 조금은 다를 수 있다</strong>.</li>
<li><strong>해당 이미지를 설명하는 버전 정보를 입력</strong>.<ul>
<li>다른 것을 지정하지 않는다면 <strong><code>latest</code> 태그를 붙인 이미지를 가져옴.</strong></li>
</ul>
</li>
</ul>
<blockquote>
<p><strong><code>docker/whalesay:latest</code></strong> 라는 문장을 다시 읽어보면, 다음와 같이 읽을 수 있습니다.</p>
<ul>
<li><strong><code>Docker Hub</code></strong>라는 <strong>레지스트리</strong>에서</li>
<li><strong><code>docker</code>라는 유저</strong>가 등록한 <strong><code>whalesay</code> 이미지 혹은 레포지토리</strong>에서</li>
<li><strong><code>latest</code> 태그</strong>를 가진 이미지</li>
</ul>
</blockquote>
<p><br><br><br></p>
<h2 id="docker-hub--dockerwhalesay">Docker Hub : <code>docker/whalesay</code></h2>
<p><img src="https://i.imgur.com/5pMWWKO.png" alt=""></p>
<br>

<h3 id="1-docker-image-pull">1. <code>docker image pull</code></h3>
<pre><code class="language-jsx">docker image pull docker/whalesay:latest

// docker/whalesay : docker 유저의 
//                   whalesay 레포지토리에서
// latest: 최신 이미지를 받아오기</code></pre>
<ul>
<li><strong><code>{image} pull</code></strong> : 레지스트리에서 <strong>이미지 혹은 레포지토리를 가져옴</strong><ul>
<li><strong><code>docker pull</code></strong>로 검색해도 많은 정보를 찾을 수 있다.</li>
</ul>
</li>
</ul>
<br>
<br>


<h3 id="2-docker-image-ls">2. <code>docker image ls</code></h3>
<pre><code class="language-jsx">docker image ls

//이미지 리스트를 출력</code></pre>
<ul>
<li><strong>이미지 리스트를 출력</strong></li>
</ul>
<br>
<br>

<h3 id="3-docker-container-run">3. <code>docker container run</code></h3>
<pre><code class="language-jsx">docker container run --name 컨테이너_이름 
docker/whalesay:latest cowsay boo

//컨테이너_이름을 이름으로 갖는 컨테이너 실행
//받아온 이미지를 실행합니다. (이미지 → 컨테이너)</code></pre>
<ul>
<li><strong><code>{container} run</code> *<em>: *</em>컨테이너를 실행</strong><ul>
<li><strong><code>--name</code></strong> : <strong>컨테이너의 이름</strong>을 할당</li>
</ul>
</li>
<li><strong><code>command</code></strong>는 <strong>초기 컨테이너 실행 시 수행</strong>되는 명령어.<ul>
<li><strong><code>cowsay</code></strong> : *<em>컨테이너 실행 시 <code>cowsay</code>를 호출. *</em><ul>
<li>node를 호출하듯 이용.</li>
</ul>
</li>
<li><strong><code>boo</code></strong> : COMMAND인 <strong><code>cowsay</code>에 넘겨질 파라미터</strong>.</li>
</ul>
</li>
</ul>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/X2NO-nWUo-1622435356787.png" alt=""></p>
<blockquote>
<p>whalesay 컨테이너가 실행되었을 때 터미널에 출력되는 화면</p>
</blockquote>
<br>
<br>

<h3 id="4-docker-container-ps--a">4. <code>docker container ps -a</code></h3>
<pre><code class="language-jsx">docker container ps -a

//모든 컨테이너의 리스트를 출력</code></pre>
<ul>
<li><strong><code>{container} ps</code></strong> : <strong>컨테이너의 리스트</strong>를 출력</li>
<li><strong><code>-a</code></strong> : 종료된 컨테이너를 포함하여 <strong>모든 컨테이너를 출력.</strong></li>
</ul>
<br>
<br>


<h3 id="5-docker-container-rm-컨테이너_이름">5. <code>docker container rm 컨테이너_이름</code></h3>
<pre><code class="language-jsx">docker container rm 컨테이너_이름

//컨테이너_이름이라는 이름을 가진 컨테이너를 삭제</code></pre>
<ul>
<li><strong><code>{container} rm</code></strong> : <ul>
<li>*<em>컨테이너를 지칭해서 삭제. *</em></li>
<li>컨테이너 명시: *<em><code>ps</code>로 확인 가능한 <code>NAMES</code> 혹은 <code>CONTAINER ID</code> *</em></li>
</ul>
</li>
</ul>
<br>
<br>

<h3 id="6-docker-image-rm-dockerwhalesay">6. <code>docker image rm docker/whalesay</code></h3>
<pre><code class="language-jsx">//# docker image 의 용량 확인
docker image ls

//# docker/whalesay 이미지 지우기
docker image rm docker/whalesay</code></pre>
<ul>
<li><strong>사용한 images의 용량을 확인</strong>하고, <strong>도커 이미지를 삭제</strong></li>
</ul>
<br>
<br>


<h3 id="7-세-가지-작업을-한-번에-실행">7. 세 가지 작업을 한 번에 실행</h3>
<blockquote>
<p>하나의 이미지를 받아와 컨테이너로 실행하고, 컨테이너와 관련된 리소스를 삭제하는 작업까지 수행했습니다. 이번에는 세 가지 작업을 한 번에 실행해 보겠습니다.</p>
</blockquote>
<pre><code class="language-jsx">docker container run --name 컨테이너_이름 --rm 
docker/whalesay cowsay boo

//세 가지 작업을 한 번에 실행</code></pre>
<ul>
<li><code>{container} run</code> : 컨테이너를 실행. <strong>이미지가 없다면 이미지를 받아온 뒤(pull) 실행</strong></li>
<li><code>--rm</code> : <strong>컨테이너를 일회성으로 실행.</strong> 컨테이너가 <strong>중지</strong>되거나 <strong>종료</strong>될 때, 컨테이너와 관련된 리소스를 모두 제거.</li>
</ul>
<br>
<br>


<h3 id="8-docker-image-rm-dockerwhalesay">8. <code>docker image rm docker/whalesay</code></h3>
<pre><code class="language-jsx">docker image rm docker/whalesay

//지정된 도커 이미지를 삭제</code></pre>
<ul>
<li><strong><code>image rm</code> : 지정된 도커 이미지를 삭제</strong><ul>
<li><strong><code>docker rmi</code></strong> 도 같은 기능</li>
</ul>
</li>
</ul>
<br>
<br>
<br>
<br>


<h2 id="danielkraicasciiquarium"><code>danielkraic/asciiquarium</code></h2>
<p><img src="https://i.imgur.com/eY9KmOX.png" alt=""></p>
<blockquote>
<p><code>danielkraic/asciiquarium</code>를 정상적으로 실행시켰을 때 출력되는 알록달록한 바닷속 물고기</p>
</blockquote>
<pre><code class="language-jsx">docker container run -it --rm 
danielkraic/asciiquarium:latest

//danielkraic/asciiquarium 이미지를 실행</code></pre>
<ul>
<li><p><strong><code>danielkraic</code>라는 사람이 올린 이미지 <code>asciiquarium</code> 를 실행</strong></p>
</li>
<li><p>*<em><code>-it</code> : -i, -t 를 동시에 사용한 옵션. *</em></p>
<ul>
<li>사용자와 컨테이너 간에 <strong>인터렉션(interaction)이 필요시 사용</strong></li>
</ul>
</li>
<li><p>container는 <code>ctrl + c</code> 로 종료.</p>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker TIL 01]]></title>
            <link>https://velog.io/@heewonkim-dev/Docker-TIL-01</link>
            <guid>https://velog.io/@heewonkim-dev/Docker-TIL-01</guid>
            <pubDate>Fri, 17 Sep 2021 02:07:19 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 17일에 작성된 문서 1번 입니다.
docker 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h1 id="docker">Docker</h1>
<h3 id="리눅스-컨테이너linux-container-기술-기반의-오픈-소스-서비스">리눅스 컨테이너(Linux Container) 기술 기반의 오픈 소스 서비스</h3>
<p><img src="https://camo.githubusercontent.com/091e5d40ba6ebcf2c5bcad7edfbd650671c7ad76/68747470733a2f2f692e696d6775722e636f6d2f7039386d4e6a746c2e706e67" alt=""></p>
<p><br><br></p>
<h2 id="linux-container">Linux Container</h2>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/xZBhdV_-v-1622776015100.jpeg" alt=""></p>
<ul>
<li>필요한 <strong>라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성</strong>한 것.</li>
<li>컨테이너를 이루는 <strong>네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유</strong>하고 있다.</li>
</ul>
<br>

<h3 id="linux-container-특징">Linux Container 특징</h3>
<table>
<thead>
<tr>
<th align="left">특징</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1. <strong>프로세스의 구획화</strong></td>
<td align="left"><strong>특정 컨테이너</strong>에서 작동하는 프로세스는 <strong>그 컨테이너 안에서만 액세스</strong> 가능.</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>다른 컨테이너의 프로세스에게 영향을 줄 수 없다.</strong></td>
</tr>
<tr>
<td align="left">2. <strong>네트워크의 구획화</strong></td>
<td align="left"><strong>컨테이너 하나에 IP 주소</strong>가 할당</td>
</tr>
<tr>
<td align="left">3. <strong>파일 시스템의 구획화</strong></td>
<td align="left">컨테이너 안에서 <strong>사용되는 파일 시스템은 구획화</strong> 되어 있다.</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">해당 컨테이너에서의 <strong>명령이나 파일 등의 액세스를 제한 가능</strong></td>
</tr>
</tbody></table>
<br>
<br>
<br>


<h2 id="docker가-해결할-수-있는-문제들">Docker가 해결할 수 있는 문제들</h2>
<h3 id="1-환경-표준화">1. 환경 표준화</h3>
<p><img src="https://i.imgur.com/enCQVt0.png" alt=""></p>
<blockquote>
<p>개발하려고 하는 여러 <strong>애플리케이션을 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경할 부분이 발생</strong>합니다. <strong>같은 Linux 인 Ubuntu, CentOS, Debian 은 서로 다른 환경이므로 여러 버전이 존재할 수도 있습니다.</strong></p>
</blockquote>
<br>
<br>


<h3 id="2-수작업으로-일치시키는-환경-구성">2. 수작업으로 일치시키는 환경 구성</h3>
<blockquote>
<p><strong>개발된 애플리케이션을 내 컴퓨터에 설치해 사용하고자 할 때, &#39;내 컴퓨터&#39; 혹은 &#39;내 사용 목적&#39;에만 맞는 설정이 따로 필요</strong>할 수 있습니다. 예를 들어 <strong>환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있습니다.</strong></p>
</blockquote>
<p><img src="https://i.imgur.com/XXmUCZF.png" alt=""></p>
<br>
<br>


<h3 id="3-리소스-격리성">3. 리소스 격리성</h3>
<p><img src="https://i.imgur.com/cQzZ4u0.png" alt=""></p>
<ul>
<li>리소스 격리성: <ul>
<li>실제로는 <strong>하나의 컴퓨터</strong>를 사용하지만, *<em>마치 여러 개의 컴퓨터를 이용하는 것 *</em></li>
</ul>
</li>
<li><strong>리소스 격리성</strong>을 제공하는 기술로: <strong>가상 머신(Virtual Machine), 도커</strong><ul>
<li>가상 머신: <ul>
<li><strong>개발 환경이나 사용 환경을 이미지로 저장</strong></li>
<li><strong>Host OS 위에 게스트 OS를 올리는</strong> 방식: VirtualBox, VMware<blockquote>
<p>가상 머신과 도커는 격리성을 제공하기 때문에, <strong>각 애플리케이션마다 다른 컴퓨터에서 실행되는 것처럼 IP나 Port 등을 다르게 설정할 수 있습니다.</strong></p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>
<br>
<br>


<h2 id="도커-vs-가상-머신">도커 VS 가상 머신</h2>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/8Hk8eU1yW-1622776467873.png" alt=""></p>
<ul>
<li>도커는 가상 머신만큼 견고한 격리성을 제공하지는 않는다.</li>
<li><strong>도커는 리눅스의 컨테이너(Linux Container)를 이용한 기술</strong><ul>
<li>OS 위에 다른 OS를 실행하는 것이 아니므로 <strong>가상 머신보다 좋은 성능을 낼 수 있다.</strong></li>
</ul>
</li>
<li>VM: 애플리케이션에 대한 환경 격리성을 중심</li>
<li>도커: Container의 관점에서 개발자와 사용자 커뮤니티 중심으로 혜택 제공</li>
</ul>
<br>
<br>
<br>


<h2 id="docker-container-lifecycle">Docker Container Lifecycle</h2>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/nzKkNGPzu-1622770734719.png" alt=""></p>
<blockquote>
<p>도커 컨테이너의 독립적인 특징을 기반으로 한 <strong>Lifecycle</strong>이 있습니다. 위 그림을 보면, <strong>컨테이너의 생성, 실행, 종료</strong>의 과정을 이해할 수 있습니다.  </p>
</blockquote>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Today I Learned [2021. 9. 15. Wed]]]></title>
            <link>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-15.-Wed</link>
            <guid>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-15.-Wed</guid>
            <pubDate>Wed, 15 Sep 2021 02:29:24 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 15일 수요일의 배운 내용을 기록한 문서입니다.<br>(내용은 바로 밑에 링크를 달아두었고 대신 Achievement Goal을 적어두었습니다.🙂)</p>
<p>👉🏻<strong>문서 1번</strong>: <a href="https://velog.io/@heewonkim-dev/AWS-TIL-01">https://velog.io/@heewonkim-dev/AWS-TIL-01</a>
👉🏻<strong>문서 2번</strong>: <a href="https://velog.io/@heewonkim-dev/AWS-TIL-02">https://velog.io/@heewonkim-dev/AWS-TIL-02</a>
👉🏻<strong>문서 3번</strong>: <a href="https://velog.io/@heewonkim-dev/AWS-TIL-03">https://velog.io/@heewonkim-dev/AWS-TIL-03</a>
👉🏻<strong>문서 4번</strong>: <a href="https://velog.io/@heewonkim-dev/AWS-TIL-04">https://velog.io/@heewonkim-dev/AWS-TIL-04</a></p>
<p><br><br></p>
<h2 id="achievement-goals">Achievement Goals</h2>
<ul>
<li><p>Cloud와 Deployment의 의미를 각각 알고, 내 코드를 남에게 배포할 수 있다.</p>
<ul>
<li>클라우드 컴퓨팅이 무엇인지 설명할 수 있다.</li>
<li>Deployment의 의미를 이해할 수 있다.</li>
<li>코드를 남에게 배포할 수 있다.</li>
</ul>
</li>
<li><p>사용하는 서비스들의 특징과 사용해야 하는 이유를 이해할 수 있다.</p>
<ul>
<li>RDS와 EC2에 설치된 데이터베이스의 차이를 이해할 수 있다.</li>
<li>S3의 높은 가용성과 안정성을 이해할 수 있다.</li>
<li>CloudFront의 콘텐츠 로딩시간 단축의 효과들을 이해할 수 있다. (advanced)</li>
<li>Route53을 이용해 요청을 쉽고 안전하게 원하는 곳으로 보낼 수 있음을 이해할 수 있다. (advanced)</li>
</ul>
</li>
<li><p>커스텀 도메인을 이용해 요청을 원하는 곳으로 라우팅할 수 있다. (advanced)</p>
<ul>
<li>DNS가 무엇인지 이해할 수 있다. (advanced)</li>
<li>커스텀 도메인을 이용해 인증서를 발급받고 SSL을 적용할 수 있다. (advanced)</li>
</ul>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS TIL 04]]></title>
            <link>https://velog.io/@heewonkim-dev/AWS-TIL-04</link>
            <guid>https://velog.io/@heewonkim-dev/AWS-TIL-04</guid>
            <pubDate>Wed, 15 Sep 2021 02:28:34 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 15일에 작성된 문서 4번 입니다.
aws 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="배포-전략">배포 전략</h2>
<h3 id="배포--개발한-서비스를-사용자가-이용할-수-있도록-하는-것">배포 : 개발한 서비스를 사용자가 이용할 수 있도록 하는 것</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/3d41c7b7-3237-45fb-b9c6-836fee7dfc16/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.13.39.png" alt=""></p>
<p><br><br></p>
<h3 id="1-client-application-배포">1. Client Application 배포</h3>
<h4 id="1-1-aws의-s3-서비스를-통해-사용자들에게-client를-제공할-수-있다">1-1. AWS의 S3 서비스를 통해 사용자들에게 Client를 제공할 수 있다.</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/61d57863-aecd-4f52-83ae-6360f7f0e61b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.14.43.png" alt=""></p>
<ul>
<li>로컬 환경에서는 *<em>자체 개발 서버를 이용해서 클라이언트 앱을 실행. *</em></li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/4adb7834-08e2-4eb6-8d18-4087482c9e27/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.14.58.png" alt=""></p>
<blockquote>
<p>그럼, 클라이언트를 위해서 EC2 인스턴스를 사용해야 할까요?</p>
<p>그렇지 않다.</p>
</blockquote>
<ul>
<li><strong>클라이언트 앱을 정적 파일로 빌드하여 제공하므로 S3를 이용해서 클라이언트를 배포</strong>한다.</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/b3d78a8a-234c-4ee9-9d75-dcd3317908de/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.15.50.png" alt=""></p>
<p><br><br></p>
<h4 id="1-2-빌드">1-2. 빌드</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/e939123d-0f11-47e6-a285-8b090bab6af4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.17.48.png" alt=""></p>
<ul>
<li>불필요한 데이터를 없애고, 여러 갈래로 퍼져있는 <strong>데이터들을 통합하여 배포하기에 최적화된 상태</strong>를 만드는 것. </li>
<li>데이터의 용량이 줄어들고, 웹 사이트의 로딩 속도가 빨라진다. </li>
<li><strong>웹 앱은 배포 가능한 정적 파일의 형태로 만들어 줘야</strong> 한다. <blockquote>
<p>asset 자체가 정적인 경우, 있는 그대로 배포하면 됩니다. <strong>React의 경우 <code>npm run build</code>와 같은 명령을 사용</strong>해서, 정적 파일 형태의 결과물을 만들어 낸 후 배포하면 됩니다. 사용하고 있는 환경에 따라 빌드 과정은 다를 수 있습니다.</p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<blockquote>
<p>S3로 사용자들에게 Client Application을 제공하고 있는데, <strong>사용자가 지구 반대편에 있다면</strong> 어떻게 빠르게 서비스를 제공할 수 있을까요? </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/86a87aee-e4f8-4812-9b58-22c6b8528ee5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.20.27.png" alt=""></p>
<ul>
<li>AWS에서 제공하는 <strong>CDN 서비스인 CloudFront</strong>를 통해 <strong>각 데이터센터에 데이터를 분산시켜서 저장</strong>해 뒀다가 <strong>가까운 지역에서 데이터를 주는 방식으로 사용자에게 더 빠르게 서비스를 제공</strong>.</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/02329662-68a0-4d97-a8fd-ae6508976d0d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.20.42.png" alt=""></p>
<p><br><br><br></p>
<h3 id="2-server-application-배포">2. Server Application 배포</h3>
<blockquote>
<p>사용자들이 제공받은 Client Application을 통해서 요청을 전달할 <strong>Server Application</strong>은 어떻게 배포해야 할까요?</p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/2d7bf8e1-fa8d-454d-9cde-091a92fa963d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.21.15.png" alt=""></p>
<ul>
<li><strong>AWS EC2 서비스를 통해 손쉽게 서버를 구성하고 서비스를 제공</strong>할 수 있습니다.</li>
</ul>
<p><br><br><br></p>
<h3 id="3-database-배포">3. Database 배포</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/231780cd-9cf6-4281-a1d6-0bce57a348ed/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.24.04.png" alt=""></p>
<ul>
<li>AWS에서는 <strong>Database 특화 서비스인 RDS 서비스를 제공</strong>하고 있다. <ul>
<li>*<em>유지 보수 작업 담당하는 RDS를 이용해 즉시 데이터베이스를 사용. *</em></li>
</ul>
</li>
<li>RDS를 이용하여 <strong>EC2를 통해 배포된 Server Application의 데이터를 저장, 제공하는 데이터베이스를 배포</strong>.</li>
</ul>
<p><br><br><br></p>
<h3 id="4-dns">4. DNS</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/d3389ce6-005a-4324-8504-578270c3cfc1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.24.39.png" alt=""></p>
<ul>
<li><code>www.google.com</code>과 같은 도메인 주소를 이용해서 접근할 수 있었다. </li>
</ul>
<br>

<blockquote>
<p>처음 배포된 서비스는 도메인주소를 통해 접근할 수 있까?</p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/48473470-dd0d-409e-8f85-076539e69d57/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.26.27.png" alt=""></p>
<ul>
<li>S3, EC2를 이용해 배포된 서비스는 <strong>IP주소 혹은 AWS에서 제공하는 서비스와 상관없는 긴 도메인주소를 통해 접근</strong>. </li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/2ff55519-c76e-4fbc-9bfe-0c9719c9b930/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.27.19.png" alt=""></p>
<ul>
<li><strong>AWS Route 53 서비스를 이용하면 도메인 주소를 통해 서비스에 접근</strong> 할 수 있다.</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS TIL 03]]></title>
            <link>https://velog.io/@heewonkim-dev/AWS-TIL-03</link>
            <guid>https://velog.io/@heewonkim-dev/AWS-TIL-03</guid>
            <pubDate>Wed, 15 Sep 2021 02:20:32 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 15일에 작성된 문서 3번 입니다.
aws 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="rds-relational-database-service">RDS (Relational Database Service)</h2>
<h3 id="rds-aws에서-제공하는-관계형-데이터베이스-서비스">RDS: AWS에서 제공하는 관계형 데이터베이스 서비스</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/3dc8e52c-bee9-4fdb-b11d-0aeab96caa34/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.44.04.png" alt=""></p>
<p><br><br></p>
<h3 id="rds-사용-이점">RDS 사용 이점</h3>
<h4 id="1-ec2-인스턴스">1. EC2 인스턴스</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/d03a77f8-e573-4c77-ba76-53de4be594c6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.47.34.png" alt=""></p>
<ul>
<li><strong>EC2 인스턴스</strong>에 데이터베이스를 설치하여 데이터를 관리하는 것은 <strong>개인 소유 차량을 이용</strong>하는 것과 비슷. <ul>
<li>개인 소유 차량을 이용하면 유지보수, 보험처리 일들을 <strong>운전자 부담.</strong></li>
<li>EC2 인스턴스 : <strong>사용자가 일일이 시간을 투자하여 데이터베이스 엔진의 설치와 버전 관리, 데이터 백업</strong>을 해야한다. <blockquote>
<p><strong>가용성과 내구성이 확보되지 않기에</strong>데이터베이스에 <strong>저장된 데이터가 유실되거나 정상적으로 사용하지 못할 확률이 커지며</strong>, 후에 <strong>필요에 따라 데이터베이스의 규모를 확장하기 어렵습니다</strong>.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<h4 id="2-rds">2. RDS</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/1742e814-2e4f-48b9-914a-725085c8c21b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.49.37.png" alt=""></p>
<ul>
<li>RDS를 이용하는 것은 <strong>렌터카 회사에서 차량을 대여</strong>하는 것과 비슷. <ul>
<li>대여 차량과 관련하여 <strong>시간이 들어가는 일들을 렌터카 회사에서 대신 처리</strong>. </li>
<li><strong>운전자는 운전만</strong> 하면 되기에 매우 편리. </li>
</ul>
</li>
<li>RDS를 이용하면 <strong>데이터베이스 유지보수는 RDS에서 전적으로 자동 관리</strong>. </li>
<li><strong>사용자가 해야할 일은 초기 설정을 제외하고 데이터베이스에 저장된 데이터를 관리하는 일</strong> 밖에 없다.</li>
</ul>
<p><br><br></p>
<h4 id="3-다양한-데이터베이스-엔진-선택지를-제공">3. 다양한 데이터베이스 엔진 선택지를 제공</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/37a0ad71-0a69-4e9d-ae9b-c7c128bc422e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.50.48.png" alt=""></p>
<ul>
<li>실무자는 회사에 필요한 데이터베이스 엔진을 취사선택하여 이용할 수 있다 . </li>
<li>일반 사용자는 필요와 목적에 맞게 데이터베이스 엔진을 선택하여 효율성을 높일 수 있다.</li>
</ul>
<p><br><br>
<br><br></p>
<h2 id="s3">S3</h2>
<h3 id="클라우드-스토리지">클라우드 스토리지</h3>
<h4 id="인터넷-공간에-데이터를-저장하는-저장소">인터넷 공간에 데이터를 저장하는 저장소</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/aeb6eab4-5901-4e96-b1bf-f35ee011f2cb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.51.33.png" alt=""></p>
<ul>
<li>컴퓨터 부품으로 비유하면 <strong>하드디스크의 역할을 하는 서비스</strong>. </li>
<li>클라우드 스토리지 서비스의 장점 <ul>
<li><strong>뛰어난 접근성</strong>을 가지고 있다. <ul>
<li><strong>웹 환경이라면 언제 어디서나 저장된 파일에 접근</strong>할 수 있다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="s3--simple-storage-service">S3 : Simple Storage Service</h3>
<h4 id="aws에서-제공하는-클라우드-스토리지-서비스">AWS에서 제공하는 클라우드 스토리지 서비스</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/5c4f9215-e53c-42e8-9fab-74418333d636/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.52.51.png" alt=""></p>
<ul>
<li><strong>S3도 뛰어난 접근성</strong>을 가지고 있다. </li>
</ul>
<p><br><br><br></p>
<h2 id="s3-사용-시-얻을-수-있는-이점">S3 사용 시 얻을 수 있는 이점</h2>
<h3 id="1-높은-확장성">1. 높은 확장성</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/6d02127b-ae87-45c0-9a27-23610ac747fc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.54.48.png" alt=""></p>
<ul>
<li>많은 시간과 수고를 들이지 않고 <strong>스토리지 규모를 확장/축소</strong>할 수 있다. <ul>
<li>S3에서는 스토리지의 용량을 무한히 확장할 수 있다. </li>
</ul>
</li>
<li><strong>사용한 만큼만 비용을 지불</strong>하면 되기 때문에 비용적 측면에서 매우 효율적.</li>
</ul>
<p><br><br></p>
<h3 id="2-강력한-내구성">2. 강력한 내구성</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/a5908528-5a9c-44d1-b5ab-05cf10ae2e98/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.56.02.png" alt=""></p>
<ul>
<li>스토리지의 <strong>내구성이 높으면 저장된 파일을 유실할 가능성이 적</strong>어진다. </li>
<li>S3는 99.999999999%의 내구성을 보장. </li>
</ul>
<p><br><br></p>
<h3 id="3-9999의-가용성-보장">3. 99.99%의 가용성 보장</h3>
<ul>
<li><strong>가용성이 높으면 스토리지에 저장된 파일들을 정상적으로 사용할 수 있는 시간이 길어진다.</strong> </li>
<li>S3는 연간 99.99%의 스토리지 가용성을 보장한다.   </li>
</ul>
<br>

<blockquote>
<p>AWS는 어떤 원리로 해당 서비스들의 높은 가용성과 내구성을 보장할 수 있는 걸까요? </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/015195d1-279a-449c-bc54-5ea92647ac65/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.59.41.png" alt=""></p>
<ul>
<li><strong>리전</strong>(Region - 지도 상 주황색 동그라미): <ul>
<li>AWS 클라우드 서비스를 제공하기 위해 운영하는 <strong>물리적 서버의 위치</strong>. </li>
</ul>
</li>
<li>주황색 동그라미 안 숫자: <strong>리전에 위치한 가용영역의 수</strong> <ul>
<li>가용 영역(Availability Zone): 각 <strong>리전 안에 존재하는 데이터 센터(IDC)</strong><ul>
<li>가용 영역은 <strong>각각 개별적인 위치에 떨어져서 존재</strong>. </li>
<li><strong>한 곳의 가용 영역이 가동이 불가능해지더라도 다른 가용 영역에 백업을 해놓은 데이터를 활용</strong>하여 문제 없이 서버가 가동 </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="4-다양한-스토리지클래스를-제공">4. 다양한 스토리지클래스를 제공</h3>
<h4 id="4-1-standard-클래스">4-1. Standard 클래스</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/c102ef0d-c50d-4c7f-ac0e-f0fb63115d2b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.00.01.png" alt=""></p>
<ul>
<li><strong>범용적</strong>인 목적으로 사용</li>
<li>데이터에 <strong>빠른 속도</strong>로 접근</li>
<li>데이터 액세스 요청에 대한 처리 속도가 빠름</li>
<li>데이터를 <strong>오래 보관하는 목적으로는 효율적인 선택지가 아님</strong><ul>
<li><strong>보관 비용이 높게 발생</strong></li>
</ul>
</li>
</ul>
<br>

<h4 id="4-2-glacier-클래스">4-2. Glacier 클래스</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/1d0f77bb-6979-49a9-b91e-2ef2a78f25ef/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.01.29.png" alt=""></p>
<ul>
<li><strong>장기적인 보관 목적</strong>으로 스토리지를 사용할 때는 Glacier를 사용</li>
<li>저장된 데이터 *<em>액세스 속도는 느리지만, 데이터를 보관하는 비용이 저렴. *</em></li>
</ul>
<blockquote>
<p>이 외에도 <strong>Standard-IA, One Zone-IA, S3 Glacier Deep Archive</strong> 등등 여러 가지 스토리지 클래스가 존재하여 사용자의 <strong>이용 목적에 따라 다양한 스토리지 클래스를 사용</strong>할 수 있습니다.</p>
</blockquote>
<p><br><br></p>
<h3 id="5-정적-웹-사이트-호스팅이-가능">5. 정적 웹 사이트 호스팅이 가능</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/0b303b47-7c28-4106-bb9c-e9542dced721/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.03.21.png" alt=""></p>
<h4 id="정적-웹-사이트-호스팅">정적 웹 사이트 호스팅</h4>
<ul>
<li><strong>정적</strong> 파일 : <ul>
<li><strong>서버의 개입 없이 생성</strong>된 파일</li>
</ul>
</li>
<li><strong>동적</strong> 파일: <ul>
<li><strong>클라이언트가 서버에 요청을 보내면, 서버가 요청에 맞추어 그 자리에서 생성</strong>한 파일 </li>
</ul>
</li>
</ul>
<br>

<h4 id="웹-호스팅web-hosting-서버의-한-공간을-임대해주는-서비스">웹 호스팅(Web Hosting) :서버의 한 공간을 임대해주는 서비스</h4>
<ul>
<li>웹 호스팅 업체가 제공하는 *<em>서버의 한 공간을 빌려서 원하는 서비스를 배포. *</em></li>
<li>S3에서는 <strong>버킷</strong>이 사용자들이 정적 웹 사이트를 배포할 수 있는 공간을 제공. <blockquote>
<p><strong>버킷</strong>이라는 <strong>저장 공간에 정적 파일을 업로드</strong>하고 <strong>버킷을 정적 웹 사이트 호스팅 용도로 구성하면 정적 웹 사이트를 배포</strong>할 수 있다. </p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<h3 id="5-1-버킷">5-1. 버킷</h3>
<h4 id="s3에-저장되는-파일들이-담기는-바구니-파일을-저장하는-최상위-디렉터리">S3에 저장되는 파일들이 담기는 바구니 (파일을 저장하는 최상위 디렉터리)</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/77a4eb81-94a8-49c1-9bbf-9d00f03bbdb3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.06.22.png" alt=""></p>
<ul>
<li>S3에서 저장되는 <strong>모든 파일은 버킷 안에 저장되어야</strong> 함.</li>
<li>버킷에는 무한한 양의 파일을 저장할 수 있다. </li>
<li>버킷의 이름은 <strong>버킷이 속해 있는 리전(버킷이 생성된 지역)에서 유일해야</strong> 한다. </li>
<li><strong>버킷 정책</strong>을 생성하여 해당 버킷에 대한 <strong>다른 유저의 접근 권한을 수정</strong>할 수 있다.</li>
</ul>
<p><br><br></p>
<h3 id="5-2-객체">5-2. 객체</h3>
<h4 id="s3에서-버킷에-담기는-파일">S3에서 버킷에 담기는 파일</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/d6392ef3-828a-4950-a286-a20bffc9720b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.08.09.png" alt=""></p>
<blockquote>
<p>왜 <strong>객체</strong>라고 부를까요?? S3에서 저장소에 <strong>데이터를 저장할 때 키-값 페어 형식으로 데이터를 저장하기 때문</strong>입니다. </p>
</blockquote>
<ul>
<li>S3에 저장되는 <strong>객체는 파일과 메타데이터로 구성</strong>. <ul>
<li><strong>파일</strong> :  <strong>키-값 페어 형식</strong>으로 데이터를 저장. <ul>
<li><strong>파일 값</strong>: <strong>실제 데이터</strong>를 저장. <ul>
<li>S3 객체의 값으로써 저장될 수 있는 데이터는 최대 5TB. </li>
</ul>
</li>
<li><strong>파일 키</strong>: 각각의 객체를 고유하게 만들어주는 *<em>식별자 역할. *</em><ul>
<li>파일의 키를 이용하여 <strong>원하는 객체를 검색</strong>할 수 있다. </li>
</ul>
</li>
</ul>
</li>
<li><strong>메타데이터</strong>: <strong>객체에 대한 정보</strong>가 담긴 데이터. <ul>
<li><strong>(객체를 설명하는 데이터)</strong></li>
</ul>
</li>
</ul>
</li>
<li><strong>모든 객체는 고유한 URL 주소</strong>를 가지고 있다. <ul>
<li>URL : <code>http://[버킷의 이름].S3.amazonaws.com/[객체의 키]</code> </li>
<li><strong>URL 주소를 통해서도 원하는 데이터에 접근</strong>할 수 있다.</li>
</ul>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS TIL 02]]></title>
            <link>https://velog.io/@heewonkim-dev/AWS-TIL-02</link>
            <guid>https://velog.io/@heewonkim-dev/AWS-TIL-02</guid>
            <pubDate>Wed, 15 Sep 2021 01:45:03 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 15일에 작성된 문서 2번 입니다.
aws 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="deployment">Deployment</h2>
<h3 id="배포-개발한-서비스를-사용자들이-이용가능하게-하는-일련의-과정">배포: 개발한 서비스를 사용자들이 이용가능하게 하는 일련의 과정</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/20f55ef8-1cc2-45da-b15a-cedb3ed4a9a7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.29.20.png" alt=""></p>
<blockquote>
<p>회사마다 추가적인 과정이 있을 수 있지만, <strong>기본적으로 4단계를 거쳐서 개발한 서비스를 배포</strong>하게 됩니다.</p>
</blockquote>
<p><br><br></p>
<table>
<thead>
<tr>
<th align="left">용어</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Development</strong></td>
<td align="left">각자의 <strong>컴퓨터에서 코드를 작성하고 테스트</strong> 하는 과정</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">개발단계라 실제 데이터를 이용하지 않고 <strong>더미데이터를 이용해 테스트</strong></td>
</tr>
<tr>
<td align="left"><strong>Intergration</strong></td>
<td align="left">각자의 컴퓨터에서 작성한 <strong>코드를 합치는 과정</strong></td>
</tr>
<tr>
<td align="left"></td>
<td align="left">내가 작성한 코드가 다른 코드에서 오류를 일으키지 않는지 확인</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">코드간에 conflict가 있지는 않는지 확인</td>
</tr>
<tr>
<td align="left"><strong>Staging</strong></td>
<td align="left">실제 출시단계인 <strong>Production단계와 유사 환경에서 테스트</strong> 진행</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">실제 데이터를 복사해서 문제가 있지 않은지 등 <strong>다양한 환경에서 테스트</strong>를 진행</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">또한 서비스와 관련된 부서 혹은 인원의 <strong>확인 과정</strong></td>
</tr>
<tr>
<td align="left"><strong>Production</strong></td>
<td align="left">개발된 서비스를 출시하는 단계</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">사용자가 접속할 수 있는 <strong>Production환경에서 코드를 구동하고 서비스를 제공</strong></td>
</tr>
<tr>
<td align="left"></td>
<td align="left">실제 데이터를 가지고 서비스가 운영되기 때문에 <strong>문제가 생기면 안되는 단계</strong></td>
</tr>
</tbody></table>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/f1e950ea-8d05-4c36-b9f1-ae551af8194b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.47.18.png" alt=""></p>
<ul>
<li>Development 환경과 Production 환경은 서로 다를 수가 있다. </li>
<li>배포에서, 환경의 차이를 이해하고 <strong>환경 설정을 코드와 분리하는 것이 중요</strong></li>
</ul>
<p><br><br></p>
<h3 id="작성한-코드가-다른-환경에서-정상-작동할-수-있게-하려면">작성한 코드가 다른 환경에서 정상 작동할 수 있게 하려면</h3>
<ol>
<li>절대 경로 대신 상대 경로를 사용한다.</li>
<li>환경에 따라 분기 할 수 있도록 환경변수를 설정해준다.</li>
<li>Docker와 같은 개발 환경 자체를 통일 시키는 솔루션을 사용한다.</li>
</ol>
<p><br><br></p>
<h3 id="배포를-위한-다양한-플랫폼들">배포를 위한 다양한 플랫폼들</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/c75ecdaa-5da0-4491-ba3a-bbadbc763fff/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.49.15.png" alt=""></p>
<p><br><br>
<br><br></p>
<h2 id="ec2">EC2</h2>
<h3 id="아마존-웹-서비스에서-제공하는-클라우드-컴퓨팅-서비스">아마존 웹 서비스에서 제공하는 클라우드 컴퓨팅 서비스</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/86773eab-7adc-44ab-a927-b5d8b28ed0a2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.20.54.png" alt=""></p>
<h4 id="클라우드-컴퓨팅-인터넷클라우드을-통해-서버-스토리지-데이터베이스-등의-컴퓨팅-서비스를-제공하는-서비스">클라우드 컴퓨팅: 인터넷(클라우드)을 통해 서버, 스토리지, 데이터베이스 등의 컴퓨팅 서비스를 제공하는 서비스.</h4>
<blockquote>
<p>정리하면 아마존에서 가상의 컴퓨터를 한 대 빌리는 것과 같습니다.</p>
</blockquote>
<p><br><br></p>
<h3 id="ec2서비스는-aws에서-비용-성능-용량면에서-탄력적인-클라우드-컴퓨터를-제공하는-서비스">EC2서비스는 AWS에서 비용, 성능, 용량면에서 탄력적인 클라우드 컴퓨터를 제공하는 서비스</h3>
<blockquote>
<p>AWS에서 제공하는 Elastic Compute Cloud서비스 앞에 붙은 Elastic이라는 단어는 어떤 의미일까요? </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/533309e5-763d-4051-9066-fadb5d24013d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.26.47.png" alt=""></p>
<ul>
<li>EC2서비스는 <strong>사용한 만큼</strong>비용을 지불하기 때문에 <strong>탄력적인 이라는 의미의 Elastic이라는 단어</strong>가 붙었다. </li>
<li>Elastic은 비용적인 부분 뿐만이 아니라 필요에 따라 <strong>성능, 용량을 자유롭게 조절할 수 있다는 의미</strong>도 가지고 있다. </li>
</ul>
<p><br><br></p>
<h3 id="ec2-서비스의-장점">EC2 서비스의 장점</h3>
<h4 id="1-구성하는-데-필요한-시간이-짧다">1. 구성하는 데 필요한 시간이 짧다.</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/91b47407-c140-49da-8a61-b12b8c5ce24e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.29.43.png" alt=""></p>
<blockquote>
<p>만약 PC를 구매한다면 구매해서 배송되는 데까지의 시간이 필요하지만 <strong>EC2 서비스는 몇 번의 클릭만으로 PC를 구성</strong>할 수 있습니다.</p>
</blockquote>
<br>

<h4 id="2-다양한-운영체제에-대한-선택이-가능하다">2. 다양한 운영체제에 대한 선택이 가능하다.</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/0e032be6-7a58-491a-86c9-4c2b3c661606/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.30.49.png" alt=""></p>
<ul>
<li>EC2에서는 <strong>AMI라는 다양한 템플릿을 제공</strong>하고 있어서 <strong>필요에 따라 손쉽게 운영체제를 선택하고 구성</strong>할 수 있다. </li>
<li>운영체제뿐만이 아니라 <strong>CPU와 RAM, 용량까지도 손쉽게 구성</strong>할 수 있다.</li>
</ul>
<p><br><br></p>
<h3 id="aws에서-빌리는-컴퓨터를-인스턴스">AWS에서 빌리는 컴퓨터를 인스턴스</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/b78a3c3d-3f6e-4f37-a1f0-eb01726fbaa1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.32.10.png" alt=""></p>
<ul>
<li><strong>EC2는 컴퓨터를 한 대 빌리는 것</strong>이므로 컴퓨터로 할 수 있는 일을 할 수 있다. </li>
<li>아마존 EC2를 통해서 할 수 있는 기본적인 일 : <ul>
<li><strong>웹서버를 설치</strong>하고 <strong>웹 서버를 통해서 사용자가 웹 브라우저를 통해 요청하는 서비스를 제공</strong>. </li>
</ul>
</li>
<li><strong>인스턴스는 1대의 컴퓨터</strong>를 의미하는 단위 </li>
<li><strong>(AWS에서 컴퓨터를 빌리는 것) = (인스턴스를 생성)</strong>.</li>
</ul>
<p><br><br></p>
<h3 id="ami">AMI</h3>
<h4 id="ami는-소프트웨어-구성이-기재된-템플릿">AMI는 소프트웨어 구성이 기재된 템플릿</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/f3049264-eb44-47ca-8032-5c6f9e2a4d12/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.37.18.png" alt=""></p>
<ul>
<li><strong>이미지 종류로는 단순히 운영체제만 깔려있는 템플릿을 선택할 수도</strong> 있다. </li>
<li>아예 <strong>특정 런타임이 설치되어있는 템플릿이 제공</strong>되는 경우도 있다. <ul>
<li>우분투 + node.js<ul>
<li>윈도우 + JVM </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/dc7130f2-5c3b-4ca2-babe-abd116842885/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.39.04.png" alt=""></p>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/a95bbdb8-5045-484f-84d2-5fc084c75941/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.41.12.png" alt=""></p>
<ul>
<li><strong>Instance는 선택한 AMI를 토대로 구성</strong>. </li>
<li>AWS에는 <strong>AMI 셋팅이 준비되어 있어 인스턴스의 운영체제를 구성할 수 있다</strong>.</li>
<li>셋팅되어 있는 AMI 이외에도 <strong>필요에 따라 직접 AMI를 구성할 수도</strong> 있다.</li>
</ul>
<p><br><br></p>
<blockquote>
<p><strong>AWS EC2 인스턴스를 생성</strong>한다는 것은 <strong>AMI를 토대로 운영체제, CPU, RAM 혹은 런타임 등이 구성된 컴퓨터를 빌리는 것</strong>입니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/9b6eb932-81cb-4c73-acf4-2ce6f0c33727/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.42.16.png" alt=""></p>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS TIL 01]]></title>
            <link>https://velog.io/@heewonkim-dev/AWS-TIL-01</link>
            <guid>https://velog.io/@heewonkim-dev/AWS-TIL-01</guid>
            <pubDate>Wed, 15 Sep 2021 01:25:24 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 15일에 작성된 문서 1번 입니다.
aws 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="cloud-computing">Cloud Computing</h2>
<h3 id="클라우드-컴퓨팅의-등장-배경">클라우드 컴퓨팅의 등장 배경</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/2786fec4-7ec3-4f28-8ca9-a643f8d1f439/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.09.12.png" alt=""></p>
<ul>
<li>클라우드 등장 이전 : <ul>
<li>전산실 등에 컴퓨터를 배치하고 인터넷 연결하여 서비스를 제공. </li>
</ul>
</li>
</ul>
<blockquote>
<p>그런데 만약 서버가 요청에 대한 <strong>수용 능력이 한계에 도달한다면</strong> 어떻게 대처할까요?</p>
</blockquote>
<p><br><br></p>
<ol>
<li><strong>같은 공간에 더 많은 컴퓨터를 제공</strong>해 한 대가 해결할 수 있는 요청을 여러 대가 나누는 방식 사용. </li>
<li>컴퓨터 <strong>한 대의 성능을 높이는 방식</strong>을 사용. </li>
</ol>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/a9ba4001-00df-4fd3-b4a0-59608f8edde6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.10.29.png" alt=""></p>
<blockquote>
<p>하지만 이런 방식은 <strong>몇 가지 문제점들</strong>을 가지고 있었습니다.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/ccfcdde2-1a58-41e9-8082-aa9810c1f720/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.11.34.png" alt=""></p>
<ol>
<li><strong>주기적인 관리</strong>가 필요. <ul>
<li>서버실에** 종종 고장**이 나거나 인터넷과 연결이 되지 않는 컴퓨터가 생긴다. <ul>
<li>이를 <strong>해결하기 위한 인력 및 비용</strong>이 투입되어야 했다. </li>
</ul>
</li>
<li><strong>관리해야 하는 컴퓨터 수가 많아져 투입 인력 및 비용도 증가</strong>하기 시작. </li>
</ul>
</li>
<li><strong>공간의 한계</strong><ul>
<li>예전 : 서버실에 컴퓨터를 배치해 두고 <strong>필요에 따라 컴퓨터를 추가하는 방식</strong>으로 수용 능력 향상. <ul>
<li>이런 방식은 <strong>공간이 부족하여 컴퓨터를 더는 배치할 수 없는 문제</strong>에 직면.</li>
<li>컴퓨터의** 성능을 높이고 부피를 줄여 좀 더 많은 컴퓨터를 같은 공간에 배치**하는 방법. </li>
</ul>
</li>
<li><strong>추가적인 서버 증설이 어렵게 되자 거대 기업은 데이터센터라는 거대한 건물을 세우기 시작</strong>. </li>
<li>이때부터 <strong>데이터센터의 유휴 자원을 대여하는 서비스가 등장</strong>하기 시작. </li>
</ul>
</li>
</ol>
<blockquote>
<p>즉 <strong>서버의 자원과 공간, 및 네트워크 환경을 제공을 빌려 사용하는 클라우드 컴퓨팅이 시작</strong>된 순간입니다.</p>
</blockquote>
<p><br><br><br></p>
<h2 id="cloud">Cloud</h2>
<h3 id="클라우드의-등장">클라우드의 등장</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/698dd0e6-c6c8-416b-a799-524b46ebdc48/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.20.36.png" alt=""></p>
<ul>
<li><strong>데이터 센터</strong>에서 <strong>서버 자원과 공간, 및 네트워크 환경</strong>을 제공. (<strong>온프레미스</strong>)<ul>
<li>현대의 클라우드 컴퓨팅은 <strong>데이터 센터와 비슷</strong>한 역할</li>
<li>물리적인 컴퓨터가 아닌, <strong>가상 컴퓨터를 대여</strong>한다. </li>
</ul>
</li>
<li><strong>가상화 기술을 사용하는 클라우드 서비스의 장점</strong>. <ol>
<li><strong>필요할 때마다 컴퓨팅 능력을 유연하게 조절</strong>할 수 있다. </li>
<li>고정 비용의 온프레미스와는 달리 <strong>사용한 만큼의 요금만 지불</strong>.</li>
<li>컴퓨터의 <strong>스냅샷을 이용해 다른 컴퓨터로 즉시 이주(migration) 가능</strong>.</li>
</ol>
</li>
</ul>
<p><br><br></p>
<h3 id="클라우드의-단점">클라우드의 단점</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/0b667b6f-be3d-41fa-bbbb-ed3461b0e621/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.21.19.png" alt=""></p>
<ul>
<li><strong>운영 환경이 클라우드 제공자에게 종속</strong>되어 클라우드 서비스에 문제가 생기면 <strong>내가 배포하고 관리하는 환경에도 영향</strong>이 미친다. <ul>
<li>운영환경이 <strong>특정 클라우드 사업자(vendor)에게 종속</strong>된다 : <ul>
<li><strong>백엔드 구성이 특정 회사의 기술로 구성 해야만 하는 경우</strong>가 발생할 수도 있다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="클라우드는-모든-것을-서비스화하는-것을-목표">클라우드는 모든 것을 서비스화하는 것을 목표</h3>
<h4 id="대표적-클라우드-서비스의-형태--saas-iaas-paas">대표적 클라우드 서비스의 형태 : SaaS, IaaS, PaaS</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/69e3e3da-e4a3-4e60-89eb-dd62d2fa4624/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.24.16.png" alt=""></p>
<table>
<thead>
<tr>
<th align="left">클라우드 서비스 형태</th>
<th align="left">풀 네임</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">SaaS</td>
<td align="left">Software as a Service</td>
<td align="left">클라우드 제공자가 <strong>당장 사용 가능한 소프트웨어를 제공</strong></td>
</tr>
<tr>
<td align="left">PaaS</td>
<td align="left">Platform as a Service</td>
<td align="left">클라우드 제공자가 <strong>데이터베이스, 개발 플랫폼까지 제공</strong></td>
</tr>
<tr>
<td align="left">IaaS</td>
<td align="left">Infrastructure as a Service</td>
<td align="left">클라우드 제공자가 <strong>가상 컴퓨터까지 제공</strong></td>
</tr>
</tbody></table>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Today I Learned [2021. 9. 14. Tue]]]></title>
            <link>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-14.-Tue</link>
            <guid>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-14.-Tue</guid>
            <pubDate>Tue, 14 Sep 2021 01:39:03 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 14일 화요일의 배운 내용을 기록한 문서입니다.<br>(내용은 바로 밑에 링크를 달아두었고 대신 Achievement Goal을 적어두었습니다.🙂)</p>
<p>👉🏻<strong>문서 1번</strong>:<a href="https://velog.io/@heewonkim-dev/GIT-TIL-03">https://velog.io/@heewonkim-dev/GIT-TIL-03</a>
👉🏻<strong>문서 2번</strong>:<a href="https://velog.io/@heewonkim-dev/GIT-TIL-04">https://velog.io/@heewonkim-dev/GIT-TIL-04</a></p>
<p><br><br></p>
<h2 id="before-you-learn">Before You Learn</h2>
<ul>
<li>Git의 환경설정을 할 수 있다.</li>
<li>버전 관리 시스템의 필요성을 이해 하고 있다.</li>
<li>Github과 Git의 관계에 대해 이해 하고 있다.</li>
<li>Repository에 대해 이해 하고 있다.<ul>
<li>Local Repository와 Remote Repository의 차이를 이해하고 있다.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h2 id="achievement-goals">Achievement Goals</h2>
<ul>
<li>Git 브랜치의 개념을 이해할 수 있다.</li>
<li>Git 으로 협업하며 브랜치를 나누는 이유를 이해할 수 있다.</li>
<li>Git 으로 프로젝트를 관리하며 브랜치를 생성, 전환, 병합할 수 있다.</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIT TIL 04]]></title>
            <link>https://velog.io/@heewonkim-dev/GIT-TIL-04</link>
            <guid>https://velog.io/@heewonkim-dev/GIT-TIL-04</guid>
            <pubDate>Tue, 14 Sep 2021 01:38:40 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 14일에 작성된 문서 2번 입니다.
git 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="프로젝트-workflow">프로젝트 workflow</h2>
<h3 id="1-fork-clone">1. Fork, clone</h3>
<h4 id="remote에-생성한-프로젝트-repository를-각자의-repository로-가져오기">Remote에 생성한 프로젝트 Repository를 각자의 Repository로 가져오기</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/1c2f3f76-269d-482f-ad3b-97832153c70f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.19.05.png" alt=""></p>
<ol>
<li><strong>프로젝트 Remote Repository 만들기</strong>. </li>
<li>팀원들과 함께 나누어 작업을 하기 위해서 <strong>각자의 Remote Repository로 Fork.</strong> </li>
<li>Local에서 작업하기 위해서 <strong><code>git clone</code> 명령어로 Repository를 Local에</strong> 가지고 왔다.</li>
</ol>
<p><br><br></p>
<h3 id="2-git-checkout--b-새로운-브랜치-이름--git-switch--c-새로운-브랜치-이름">2. <code>git checkout -b 새로운 브랜치 이름</code> / <code>git switch -c 새로운 브랜치 이름</code></h3>
<h4 id="브랜치를-생성하고-생성한-브랜치로-이동">브랜치를 생성하고 생성한 브랜치로 이동</h4>
<ul>
<li>개발 과정에서는 main 브랜치가 아닌 dev 브랜치를 하나 만들어서 작업을 하는 경우가 많다. </li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/bb6cd971-5794-47b5-9371-9572eba8925c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.23.02.png" alt=""></p>
<blockquote>
<p><code>dev</code> 브랜치를 만들어서 <strong>해당 브랜치로 이동</strong>해 보겠습니다. 
여기서 <strong><code>HEAD</code>는 현재 위치의 커밋</strong>을 가리킵니다. 
즉 <strong>현재 작업중인 커밋</strong>입니다.</p>
</blockquote>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/3ad0bce2-e4e4-41a3-9cd8-3da53e0398d2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.26.10.png" alt=""></p>
<ul>
<li><strong><code>git checkout -b dev</code></strong> 통해서 <strong><code>dev</code> 브랜치를 생성.</strong> <ul>
<li><strong><code>git switch -c dev</code> 도 가능</strong>. </li>
</ul>
</li>
<li><strong>Remote Repository 에도 생성한 브랜치를 반영</strong>하기 위해서는 <strong><code>git push origin dev</code></strong> 를 입력.</li>
</ul>
<p><br><br></p>
<h3 id="3-git-branch">3. <code>git branch</code></h3>
<h4 id="생성한-브랜치의-목록-및-현재-위치한-브랜치-확인">생성한 브랜치의 목록 및 현재 위치한 브랜치 확인</h4>
<blockquote>
<p>브랜치가 잘 생성되었는지 확인하고 싶어요. 
생성한 브랜치의 목록과 내가 현재 dev 브랜치에 있는 것이 맞는지 확인해 볼 방법은 없을까요? </p>
</blockquote>
<ul>
<li><strong><code>git branch</code></strong> 명령어를 통해 확인할 수 있다. </li>
<li>터미널 창에 <code>git branch</code> 를 입력하면 아래 화면이 뜬다. </li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/f9f4633d-d883-4a81-8818-1eca67f9d6ab/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.30.05.png" alt=""></p>
<ul>
<li>알파벳 <strong><code>q</code> 를 눌러서 종료</strong>할 수 있다.</li>
</ul>
<p><br><br></p>
<h3 id="4-git-checkout--b-새로운-브랜치-이름--git-switch--c-새로운-브랜치-이름">4. <code>git checkout -b 새로운 브랜치 이름</code> / <code>git switch -c 새로운 브랜치 이름</code></h3>
<h4 id="브랜치를-생성하고-생성한-브랜치로-이동-1">브랜치를 생성하고 생성한 브랜치로 이동</h4>
<blockquote>
<p>회의를 통해 <strong>하나의 기능을 구현할 때는 <code>feature/기능이름</code> 브랜치를 만들어서 작업하기로 정했습니다</strong>. 
<strong>로그인 기능을 구현</strong>하기 위해서 <strong><code>feature/login</code> 브랜치를 생성</strong>해보도록 하겠습니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/72d09898-7a6a-4ffa-b7a8-a60174d850e4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.31.09.png" alt=""></p>
<br>

<ul>
<li><strong><code>git checkout -b feature/login</code></strong> 를 입력. <ul>
<li><strong><code>git switch -c feature/login</code></strong> 도 같은 기능.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/ad3372cd-43ea-4f52-82b0-d8057cf26845/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.32.56.png" alt=""></p>
<p><br><br></p>
<h3 id="5-git-checkout--b-새로운-브랜치-이름--git-switch--c-새로운-브랜치-이름">5. <code>git checkout -b 새로운 브랜치 이름</code> / <code>git switch -c 새로운 브랜치 이름</code></h3>
<h4 id="브랜치를-생성하고-생성한-브랜치로-이동-2">브랜치를 생성하고 생성한 브랜치로 이동</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/dcc97218-130c-4bd4-aff3-9a4a245181db/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.50.27.png" alt=""></p>
<blockquote>
<p><strong><code>feature/login</code> 브랜치에서 로그인 기능이 완성</strong>되었습니다! 여기에 <strong>소셜 로그인(oauth) 기능을 추가</strong>해 보고 싶어요. 그런데 로그인 코드를 건드리자니 위험 부담이 있네요. <strong>새로운 브랜치를 하나 더 만들어서 작업</strong>하고 싶습니다. <strong><code>feature/login-oauth</code> 라는 이름으로 <code>feature/login</code> 브랜치에서 파생된 브랜치를 하나 더 만들어서 작업</strong>해 보겠습니다.</p>
</blockquote>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/21e0fa68-f7ae-4652-bd54-adeef9b1516a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.51.47.png" alt=""></p>
<ul>
<li><strong><code>git checkout -b feature/login-oauth</code></strong> 를 입력. <ul>
<li><strong><code>git switch -c feature/login-oauth</code></strong> 명령어도 같은 기능.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="6-git-checkout--b-새로운-브랜치-이름--git-switch--c-새로운-브랜치-이름">6. <code>git checkout -b 새로운 브랜치 이름</code> / <code>git switch -c 새로운 브랜치 이름</code></h3>
<h4 id="브랜치를-생성하고-생성한-브랜치로-이동-3">브랜치를 생성하고 생성한 브랜치로 이동</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/035dc694-fbc7-416e-b539-2b7201ab1269/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.55.43.png" alt=""></p>
<blockquote>
<p><strong>소셜 로그인 기능까지 구현이 완료</strong>되었습니다. 이 <strong><code>feature/login-oauth</code>에 있는 코드를 <code>feature/login</code> 브랜치로 병합(merge) 할 수 있는 방법</strong>이 있을까요? 먼저 <strong><code>git checkout(switch) feature/login</code> 명령어를 통해 <code>feature/login</code> 브랜치로 이동</strong>하세요.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/980bd463-f342-4c2a-9217-5481231b0e2e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.56.06.png" alt=""></p>
<ul>
<li><strong><code>git checkout -b feature/login</code></strong> 를 입력. </li>
<li><strong>merge하기 위해서는 먼저 병합이 될 브랜치로 이동</strong>을 해야 한다.<ul>
<li><strong><code>feature/login-oauth</code> 브랜치를 <code>feature/login</code> 브랜치로 병합하기 위해서는 <code>feature/login</code> 브랜치로 이동</strong>. </li>
<li><strong><code>git switch feature/login</code>도 같은 기능</strong>.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="7-1-git-merge-병합할-브랜치-이름">7-1. <code>git merge 병합할 브랜치 이름</code></h3>
<h4 id="브랜치-병합하기">브랜치 병합하기</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/04baf94e-7c17-49b7-9cfe-015d05268074/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.01.27.png" alt=""></p>
<ul>
<li><strong><code>feature/login-oauth</code> 내용을 <code>feature/login</code> 브랜치로 병합</strong><ul>
<li><strong>현재 위치가 <code>feature/login</code></strong><ul>
<li><strong><code>git merge feature/login-oauth</code></strong> 입력. </li>
</ul>
</li>
</ul>
</li>
<li><strong><code>feature/login-oauth</code> 머지 전 <code>feature/login</code>에 추가 커밋이 없어, 브랜치가 분기될 필요가 없다.</strong> <ul>
<li>자동적으로 <strong>fast-forward 방식으로 병합</strong>이 이뤄진다. <ul>
<li>fast-forward : <strong>별도의 커밋을 생성하지 않고 <code>feature/login</code> 브랜치가 가리키는 커밋을 <code>feature/login-oauth</code> 가 생성한 커밋으로 바꾸는 작업</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="7-2-git-merge-병합할-브랜치-이름">7-2. <code>git merge 병합할 브랜치 이름</code></h3>
<h4 id="만일-featurelogin-브랜치에-별도의-커밋이-있었다면">만일, <code>feature/login</code> 브랜치에 별도의 커밋이 있었다면?</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/6f9c9701-c6d4-4a94-a833-0b7512632e8b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.02.51.png" alt=""></p>
<ul>
<li><strong>merge commit 방식</strong>으로 병합되었을 것. <ul>
<li>각 브랜치가 줄기처럼 분기한 후, 병합의 모양새를 가짐.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/7f7be899-a491-49d5-bce2-6561249af72b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.03.11.png" alt=""></p>
<ul>
<li><strong><code>git merge feature/login-oauth</code></strong> 입력 </li>
<li><strong>해당 브랜치를 현재 위치한 브랜치로 병합</strong>(merge).</li>
</ul>
<p><br><br></p>
<h3 id="merge와-rebase의-차이점">merge와 rebase의 차이점</h3>
<ul>
<li><strong>merge</strong><ul>
<li>변경 내용의 이력이 모두 그대로 남아 있어 이력이 복잡해 짐. </li>
</ul>
</li>
<li>rebase<ul>
<li>말 그대로 <strong>branch base를 이동</strong> </li>
<li>rebase의 원리 =  fast-forward. </li>
<li>머지처럼 <strong>브랜치 통합을 목적</strong> </li>
<li><strong>특정 시점으로 브랜치가 가리키는 곳을 변경하는 기능</strong>. </li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/9007d883-487b-4300-965d-7c13ccf4bb68/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.04.06.png" alt=""></p>
<blockquote>
<p><strong><code>feature/login</code> 에서 <code>git rebase main feature/login</code> 명령어를 입력하면 main의 가장 최신 커밋으로 브랜치가 가리키는 곳이 변경</strong>됩니다. (main의 다른 커밋에서 충돌이 없을 경우)</p>
</blockquote>
<p><br><br></p>
<h3 id="8-git-push-origin-브랜치-이름">8. <code>git push origin 브랜치 이름</code></h3>
<h4 id="remote-repository로-업로드하기">Remote Repository로 업로드하기</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/c8a16214-816d-4c5a-b887-4b5c1a61c8b3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.07.52.png" alt=""></p>
<ul>
<li>로컬 작업 내용을 <strong>Remote Repository 에 업로드하기 위해서는 <code>push</code></strong></li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/cbdb263c-7336-4545-9b19-c81a059a527b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.08.17.png" alt=""></p>
<ul>
<li><strong><code>git push origin feature/login</code></strong> 입력 </li>
<li>해당 <strong>브랜치를 Remote Repository로 업로드</strong>.</li>
</ul>
<p><br><br></p>
<h3 id="9-pull-request">9. <code>Pull Request</code></h3>
<h4 id="내가-push한-변경사항에-대해서-다른-사람들에게-알리는-것">내가 <code>push</code>한 변경사항에 대해서 다른 사람들에게 알리는 것</h4>
<blockquote>
<p><code>feature/login</code>의 변경 사항을 다른 팀원들과 함께 코드 리뷰를 하고 dev 브랜치에 적용하고 싶습니다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/460a812c-3f1f-4ea8-94ce-71b8cf31c8ce/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.10.54.png" alt=""></p>
<ul>
<li>Github의 <strong>Pull Request 기능을 활용해 dev 브랜치로의 반영을 요청</strong>. </li>
<li><strong>리뷰가 끝난 코드는 브라우저에서도 dev 브랜치로 merge</strong> 할 수 있다.</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/9db81c7d-4c64-44dd-997c-5357b7755b5c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.11.09.png" alt=""></p>
<ul>
<li>간단하게 PR 내용을 입력한 후 <strong><code>Create pull request</code> 버튼</strong>을 클릭.</li>
</ul>
<p><br><br></p>
<h3 id="전체적인-흐름-그림-아래-참조">전체적인 흐름 그림 (아래 참조)</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/fac6c46f-4c7f-4c70-b059-44a058b2e07b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.11.52.png" alt="">
<br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIT TIL 03]]></title>
            <link>https://velog.io/@heewonkim-dev/GIT-TIL-03</link>
            <guid>https://velog.io/@heewonkim-dev/GIT-TIL-03</guid>
            <pubDate>Tue, 14 Sep 2021 01:21:04 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 14일에 작성된 문서 1번 입니다.
git 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="브랜치">브랜치</h2>
<h3 id="독립적으로-어떤-작업을-진행하기-위한-개념">독립적으로 어떤 작업을 진행하기 위한 개념</h3>
<blockquote>
<p>개발을 하다 보면 한 페이지 안의 <strong>여러 기능을 따로 구현하기 위해, 코드를 여러 개로 복사해야 하는 일이 자주 생깁</strong>니다. <strong>브랜치 기능을 활용하면, 코드를 통째로 복사한 후 원래 코드가 변경될 우려 없이 독립적으로 개발</strong>할 수 있습니다.</p>
</blockquote>
<ul>
<li>각각의 브랜치는 다른 브랜치의 영향을 받지 않아 여러 작업을 동시에 진행할 수 있다.</li>
<li>브랜치 기능의 장점<ul>
<li>한 소스코드에서 동시에 다양한 작업을 할 수 있게 해준다.</li>
<li>소스코드의 한 시점과 동일한 상태를 만들고, 브랜치를 넘나들며 작업을 수행할 수 있다.</li>
<li>각각의 브랜치에서 생긴 변화가 다른 브랜치에 영향을 주지 않고 독립적으로 코딩을 진행할 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/t1EZnoWNe-1622611173126.png" alt=""></p>
<blockquote>
<p>master 또는 main 이라는 이름을 가진 통합 브랜치에 뿌리를 두고, 각각의 브랜치가 갈라져 나오고 있는 모습입니다.</p>
</blockquote>
<ul>
<li>나누어진 브랜치에서는 각 저장소 안에서 마음대로 소스코드를 변경할 수 있다. </li>
<li>브랜치에서 변경된 내용들은 다른 브랜치와 병합함으로써 다시 새로운 하나의 브랜치로 모을 수 있다.</li>
</ul>
<p><br><br></p>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/M5W4lDSaJ-1622611197181.png" alt=""></p>
<blockquote>
<p>여러 명이서 동시에 작업을 할 때에 다른 사람의 작업에 영향을 주거나 받지 않도록, 먼저 통합 브랜치에서 자신의 작업 전용 브랜치를 만듭니다.</p>
</blockquote>
<ul>
<li>각자의 브랜치에서 맡은 영역에 대한 작업을 진행한 후, 작업이 끝난 브랜치는 통합 브랜치에 병합해서 변경 사항을 적용. </li>
</ul>
<p><br><br>
<br></p>
<h2 id="브랜치-종류">브랜치 종류</h2>
<h3 id="1-통합-브랜치-integration-branch">1. 통합 브랜치 (Integration Branch)</h3>
<h4 id="배포될-소스-코드가-기록되는-브랜치">배포될 소스 코드가 기록되는 브랜치.</h4>
<ul>
<li>Github Repository를 생성하게 되면 기본적으로 main 브랜치가 생긴다. </li>
<li>프로젝트의 모든 기능이 정상적으로 작동하는 상태의 소스코드가 담겨 있다.
<br><br></li>
</ul>
<h3 id="2-피처-브랜치-feature-branch">2. 피처 브랜치 (Feature Branch)</h3>
<h4 id="기능-추가-버그-수정과-같이-단위-작업을-위한-브랜치">기능 추가, 버그 수정과 같이 단위 작업을 위한 브랜치.</h4>
<ul>
<li>통합 브랜치로부터 만들어내며, 피처 브랜치에서 하나의 작업이 완료가 되면 다시 통합 브랜치에 병합하는 방식으로 진행. </li>
<li>토픽 브랜치라고도 한다.</li>
</ul>
<p><br><br>
<br></p>
<h2 id="브랜치-명령어-모음">브랜치 명령어 모음</h2>
<table>
<thead>
<tr>
<th align="left">명령어</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong><code>$ git branch 새로운 브랜치 이름</code></strong></td>
<td align="left"><strong>새로운 브랜치</strong> 생성</td>
</tr>
<tr>
<td align="left"><strong><code>$ git switch -c 새로운 브랜치 이름</code></strong></td>
<td align="left"><strong>새로운 브랜치 생성 후 해당 브랜치로 전환</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git checkout -b 새로운 브랜치 이름</code></strong></td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><strong><code>$ git branch</code></strong></td>
<td align="left">브랜치 <strong>목록 확인</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git branch -v</code></strong></td>
<td align="left">브랜치 <strong>목록과 각 브랜치의 최근 커밋</strong> 확인</td>
</tr>
<tr>
<td align="left"><strong><code>$ git branch -d 삭제할 브랜치 이름</code></strong></td>
<td align="left"><strong>브랜치 삭제</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git branch -D</code></strong></td>
<td align="left"><strong>병합하지 않은 브랜치를 강제 삭제</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git switch 브랜치 이름</code></strong></td>
<td align="left"><strong>브랜치 전환</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git checkout 브랜치 이름</code></strong></td>
<td align="left"></td>
</tr>
<tr>
<td align="left"><strong><code>$ git checkout master</code></strong></td>
<td align="left"><strong>브랜치 병합</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git merge dev</code></strong></td>
<td align="left"><strong>master 브랜치로 dev 브랜치를 병합할 때 (master ← dev)</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git log --branches --graph --decorate</code></strong></td>
<td align="left"><strong>로그에 모든 브랜치를 그래프로 표현</strong></td>
</tr>
<tr>
<td align="left"><strong><code>$ git stash</code></strong></td>
<td align="left"><strong>아직 commit 하지 않은 작업을 스택에 임시로 저장</strong></td>
</tr>
</tbody></table>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Today I Learned [2021. 9. 13. Mon]]]></title>
            <link>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-13.-Mon</link>
            <guid>https://velog.io/@heewonkim-dev/Today-I-Learned-2021.-9.-13.-Mon</guid>
            <pubDate>Tue, 14 Sep 2021 01:17:58 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일 월요일의 배운 내용을 기록한 문서입니다.<br>(내용은 바로 밑에 링크를 달아두었고 대신 Achievement Goal을 적어두었습니다.🙂)</p>
<p>👉🏻<strong>문서 1번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-06">https://velog.io/@heewonkim-dev/HTTP-TIL-06</a>
👉🏻<strong>문서 2번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-07">https://velog.io/@heewonkim-dev/HTTP-TIL-07</a>
👉🏻<strong>문서 3번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-08">https://velog.io/@heewonkim-dev/HTTP-TIL-08</a>
👉🏻<strong>문서 4번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-09">https://velog.io/@heewonkim-dev/HTTP-TIL-09</a>
👉🏻<strong>문서 5번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-10">https://velog.io/@heewonkim-dev/HTTP-TIL-10</a>
👉🏻<strong>문서 6번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-11">https://velog.io/@heewonkim-dev/HTTP-TIL-11</a>
👉🏻<strong>문서 7번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-12">https://velog.io/@heewonkim-dev/HTTP-TIL-12</a>
👉🏻<strong>문서 8번</strong>:<a href="https://velog.io/@heewonkim-dev/HTTP-TIL-13">https://velog.io/@heewonkim-dev/HTTP-TIL-13</a></p>
<p><br><br></p>
<h2 id="achievement-goals"><strong>Achievement Goals</strong></h2>
<ul>
<li>HTTP 기반 네트워크 흐름에 대해 이해할 수 있다.</li>
<li>TCP/IP 기반 네트워크 흐름에 대해 이해할 수 있다.<ul>
<li>TCP/IP 패킷이 왜 필요한 지 설명할 수 있다.</li>
<li>TCP와 UDP의 차이에 대해 설명할 수 있다.</li>
</ul>
</li>
<li>HTTP 기본 동작과 특징에 대해 이해할 수 있다.<ul>
<li>상태유지(Stateful)과 무상태(Stateless)의 개념에 대해 설명할 수 있다.</li>
<li>HTTP 메시지 구성에 대해 설명할 수 있다.</li>
</ul>
</li>
<li>HTTP 헤더의 역할에 대해 이해할 수 있다.<ul>
<li>표현, 콘텐츠 협상 등 다양한 헤더의 역할에 대해 알 수 있다.</li>
</ul>
</li>
<li>캐시가 왜 필요한 지 알 수 있다.<ul>
<li>브라우저 캐시, 프록시 캐시에 대해 설명할 수 있다.</li>
<li>조건부 요청, 캐시 무효화 방법 등을 사용할 수 있다.</li>
</ul>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP TIL 13]]></title>
            <link>https://velog.io/@heewonkim-dev/HTTP-TIL-13</link>
            <guid>https://velog.io/@heewonkim-dev/HTTP-TIL-13</guid>
            <pubDate>Tue, 14 Sep 2021 01:17:31 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일에 작성된 문서 9번 입니다.
http 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="프록시-캐시">프록시 캐시</h2>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/e9eeaf21-f3af-433f-afad-50e8a0ae2321/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.59.07.png" alt=""></p>
<ul>
<li>프록시: 클라이언트와 서버 사이에 대리로 통신을 수행하는 중계 기능을 하는 서버. <blockquote>
<p>클라이언트, 혹은 반대로는 서버가 다른 네트워크에 간접적으로 접속 할 수 있기 때문에, 보안, 캐싱을 통한 성능, 트래픽 분산 등의 장점을 가집니다.</p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<blockquote>
<p>한국에 있는 클라이언트에서 특정 데이터가 필요한 상황인데 해당 데이터의 원 서버가 미국에 있다고 가정. </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/f1957c83-7139-4548-b635-5ae00e63c689/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.00.36.png" alt=""></p>
<ul>
<li>한국에서 미국까지 직접 접근하여 이미지를 가져오는데 0.5초 소요. </li>
<li>한국 클라이언트는 모두 0.5초 가량을 기다려야 해당 이미지를 받을 수 있다. </li>
</ul>
<p><br><br></p>
<h4 id="클라이언트와-원-서버-사이에-위치한-프록시-캐시-서버를-도입">클라이언트와 원 서버 사이에 위치한 프록시 캐시 서버를 도입.</h4>
<blockquote>
<p>한국에 프록시 캐시서버를 두고 한국의 클라이언트는 프록시 캐시서버를 통해 자료를 가져오도록 해봅시다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/82dcd39d-6002-4bef-a0f2-d4338811bbd2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.02.00.png" alt=""></p>
<ul>
<li>여러 사람이 찾은 자료일수록 이미 캐시에 등록되어 빠른 속도로 자료를 가져올 수 있다. <ul>
<li>같은 국내에 있기에 원서버에 접근하는 것보다 훨씬 빠른 속도에 자료를 가져올 수 있기 때문. </li>
<li>클라이언트에서 사용하고 저장하는 캐시를 private 캐시</li>
<li>프록시 캐시 서버의 캐시를 public 캐시</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="캐시-지시어">캐시 지시어</h3>
<table>
<thead>
<tr>
<th align="left">캐시 지시어</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>Cache-Control: public</code></td>
<td align="left">응답이 퍼블릭 캐시에 저장되도 됨</td>
</tr>
<tr>
<td align="left"><code>Cache-Control: private</code></td>
<td align="left">응답이 해당 사용자만을 위함. 프라이빗 캐시에 저장해야함.</td>
</tr>
<tr>
<td align="left"><code>Cache-Control: s-maxage</code></td>
<td align="left">프록시 캐시에만 적용되는 max-age</td>
</tr>
<tr>
<td align="left"><code>Age: 60</code></td>
<td align="left">오리진 서버에서 응답후 프록시 캐시에 머문시간(초)</td>
</tr>
</tbody></table>
<p><br><br></p>
<h3 id="캐시-무효화">캐시 무효화</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/03306635-b969-4ffe-9704-b76be0f07ed4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.05.09.png" alt=""></p>
<table>
<thead>
<tr>
<th align="left">캐시 지시어</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>Cache-Control: no-cache</code></td>
<td align="left">데이터는 캐시해도 되지만, 원서버에 검증하고 사용</td>
</tr>
<tr>
<td align="left"><code>Cahce-Control: no-store</code></td>
<td align="left">데이터에 민감한 정보가 있어 저장하면 안됨. 메모리에서 사용하고 최대한 빨리 삭제</td>
</tr>
<tr>
<td align="left"><code>Cache-Control: must-revalidate</code></td>
<td align="left">캐시 만료후, 최초 조회시, 원서버에 검증해야 함.</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">원서버 접근 실패시, 반드시 오류 발생해야함 504 gateway-timeout</td>
</tr>
<tr>
<td align="left"></td>
<td align="left">캐시 유효 시간이라면 캐시 사용</td>
</tr>
<tr>
<td align="left"><code>Pragma: no-cache</code></td>
<td align="left">HTTP 1.0 하위 호환</td>
</tr>
</tbody></table>
<ul>
<li>캐시를 무효화를 확실하게 해야하는 경우 Pragma와 같은 하위호환까지 포함하여 위와같이 적용해야 한다.</li>
</ul>
<p><br><br></p>
<h3 id="no-cache">no-cache</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/00214e2a-e4f9-4ef7-ab8f-20a5d0569ee1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.10.05.png" alt=""></p>
<ul>
<li>캐시 서버 요청을 하면 프록시 캐시 서버에 도착하면 no-cache인 경우 원 서버에 요청. </li>
<li>원 서버에서 검증 후 304 응답.</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/b1efc1bd-9369-4df7-ae94-588932514590/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.10.58.png" alt=""></p>
<ul>
<li>프록시 캐시 서버와 원 서버간 네트워크 연결이 단절되어 접근이 불가능</li>
<li>no-cache에서는 오래된 데이터라도 보여주자라는 개념으로 200OK으로 응답.</li>
</ul>
<p><br><br></p>
<h3 id="must-revalidate">must-revalidate</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/785552a5-2410-4efa-9fac-1700d6db21a3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.11.54.png" alt=""></p>
<ul>
<li>원 서버에 접근이 불가할 때 504 Gateway Timeout 오류를 보냄. <blockquote>
<p>통장 잔고 등 중요한 정보가 원 서버를 못 받았다고 해서 예전 데이터로 뜬다면 큰 문제가 생기기때문에 이런 경우 must-revalidate를 써야 합니다.</p>
</blockquote>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP TIL 12]]></title>
            <link>https://velog.io/@heewonkim-dev/HTTP-TIL-12</link>
            <guid>https://velog.io/@heewonkim-dev/HTTP-TIL-12</guid>
            <pubDate>Tue, 14 Sep 2021 01:14:14 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일에 작성된 문서 7번 입니다.
http 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="캐시-검증-헤더와-조건부-요청">캐시 검증 헤더와 조건부 요청</h2>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/85026d7f-b00d-4b72-8e42-399be3bf46d9/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.03.43.png" alt=""></p>
<p><br><br></p>
<h3 id="last-modified--if-modified-since">Last-Modified &amp; If-Modified-Since</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/7a81dc17-1934-419c-ab8b-bf4d6f10a523/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.05.50.png" alt=""></p>
<ul>
<li>검증 헤더 <code>Last Modified</code>로 캐시의 수정시간을 알 수 있다.<ul>
<li><code>Last Modified</code> : 데이터가 마지막으로 수정된 시간정보를 헤더에 포함. <strong>(데이터 최종 수정일 정보)</strong><ul>
<li>응답 결과를 캐시에 저장할 때 데이터 최종 수정일도 저장.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/2eca354d-e1fc-4ec3-85d6-76bd6878a36e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.07.25.png" alt=""></p>
<ul>
<li>캐시의 유효시간이 초과되도 <code>If-Modified-Since</code> 헤더를 이용해서 조건부 요청을 할 수 있다.<br>

</li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/27b1243f-2305-464f-8def-7143db0ad87d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.09.23.png" alt=""></p>
<ul>
<li>서버의 해당 자료의 최종 수정일과 비교해 데이터 수정이 안되었을 경우 응답 메세지에 이를 담아서 알려준다. <ul>
<li>이때 HTTP Body는 응답 데이터에 없음 <ul>
<li>상태코드 304 <code>Not Modified</code> : 변경된 것이 없다는 뜻. </li>
</ul>
</li>
</ul>
</li>
<li>전송 데이터에 바디가 빠졌기 때문에 헤더만 포함된 0.1M만 전송. </li>
<li>클라이언트에서는 해당 응답을 받은 뒤 캐시를 갱신해주고 다시 일정시간(60초)동안 유효하게 됨.</li>
</ul>
<p><br><br></p>
<blockquote>
<p>Last-Modified와 If-Modified-Since를 정리</p>
</blockquote>
<ul>
<li>캐시 유효 시간이 초과해도 서버의 데이터가 갱신되지 않으면?<ul>
<li>304 <code>Not Modified</code> + 헤더의 메타데이터만 응답 (바디X)</li>
</ul>
</li>
<li>클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 데이터를 갱신</li>
<li>클라이언트는 캐시에 저장되어 있는 데이터를 재활용</li>
<li>결과적으로 네트워크 다운 로드가 발생하지만, 용량이 적은 헤더 정보만 다운로드</li>
<li>매우 실용적인 해결책</li>
</ul>
<br>

<blockquote>
<p>Last-Modified와 If-Modified-Since 단점</p>
</blockquote>
<ul>
<li>1초 미만의 단위로는 캐시 조정이 불가능</li>
<li>날짜 기반의 로직 사용</li>
<li>데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터의 결과가 똑같은 경우</li>
<li>서버에서 별도로 캐시 로직을 관리하고 싶은 경우<ul>
<li>스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시를 유지하고 싶은 경우</li>
</ul>
</li>
</ul>
<p><br><br>
<br></p>
<h3 id="etag와-if-none-match-검증헤더">ETag와 If-None-Match 검증헤더</h3>
<h4 id="서버에서-완전히-캐시를-컨트롤하고-싶은-경우-etag를-사용">서버에서 완전히 캐시를 컨트롤하고 싶은 경우 ETag를 사용</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/10f8976f-e5b5-4c0c-be8c-7af7972878a2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.16.17.png" alt=""></p>
<p><br><br></p>
<h3 id="etag와-if-none-match의-작동방식">ETag와 If-None-Match의 작동방식</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/de335138-7f5a-41f6-a332-a7b19bc26b5d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.17.15.png" alt=""></p>
<ul>
<li>서버에서 헤더에 ETag를 작성해 응답. </li>
<li>클라이언트의 캐시에서 해당 ETag 값을 저장.</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/82d2d2ce-31b0-4e70-ab30-96fb8fa1cc37/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.17.59.png" alt=""></p>
<ul>
<li>캐시시간이 초과되서 다시 요청을 해야하는 경우 <ul>
<li>ETag값을 검증하는 If-None-Match를 요청 헤더에 작성해서 보낸다.</li>
</ul>
</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/1bb73b44-36a3-4ea2-bd66-44c4d329e150/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.19.15.png" alt=""></p>
<ul>
<li>서버에서 데이터가 변경되지 않았을 경우 ETag는 동일해서 If-None-Match는 거짓. <ul>
<li>서버에서는 304 Not Modified를 응답 </li>
<li>HTTP Body는 없다. </li>
</ul>
</li>
<li>브라우저 캐시에서는 응답 결과를 재사용하고 헤더 데이터를 갱신</li>
</ul>
<br>

<blockquote>
<p>ETag와 If-None-Match를 정리</p>
</blockquote>
<ul>
<li>단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받는 형식</li>
<li>캐시 제어 로직을 서버에서 완전히 분리</li>
<li>클라이언트는 단순하게 이 값을 서버에 제공<ul>
<li>클라이언트는 캐시 매커니즘을 모름.</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="캐시와-관련된-헤더들과-조건부-요청-헤더">캐시와 관련된 헤더들과 조건부 요청 헤더</h3>
<table>
<thead>
<tr>
<th align="left">캐시 지시어</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>Cahce-Control: maxage</code></td>
<td align="left">캐시 유효기간: 초단위</td>
</tr>
<tr>
<td align="left"><code>Cahce-Control: no-cache</code></td>
<td align="left">데이터는 캐시해도 되지만, 항상 원래 서버에 검증하고 사용</td>
</tr>
<tr>
<td align="left"><code>Cahce-Control: no-store</code></td>
<td align="left">데이터에 민감한 정보가 있어 저장하면 안됨. 메모리에서 사용하고 최대한 빨리 삭제</td>
</tr>
</tbody></table>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/78bf535c-e7e6-4110-85d6-1ce0908dcb47/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.57.16.png" alt=""></p>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP TIL 11]]></title>
            <link>https://velog.io/@heewonkim-dev/HTTP-TIL-11</link>
            <guid>https://velog.io/@heewonkim-dev/HTTP-TIL-11</guid>
            <pubDate>Tue, 14 Sep 2021 01:10:27 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일에 작성된 문서 6번 입니다.
http 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="캐시">캐시</h2>
<h3 id="캐시가-없는-경우">캐시가 없는 경우</h3>
<blockquote>
<p>클라이언트가 logo.jpg 이미지에 대한 요청을 보내고 서버가 해당 이미지에 대한 응답을 줄 때, HTTP 헤더가 0.1M, 바디가 1.0M로 총 1.1M로 가정해보겠습니다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/19e9c454-e988-44b2-8cd3-24ba2542c19b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.42.59.png" alt=""></p>
<ul>
<li>데이터가 변경되지 않아도 계속 네트워크를 통해 데이터를 다운 받아야한다.</li>
<li>인터넷 네트워크 속도가 느리고 비싸다.</li>
<li>브라우저 로딩속도가 느리다.</li>
<li>느린 사용자 경험을 제공한다.</li>
</ul>
<p><br><br></p>
<h3 id="캐시를-적용한-경우">캐시를 적용한 경우</h3>
<h4 id="캐시cache-컴퓨터-과학에서-데이터나-값을-미리-복사해-놓는-임시-장소">캐시(cache): 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소.</h4>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/cfa595fa-08e8-4059-8aca-01aaf9b21628/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.57.33.png" alt=""></p>
<ul>
<li>캐시 접근 시간에 비해 원래 데이터 접근 시간이 오래 걸리는 경우</li>
<li>값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용. </li>
<li>캐시에 데이터를 미리 복사해 놓으면 더 빠른 속도로 데이터에 접근할 수 있다. </li>
<li>브라우저에 캐시를 저장: 헤더에 <code>cache-control</code> 속성 <ul>
<li><strong>캐시가 유효한 시간을 지정</strong>. <blockquote>
<p>60초로 설정한다면 60초 동안은 해당 캐시가 유효</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/726bc6af-a993-41c2-865a-68eb36299534/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.58.13.png" alt=""></p>
<blockquote>
<p>응답을 받았을 때 브라우저 캐시에 해당 응답 결과를 저장하며 이는 60초간 유효합니다.</p>
</blockquote>
<p><br><br></p>
<h3 id="캐시를-적용한-경우--캐시-시간-초과">캐시를 적용한 경우 : 캐시 시간 초과</h3>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/299a3d67-2790-4dfe-b28f-a7ded45582be/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.59.51.png" alt=""></p>
<ul>
<li>두 번째 요청에선 캐시를 우선 조회. </li>
<li>캐시가 존재하고 아직 60초가 지나지 않아 유효한 캐시라면 해당 캐시에서 데이터를 가져온다.</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/d4041736-039e-43e1-9edc-b88e77a2555b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.00.44.png" alt=""></p>
<blockquote>
<p>만약 캐시의 유효시간이 초과한다면 어떻게 될까요?</p>
</blockquote>
<br>


<p><img src="https://images.velog.io/images/heewonkim-dev/post/668e6f90-e71b-40b4-86d5-74a8e70298c4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.01.37.png" alt=""></p>
<ul>
<li>다시 서버에 요청을하고 60초간 유효한 logo.jpg 이미지를 응답받는다. </li>
<li>이때 다시 네트워크 다운로드가 발생.</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/312fba5a-045a-4848-8bdf-9ff7cd549407/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-13%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.02.15.png" alt=""></p>
<ul>
<li>응답 결과를 브라우저가 렌더링하면 브라우저 캐시는 기존 캐시를 지우고 새 캐시로 데이터를 업데이트. </li>
<li>이 과정에서 캐시 유효 시간이 다시 초기화.</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP TIL 10]]></title>
            <link>https://velog.io/@heewonkim-dev/HTTP-TIL-10</link>
            <guid>https://velog.io/@heewonkim-dev/HTTP-TIL-10</guid>
            <pubDate>Tue, 14 Sep 2021 00:59:18 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일에 작성된 문서 5번 입니다.
http 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="콘텐츠-협상-헤더">콘텐츠 협상 헤더</h2>
<h3 id="콘텐츠-협상-contents-negotiation">콘텐츠 협상 (contents negotiation)</h3>
<h4 id="클라이언트가-선호하는-표현-요청">클라이언트가 선호하는 표현 요청</h4>
<ul>
<li>콘텐츠 협상에서 사용하는 헤더<ul>
<li>협상 헤더는 요청시에만 사용</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th align="left">헤더</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong><code>Accept</code></strong></td>
<td align="left">클라이언트가 선호하는 미디어 타입을 전달</td>
</tr>
<tr>
<td align="left"><strong><code>Accept-Charset</code></strong></td>
<td align="left">클라이언트가 선호하는 문자 인코딩</td>
</tr>
<tr>
<td align="left"><strong><code>Accept-Encoding</code></strong></td>
<td align="left">클라이언트가 선호하는 압축 인코딩</td>
</tr>
<tr>
<td align="left"><strong><code>Accept-Language</code></strong></td>
<td align="left">클라이언트가 선호하는 자연 언어</td>
</tr>
</tbody></table>
<p><br><br></p>
<h3 id="accept-language-예시"><code>Accept-Language</code> 예시</h3>
<blockquote>
<p>Accept-Language 헤더를 통해 클라이언트가 원하는 언어를 어떻게 서버에 요청할 수 있는지 알아봅시다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/7a6ce86d-0cda-464d-b0b5-23edb87eec3b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-11%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.18.51.png" alt=""></p>
<ul>
<li>한국어 브라우저에서 특정 웹사이트에 접속했을 때 콘텐츠 협상(<code>Accept-Language</code>)이 적용되지 않은 경우 :<ul>
<li>서버는 요청으로 받은 우선순위가 없으므로 기본언어로 설정된 영어로 응답. </li>
</ul>
</li>
<li>클라이언트에서 <code>Accept-Language</code>로 <code>KO</code>를 작성해 요청 : <ul>
<li>서버에서는 해당 우선순위 언어를 지원할 수 있기 때문에 한국어로 된 응답을 돌려줌</li>
</ul>
</li>
</ul>
<p><br><br></p>
<h3 id="accept-language-복잡한-예시"><code>Accept-Language</code> 복잡한 예시</h3>
<ul>
<li>클라이언트는 한국어를 선호해 <code>Accept-Language</code>에 한국어를 요청했지만 서버는 한국어를 지원하지 않으며 기본 언어는 독일어로 설정되어있다. </li>
<li>클라이언트는 독일어는 너무 어렵기 때문에 한국어가 안되면 영어로라도 응답을 받기 원한다. </li>
</ul>
<p><img src="https://images.velog.io/images/heewonkim-dev/post/b8c2eb49-45e9-46f7-9d99-d528d77dcb94/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-11%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.21.16.png" alt=""></p>
<blockquote>
<p>앞의 경우처럼 지원하는 언어를 요청하는 단순한 경우가 아닌 이처럼 서버에서 지원하는 언어가 여러개일때 <strong>클라이언트가 최우선으로 선호하는 언어가 지원되지 않는다면 어떻게 해야할까요?</strong></p>
</blockquote>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/48c917a4-4f5f-466e-bbd4-91605c532e1b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-11%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.22.12.png" alt=""></p>
<ul>
<li>협상 헤더에서는 원하는 콘텐츠에 대한 <strong>우선순위를 지정할 수 있다.</strong> <ul>
<li>Quality-Values (q) 값을 사용</li>
<li>0 ~ 1까지 숫자가 클수록 더 우선순위</li>
<li>생략하는 경우 1로 간주</li>
</ul>
</li>
<li>1부터 0까지 우선순위를 부여하면 이를 토대로 서버는 응답을 지원.</li>
</ul>
<br>

<p><img src="https://images.velog.io/images/heewonkim-dev/post/b56c898c-d8d9-4253-9d35-eb6e1f974d0f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-09-11%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.25.05.png" alt=""></p>
<blockquote>
<p>이를 이용해 서버에 우선순위 요청을 하게 되면 1순위인 한국어를 서버에서는 지원하지 않지만 2순위인 영어를 지원하기에 서버에서는 우선순위에 있는 영어를 독일어보다 클라이언트가 선호하기에 영어로 응답을 주게됩니다.</p>
</blockquote>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP TIL 09]]></title>
            <link>https://velog.io/@heewonkim-dev/HTTP-TIL-09</link>
            <guid>https://velog.io/@heewonkim-dev/HTTP-TIL-09</guid>
            <pubDate>Tue, 14 Sep 2021 00:56:13 GMT</pubDate>
            <description><![CDATA[<p>2021년 9월 13일에 작성된 문서 4번 입니다.
http 배운 내용을 정리했습니다.</p>
<p><br><br></p>
<h2 id="요청request에서-사용되는-헤더">요청(Request)에서 사용되는 헤더</h2>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/jkpVF5HFF-1622794687505.png" alt="HTTP_header"></p>
<h3 id="1-from--유저-에이전트의-이메일-정보">1. <code>From</code> : 유저 에이전트의 이메일 정보</h3>
<ul>
<li>일반적으로 <strong>잘 사용하지 않음</strong></li>
<li><strong>검색 엔진</strong>에서 주로 사용</li>
<li><strong>요청에서 사용</strong></li>
</ul>
<p><br><br></p>
<h3 id="2-referer--이전-웹-페이지-주소">2. <code>Referer</code> : 이전 웹 페이지 주소</h3>
<ul>
<li>현재 요청된 페이지의 <strong>이전 웹 페이지 주소</strong></li>
<li><strong>A → B로 이동하는 경우 B를 요청할 때 <code>Referer: A</code> 를 포함해서 요청</strong></li>
<li><code>Referer</code> 를 사용하면 <strong>유입경로 수집 가능</strong></li>
<li><strong>요청에서 사용</strong></li>
<li>referer는 단어 referrer의 오탈자이지만 스펙으로 굳어짐</li>
</ul>
<p><br><br></p>
<h3 id="3-user-agent--유저-에이전트-애플리케이션-정보">3. <code>User-Agent</code> : 유저 에이전트 애플리케이션 정보</h3>
<ul>
<li>클라이언트의 <strong>애플리케이션 정보 (웹 브라우저 정보, 등등)</strong></li>
<li><strong>통계 정보</strong></li>
<li><strong>어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능</strong></li>
<li>요청에서 사용<blockquote>
<p><code>user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36</code></p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<h3 id="4-host--요청한-호스트-정보도메인">4. <code>Host</code> : 요청한 호스트 정보(도메인)</h3>
<ul>
<li><p>요청에서 사용</p>
</li>
<li><p><strong>필수 헤더</strong></p>
</li>
<li><p><strong>하나의 서버가 여러 도메인을 처리해야 할 때 호스트 정보를 명시</strong>하기 위해 </p>
</li>
<li><p><strong>하나의 IP 주소에 여러 도메인이 적용됬을 때 호스트 정보를 명시</strong>하기 위해 </p>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/AQRIePiGt-1621842980559.png" alt="HTTP_HOST헤더비교"></p>
</li>
</ul>
<p><br><br></p>
<h3 id="5-origin--서버로-post-요청을-보낼-때-요청을-시작한-주소를-나타냄">5. <code>Origin</code> : 서버로 POST 요청을 보낼 때, 요청을 시작한 주소를 나타냄</h3>
<ul>
<li>여기서 <strong>요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생</strong></li>
<li>응답 헤더의 Access-Control-Allow-Origin와 관련</li>
</ul>
<p><br><br></p>
<h3 id="6-authorization--인증-토큰eg-jwt을-서버로-보낼-때-사용하는-헤더">6. <code>Authorization</code> : 인증 토큰(e.g. JWT)을 서버로 보낼 때 사용하는 헤더</h3>
<ul>
<li><strong>토큰의 종류(e.g. Basic) + 실제 토큰 문자</strong> 전송<blockquote>
<p><code>Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l</code></p>
</blockquote>
</li>
</ul>
<br>
<br><br>


<h2 id="응답response에서-사용되는-헤더">응답(Response)에서 사용되는 헤더</h2>
<p><img src="https://s3.ap-northeast-2.amazonaws.com/urclass-images/jkpVF5HFF-1622794687505.png" alt="HTTP_header"></p>
<h3 id="1-server--요청을-처리하는-origin-서버의-소프트웨어-정보">1. <code>Server</code> : 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보</h3>
<ul>
<li>응답에서 사용<blockquote>
<p><code>Server: Apache/2.2.22 (Debian)</code>
<code>Server: nginx</code></p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<h3 id="2-date--메시지가-발생한-날짜와-시간">2. <code>Date</code> : 메시지가 발생한 날짜와 시간</h3>
<ul>
<li>응답에서 사용<blockquote>
<p><code>Date: Tue, 15 Nov 1994 08:12:31 GMT</code></p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<h3 id="3-location--페이지-리디렉션">3. <code>Location</code> : 페이지 리디렉션</h3>
<ul>
<li>웹 브라우저는 3xx 응답의 결과에 <code>Location</code> 헤더가 있으면, <code>Location</code> 위치로 리다이렉트(자동 이동)</li>
<li>201(Created): <code>Location</code> 값은 요청에 의해 생성된 리소스 URI</li>
<li>3xx(Redirection): <code>Location</code> 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스</li>
</ul>
<p><br><br></p>
<h3 id="4-allow--허용-가능한-http-메서드">4. <code>Allow</code> : 허용 가능한 HTTP 메서드</h3>
<ul>
<li>405(Method Not Allowed)에서 응답에 포함<blockquote>
<p><code>Allow: GET, HEAD, PUT</code></p>
</blockquote>
</li>
</ul>
<p><br><br></p>
<h3 id="5-retry-after--유저-에이전트가-다음-요청을-하기까지-기다려야-하는-시간">5. <code>Retry-After</code> : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간</h3>
<ul>
<li>503(Service Unavailable): 서비스가 언제까지 불능인지 알려줄 수 있음<blockquote>
<p><code>Retry-After: Fri, 31 Dec 2020 23:59:59 GMT(날짜 표기)</code>
<code>Retry-After: 120(초 단위 표기)</code></p>
</blockquote>
</li>
</ul>
<p><br><br>
<br><br></p>
<blockquote>
<p>Written with <a href="https://stackedit.io/">StackEdit</a>.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>