<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev.awlog</title>
        <link>https://velog.io/</link>
        <description>기록을 생활화하려는 개발자</description>
        <lastBuildDate>Sun, 09 May 2021 16:48:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev.awlog</title>
            <url>https://images.velog.io/images/lua_aw/profile/efa6f336-1625-4038-8213-6ed5cb36d829/미니언_자름.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev.awlog. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lua_aw" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[리눅스 - 쉘(Shell)과 쉘스크립트(Shell Script)]]></title>
            <link>https://velog.io/@lua_aw/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98Shell%EA%B3%BC-%EC%89%98%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Shell-Script</link>
            <guid>https://velog.io/@lua_aw/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98Shell%EA%B3%BC-%EC%89%98%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Shell-Script</guid>
            <pubDate>Sun, 09 May 2021 16:48:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/18131515-4b67-4566-af0f-eec8a4e8236c/image.png" alt=""></p>
<h2 id="시작하며">시작하며</h2>
<p>이번주 공부한 리눅스 내용은 쉘과 쉘스크립트다 :)</p>
<h2 id="bash">Bash</h2>
<hr>
<p><code>Bash</code>는 쉘의 종류로, <strong>Bourne Again Shell</strong>의 축약어다. 리눅스에서 가장 널리 사용되는 쉘이다.
<code>/bin</code> 데릭터리 안에 존재한다.</p>
<h3 id="설정파일">설정파일</h3>
<p>bash는 다섯 개의 공통된 설정 파일들을 가지고 있다. 모든 리눅스 배포본에서 이들을 찾아볼 수 있지는 않지만, 이 파일들을 만드는 것은 어렵지 않다. bash는 5개의 설정 파일을 갖는다.</p>
<p><strong>일반적으로 전역적인 파일은 /etc 디렉토리에 위치한다.</strong> 지역적인 파일은 사용자 개개인을 위한 설정 내용을 담고 있어서 그 파일을 사용하는 특정 사용자에게만 영향을 끼치는 파일들을 뜻한다. 이들은 대개 사용자의 홈 디렉토리에서 찾아 볼 수 있는 숨김 파일이다. <strong>숨김 파일</strong>은 <strong>~/.bashrc와 같이 &#39;.&#39; 으로 시작한다.</strong></p>
<ul>
<li>전역적인 설정인 /etc/profile과 /etc/bashrc</li>
<li>개별 사용자마다 다른 설정을 담는, 지역적 설정인 ~/.bashrc, ~/.bash_profile, ~/.bash_logout</li>
</ul>
<p>처음에 한 번 수행되는 게 전역파일들, 그 다음엔 매번 지역적인 파일들이 참조된다.
<strong>bashrc는 bash에서 작업할 때마다 수행되는 파일</strong>로서, 우리가 그냥 python이라고 입력만 해도 python3.x버전으로 연결되어 작업할 수 있게 해준다. 즉 <strong>환경변수 개념</strong>이라고 생각하면 편하다.
<strong>만약 모든 사용자에게 적용되게 하려면 /etc/profile에 설정해주면 된다. 개별 사용자에게 적용되게 하려면 .bash에 설정</strong>한다.</p>
<h2 id="shell-script">Shell Script</h2>
<hr>
<h3 id="basic">Basic</h3>
<p>인터프리트(interpret) 방식으로 동작하는 컴파일되지 않은 프로그램이다.
텍스트 형식으로 저장되는 프로그램으로서 한줄씩 순차적으로 읽어 커맨드처럼 실행되도록 작성된 프로그램으로, 하나의 업무에 필요한 명령어가 여러 개일 때, 주기적으로 해야 할 때, 재사용성을 늘리기 위해 사용하는 각본이라고 생각하면 된다.
이 각본을 컴퓨터가 작동하게 하여 자동화된 업무를 할 수 있도록 한다.
자바스크립트, 쉘스크립트, 펄스크립트 등 스크립트 단어 앞에 붙는 수식어들은 스크립트를 읽어 실행해주는 인터프리트 엔진을 의미한다.
쉘스크립트는 운영체제의 쉘 즉 bash, ksh, csh 등이 읽어 실행해주는 스크립트 언어이고,
펄 스크립트는 perl 이라고하는 인터프리트 엔진이 읽어 실행해주는 스크립트 언어이다.</p>
<p><strong>다운로드 :</strong> 유닉스는 내장되어 있음</p>
<h3 id="설정">설정</h3>
<h4 id="1-파일생성">1. 파일생성</h4>
<pre><code class="language-bash">$ touch shell_script_practice.sh # 파일 생성
$ vim shell_script_practice.sh # 쉘 스크립트 파일 편집기로 열기</code></pre>
<h4 id="2-실행-권한-부여-파일의-상태-변경">2. 실행 권한 부여 (파일의 상태 변경)</h4>
<pre><code class="language-bash">$ chmod +x shell_script_practice.sh # 실행 권한 부여</code></pre>
<h4 id="3-상단에-추가">3. 상단에 추가</h4>
<pre><code class="language-bash">#!/bin/bash

..하단에 스크립트 작성..</code></pre>
<blockquote>
<p>스크립트 헤드에 있는 <code>!#</code>의 의미 (she-bang)</p>
</blockquote>
<p>스크립트 헤드의 she-bang은 이 파일이 표시된 <strong>명령 인터프리터에 제공되는 명령 집합임을 시스템에 알려줌</strong></p>
<ol>
<li><code>#!/bin/sh</code> : / bin / sh 경로와 함께 Bourne 쉘 또는 호환 가능한 쉘을 사용하여 스크립트를 실행한다.</li>
<li><code>**#!/bin/bash</code> : Bash 셸을 사용하여 스크립트를 실행한다.**</li>
<li><code>#!/bin/csh -f</code> : C쉘 또는 호환 가능한 쉘을 사용하여 스크립트를 실행한다.</li>
<li><code>#!/usr/bin/perl -T</code> : taint 검사 옵션과 함께 perl을 사용하여 스크립트를 실행한다.</li>
<li><code>#!/usr/bin/env python</code> : 환경 변수에서 자동으로 파이썬 인터프리터의 경로를 조회하여 파이썬을 사용하여 스크립트를 실행한다.</li>
</ol>
<h4 id="4-실행">4. 실행</h4>
<pre><code class="language-bash">./파일명.sh</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[리눅스 - test, sleep, cat, tee, awk 명령어]]></title>
            <link>https://velog.io/@lua_aw/%EB%A6%AC%EB%88%85%EC%8A%A4-cat-%EB%AA%85%EB%A0%B9%EC%96%B4-tee-%EB%AA%85%EB%A0%B9%EC%96%B4-awk-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@lua_aw/%EB%A6%AC%EB%88%85%EC%8A%A4-cat-%EB%AA%85%EB%A0%B9%EC%96%B4-tee-%EB%AA%85%EB%A0%B9%EC%96%B4-awk-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Sun, 02 May 2021 14:58:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/13b32875-e9d7-4fe1-b8a7-7f115fd58503/image.png" alt=""></p>
<h3 id="시작하며">시작하며</h3>
<p>이번주부터 일주일에 한 번씩 공부한 내용을 업로드할 예정이다.
이번주에 공부한 리눅스 내용은 test, sleep, cat, tee, awk 명령어다 :)</p>
<h3 id="sleep-명령어">sleep 명령어</h3>
<ul>
<li><p>지정한 시간동안 작업을 멈춤</p>
</li>
<li><p>시간</p>
<p>  1초 쉬기 : <code>sleep 1</code>, <code>sleep 1s</code></p>
<p>  1분 쉬기 : <code>sleep 1m</code></p>
<p>  1시간 쉬기 : <code>sleep 1h</code></p>
<p>  1시간 1분 1초 쉬기 : <code>sleep 1h 1m 1s</code></p>
<p>  하루 쉬기 : <code>sleep 1d</code></p>
<p>  0.1초 쉬기 : <code>sleep .1</code>, <code>sleep 0.1</code></p>
</li>
</ul>
<pre><code class="language-bash">sleep 시간(초단위)</code></pre>
<h3 id="test-명령어">test 명령어</h3>
<ul>
<li><p><code>test</code> : 실행이 되는지 확인 <strong>(쉘 스크립트의 조건문과 짝꿍! if의 <code>[]</code>로 치환되기도 함)</strong></p>
<p>  옵션</p>
<p>  1) <code>-f</code> : 파일 여부 확인</p>
<p>  2) <code>-d</code> : 디렉터리 여부 확인</p>
<p>  3) <code>-x</code> : 파일 존재 여부 및 실행 가능 여부 함께 확인</p>
</li>
</ul>
<h3 id="cat-명령어">cat 명령어</h3>
<ul>
<li><p><code>cat</code> : 파일들을 인자로 받아서 해당 파일들의 내용을 쉘 화면에 출력</p>
<pre><code class="language-bash">  #!/bin/bash

  cat read.sh

  --결과값 : read.sh 파일 그대로 읽어옴 (실행x)
  read i
  echo &quot;What&#39;s your name?&quot;
  echo &quot;My name is &quot;${i}&quot;&quot;

  echo &quot;---------&quot;
  echo &quot;What&#39;s ur fav food?&quot;
  echo &quot;&quot;${food}&quot;&quot;
  read food</code></pre>
<p>  <strong>여러줄 입력하는 법</strong></p>
<p>  1) <code>&lt;&lt;</code> : 리디렉션 연산자 (Here Document)</p>
<p>  2) <code>cat &lt;&lt; 표시자</code></p>
<p>  3) 처음에 사용한 단어를 끝에도 동일하게 입력해야 함</p>
<pre><code class="language-bash">  #!/bin/bash

  cat &lt;&lt; EOF
  Hello world
  This is TEST
  EOF

  --결과값
  Hello world
  This is TEST</code></pre>
</li>
</ul>
<h3 id="tee-명령어">tee 명령어</h3>
<ul>
<li><p>명령어의 출력 결과를 파일과 화면에 동시에 출력할 수 있도록 해주는 명령어</p>
</li>
<li><p>옵션</p>
<p>  <code>[ -a ]</code>: 덮어쓰기 말고 해당 파일에 추가해서 입력합니다.</p>
<p>  <code>[ -i ]</code>: interrupt를 무시하는 옵션</p>
<p>  <code>[ File ... ]</code>: 파일들 이름입니다.</p>
</li>
</ul>
<h3 id="awk-명령어">awk 명령어</h3>
<p>데이터를 조작하고 리포트를 생성하기 위해 사용하는 언어</p>
<p>다른 명령어들과는 다르게 이름만으로 대략적인 기능을 예측하기 힘들다. 해당 약어는 이 기능을 만든 사람들의 이니셜이기 때문</p>
<p>데이터를 조작할 수 있기 때문에 쉴 스크립트에서 필수로 사용되는 툴이며, 작은 데이터베이스를 관리하기에 용이</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(1) 네트워크 기본 개념 - TCP/IP, 도메인, 호스트, 호스팅, DNS, FQDN, LB(로드밸런서)]]></title>
            <link>https://velog.io/@lua_aw/1-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-TCPIP-%EB%8F%84%EB%A9%94%EC%9D%B8-%ED%98%B8%EC%8A%A4%ED%8A%B8-%ED%98%B8%EC%8A%A4%ED%8C%85-DNS-FQDN-LB%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C</link>
            <guid>https://velog.io/@lua_aw/1-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-TCPIP-%EB%8F%84%EB%A9%94%EC%9D%B8-%ED%98%B8%EC%8A%A4%ED%8A%B8-%ED%98%B8%EC%8A%A4%ED%8C%85-DNS-FQDN-LB%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%84%9C</guid>
            <pubDate>Thu, 08 Apr 2021 11:42:45 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<hr>
<p><img src="https://images.velog.io/images/lua_aw/post/57bb2c0a-9fbc-4a73-808d-e70dc958f668/image.png" alt=""></p>
<p>오늘은 네트워크 기초 개념에 대해 포스팅하고자 한다.</p>
<h2 id="본론">본론</h2>
<hr>
<h3 id="11-호스트host와-ip-도메인domain">1.1 호스트(host)와 ip, 도메인(domain)</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/d3f4850e-bd76-4e34-9b4d-3c68d1a3b3c1/image.png" alt="">
host는 guest를 맞이하는 주인이다. 이 의미가 그대로 적용되어 IT에서의 <strong>호스트</strong>는 무언가를 받아주는 객체다. 굉장히 추상적인데 이건 웹의 흐름을 보면 이해할 수 있다.</p>
<p>웹에 대한 여러가지 프로그램들이 있지만 결국 웹은 요청과 응답 이 두가지로 이루어져 있다. 응답에는 동기와 비동기가 있다. 여기서 요청을 하는 쪽이 클라이언트고 응답을 하는 곳이 호스트다.</p>
<p>내가 태블릿pc로 검색엔진에 &#39;luaaw&#39;를 검색한다면, 검색을 요청하는 내 테블릿pc가 클라이언트가 될 것이고, 검색 결과를 보여주는 검색엔진이 호스트가 될 것이다.</p>
<p>네트워크는 정보를 전달하기 위해 만들어졌는데, 이 정보를 어디에서(누가) 어디로(누구에게) 보낼 지 정해야 한다.</p>
<p>우리가 택배를 보낼 때 보내는이, 받는 이 주소를 모두 입력하듯이 클라이언트가 요청을 보내기 위해서는 요청 주소와 응답 주소가 있어야 하는데 그게 <strong>ip주소</strong>다. ip주소는 컴퓨터가 인식할 수 있도록 3개의 마침표로 나뉘어진 숫자로 이루어져 있다(000.000.000.000).</p>
<p>즉, ip는 네트워크에 접속하기 위한 공간의 주소이다. 여기서 공간은 서버pc의 하드디스크 주소다. 해당 위치는 ip로밖에 지정이 안 되기 때문에 네트워크에 접속하기 위해서는 반드시 ip주소를 할당받아야 한다.</p>
<p>컴퓨터가 처리할 수 있는 숫자로 된 인터넷 주소가 IP주소고 IP주소를 사람이 기억하기 쉽게 문자로 바꾼 인터넷 주소가 <strong>도메인</strong>이다.</p>
<p>결국 <strong>호스트</strong>는 <strong>네트워크에 연결되어 있고 IP를 가지고 있는 시스템</strong>을 의미한다. 네트워크에 연결되어 있다는 것은 쌍방향 통신이 가능하다는 의미이며, 시스템이기 때문에 운영체제와 상관없이 기본적으로 모두 가지고 있다.</p>
<p>클라이언트에게 호스트는 반드시 리퀘스트를 주기 때문에 호스트는 리퀘스트를 줄 수 있는 곳이 된다.</p>
<p>참고로 도메인은 영어 소문자, 숫자, 하이픈의 조합으로만 표현되어야 한다. 대문자/소문자 구별은 없지만 소문자로 쓰는 것이 약속이며 하이픈으로 시작하거나 끝날 수 없다. 당연하지만 고유한 값이어야 한다.</p>
<h3 id="12-호스팅">1.2 호스팅</h3>
<p>서버를 만든 후 네트워크에 띄워서 서비스하는 일련의 과정으로 ip와 서버를 연결하는 작업이다.</p>
<p>요즘엔 호스팅 업체가 많다. 서비스를 하려면 서버가 24시간 돌아야 하는데 로컬에서 하기엔 금액이나 물리적으로 한계가 있기 때문에 이를 대신해주는 업체들이 등장한 것이다. 그 예로 가비아, 후이즈, 카페24 등이 있다.</p>
<h3 id="13-도메인-체계종류">1.3 도메인 체계(종류)</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/ff887733-2fb0-4f1f-baf1-a25c7ccb545d/image.png" alt="">
도메인은 루트를 제외한 3단계로 구성되어 있다.</p>
<p>표시 순서가 마지막(.com) → 첫번째(www)로 가기 때문에 자식 → 부모 관계로 가서 <strong>역트리구조</strong>를 띈다.</p>
<p>참고로 1단계 도메인의 분류값이 2단계 도메인이기 때문에 1단계 도메인과 2단계 도메인은 함께 쓰이지 않으며, 1단계 도메인은 반드시 분류값을 가지지 않는다.</p>
<ol>
<li><p><strong>루트 도메인(root, &quot;.&quot;)</strong></p>
</li>
<li><p><strong>1단계 도메인(Top Level Domain, TLD) = 최상위 도메인</strong>
마지막에 쓰이는 도메인으로 <a href="http://www.google.com">www.google.com</a>의 .com 쪽이다.
최상위 도메인은 인터넷에서 도메인명의 가장 마지막 부분을 말한다. 종류는 크게 3가지로 나뉜다.
<img src="https://images.velog.io/images/lua_aw/post/1222e285-39ec-49e5-92a8-37138bf4aa2c/image.png" alt="">
1) <strong>국가코드 최상위 도메인 (Country Code Top Level Domain, ccTLD)</strong>
국가/지역을 나타내는 도메인으로 기본적으로 해당 국가지역에 거주하는 단체 및 개인만이 취득할 수 있다.
현재 250여개의 도메인이 존재하며 한국에서 많이 사용하는 도메인은 다음과 같다.
kr - 한국 / jp - 일본 / cn - 중국 / in - 인도 / us - 미국
ca - 캐나다 / uk - 영국 / fr - 프랑스 / de - 독일 / it - 이탈리아
2) <strong>일반 최상위 도메인 (Generic Top Level Domain, gTLD)</strong>
인터넷 초창기부터 사용된 도메인들이다. 전 세계 누구나 사용가능하다.
.com은 예전에 한 번 열풍이 있었어서 거의 포화상태일 정도로 많은 곳에서 사용 중이다.
edu - 미국 교육기관 / gov - 미국 정부기관 / mil - 미국 국방기관 / biz - 비즈니스
com - 영리기관 / org - 비영리 공공기관 / int - 국제기구 / net - 네트워크 관련기관
3) <strong>신규 일반 최상위 도메인 (New Generic Top Level Domain, New gTLD)</strong>
일반 최상위 도메인의 수량적 한계로 만들어졌다. 현재 가장 활발하게 늘어나고 있다. 특징은 일반 최상위 도메인과 동일하다.</p>
</li>
<li><p><strong>2단계 도메인(Second Level Domain, SLD) = 차상위 도메인</strong>
1단계 도메인에서 분류값이 필요할 때 사용한다.
예를 들어, 정부 사이트를 접속한다면,
1단계 도메인은 국가/지역을 구분하는 .kr이 될 것이고
2단계 도메인은 kr의 국가 내에서 존재하는 정부의 도메인 .go가 될 것이다.</p>
</li>
<li><p><strong>3단계 도메인 (Domain Name, 도메인명)</strong>
<img src="https://images.velog.io/images/lua_aw/post/f97d5c18-33aa-4df8-aed9-1911e7abc17e/image.png" alt="">
도메인 가운데에 표시되는 이름이다. 해당 단계는 자율적으로 지정할 수 있다.</p>
</li>
</ol>
<h3 id="14-fqdn-fully-qualified-domain-name">1.4 FQDN (Fully Qualified Domain Name)</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/65c71d6a-a1ef-42ef-b280-f2627936e8a1/image.png" alt="">
FQDN은 전체 도메인명을 의미한다. 사람들이 많이 알고 있는 FQDN은 <a href="http://www.google.com">www.google.com</a>, <a href="http://www.daum.net">www.daum.net</a> 등이 있는데, 명확하게 말하자면 <strong>www는 호스트명이며 google.com, daum.net은 도메인명이다.</strong></p>
<h3 id="15-dns-domain-name-service">1.5 DNS (Domain Name Service)</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/c18e4f54-c4d1-4ef7-a46f-6c74e843cb25/image.png" alt="">
(도메인)네임서버라고도 불리며, 인터넷망 통신규약인 TCP/IP 네트워크 상에서 도메인을 IP로 바꿔주는 시스템 혹은 이런 역할을 하는 서버 컴퓨터를 의미한다.</p>
<p>옛날엔 내가 하는 컴퓨터 게임을 친구에게 주려면 디스켓에 게임을 넣어서 디스켓을 직접 전달해줬어야 했었다.</p>
<p>그러다 미국에서 컴퓨터망의 연동망이 생기면서 &#39;네트워크&#39;라는 개념이 생겼다. 서로의 주소를 알아야 데이터를 전달할 수 있으므로 개인pc는 서로의 식별값인 ip를 할당받게 되었으며, 이제는 컴퓨터 게임을 디스켓에 전달하지 않아도 인터넷으로 전달할 수 있게 된 것이다.</p>
<p>다만 초기에는 모든 사람들이 동일한 네트워크를 사용하지 못했다. 내부 네트워크에서 할당받은 ip끼리만 사용할 수 있었는데 이게 인트라넷이다.</p>
<p>인터넷은 인트라넷에서 역사가 시작되었으며, 폐쇄망이 커지면서 모두가 사용할 수 있게 된 것이다. 인터넷이라는 거대 개념이 생긴 후 인터넷과 다른 개념으로 불리기 위해 &#39;인트라넷&#39;이라는 인터넷과 비슷한 용어로 분류된 것이며 현재 인트라넷은 군대, 청와대, 북한 등 폐쇄적인 곳에서 사용 중이다.</p>
<p>인트라넷을 사용할 때에는 사용자pc에 할당받은 ip들을 다 저장했는데, ip를 할당받는 사용자가 몇백, 몇천으로 늘어나면서 저 정보를 pc에 다 저장하기 힘들어졌다.</p>
<p>그래서 나온 개념이 DNS다. DNS는 이전에 사용자 pc에서 저장하던 ip정보들을 저장하여 사용자에게 제공한다. 덕분에 사용자는 ip주소들을 저장하지 않고 도메인만으로도 다른 주소에 접속을 할 수 있게 되었다.</p>
<p>우리가 많은 사람들의 전화번호를 스마트폰 전화번호부에 이름으로 저장하는 것과 비슷하다. &#39;통화&#39; 버튼을 누르면 전화번호부는 이름에 매칭된 번호를 가져와서 상대방 전화번호로 연결해준다. 여기서 ip주소는 나와 상대방의 전화번호, 도메인은 서로의 전화번호에 저장된 단어, dns는 스마트폰의 전화번호부가 되겠다.</p>
<p>공용 DNS는 매일 수십억 개 이상의 요청을 처리한다. 누군가가 브라우저에 웹 주소를 입력할 때마다 세계 어느 곳에서든 해당 도메인 네임 서버가 요청(쿼리)를 받고, 해당하는 ip주소를 연결함으로써 요청한 웹사이트가 올바르게 연결되도록 해준다. DNS가 없으면 인터넷을 제대로 사용할 수 없으므로 매우 중요한 존재라 할 수 있다.</p>
<p>DNS 또한 루트 DNS를 가지고 있으며, 모르는 정보가 있다면 다른 DNS와 연계하여 정보를 공유한다.</p>
<h3 id="16-tcpip">1.6 TCP/IP</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/b4e6e021-5a3d-403a-bbb9-fb9f354df71f/image.png" alt="">
인터넷에서 서로가 정보를 주고받을 때 원활한 통신이 가능하도록 만들어진 통신규약(Protocol)이다.</p>
<p>TCP와 IP라는 두 가지의 통신규약으로 이루어져 있다.</p>
<ol>
<li><p><strong>TCP (Transmission Control Protocol), 패킷교환방식</strong>
클라이언트와 서버가 신뢰성 있는 데이터를 전달할 수 있도록 만들어진 제어 프로토콜이다. 데이터는 네트워크 선로를 통해서 전달되는데 선로는 광케이블, 구리선, 인공위성 등 여러 가지가 될 수 있다. 어떤 선로냐에 따라 데이터 전달 속도가 달라지거나 손실이 발생할 수도 있고, 순서가 뒤바뀔 수 있다. TCP는 데이터의 손상과 순서를 확인하여 데이터를 재조합할 수 있다.</p>
<p>TCP는 패킷교환방식으로 데이터를 전송하는데 패킷에 일련번호를 부여하여 데이터를 인식한다.
패킷은 데이터의 전송 단위이며, 패킷교환은 데이터를 작은 블록의 패킷으로 보내주는 방법이다. 경로가 정해져 있지 않으며 데이터는 송신할 때 일정한 크기의 패킷으로 분해하여 전송된다. 그리고 수신할 때 원래대로 조립된다.
패킷은 교환될 때 여러 경로 중에 최적의 경로를 찾아서 송신되기 때문에 속도가 빠르며 현재 가장 많이 사용되고 있다.</p>
<p>IT 개발 동기는 거의 군사 목적으로부터 시작된다. 위급한 상황 속에서도 데이터를 주고 받아야 하고, 해당 데이터는 기밀사항이기 때문이다. 패킷교환방식도 마찬가지다.</p>
<p>원래는 군사 목적으로 만들어졌다. 패킷교환방식이 개발되기 전에는 회선교환방식으로 데이터를 주고 받았는데, 전쟁 시 회선이 끊기면 데이터를 받을 수 없었기 때문에 회선이 하나만 남아있어도 통신이 끊기지 않는 네트워크가 필요했다. 그렇게 패킷교환방식은 개발되었다.</p>
</li>
<li><p><strong>IP (Internet Protocol)</strong>
기기 간 데이터를 전송하기 위해 필요한 각 기기의 인터넷 주소다. TCP와 달리 데이터의 재조합이나 손실여부 확인이 불가하며, 데이터를 전달하는 역할만 한다.
IP주소는 임시적으로 통신사에게 받는 주소라 변경될 수 있다. 하드웨어 고유 식별번호와 다르다(mac주소 등).</p>
</li>
</ol>
<h3 id="17-lb-load-balancer-로드밸런서">1.7 LB (Load Balancer, 로드밸런서)</h3>
<p>동시 접속을 대비하기 위해 사용하는 장비로, 여러 서버를 사용하는 경우 동시 접속이 진행되었을 때 로드밸런서가 사용자를 부하가 없는 서버로 유치하여 분산 처리를 해준다. 로드밸런서는 ip와 도메인 사이에 위치한다.</p>
<h2 id="마치며">마치며</h2>
<hr>
<p>기초 개념은 아무리 공부해도 끝이 없는 것 같다. 배운 것을 잊지 않는 개발자가 되어야지 ㅠㅠ
문의, 지적 언제나 환영해요 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[macOS] nginx로 웹서버 띄우기]]></title>
            <link>https://velog.io/@lua_aw/macOS-nginx%EB%A1%9C-%EC%9B%B9%EC%84%9C%EB%B2%84-%EB%9D%84%EC%9A%B0%EA%B8%B0</link>
            <guid>https://velog.io/@lua_aw/macOS-nginx%EB%A1%9C-%EC%9B%B9%EC%84%9C%EB%B2%84-%EB%9D%84%EC%9A%B0%EA%B8%B0</guid>
            <pubDate>Thu, 01 Apr 2021 12:41:33 GMT</pubDate>
            <description><![CDATA[<h2 id="개요">개요</h2>
<hr>
<p><img src="https://images.velog.io/images/lua_aw/post/1ec235ce-9e31-4f3f-a042-6263363e556d/image.png" alt="">
오랜만의 포스팅이다.
3달동안 프로젝트 하느라 매일을 야근하고 서비스 오픈 직전엔 밤도 샜다ㅠㅠ
육체적으론 많이 힘들었지만, 그만큼 많은 걸 배운 느낌이다.</p>
<p>오늘은 nginx를 설치하여 웹서버를 띄워볼 것이다.
얼마 전에 nginx로 서버를 띄워야 하는 일이 생겼는데,
이리저리 경험해보니 내가 직접 설치해서 설정해볼 수 있겠다 싶었음</p>
<p>스펙은 다음과 같다.</p>
<ul>
<li>운영체제 : macOS</li>
<li>사용 프로그램 : Homebrew</li>
<li>nginx 버전 : 1.19.8</li>
</ul>
<h2 id="apache와-nginx">Apache와 Nginx</h2>
<hr>
<p><img src="https://images.velog.io/images/lua_aw/post/da6ab6aa-01ba-4a38-8c4c-f920c3a00a09/image.png" alt="">
본론으로 넘어가기 전에 nginx에 대한 역사를 알아보자.
apache와 nginx는 전 세계적으로 가장 큰 오픈소스 웹서버들이다.
두 프로그램의 동작 원리는 다르지만 apache의 단점을 보완하고자 만들어진 게 nginx이다보니 nginx 출시 후 둘은 늘 비교 대상이 되어왔다.</p>
<h3 id="11-apache">1.1 Apache</h3>
<p>Apache는 1995년도에 처음 출시된 후에 대표적인 웹서버로 자리매김하였으며, 
요청 당 쓰레드 또는 프로세스가 처리하는 구조이다. nginx보다 모듈이 다양하며 안정성, 호환성 등에 우세하다.</p>
<h3 id="12-nginx">1.2 Nginx</h3>
<p>Apache보다 기능은 적은 대신 성능 면에서 우세하다. 더 적은 자원으로 더 빠른 서비스를 제공할 수 있는 &#39;경량화&#39;된 웹서버로 핵심은 &#39;빠름&#39;이다.
프로그램의 흐름이 이벤트에 의해 결정(event-based)이 되며 여러 개의 커넥션을 이벤트 핸들러를 통해 비동기 방식으로 처리한다.
Apache에 비하여 스레드를 많이 사용하지 않기 때문에 CPU 소모도가 상대적으로 낮다.
적은 수의 스레드로 효율적인 일처리가 가능하기에 많은 접속자들이 와도 대응을 할 수 있다.</p>
<p>예전엔 nginx를 차세대 웹서버라고 불렀는데, 이제는 사용자가 가장 많이 사용하는 웹서버가 되었다.
출시 이후 늘 사용자 사용 1위를 차지했던 아파치는 2019년, nginx에게 1위 자리를 넘겨주게 되었다.
<img src="https://images.velog.io/images/lua_aw/post/60ee3953-95e0-4d57-9294-deb021e7685a/image.png" alt=""></p>
<h3 id="13-무엇이-더-좋은가">1.3 무엇이 더 좋은가?</h3>
<p>이건 상황에 따라 달라지기 때문에 어떤 것이 더 좋다고 결론을 내릴 순 없다. 
서버의 부담을 줄이고 싶다면 nginx를 추천한다.</p>
<h2 id="nginx-프로세스">Nginx 프로세스</h2>
<hr>
<p>nginx는 하나의 master 프로세스와 여러 개의 worker 프로세스를 가진다.
master 프로세스는 nginx의 성능을 측정하고 worker 프로세스를 관리한다.
worker 프로세스는 요청을 처리하며, worker 프로세스 사이에 요청을 효율적으로 분배하기 위해 운영체제에 의존한다.
worker 프로세스의 개수는 설정 파일에서 알 수 있는데 정의된 프로세스 개수와 사용 가능한 cpu 코어 숫자에 맞게 자동으로 조정된다.</p>
<h2 id="본론">본론</h2>
<hr>
<p>이제 nginx로 웹서버를 띄워보자.</p>
<h3 id="21-다운로드">2.1 다운로드</h3>
<p>nginx를 사용하기 위해선 먼저 다운로드 해야 한다.</p>
<pre><code class="language-bash">brew install nginx</code></pre>
<p>다운로드가 잘 되었는지 확인하려면 버전을 검색해본다.
버전이 뜬다면 다운로드에 성공한 것이다.</p>
<pre><code class="language-bash">nginx -v
// nginx version: nginx/1.19.8</code></pre>
<p>homebrew를 이용한 nginx는 다음과 같은 경로에 설치된다.
(설치방법 혹은 운영체제에 따라 <code>/usr/local/nginx/conf</code>, <code>/etc/nginx</code> 등에 설치되기도 함)</p>
<pre><code class="language-bash">usr/local/etc/nginx</code></pre>
<p><strong>nginx를 설치하면 기본적으로 포트가 8080으로 잡혀있다.</strong>
<img src="https://images.velog.io/images/lua_aw/post/552bd7d5-3883-457b-8273-bc0a9cbeff01/image.png" alt="">
homebrew로 설치하면 현재 로그인된 사용자(mac의 user)의 권한으로 진행되는데,
nginx는 root가 아닌 사용자가 nginx를 설치할 경우 1024 포트보다 작은 포트를 사용할 수 없도록 되어있다.</p>
<p><strong>80 포트를 사용하고 싶다면 설정 파일의 포트를 변경한 후에 설정 적용 시 &#39;sudo&#39;를 붙여야 한다.</strong></p>
<p>설정파일 경로는 다음과 같다.</p>
<pre><code class="language-bash">sudo vi /usr/local/etc/nginx/nginx.conf</code></pre>
<p>포트를 8080에서 80으로 변경하면 된다.</p>
<pre><code class="language-java">server {
 listen       80;
 server_name  localhost;</code></pre>
<p>포트가 80이 아닐 때 일부 서비스에서 인코딩 혹은 서버와의 통신 오류가 발생할 수 있으므로 80번 포트로 지정해 놓는 게 좋다.</p>
<h3 id="22-사이트-설정">2.2 사이트 설정</h3>
<p>nginx를 사용하는 방법은 여러가지가 있는데,
나는 하나의 서버에서 여러 개의 사이트를 띄우는 방법으로 사용했다.
이걸 가상 호스트(Virtual Hosts) 기능이라고 하는데, nginx를 포함한 거의 모든 웹서버에서 해당 기능을 가지고 있다.</p>
<p>1) 띄우려는 사이트들을 설정하고
2) 그 사이트들을 nginx 서버와 연결하면 된다.</p>
<p>sites-available, sites-enable 폴더에서 설정 및 연결할 수 있다.
sites-available 폴더에는 연결하려는 서비스에 대한 사이트 정보를 정의하면 되고,
sites-enabled 폴더에는 available의 파일의 심볼링크를 걸면 된다.
만약 폴더가 없다면 만들어주자.</p>
<pre><code class="language-bash">mkdir sites-available
mkdir sites-enabled</code></pre>
<p>sites-avaliable 폴더에서 정보를 입력하자.</p>
<pre><code class="language-bash">server {
 listen 80;
 server_name 도메인명;
 server_name ip주소;
 root 루트경로;
 index index.html;

 access_log /var/log/nginx/파일명.access.log;
 error_log /var/log/nginx/파일명.error.log;
 location / {
     try_files $uri /index.html =404;
  }
}</code></pre>
<p>sites-enabled 폴더에서 심볼링크를 건다. ln = link다.</p>
<pre><code class="language-bash">sudo ln -s ../sites-available/파일명 .</code></pre>
<p>설정을 적용하기 전에 작성한 파일에 이상이 없는지 확인해보자.
-t는 nginx에 설정된 파일들을 테스트로 실행시켜본다.</p>
<pre><code class="language-java">sudo nginx -t</code></pre>
<p>successful 이라는 답을 얻으면 성공이다.
에러가 있다면 nginx는 failed 답과 함께 원인을 알려준다.</p>
<h3 id="23-설정-적용">2.3 설정 적용</h3>
<p>설정을 해준 후에는 적용을 해줘야 한다.
nginx를 restart하거나 reload 해주면 된다. </p>
<pre><code class="language-bash">sudo brew service reload nginx
sudo systemctl reload nginx</code></pre>
<p><strong>reload와 restart의 차이점은 &#39;서버 중단 여부&#39;이다.</strong></p>
<p>reload는 서버를 중단시키지 않고 명령어를 입력한 시점부터 설정 파일에서 변경된 사항만 적용한다.
restart는 이름 그대로 서버를 껐다가 켠다.
설정 파일 적용 시 restart를 해도 되지만 무중단 서버를 위해선 reload를 추천한다.</p>
<p>그 외 명령어들은 다음과 같다. (Homebrew로 설치했을 때의 명령어와 일반 nginx 명령어)</p>
<p>시작 명령어</p>
<pre><code class="language-bash">sudo brew services start nginx
sudo systemctl start nginx</code></pre>
<p>중지 명령어</p>
<pre><code class="language-bash">sudo brew services stop nginx
sudo systemctl stop nginx</code></pre>
<p>재시작 명령어</p>
<pre><code class="language-bash">sudo brew services restart nginx
sudo systemctl restart nginx</code></pre>
<p>상태확인 명령어</p>
<pre><code class="language-bash">sudo brew services status nginx
sudo systemctl status nginx</code></pre>
<h3 id="24-디렉토리-설정">2.4 디렉토리 설정</h3>
<p>만든 디렉토리의 소유권을 nginx 기본 사용자인 www-data에게 넘기자.
chown은 change own의 약자로, 파일의 소유자나 그룹을 변경할 때 사용한다.</p>
<pre><code class="language-bash">sudo chown -R $USER:www-data /디렉토리경로</code></pre>
<p>디렉토리 권한이 755가 아니라면 변경하자.</p>
<p>chmod는 change mode로 파일의 사용권한을 변경할 때 사용한다.</p>
<p>755로 설정하면 사용자와 그룹은 파일 읽기, 쓰기, 실행 모두 가능하고 그 외는 읽기와 실행만 가능하다.</p>
<pre><code class="language-bash">sudo chmod -R 755 /디렉토리경로</code></pre>
<h3 id="25-확인">2.5 확인</h3>
<p>서버가 잘 띄워졌는지 확인해보자.</p>
<pre><code class="language-bash">netstat -anv | grep LISTEN</code></pre>
<p><img src="https://images.velog.io/images/lua_aw/post/90c17736-7f66-412a-b2f1-e2223e3a7d17/image.png" alt="">
마지막으로 nginx 웹서버를 접속해보자.
<img src="https://images.velog.io/images/lua_aw/post/3d3e2cac-795f-44ed-aecd-437fb9714f52/image.png" alt=""></p>
<p>설정된 페이지나 위 페이지가 뜨면 성공! 😎</p>
<h2 id="마치며">마치며</h2>
<hr>
<p>macOS에서 nginx를 설치해보았다.
이 외에도 proxy 서버를 띄워서 보안을 강화하거나 로드 밸런스와 붙여서 트래픽 부하를 줄일 수 있다.</p>
<p>문의, 지적 언제나 환영합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(1) Git 명령어들 - commit 관련]]></title>
            <link>https://velog.io/@lua_aw/1-Git-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%93%A4-commit-%EA%B4%80%EB%A0%A8</link>
            <guid>https://velog.io/@lua_aw/1-Git-%EB%AA%85%EB%A0%B9%EC%96%B4%EB%93%A4-commit-%EA%B4%80%EB%A0%A8</guid>
            <pubDate>Thu, 03 Dec 2020 03:26:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/8c65709f-bf2a-4403-b1e9-b962a607bbdd/image.png" alt=""></p>
<h2 id="개요">개요</h2>
<hr>
<p>내가 기억 안 날 때마다 와서 찾아보기 위해 쓰는 포스팅ㅋㅋ
개발 업무를 하다 보면 Git과 Github를 필수로 쓰게 되는데, 두 개의 툴을 쓰면서 가지각색의 상황을 마주하게 된다.
그리고 그 상황들은 거의 간단한 명령여 몇 줄로 해결할 수 있다(진짜다!).
오늘은 &#39;그 명령어 몇 줄&#39;에 대해서 알아보자.</p>
<h2 id="git-명령어">Git 명령어</h2>
<hr>
<blockquote>
<p><strong>Git에서의 인덱스(index)는 원격을 의미한다.</strong></p>
</blockquote>
<h3 id="0-reset과-revert-명령어">0. reset과 revert 명령어</h3>
<p>일단 행동 명령어를 알기 전에 함께 알아두면 좋은 명령어가 있다.
<strong>특정 commit으로 돌아갈 때</strong> 
<code>reset</code> 명령어는 되돌린 버전 <strong>이후의 커밋 버전들이 삭제</strong>되어 <strong>히스토리에 남지 않게 된다.</strong>
<code>revert</code> 명령어는 되돌린 버전 <strong>이후의 커밋 버전들이 그대로 남아</strong> <strong>히스토리에도 남는다.</strong></p>
<p>두 명령어는 <strong>3가지 옵션</strong>을 가지고 있다.</p>
<ul>
<li><code>soft</code> : 이후의 커밋 내용이 stage 상태로 남아 있다(<strong>git add 이후의 상태</strong>)</li>
<li><code>mixed</code> : <strong>(Default)</strong> 이후의 커밋 내용이 unstage 상태로 남아 있다(<strong>git add 전의 상태</strong>). 인덱스에서는 리셋된 상태인 것이다.</li>
<li><code>hard</code> : 모든 작업 상태 내 변경 사항을 버린다.</li>
</ul>
<p>각자의 상황에 맞게 명령어와 옵션을 선택하면 되는데,
보통 협업을 할 때에는 이력을 남기는 게 중요해서 <code>revert</code>를 많이 사용한다.</p>
<h3 id="1-staging-취소하기">1. staging 취소하기</h3>
<p><code>**git add</code>를 취소한다는 뜻**이다.
파일 하나만 언스테이징 한다면 reset 다음에 파일명을 입력하면 된다.</p>
<pre><code class="language-basic">$ git reset(revert) (파일명)</code></pre>
<h3 id="2-마지막-commit-취소하기">2. 마지막 commit 취소하기</h3>
<p><code>reset</code> / <code>revert</code> 명령어로 HEAD를 마지막 commit 이전으로 되돌린다.</p>
<pre><code class="language-basic">$ git reset(revert) --option HEAD^</code></pre>
<h3 id="3-마지막-commit-메세지-수정하기">3. 마지막 commit 메세지 수정하기</h3>
<p>메세지 수정은 <code>-—amend</code> 옵션으로 처리할 수 있다.</p>
<pre><code class="language-basic">$ git commit --amend -m &quot;수정 커밋 내용&quot;</code></pre>
<h3 id="4-특정-시점으로-commit-되돌리기">4. 특정 시점으로 commit 되돌리기</h3>
<ol>
<li>commit 이력을 확인한다.</li>
</ol>
<pre><code class="language-basic">$ git reflog</code></pre>
<ol start="2">
<li><code>reset</code> / <code>revert</code> 명령어로 특정 commit 시점으로 되돌린다.</li>
</ol>
<pre><code class="language-basic">$ git reset(revert) --option 커밋해시</code></pre>
<ol start="3">
<li>원격 저장소에 강제로 push 한다.</li>
</ol>
<pre><code class="language-sql">$ git push -f origin master</code></pre>
<h3 id="5-특정-시점의-commit-메세지-수정하기">5. 특정 시점의 commit 메세지 수정하기</h3>
<p>수정하고자 하는 커밋 시점으로 <strong>리베이스</strong>를 해야 한다.
<strong>리베이스에 대한 설명은 다음 글에서 확인할 수 있을 것이다.</strong></p>
<p>🌟<strong>리베이스를 한다는 것은 커밋 이력이 변경되는 것을 뜻하기 때문에, 
    협업을 한다면 반드시 협업자와 사전에 이야기가 되어야 한다.</strong>🌟</p>
<p>사전 협의가 되었다는 가정 하에 아래 단계를 진행하면 된다.
리베이스에서 커밋 내역을 확인하려면 <code>i</code>옵션(<strong>interactive</strong>)을 사용해야 한다.
<code>-i</code> 옵션을 입력하면 <strong>커밋 메세지에 대한 텍스트 에디터가 열린다.</strong></p>
<blockquote>
<p><strong>interactive</strong> : 사용자가 데이터나 명령을 입력할 수 있도록 함</p>
</blockquote>
<ol>
<li>해당 커밋으로 리베이스 한다.</li>
</ol>
<pre><code class="language-basic">$ git rebase -i</code></pre>
<ol start="2">
<li>이렇게 나올 것이다.</li>
</ol>
<pre><code class="language-basic">pick 커밋해시 커밋내용
pick 커밋해시 커밋내용    //수정하고자 하는 코드일 때
.
.</code></pre>
<ol start="3">
<li>수정하고자 하는 커밋 해시 앞의 단어를 <code>edit</code> 또는 <code>e</code>로 바꾼 후에 <strong>저장</strong>한다.</li>
</ol>
<pre><code class="language-basic">pick 커밋해시 커밋내용
**edit** 커밋해시 커밋내용    //수정하고자 하는 코드일 때
**e** 커밋해시 커밋내용    //수정하고자 하는 코드일 때
.
.</code></pre>
<ol start="4">
<li>커밋 메세지를 새로 작성하여 커밋한다.</li>
</ol>
<pre><code class="language-basic">$ git commit --amend -m &quot;수정 커밋 내용&quot;</code></pre>
<ol start="5">
<li>리베이스를 진행하고 <code>-f</code> 옵션(<strong>force</strong>)으로 푸시하여 원격 저장소에 반영한다.</li>
</ol>
<pre><code class="language-basic">$ git rebase --continue
$ git push -f origin master</code></pre>
<p>참고로 중간에 리베이스를 하면 안 된다는 이야기를 들었거나, 리베이스를 하고 싶지 않다면 <code>--abort</code> 옵션으로 중단하면 된다.
이 번거로운 과정을 여러 가지 패키지들로 대신할 수도 있다.</p>
<p>주변에서 추천받았던 유틸은 <a href="https://www.npmjs.com/package/git-amend">git-amend</a> 였는데 아무리 다운받으려고 해도 안 돼서 나는 포기했다.</p>
<hr>
<p>오류 지적, 문의 사항 언제나 환영해요 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA Error "Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException" 살펴보기]]></title>
            <link>https://velog.io/@lua_aw/201111-JPA-Error-Cannot-resolve-reference-to-bean-jpaMappingContext-while-setting-bean-property-mappingContext-nested-exception-is-org.springframework.beans.factory.BeanCreationException-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@lua_aw/201111-JPA-Error-Cannot-resolve-reference-to-bean-jpaMappingContext-while-setting-bean-property-mappingContext-nested-exception-is-org.springframework.beans.factory.BeanCreationException-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Thu, 12 Nov 2020 08:48:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/5abdde8b-aeb4-4b2b-8e70-64e583b9220f/image.png" alt="">
자바에서 JPA의 구현체인 Hibernate 설정을 해준 후에 마주했던 에러다.</p>
<pre><code>Error creating bean with name &#39;Repository&#39; defined in 패키지.Repository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration:
Cannot resolve reference to bean &#39;jpaMappingContext&#39; while setting bean property &#39;mappingContext&#39;; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name &#39;jpaMappingContext&#39;:
Invocation of init method failed; nested exception is org.hibernate.AnnotationException:
Attribute [패키지.엔티티] was annotated as enumerated,
but its java type is not an enum [java.lang.String ...</code></pre><p>오늘은 이 에러에 대해 글쓰고자 한다.</p>
<hr>
<h3 id="what-is-bean">What Is &quot;bean&quot;?</h3>
<p>글을 읽다 보면 눈에 띄는 단어가 하나 있다.</p>
<blockquote>
<p>&#39;Bean&#39;</p>
</blockquote>
<p>빈(Bean)은 <strong>스프링에서 애플리케이션의 핵심을 이루는 객체</strong>이며, Spring IoC(Inversion of Control) 컨테이너에 의해 인스턴스화, 관리,생성된다.
개발자가 인스턴스를 생성하거나 호출, 삭제하면 빈이 인스턴스가 되는거고 IoC라는 컨테이너가 열심히 관리를 해준다.</p>
<p>직관적으로 설명하자면,
어플리케이션이 땅! 하고 켜지면 인스턴스 빈들이 뿅 나타나는 거고 (참고로) 어노테이션이라는 아이가(@ 이걸 달고 있는 아이들) 버스가 돼서 빈들을 버스에 태워 컨테이너에 데려다준다.
그러면 컨테이너가 관리를 시작한다.</p>
<hr>
<h3 id="error-analysis">Error Analysis</h3>
<p>에러 내용을 보면 &#39;빈을 생성할 수 없다&#39;라고 이야기하고 있다.
어플리케이션을 작동했을 때 초기에 진행되어야 하는 일이 안됐다는 건 <strong>JPA 초기 설정이 잘못되었다는 것</strong>이다.</p>
<p>결국 이 긴 에러를 분석하자면 아래와 같다.</p>
<blockquote>
<p>초기 설정 잘못되었으니 다시 한 번 살펴보삼</p>
</blockquote>
<p>이 에러를 마주한다면 엔티티와 레파지토리 쪽을 살펴보길 바란다.</p>
<ol>
<li>엔티티를 정확히 입력했는가</li>
<li>릴레이션 조인을 상황에 맞게 맺었는가</li>
<li>엔티티 클래스와 연결된 클래스들이나 어노테이션이 적절하게 배치되었는가</li>
<li>그 외...</li>
</ol>
<p>나의 경우에는 3번이었는데, Enum 타입 설정을 잘못해서 이 에러를 어제 마주했다. 타입을 수정했더니 잘 작동하더라!!</p>
<p>문의 &amp; 오류 지적 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[소스트리(Sourcetree)에서 특정 파일 커밋 제외/원복하기]]></title>
            <link>https://velog.io/@lua_aw/201109-%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%ACSourcetree%EC%97%90%EC%84%9C-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%BB%A4%EB%B0%8B-%EC%A0%9C%EC%99%B8%ED%95%98%EA%B8%B0%EC%9B%90%EB%B3%B5</link>
            <guid>https://velog.io/@lua_aw/201109-%EC%86%8C%EC%8A%A4%ED%8A%B8%EB%A6%ACSourcetree%EC%97%90%EC%84%9C-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EC%BB%A4%EB%B0%8B-%EC%A0%9C%EC%99%B8%ED%95%98%EA%B8%B0%EC%9B%90%EB%B3%B5</guid>
            <pubDate>Tue, 10 Nov 2020 09:26:48 GMT</pubDate>
            <description><![CDATA[<p>작업하다 보면 깃에 올리면 안 되는 파일들이나 올리기엔 불필요한 파일들이 생성된다.
우리는 보통 .gitignore 파일을 생성하여 &#39;커밋할 때 그 파일이 보이지 않게 해주삼&#39;을 설정한다.
이 기능은 소스트리에도 있다! 그리고 설정 방법은 매우 간단하고 편리하다!
물론 파일 수가 적을 때에만 말이다 ㅋㅋ</p>
<p>오늘은 소스트리에서 특정 파일 커밋에서 제외하는 방법에 대해 글쓰고자 한다.
추가로 원복하는 방법까지 쓴다. 왜냐하면..
내가 원복하는 방법을 몰라 헤맸기 때문이다(ㅠㅠ)
그 방법도 매우 간단하니 다른 분들은 나처럼 헤매지 않길 바란다.
일단 소스트리가 무엇인지에 대해 간단히 살펴보자.</p>
<hr>
<h3 id="what-is-sourcetree">What is &quot;Sourcetree&quot;?</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/1218ba22-eb7d-473d-b211-80a8e5b6d502/image.png" alt="">
<a href="https://www.sourcetreeapp.com/">소스트리 공식 홈페이지</a>에 가면 아래와 같이 정의하고 있다.</p>
<blockquote>
<p>Git&#39;s GUI</p>
</blockquote>
<p><strong>GUI</strong>는** &#39;그래픽 사용자 인터페이스(Graphical User Interface)&#39;**의 약자로 사용자가 편리하게 사용할 수 있도록 입출력 등의 기능을 알기 쉬운 아이콘 따위의 그래픽으로 나타낸 것이다.
한마디로 정리하자면 사용자가 보기 좋도록 예쁘게 꾸며주고 간편하게 만들어진 것이라 할 수 있겠다.</p>
<p>그렇다면 소스트리는 Git을 예쁘고 간편하게 쓸 수 있는 프로그램이라 할 수 있겠다.
실제로 깃 push, pull, commit을 하려면 terminal이나 powershell이라고 불리우는 80년대 UI같은(커스텀하면 좀 예뻐지지만) 곳에다 명령어를 키보드로 입력해야 한다.
소스트리는 이 불편한 과정을 간편하게 클릭만 하면 될 수 있게끔 만들어놨다.</p>
<p>가끔(어쩔 땐 많이) 혼자 에러나서 꺼지는 것만 빼곤 사용하기 편리한 GUI다.</p>
<hr>
<h3 id="특정-파일-커밋-제외하기">특정 파일 커밋 제외하기</h3>
<p>그렇다면 어떻게 특정 파일을 제외할 수 있을까?
방법은 간단하다.</p>
<ol>
<li>commit 할 때</li>
<li>불필요한 파일을 &#39;오른쪽 마우스 클릭&#39;하여</li>
<li>&#39;무시&#39; 버튼을 눌러주면 된다!</li>
<li>그러면 설정창이 나오는데 원하는대로 설정하면 된다.
이제 소스트리는 &#39;무시&#39; 선택된 파일을 커밋에서 더 이상 표시하지 않을 것이다! :)</li>
</ol>
<p>하지만 작업하다 보면 변수는 언제나 발생하는 법..
갑자기 그 파일을 커밋해야 하는 상황이 생기거나,
알고보니 그 파일은 원래 커밋했어야 하는 파일이라면?</p>
<p>그렇다면 우리는 무시했던 파일에 다시 관심을 줘야 한다!
무시한 파일에 다시 관심을 줘야 한다.</p>
<hr>
<h3 id="커밋-제외한-파일을-원복시키기">커밋 제외한 파일을 원복시키기</h3>
<p>방법은 굉장히 간단하다.</p>
<ol>
<li>사용하고 있는 IDE나 에디터에서</li>
<li>해당 파일을 오른쪽 마우스 클릭한 다음</li>
<li>Git - add 처리 해주면 된다.</li>
</ol>
<p>그럼 소스트리는 다시 그 파일을 인식한다!
소스트리 설정 - 고급 - 저장소별 무시 목록(.gitignore) 메뉴가 있긴 한데 나는 거기서 해결할 수 없었다.
어차피 모두들 개발하면서 하나의 에디터나 IDE 사용하니까 거기서 간편하게 해결하는 게 좋은 것 같다(소스트리에서 해결 못해서 이르는그 아늬다...)</p>
<p>문의 &amp; 오류 지적 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(3) React 개념 - 컴포넌트(Component), JSX]]></title>
            <link>https://velog.io/@lua_aw/201108-3-React-%EA%B0%9C%EB%85%90-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8Component-JSX</link>
            <guid>https://velog.io/@lua_aw/201108-3-React-%EA%B0%9C%EB%85%90-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8Component-JSX</guid>
            <pubDate>Sun, 08 Nov 2020 17:59:52 GMT</pubDate>
            <description><![CDATA[<p>강의 듣다가 12시가 넘은 걸 알고 부랴부랴 벨로그로 왔다.
오늘은 리액트의 가장 기본적인 개념인 컴포넌트와 JSX에 대해 글쓰고자 한다.</p>
<p>리액트 개발자들과 얘기하다 보면 요런 얘기를 심심찮게 듣는다.</p>
<p>&quot;이건 컴포넌트 안에 컴포넌트를 넣고...&quot;
&quot;children으로 컴포넌트 레이아웃을 짜고 props를 넣고...&quot;
&quot;컴포넌트가... 어쩍저쩍...&quot;</p>
<p>듣다보면 컴포넌트는 리액트의 구조를 짤 때 필요한, 기본적인 틀과 같은 느낌이 드는데..
컴포넌트란 무엇인가?</p>
<hr>
<h3 id="what-is-component">What is &quot;Component&quot;?</h3>
<p><img src="https://images.velog.io/images/lua_aw/post/0c4c6a2e-17fd-4679-ab27-49b21afa8e56/react.png" alt="">
앞선 글에서 우리는 리액트가 &quot;HTML&quot;을 만들어주는 라이브러리라는 것을 배웠다.
그렇다면 컴포넌트도 HTML과 관련이 있을 것이다.</p>
<p>컴포넌트의 정의는 아래와 같다.</p>
<blockquote>
<p>HTML을 생성하는 자바스크립트 함수의 모음집</p>
</blockquote>
<p>그렇다. <strong>컴포넌트는 함수</strong>이다!
다만 HTML을 직접적으로 리턴하지는 않고 보통 <strong>JSX라는 HTML과 유사한 문법</strong>을 리턴한다.
결국 HTML과 관련이 있다.
(&quot;보통&quot;이라는 건 <strong>꼭 JSX를 리턴해야해!!!! 는 아니라는 뜻</strong>이다)</p>
<p>아니, 그렇다면 JSX라는 문법은 뭐길래 컴포넌트 함수가 그걸 리턴한단 말인가?</p>
<hr>
<h3 id="what-is-jsx">What is &quot;JSX&quot;?</h3>
<p>JSX는 리액트만의 거의 유일한 문법이다.
정의는 아래와 같다.</p>
<blockquote>
<p>변형된 자바스크립트로, 자바스크립트 안에 HTML처럼 보이는 소스 코드를 사용할 수 있게 해줌</p>
</blockquote>
<p>JSX에는 중괄호를 사용할 수 있는데, 그 안에는 모든 자바스크립트 표현식을 넣을 수 있다.
JSX를 사용하는 목적은 다음과 같다.</p>
<blockquote>
<p>자바스크립트 코드를 HTML로 만들기 위함</p>
</blockquote>
<p>글을 읽으면 읽을수록 뭔 소린가 싶을 것이다.
저 목적을 이해하기 위해서는 리액트 작동 흐름을 알아야 한다.</p>
<hr>
<h3 id="reacts-working-flow">React&#39;s Working Flow</h3>
<p>JSX 작동 흐름은 이렇다.</p>
<ol>
<li>컴포넌트가 JSX를 리턴하면</li>
<li>바벨과 웹팩이 JSX 코드를 바닐라 스크립트로 변환한다.</li>
<li>변환된 코드는 HTML로 변환되고 나서</li>
<li>컴포넌트를 렌더링 할 때 DOM으로 삽입되어 페이지에 실제로 보여진다.</li>
<li>그러면 사용자는 네이버, 다음과 같은 페이지를 볼 수 있는 것이다.</li>
</ol>
<p>JSX의 목적은 ... 작동 흐름 1, 2, 3번 즈음과 맞물린다.
그렇다면 합리적인(!) 의문이 든다.</p>
<p>&quot;아니 그럼 컴포넌트 리턴값을 그냥 바닐라 자바스크립트로 하셈. 왜 굳이 중간에 JSX가 껴?&quot;</p>
<p>그 의문은 아래에서 풀린다.</p>
<hr>
<p>간단한 예시를 들어보자.</p>
<blockquote>
<p>홈페이지에 &quot;Hi&quot; 문구를 뜨게 해보쇼</p>
</blockquote>
<p>JSX 코드는 이렇다.</p>
<pre><code>export default function App() {
    return (
        &lt;div&gt;Hi&lt;/div&gt;
    )
}</code></pre><p>바닐라 자바스크립트 코드는 이렇다.</p>
<pre><code>var _temporalUndefined = {};
var App = _temporalUndefined;

App = function App() {
    return React.CreateElement(
        &quot;div&quot;,
        null,
        &quot;Hi!&quot;
    );
};</code></pre><p>둘을 비교하였을 때 어느 쪽이 더 가독성이 좋은가?
그리고 코드양은 어느 쪽이 더 적은가?
압도적으로 JSX쪽이다.
리액트가 JSX를 만든 이유 중 하나이기도 하다.</p>
<p>컴포넌트는 JSX 뿐만 아니라 바닐라 자바스크립트도 리턴할 수 있다.
다만, 가독성도 안 좋고 코드양도 많아서 다들 안 쓸 뿐이다.
개발자들은 게으르기 떄문에 어떻게든 더 편리한 방법을 찾지 않는가?ㅋㅋ</p>
<p>오늘의 포스팅은 여기까지!
문의, 오류 지적 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(2) React 보일러 플레이트 Boiler Plate CRA(Create-React-App)]]></title>
            <link>https://velog.io/@lua_aw/201105-2-React-%EB%B3%B4%EC%9D%BC%EB%9F%AC%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8-CRACreate-React-App</link>
            <guid>https://velog.io/@lua_aw/201105-2-React-%EB%B3%B4%EC%9D%BC%EB%9F%AC%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8-CRACreate-React-App</guid>
            <pubDate>Thu, 05 Nov 2020 00:57:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/edb22050-5870-4dd9-a0a8-5d85a444cd0f/image.png" alt="">
리액트의 공식 명령어이자 보일러플레이트인 CRA에 대해서 글쓰고자 한다.
본론으로 들어가기 앞서, 먼저 보일러 플레이트에 대해 알아보자.</p>
<hr>
<h3 id="what-is-boiler-plate">What is &quot;Boiler Plate&quot;?</h3>
<p>위키에서는 보일러플레이트 코드를 다음과 같이 정의하고 있다.</p>
<blockquote>
<p>변경이 거의 또는 전혀 없이 많은 곳에 포함되어야하는 코드 섹션</p>
</blockquote>
<p>보일러플레이트라는 단어의 어원이 신문사업에서 생겼다고 한다. 1890년대에 광고나 컬럼에서 똑같이 사용되는 텍스트를 강철로 도장 찍듯이 찍기 시작한 것.
어원과 정의를 보았을 때 보일러플레이트는 아래와 같이 정의할 수 있겠다.</p>
<blockquote>
<p>최소한의 변경으로 여러 곳에서 재사용되는 것</p>
</blockquote>
<hr>
<h3 id="what-is-cra">What is &quot;CRA&quot;?</h3>
<p>CRA는 <strong>Create-React-App</strong> 라는 리액트 공식 명령어의 약자이다.
명령어는 아래와 같다.</p>
<blockquote>
<p>npx create-react-app 프로젝트명(서비스명)</p>
</blockquote>
<p>참고로 npx는 npm의 CLI이다.
명령어를 직역하자면 <del>&#39;리액트 어플리케이션 하나 만들어주삼&#39;</del> 이 되겠다.
IDE나 에디터로 프로젝트를 생성할 수 있지만 CRA로 생성하면 웹팩(Webpack) 등의 세팅들을 알아서 해준다.
IDE나 에디터로 생성할 시 해당 세팅을 일일이 해줘야 한다.</p>
<p>여담으로 CRA로 생성한 어플리케이션에는 웹팩 설정 파일이 안 보이는데 그건 CRA가 숨겨놓았기(!) 때문이다. package.json의 scripts를 통해 파일 경로를 찾을 수 있다.</p>
<p>그렇다면 왜 사람들은 CRA를 보일러플레이트라고 부르는 걸까?</p>
<hr>
<h3 id="cra--bioler-plate">CRA = Bioler Plate?</h3>
<p>CRA에는 &#39;변경 없는 (어플리케이션을 생성해주는) 코드&#39;들이 있고 이 코드들은 &#39;여러 곳(정확히는 여러 사람들에게)&#39;에서 쓰인다.
이는 보일러플레이트의 역할과 일치하므로 CRA는 리액트의 보일러 플레이트라고 할 수 있겠다.</p>
<hr>
<p>다음에는 리액트의 기본 문법에 대해서 포스팅하겠다.
문의 및 오류 지적은 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(1) React에 대하여]]></title>
            <link>https://velog.io/@lua_aw/201104-1-React-%EC%A0%95%EC%9D%98</link>
            <guid>https://velog.io/@lua_aw/201104-1-React-%EC%A0%95%EC%9D%98</guid>
            <pubDate>Wed, 04 Nov 2020 18:37:23 GMT</pubDate>
            <description><![CDATA[<p>새벽까지 소스 작업하고 사수분께 풀리퀘스트 보낸 후에야 업무가 끝났다.
이미 12시가 지나서 5일이 되었지만 아직 나의 하루가 끝난 건 아니라는 억지 아닌 억지(ㅋㅋ)로 4일 TIL 시작!
오늘은 매우 매우 핫하고 프론트엔드 개발자라면 한 번쯤은 들어봤을 법한 자바스크립트 라이브러리, 리액트에 대해 글쓰고자 한다.</p>
<hr>
<h3 id="what-is-react">What Is React?</h3>
<p>2013년 페이스북이 만들었다.
공식 홈페이지에는 &quot;사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리&quot;라고 쓰여 있다.
사용자 인터페이스는 UI이고 웹 브라우저에서 보여지는 건 HTML일테니 결국 리액트는 아래와 같이 정의할 수 있겠다.</p>
<blockquote>
<p>&quot;웹 브라우저에서 보여지는 HTML을 만드는 자바스크립트 전용 라이브러리&quot;</p>
</blockquote>
<hr>
<h3 id="fame-of-react">Fame of React?</h3>
<p>매년 자바스크립트 관련 프레임워크, 라이브러리 등의 생태계 인지도와 관심도를 조사하는 [StateOfJS]  (<a href="https://2019.stateofjs.com/ko/">https://2019.stateofjs.com/ko/</a>) 사이트에 따르면, 리액트의 인기는 2016년도부터 상당했다.</p>
<p>리액트와의 비교군은 중국 개발자가 만든 Vue.js, 이제는 시들해진 Angular.js, 캐릭터가 귀여운 Ember.js이다.</p>
<p>아래 그래프를 보면 리액트는 2016년도부터 2019년도까지 2018년 1년을 제외하고 모든 해 1위를 차지하였다. 2018년도의 1위는 Vue.js이다.
<img src="https://images.velog.io/images/lua_aw/post/f1eede74-4ec6-4af6-93b4-fbc22c311c76/image.png" alt=""></p>
<p>그래프에는 나와 있지 않지만 2010년도 초중반엔 Angular.js가 인기가 많았고 리액트는 논외 대상이었다.
얘기 듣기로는 리액트 공부하는 사람은 거의 무시당했다고 할 정도..
그러나 불과 몇 년만에 상황은 뒤바뀌었다!</p>
<p>두 번째 이미지는 자바스크립트 프레임워크들에 대한 개발자들의 설문조사 결과를 나타낸 자료인데, 가장 왼 쪽이 리액트이다.
리액트는 모든 프레임워크들 중에 빨간색 면적이 제일 넓다.
빨간색의 의미는 아래와 같다.</p>
<blockquote>
<p>전에 “사용한 적”이 있고, 다시 사용할 생각이 “있음”</p>
</blockquote>
<p>참고로 파란색의 의미는 들어봤으나 관심 읎음이다ㅋㅋ
<img src="https://images.velog.io/images/lua_aw/post/4fe58573-53e1-487f-acf6-3df55e1ea967/image.png" alt=""></p>
<p>앵귤러의 인기가 몇 년도 안 돼서 시들해진 것처럼 리액트도 그렇게 될 것이라고 예상한 사람들을 비웃듯이 리액트는 자바스크립트 대표 라이브러리로서 굳건히 서있다.</p>
<p>도대체 무엇이 사람들로부터 리액트에 열광하게 만들었을까?</p>
<hr>
<h3 id="why-react">Why React?</h3>
<p>여러가지 이유가 있을 것이다. 아토믹 패턴, SEO와 SSR, Virtual DOM ... 개인적으로 나는 아래 이유가 가장 끌린다.</p>
<blockquote>
<p>리액트는 자바스크립트 기반으로 작동한다.</p>
</blockquote>
<p>즉, 혹여나 리액트가 없어져도 배운 지식을 써먹을 수 있다는 소리가 된다!
어디에? 자바스크립트 스킬 업에!!
날마다 새로운 개발 기술이 만들어지고, 그걸 빨리 습득해야 하는 개발자의 입장으로서 배운 지식을 재활용할 수 있다는 말은 너무나도 큰 메리트다 ㅋㅋ</p>
<p>앵귤러나 뷰는 프레임워크에 맞는 문법이 따로 존재해서 개별적으로 습득해야 한다. 반대로 리액트는 JSX를 제외하고는 거의 모든 문법이 자바스크립트임!</p>
<p>리액트를 배우면 자바스크립트를 따로 공부할 필요가 없다고 말하는 사람이 있을 정도로 리액트는 자바스크립트와 영혼의 소울메이트다.
그리고 자바스크립트는 웹에 쓰이는 유일한 프로그래밍 언어이므로 개발자라면 필수로 배워야 하는 언어이다.</p>
<p>결론! 포지션에 프론트엔드가 있다면 리액트를 열심히 공부합시다 <del>(2020년도 기준)</del>.</p>
<hr>
<p>다음에는 리액트의 공식 명령어인 CRA에 대해 포스팅하겠다.
문의 및 오류 지적은 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React "code ELIFECYCLE" Error 해결]]></title>
            <link>https://velog.io/@lua_aw/201103-React-code-ELIFECYCLE-Error-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@lua_aw/201103-React-code-ELIFECYCLE-Error-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Tue, 03 Nov 2020 13:20:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lua_aw/post/00a33d83-d606-46ba-b867-084ea29666b8/react.jpeg" alt="">
회사 리액트 프로젝트 설정 파일을 추출하고 싶어서 eject 명령어를 쳤더니 다음과 같은 오류가 발생하였다.</p>
<pre><code>&gt; test-react@0.1.0 eject 프로젝트 directory
&gt; react-scripts eject

sh: react-scripts: command not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! test-react@0.1.0 eject: `react-scripts eject`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the test-react@0.1.0 eject script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

npm ERR! A complete log of this run can be found in:
npm ERR!     로그파일</code></pre><p>이걸 번역하자면...</p>
<blockquote>
<p>&quot;
니가 쓴 명령어 react-scripts에서 찾을 수 없어!
npm 문제 아닌 것 같어 추가 로깅이 있는 거 같은데.
npm install을 했는지 확인해봐
&quot;</p>
</blockquote>
<p>그렇다면 확인 사항은</p>
<ol>
<li>명령어가 package.json scripts에 있는가?</li>
<li>(1번이 아니라면) npm install을 했는가?</li>
<li>(2번이 아니라면) 로그를 확인했는가?</li>
</ol>
<p>나는 명령어가 스크립트에 있었고, npm install을 한 상태였다.
다만 여러 라이브러리를 추가하던 때라서 install을 짧은 시간 안에 여러 번 한 상태였음..
로그가 쌓여서 발생한 문제라 판단하여 아래와 같이 시도하였다.</p>
<ol>
<li>캐시 정리<blockquote>
<p>npm cache clean --force</p>
</blockquote>
</li>
<li>기존 파일 삭제 : node_modules, package-lock.json<blockquote>
<p>rm -rf ./node_modules
rm -rf ./package-lock.json</p>
</blockquote>
</li>
<li>npm 재설치 &amp; 재시작<blockquote>
<p>npm install &amp;&amp; npm start</p>
</blockquote>
</li>
</ol>
<p>시도 후 프로젝트는 잘 작동하였다!
혹시 모르니 중간 중간에 캐시를 지워줘야 겠다.</p>
<hr>
<p>문의 &amp; 오류 지적 언제나 환영합니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[안녕, velog :)]]></title>
            <link>https://velog.io/@lua_aw/hello-velog</link>
            <guid>https://velog.io/@lua_aw/hello-velog</guid>
            <pubDate>Mon, 19 Oct 2020 11:47:21 GMT</pubDate>
            <description><![CDATA[<p>새로운 개발 지식들을 알아가느라 정신 없는 요즘,
배운 지식들을 velog에 차곡 차곡 기록하려 한다.</p>
<p>질문과 시행착오가 가득할 수도 있지만 그 또한 내 성장의 밑거름이 되어줄거라 믿는다.
천천히, 그리고 꾸준히 기록해 나가야겠다.</p>
<p>오늘부터 velog 시작!</p>
]]></description>
        </item>
    </channel>
</rss>