<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>edge's Tech log</title>
        <link>https://velog.io/</link>
        <description>TIL (Today I Learned!) 전공 까먹기 싫어서 정리하는 중🎁</description>
        <lastBuildDate>Sun, 03 Oct 2021 08:24:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>edge's Tech log</title>
            <url>https://images.velog.io/images/dl_edge/profile/09a8b882-f996-40c6-8a5e-e33cf8d92c2b/22021046_조다은_중간과제.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. edge's Tech log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dl_edge" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[운영체제] cpu 스케쥴링]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-cpu-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%A7%81</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-cpu-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%A7%81</guid>
            <pubDate>Sun, 03 Oct 2021 08:24:37 GMT</pubDate>
            <description><![CDATA[<h2 id="cpu-스케쥴링이란">cpu 스케쥴링이란?</h2>
<p>Cpu 스케쥴링은 ready queue에 있는 프로세스 중 cpu를 할당할 프로세스를 결정하는 것이다.</p>
<hr>

<h2 id="cpu-스케쥴러의-두가지-종류">cpu 스케쥴러의 두가지 종류</h2>
<h4 id="선점형preemptive">선점형(preemptive)</h4>
<p>이미 작업 중인 프로세스에 대해서 <strong>우선 순위가 더 높은 프로세스가 등장한다면 context switching</strong>이 일어난다.
빠른 응답이 가능해 실시간 시스템이나 시분할 시스템에 적합니다. 하지만, <strong>context switching이 잦아 오버헤드가 발생한다.</strong></p>
<blockquote>
<p>context switching이란? </p>
</blockquote>
<h4 id="비선점형non-preemptive">비선점형(non-preemptive)</h4>
<p>이미 작업 중인 프로세스에 대해서 우선 순위가 더 높은 프로세스가 등장하더라도 <strong>context switching이 발생하지 않는다.</strong>
모든 프로세스에 대해 공평하게 작업이 가능하지만 앞에 긴 작업이 진행 중인 경우, <strong>짧은 작업은 대기 시간이 길어지고 평균 처리시간이 증가</strong>한다.</p>
<h4 id="선점형-vs-비선점형">선점형 vs. 비선점형</h4>
<ul>
<li>선점형 : 프로세스의 cpu를 강제로 뺏어서 실행</li>
<li>비선점형 : cpu를 획득한 프로세스가 스스로 반납하기 전까지 cpu를 뺏기지 않는 방법<br>

</li>
</ul>
<h2 id="디스패처">디스패처</h2>
<h4 id="디스패처란">디스패처란?</h4>
<p>Cpu할당을 결정하면 이를 이양하는 작업이 필요한데, 선택된 프로세스가 cpu를 할당받고 작업을 수행할 수 있게 환경설정하는 코드를 말한다.</p>
<ul>
<li><p>현재 수행 중인 문맥을 pcb에저장하고, 새로운 프로세스의 문맥을 pcb로부터 복원한 후 그 프로세스에게 cpu를 넘기는 과정을 수행한다.</p>
</li>
<li><p>디스패처가 프로세스를 정지시키고 다른 프로세스에게 cpu를 전달하기까지 걸리는 시간을 <strong>디스패치 지연시간</strong>이라고 한다.</p>
</li>
<li><p><em>디스패치 지연시간의 대부분은 context switching 오버헤드에 해당한다.*</em></p>
</li>
</ul>
<p>-&gt; 선점형 cpu 스케쥴링에서 사용된다. </p>
<hr>

<h2 id="cpu-스케쥴링-알고리즘">cpu 스케쥴링 알고리즘</h2>
<p>Ready queue에 있는 프로세스를 대상으로 스케쥴링을 한다.</p>
<h3 id="1-first-come-first-servedfcfs">1) first come first served(fcfs)</h3>
<ul>
<li>먼저 온 순서대로 처리한다.</li>
<li>선점형 스케쥴링</li>
<li>소요시간이 긴 프로세스가 먼저 도착하면 짧은 프로세스들은 대기시간이 길어진다 (convoy effect)<blockquote>
<p>프로세스마다 대기시간은 앞의 프로세스가 완료될 때까지의 시간이고, 평균 대기시간은 이를 프로세스 수로 나눈 시간이다.</p>
</blockquote>
</li>
</ul>
<h3 id="2-round-robin-rr">2) round robin (rr)</h3>
<ul>
<li>프로세스가 ready queue를 순차적으로 돌며 cpu를 할당한다.</li>
<li>비선점형 스케쥴링</li>
<li>프로세스 작업의 시간 제한이 있다. 시간이 경과하면, ready queue의 끝에 추가되고 다음 프로세스가 cpu를 할당받는다.<blockquote>
<p>할당시간을 time slice/time quantum 이라고 한다.
이 시간이 짧아질 수록 모든 프로세스가 동시에 작업하는 것처럼 보인다.
하지만, 그만큼 <strong>context switching이 많이 발생하여 오버헤드가 발생</strong>한다.
이 시간이 길어질수록 fcfs 방식과 유사해진다.</p>
</blockquote>
</li>
</ul>
<h3 id="3-priority-scheduling">3) priority scheduling</h3>
<ul>
<li>우선순위가 가장 높은 프로세스에게 cpu를 할당하는 스케쥴링이다.</li>
<li>선점/비선점 둘다 가능<ul>
<li>선점형 : 더 높은 우선순위를 가진 프로세스가 오면 실행 중인 프로세스를 중지하고 cpu를 반환한다.</li>
<li>비선점형 : 더 높은 우선순위를 가진 프로세스가 오면 ready queue의 head에 넣는다.</li>
</ul>
</li>
<li>우선순위가 낮은 프로세스는 차례가 오지 않는 <strong>기아 상태(starvation)</strong>가 발생할 수 있다.<ul>
<li><strong>aging</strong>으로 시간이 지나면 우선순위를 높여 해결이 가능하다.<blockquote>
<p>aging : 기다리는 시간이 길어질 수록 우선순위를 조금씩 높임</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="4-shortest-job-firstsjf">4) shortest job first(sjf)</h3>
<ul>
<li>cpu burst time이 짧은 프로세스에게 cpu를 할당한다.</li>
<li>비선점형으로 더 짧은 작업시간을 갖는 프로세스가 오면, ready queue에 넣는다.</li>
<li>시스템 프로세스 수를 최소회하고, 스케쥴링 부하가 감소한다. </li>
<li>메모리를 절약하여 시스템 효율이 향상된다.</li>
<li>작업시간이 길면 차례가 오지 않는 <strong>기아 상태(starvation)</strong>가 발생할 수 있다.</li>
</ul>
<h3 id="5-shortest-remaining-time-firstsrt">5) shortest remaining time first(srt)</h3>
<ul>
<li>잔여 실행시간이 짧은 프로세스에게 cpu를 할당한다.</li>
<li>선점형으로, 잔여 실행시간이 더 짧은 프로세스가 오면 cpu를 반납한다.</li>
<li>주어진 집합에 대해 최소 평균 대기시간을 제공한다.</li>
<li>잔여 실행 시간을 예측해야한다.</li>
</ul>
<p>이 다섯개 이외에도,
Highest response ratio nest(hrrn), multi-level queue(mlq), multi-level feedback queue(mfq) 등이 있다.</p>
<hr>
Reference : https://jgrammer.tistory.com/entry/운영체제-CPU-스케쥴링
https://velog.io/@secho/OS-Cpu-스케쥴링

]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vuetify 사용하기]]></title>
            <link>https://velog.io/@dl_edge/Vue.js-Vuetify-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dl_edge/Vue.js-Vuetify-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 30 Sep 2021 14:34:33 GMT</pubDate>
            <description><![CDATA[<p>Vuetify란, Vue에서 제공하는 css 라이브러리다.</p>
<h2 id="1-vuetify-설치">1. Vuetify 설치</h2>
<pre><code>npm install vuetify</code></pre><p>node_modules 밑에 vuetify 생성확인</p>
<img src="https://user-images.githubusercontent.com/19389288/92556018-ded03700-f2a3-11ea-9dc2-2fab4999b5ba.PNG" width="80%">

<br>

<h2 id="2-vuetify-사용-설정">2. Vuetify 사용 설정</h2>
<ul>
<li>main.js 에 아래 설정을 추가한다.</li>
</ul>
<pre><code class="language-js">import Vue from &#39;vue&#39;
import App from &#39;./App.vue&#39;
import router from &#39;./router&#39;
import store from &#39;./store&#39;

// vuetify
import Vuetify from &#39;vuetify&#39;
import &#39;vuetify/dist/vuetify.min.css&#39;

Vue.use(Vuetify);

Vue.config.productionTip = false

new Vue({
    router,
    store,
    vuetify: new Vuetify(),
    render: h =&gt; h(App)
}).$mount(&#39;#app&#39;)</code></pre>
<ul>
<li>App.vue template 수정</li>
</ul>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;template&gt;
  &lt;v-app id=&quot;app&quot;&gt;

  &lt;/v-app&gt;
&lt;/template&gt;</code></pre>
<br>

<h2 id="3-적용-확인">3. 적용 확인</h2>
<p>Vuetify 버튼 적용 확인하기</p>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;template&gt;
  &lt;v-app id=&quot;app&quot;&gt;
    &lt;v-btn color=&quot;success&quot;&gt;Success&lt;/v-btn&gt;
    &lt;v-btn color=&quot;error&quot;&gt;Error&lt;/v-btn&gt;
    &lt;v-btn color=&quot;warning&quot;&gt;Warning&lt;/v-btn&gt;
    &lt;v-btn color=&quot;info&quot;&gt;Info&lt;/v-btn&gt;
  &lt;/v-app&gt;
&lt;/template&gt;</code></pre>
<img src="https://user-images.githubusercontent.com/19389288/92560740-e268bb80-f2ad-11ea-8a59-abd38de4a644.PNG" width="90%">
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vuex 시작 (3) - Actions]]></title>
            <link>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%91-3-Actions</link>
            <guid>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%91-3-Actions</guid>
            <pubDate>Thu, 30 Sep 2021 14:31:51 GMT</pubDate>
            <description><![CDATA[<p>Vuex의 마지막 부분인 Actions!</p>
<h2 id="actions-란">Actions 란?</h2>
<p>Mutations 에는 순차적인 로직들만 선언하고 Actions 에는 비 순차적 또는 비동기 처리 로직들을 선언한다.</p>
<p>그렇다면 왜 처리 로직의 성격에 따라 Mutations 와 Actions 로 나눠 등록을 해야할까?</p>
<br>

<ul>
<li><strong>Mutations 의 역할은 State 관리</strong>에 초점을 두고 있다.</li>
<li>=&gt; 한 데이터에 대해 여러 개의 컴포넌트가 접근할 때, 어느 컴포넌트에서 접근했는지를 알기 위해 사용한다고 배웠다.</li>
<li>상태 관리 자체가 한 데이터에 대해 여러 개의 컴포넌트가 관여하는 것을 효율적으로 관리하기 위함인데 Mutations 에 비동기 처리 로직들이 포함되면 <strong>같은 값에 대해 여러 개의 컴포넌트에서 변경을 요청했을 때, 그 변경 순서 파악이 어렵기 때문</strong>이다.</li>
</ul>
<h5 id="이러한-문제를-방지하기-위해-비동기-처리-로직은-actions-에-동기-처리-로직은-mutations-에-나눠-구현한다">이러한 문제를 방지하기 위해 비동기 처리 로직은 Actions 에, 동기 처리 로직은 Mutations 에 나눠 구현한다.</h5>
<br>

<p>따라서, <code>setTimeout()</code> 이나 서버와의 http 통신 처리 같이 결과를 받아올 타이밍이 예측되지 않은 로직은 Actions 에 선언한다.</p>
<br>

<h5 id="pushpintip-동기-처리mutations-vs-비동기-처리actions">:pushpin:Tip! 동기 처리(Mutations) vs. 비동기 처리(Actions)</h5>
<blockquote>
<p>Mutations 속성에는 state 값의 변화를 추적하기 어렵기 때문에 동기 처리 로직만 선언해주고, </p>
<p>state 호출, 변경 확인이 쉬운 Actions 에는 비동기 처리 로직을 선언해준다.</p>
</blockquote>
<br>

<h2 id="actions-등록">Actions 등록</h2>
<p>Vuex에 Actions를 등록하는 방법은 State나 Mutations, Getters 와 유사하다. </p>
<pre><code class="language-js">// store.js
export const store = new Vuex.Store({
  // ...
  mutations: {
    addCounter: function (state, payload) {
      return state.counter++;
    }
  },
  actions: {
    addCounter: function (context) {
      // commit 의 대상인 addCounter 는 mutations 의 메서드를 의미한다.
      return context.commit(&#39;addCounter&#39;);
    }
  }
});</code></pre>
<p>상태가 변화하는 걸 추적하기 위해 <strong>actions는 결국 mutations의 메서드를 호출(commit)하는 구조</strong>가 된다. </p>
<pre><code class="language-js">// store.js
export const store = new Vuex.Store({
  actions: {
    getServerData: function (context) {
      return axios.get(&quot;sample.json&quot;).then(function() {
        // ...
      });
    },
    delayFewMinutes: function (context) {
      return setTimeout(function () {
        commit(&#39;addCounter&#39;);
      }, 1000);
    }
  }
});</code></pre>
<p>위처럼 <strong>HTTP get 요청이나 setTimeout 과 같은 비동기 처리 로직</strong>들은 <strong>actions 에 선언</strong>해준다.</p>
<br>

<h2 id="actions-사용">Actions 사용</h2>
<p>Actions를 이용해서 counter를 하나씩 늘려보자.</p>
<p>Actions를 호출할 때는 <strong>dispatch()</strong> 를 이용한다. (Mutations는 <strong>commit()</strong> 사용)</p>
<pre><code class="language-js">// App.vue
methods: {
  // Mutations 를 이용할 때
  addCounter() {
    this.$store.commit(&#39;addCounter&#39;);
  }
  // Actions 를 이용할 때
  addCounter() {
    this.$store.dispatch(&#39;addCounter&#39;);
  }
},</code></pre>
<p>전체 구조도에서 <strong>dispatch</strong> 의 동작을 보면,</p>
<img src="https://user-images.githubusercontent.com/19389288/92506887-16f25e00-f241-11ea-8406-b199254e40d1.jpg" width="70%">

<blockquote>
<ul>
<li><p>App.vue에서 addCounter 이벤트가 발생하고, Vuex의 Actions에 dispatch를 한다.</p>
</li>
<li><p>dispatch를 받은 Actions는 Mutations 에 commit 을 하고,</p>
</li>
<li><p>Mutations 에 정의되어 있는 메서드가 호출되어 Vuex의 State를 변경시킨다.</p>
</li>
</ul>
</blockquote>
<p>위와 같은 흐름으로 상태 관리를 하게 되면, 어느 컴포넌트에서 어떤 순서로 State에 접근하고 변경했는지를 알 수 있게 되는 것이다.</p>
<br>

<h2 id="actions-에-인자-값-넘기기">Actions 에 인자 값 넘기기</h2>
<p>Mutations와 유사하다.</p>
<pre><code class="language-js">&lt;!-- by 와 duration 등의 여러 인자 값을 넘길 경우, 객체안에 key - value 형태로 여러 값을 넘길 수 있다 --&gt;
&lt;button @click=&quot;asyncIncrement({ by: 50, duration: 500 })&quot;&gt;Increment&lt;/button&gt;</code></pre>
<pre><code class="language-js">export const store = new Vuex.Store({
  actions: {
    // payload 는 일반적으로 사용하는 인자 명
    asyncIncrement: function (context, payload) {
      return setTimeout(function () {
        context.commit(&#39;increment&#39;, payload.by);
      }, payload.duration);
    }
  }
})</code></pre>
<br>

<h2 id="mapactions">mapActions</h2>
<pre><code class="language-js">import {mapActions} from &#39;vuex&#39;;

export default {
  methods: {
    ...mapActions([
      &#39;asyncIncrement&#39;,
      &#39;asyncDecrement&#39;
    ])
  },
}</code></pre>
<hr>
<p>📔 <strong>REFERENCE</strong>: [캡틴판교] <a href="https://joshua1988.github.io/web-development/vuejs/vuex-actions-modules/">https://joshua1988.github.io/web-development/vuejs/vuex-actions-modules/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vuex 시작 (2) - Getters와 Mutations]]></title>
            <link>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%91-2-Getters%EC%99%80-Mutations</link>
            <guid>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%91-2-Getters%EC%99%80-Mutations</guid>
            <pubDate>Thu, 30 Sep 2021 14:30:11 GMT</pubDate>
            <description><![CDATA[<p>지난 글에 이어 Vuex의 기본인 Getters와 Mutations를 배워보자!</p>
<h2 id="getters-란">Getters 란?</h2>
<p><strong>중앙 데이터 관리식 구조(Vuex)</strong>에서 발생하는 문제점 중 하나는 각 컴포넌트에서 Vuex의 데이터를 접근할 때 중복된 코드를 <strong>반복 호출</strong>하게 되는 것이다. </p>
<p>예를 들어, 아래와 같은 코드가 있다.</p>
<pre><code class="language-js">// App.vue
computed: {
  doubleCounter() {
    return this.$store.state.counter * 2;
  }
},

// Child.vue
computed: {
  doubleCounter() {
    return this.$store.state.counter * 2;
  }
},</code></pre>
<p>App.vue와 Child.vue 등 여러 컴포넌트에서 같은 로직을 중복 사용하고 있다. 이 때<strong>, Vuex의 데이터(state) 변경을 각 컴포넌트에서 수행하는 게 아니라, Vuex에서 수행하도록 하고</strong>, <strong>각 컴포넌트에서 수행 로직을 호출</strong>하면, 가독성도 올라가고 성능면에서도 이점이 생긴다.</p>
<br>

<pre><code class="language-js">// store.js (Vuex)
getters: {
  doubleCounter: function (state) {
    return state.counter * 2;
  }
},

// App.vue
computed: {
  doubleCounter() {
    return this.$store.getters.doubleCounter;
  }
},

// Child.vue
computed: {
  doubleCounter() {
    return this.$store.getters.doubleCounter;
  }
},</code></pre>
<br>

<img src="https://user-images.githubusercontent.com/19389288/92451701-0cf83d00-f1f8-11ea-8063-366b46de7371.jpg" width="70%">



<br>

<h2 id="getters-등록을-위한-코드-정리">Getters 등록을 위한 코드 정리</h2>
<p>에 이어서 getters를 추가해보자.</p>
<ul>
<li><p>지난번 코드에서 정리해야 하는 부분은 다음과 같다.</p>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;div id=&quot;app&quot;&gt;
  Parent counter : {{ this.$store.state.counter }}
  &lt;!-- ... --&gt;
&lt;/div&gt;</code></pre>
<p>Vue 공식사이트에서 언급된 것처럼 <code>Template</code>의 표현식은 최대한 간소화해야 한다.</p>
<p>따라서,</p>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;div id=&quot;app&quot;&gt;
  Parent counter : {{ parentCounter }}
  &lt;!-- ... --&gt;
&lt;/div&gt;

&lt;!-- Child.vue --&gt;
&lt;div&gt;
  Child counter : {{ childCounter }}
  &lt;!-- ... --&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-js">// App.vue
computed: {
  parentCounter() {
    return this.$store.state.counter;
  }
},

// Child.vue
computed: {
  childCounter() {
    return this.$store.state.counter;
  }
},</code></pre>
<p>computed 속성을 활용함으로써 Template 코드가 더 간결해지고, 가독성이 좋아졌다.</p>
<p><strong>*computed 속성이란?</strong></p>
<blockquote>
<p>computed 속성의 대상으로 정한 data 속성이 변했을 때 이를 감지하고 자동으로 다시 연산해준다.</p>
<ul>
<li>computed 속성은 인자를 받지 않는다.</li>
<li>HTTP 통신과 같이 컴퓨팅 리소스가 많이 필요한 로직을 정의하지 않는다.</li>
</ul>
</blockquote>
</li>
</ul>
<br>

<h2 id="getters-등록">Getters 등록</h2>
<ul>
<li>getters를 Vuex에 추가한다.</li>
</ul>
<pre><code class="language-js">// store.js
import Vue from &quot;vue&quot;;
import Vuex from &quot;vuex&quot;;

Vue.use(Vuex);

export const store = new Vuex.Store({
    state: {
        counter: 0
    },
    // getCounter 라는 getters를 추가
    getters: {
        getCounter: function(state) {
            return state.counter;
        }
    }
});</code></pre>
<br>

<h2 id="getters-사용">Getters 사용</h2>
<p>등록된 getters를 각 컴포넌트에서 사용하려면 this.$store를 이용하여 getters에 접근한다.</p>
<pre><code class="language-js">// App.vue
computed: {
  parentCounter() {
    this.$store.getters.getCounter;
  }
},

// Child.vue
computed: {
  childCounter() {
    this.$store.getters.getCounter;
  }
},</code></pre>
<br>

<h2 id="mapgetters">mapGetters</h2>
<p>Vuex에 내장된 helper함수, mapGetters로 이미 위에서 한번 가독성이 올라간 코드를 더 직관적이게 작성할 수 있다.</p>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;div id=&quot;app&quot;&gt;
  Parent counter : {{ parentCounter }}
  &lt;!-- ... --&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-js">// App.vue
import { mapGetters } from &#39;vuex&#39;

// ...
computed: mapGetters({
  parentCounter : &#39;getCounter&#39; // getCounter 는 Vuex 의 getters 에 선언된 속성 이름
}),</code></pre>
<p>또는, 아래와 같이 간단하게 선언할 수도 있다.</p>
<pre><code class="language-js">&lt;!-- App.vue --&gt;
&lt;div id=&quot;app&quot;&gt;
  Parent counter : {{ getCounter }}
  &lt;!-- ... --&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-js">// App.vue
import { mapGetters } from &#39;vuex&#39;

computed: mapGetters([
  &#39;getCounter&#39;
]),</code></pre>
<br>

<h2 id="mutaions-란">Mutaions 란?</h2>
<p>Mutations 란, Vuex의 데이터 즉 <strong>state의 값을 변경하는 로직</strong>들을 의미한다.</p>
<p><strong>Getters와의 차이점</strong>은</p>
<ol>
<li>인자를 받아 Vuex에 넘겨줄 수 있고</li>
<li>computed가 아닌 methods에 등록한다.</li>
</ol>
<p>또한<strong>, Actions 와의 차이점</strong>은</p>
<ol>
<li>Mutations 는 <strong>동기적 로직</strong>을 정의</li>
<li>Actions 는 비동기적 로직을 정의</li>
</ol>
<br>

<p><strong>Mutations 의 성격상 안에 정의한 로직들이 &quot;순차적&quot;으로 일어나야 각 컴포넌트의 반영 여부를 제대로 추적할 수가 있기 때문이다.</strong></p>
<br>

<p>지금까지 counter를 변경할때 아래와 같이 직접 state에 접근하여 변경하였다.</p>
<pre><code class="language-js">return this.$store.state.counter++;
return this.$store.state.counter;</code></pre>
<p>하지만, 이 방식은 안티패턴으로써 Vue의 상태관리 패턴에 맞지 않는 방식이다.</p>
<p><strong>안티패턴인 이유</strong>는 여러 개의 컴포넌트에서 같은 state 값을 동시에 제어하게 되면, <strong>state 값이 어느 컴포넌트에서 호출해서 변경된건지 추적하기 어렵기 때문이다.</strong></p>
<p>하지만, 상태변화를 명시적으로 수행함으로써 테스팅, 디버깅, Vue의 Reactive 성질 준수의 혜택을 얻는다.</p>
<br>

<p>아래와 같이 <code>commit</code>을 이용하여 state를 변경한다.</p>
<img src="https://user-images.githubusercontent.com/19389288/92469706-3cb33f00-f210-11ea-8c9c-29aad6140bbe.jpg" width="50%">

<h5 id="pushpintip">:pushpin:Tip!</h5>
<ul>
<li><strong>Mutations</strong> 가 낯설다면 기억하기 쉽게 <strong>Setters</strong> 로 이해할 수 있다.</li>
</ul>
<br>

<h2 id="mutations-등록">Mutations 등록</h2>
<p>getters와 마찬가지로 Vuex 에 mutations 속성을 추가한다.</p>
<pre><code class="language-js">// store.js
export const store = new Vuex.Store({
  // ...
  mutations: {
    addCounter: function (state, payload) {
      return state.counter++;
    }
  }
});</code></pre>
<br>

<h2 id="mutations-사용">Mutations 사용</h2>
<p>App.vue의 기존 코드는 addCounter에서 state의 counter 값을 바로 접근하여 1을 더하는 코드였다.</p>
<p>state를 컴포넌트에서 직접 접근하여 증가시키는 부분을 mutations 를 이용하는 코드로 바꾸자.</p>
<pre><code class="language-js">&lt;!-- App.vue(parent) --&gt;
!&lt;template&gt;
  &lt;div id=&quot;app&quot;&gt;
    Parent counter : {{ parentCounter }} &lt;br&gt;
    &lt;button @click=&quot;addCounter&quot;&gt;+&lt;/button&gt;
    &lt;button @click=&quot;subCounter&quot;&gt;-&lt;/button&gt;
   &lt;child&gt;&lt;/child&gt; 
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
import Child from &quot;./Child.vue&quot;;
import { mapGetters } from &#39;vuex&#39;;

export default {
  components: {
    child : Child
  },

  computed: mapGetters({
    parentCounter : &#39;getCounter&#39;
  }),

  methods: {
    addCounter(){
      // this.$store.state.counter++;
      // commit을 이용하여 mutations 이벤트를 호출해야한다.
      this.$store.commit(&#39;addCounter&#39;); 
    }
  }
};
&lt;/script&gt;</code></pre>
<br>

<h2 id="mutations-에-인자-값-넘기기">Mutations 에 인자 값 넘기기</h2>
<p><strong>각 컴포넌트에서 Vuex 의 state를 조작하는데 필요한 특정 값들을 넘기고 싶을 때</strong>는 <code>commit()</code> 에 두번째 인자를 추가한다.</p>
<pre><code class="language-js">this.$store.commit(&#39;addCounter&#39;, 10);
this.$store.commit(&#39;addCounter&#39;, {
  value: 10,
  arr: [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]
});</code></pre>
<p>이를 Vuex 에서 아래와 같이 받을 수 있다.</p>
<pre><code class="language-js">mutations: {
  // payload 가 { value : 10 } 일 경우
  addCounter: function (state, payload) {
    state.counter = payload.value;
  }
}</code></pre>
<br>

<h2 id="mapmutations">mapMutations</h2>
<p>mapGetters와 마찬가지로, Vuex 에 내장된 mapMutations 를 이용하여 코드 가독성을 높일 수 있다.</p>
<pre><code class="language-js">// App.vue
import { mapMutations } from &#39;vuex&#39;

methods: {
  // Vuex 의 Mutations 메서드 명과 App.vue 메서드 명이 동일할 때 [] 사용
  ...mapMutations([
    &#39;addCounter&#39;
  ]),
  // Vuex 의 Mutations 메서드 명과 App.vue 메서드 명을 다르게 매칭할 때 {} 사용
  ...mapMutations({
    addCounter: &#39;addCounter&#39; // 앞 addCounter 는 해당 컴포넌트의 메서드를, 뒤 addCounter 는 Vuex 의 Mutations 를 의미
  })
}</code></pre>
<br>

<br>

<hr>

<br>

<p>📔 <strong>REFERENCE</strong>: [캡틴판교] <a href="https://joshua1988.github.io/web-development/vuejs/vuex-getters-mutations/">https://joshua1988.github.io/web-development/vuejs/vuex-getters-mutations/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 인터럽트(Interrupt)]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt</guid>
            <pubDate>Wed, 29 Sep 2021 14:59:08 GMT</pubDate>
            <description><![CDATA[<h2 id="✨-인터럽트interrupt란">✨ 인터럽트(Interrupt)란?</h2>
<p>프로그램을 실행하는 도중에, 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고 발생된 상황을 우선 처리한 후 실행 중이던 작업으로 복귀하여 계속 처리하는 것이다.</p>
<blockquote>
<p>지금 수행중인 일보다 더 중요한 일(ex. 입출력, 우선순위연산 등)이 발생하면 그 일을 먼저 처리하고 나서 하던 일을 계속해야한다.</p>
</blockquote>
<ul>
<li>외부/내부 인터럽트는 <strong>CPU의 하드웨어 신호에 의해 발생</strong></li>
<li>소프트웨어 인터럽트는 <strong>명렁어의 수행에 의해 발생</strong></li>
</ul>
<br>

<h3 id="외부-인터럽트">외부 인터럽트</h3>
<p>입출력 장치, 타이밍 장치, 전원 등 외부적인 요인으로 발생
<code>전원 이상, 기계 착오, 외부 신호, 입출력</code>
<br></p>
<h3 id="내부-인터럽트">내부 인터럽트</h3>
<p>Trap이라고 부르며, 잘못된 명령이나 데이터를 사용할 때 발생</p>
<blockquote>
<ul>
<li>Division by zero, Overflow/Underflow, 기타 Exception</li>
</ul>
</blockquote>
<br>

<h3 id="소프트웨어-인터럽트">소프트웨어 인터럽트</h3>
<p>프로그램 처리 중 명령의 요청에 의해 발생한 것 (SVC 인터럽트 : SuperVisor Call)</p>
<blockquote>
<p>사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우
소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.</p>
</blockquote>
<br>

<h2 id="✨-인터럽트-발생-처리-과정">✨ 인터럽트 발생 처리 과정</h2>
<ol>
<li>주 프로그램 실행</li>
<li>인터럽트 발생</li>
<li>복귀주소 저장</li>
<li>인터럽트 백터로 점프</li>
<li>인터럽트 처리</li>
<li>인터럽트 처리완료</li>
<li>복귀주소 로드</li>
<li>마지막에 실행되던 주소로 점프</li>
<li>주 프로그램 실행</li>
</ol>
<blockquote>
<p>인터럽트 백터(Interrupt vector) : 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간이다.</p>
</blockquote>
<p><strong>시나리오</strong>
주 프로그램이 실행되다가 인터럽트가 발생했다.</p>
<p>현재 수행 중인 프로그램을 멈추고, <strong>상태 레지스터와 PC 등을 스택에 저장</strong>한 뒤에 인터럽트 서비스 루틴으로 간다.
-&gt; 잠시 저장하는 이유는 인터럽트 서비스 루틴이 끝난 뒤 다시 원래 작업으로 돌아와야 하기 때문</p>
<p>만약 <strong>인터럽트</strong>가 없다면 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해야 한다. (== 폴링(Polling))</p>
<p>폴링을 하는 시간에는 원래 하던 일에 집중할 수가 없게 되어 많은 기능을 제대로 수행하지 못하는 단점이 있었다.</p>
<br>

<h2 id="✨-인터럽트-우선순위-판별-방법">✨ 인터럽트 우선순위 판별 방법</h2>
<p>컨트롤러가 입력을 받아들이는 방법(우선순위 판별방법)에는 두가지가 있다.</p>
<h3 id="소프트웨어적인-방법polling">소프트웨어적인 방법(Polling)</h3>
<p>인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행한다.
속도가 빠른 장치에 높은 등급을 부여한다.
우선순위 변경이 쉽다.
많은 인터럽트가 있을 경우 하드웨어 적인 방법에 비해서 우선순위 판단 속도가 느리다.
회로가 간단하고 융통성이 있으며, 별도의 하드웨어가 필요 없다.</p>
<h3 id="하드웨어적인-방법vectored-interrupt">하드웨어적인 방법(Vectored Interrupt)</h3>
<p>인터럽트를 요청할 수 있는 장치와 CPU사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결한다.
인터럽트 벡터는 인터럽트를 발생한 장치가 분기할 곳에 대한 정보이다.</p>
<p>소프트웨어적인 방법에 비해 비경제적이다.
회로가 복잡하고 융통성이 없으나, 별도의 소프트웨어가 필요없이 하드웨어로 처리되므로 속도가 빠르다.</p>
<p>하드웨어적인 방법은 아래 2가지로 나뉜다.</p>
<blockquote>
<p><strong>1) Daisy Chain</strong>
인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
우선순위가 높은 장치를 상위에 두고 우선순위 차례대로 배치한다.
<br>
<strong>2) 병렬(Parallel) 우선순위 부여 방식</strong>
인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
각 장치별 우선순위를 판별하기 위한 Mask register에 bit를 설정한다.
Mask register상 우선순위가 높은 서비스 루틴 수행중 우선순위가 낮은 bit들을 비활성화 시킬 수 있다.
반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리된다.</p>
</blockquote>
<p>인터럽트 방식은 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다. 따라서 <strong>실시간 대응</strong>이 필요할 때는 필수적인 기능이다.</p>
<p>즉, 인터럽트는 <strong>발생시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법</strong>이다.
<br></p>
<hr>
📕 REFERENCE : https://raisonde.tistory.com/entry/인터럽트Interrupt의-개념과-종류 [지식잡식]
https://gyoogle.dev/blog/computer-science/operating-system/Interrupt.html

]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] TCP/IP 4계층 ]]></title>
            <link>https://velog.io/@dl_edge/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-4%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@dl_edge/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-4%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Wed, 29 Sep 2021 13:00:53 GMT</pubDate>
            <description><![CDATA[<h1 id="👑-tcpip-4계층">👑 TCP/IP 4계층</h1>
<br>

<img src="https://user-images.githubusercontent.com/19389288/95017998-a69bf880-0697-11eb-8f78-031143eafd0f.jpg" width="600">

<br>

<ul>
<li><p>APRANET이 개발된 이후 현재의 인터넷으로 발전해나가는 과정에서 대부분의 데이터 통신이 TCP와 IP 기반으로 이루어졌기 때문에 인터넷 프로토콜 그 자체를 표현하는 용어</p>
</li>
<li><p>사실상 인터넷 프로토콜을 대표하는 용어로 사용</p>
</li>
<li><p>TCP/IP는 현재 <strong>인터넷에서 컴퓨터들이 서로 정보를 주고 받는데 쓰이는 통신규약(프로토콜)의 모음</strong>이다.</p>
<br>

</li>
</ul>
<h3 id="1계층---네트워크-액세스-계층network-access-layer">1계층 - 네트워크 액세스 계층(Network Access Layer)</h3>
<ul>
<li>OSI 7계층의 물리계층과 데이터 링크 계층에 해당</li>
<li><strong>물리적인 주소로 MAC을 사용</strong></li>
<li>CSMA/CD, MAC, LAN, X25, 패킷망, 위성 통신 등</li>
<li>Ethernet(이더넷), Token Ring, PPP 등</li>
</ul>
<br>

<h3 id="2계층---인터넷-계층internet-layer">2계층 - 인터넷 계층(Internet Layer)</h3>
<ul>
<li>OSI 7계층의 네트워크 계층에 해당</li>
<li><strong>통신 노드 간의 IP패킷을 전송하는 기능</strong>과 라우팅 기능을 담당</li>
<li>IP, ICMP, ARP, RARP, OSPF 등</li>
</ul>
<br>

<h3 id="3계층---전송-계층transport-layer">3계층 - 전송 계층(Transport Layer)</h3>
<ul>
<li>OSI 7계층의 전송 계층에 해당</li>
<li><strong>통신 노드 간의 연결을 제어</strong>하고, 신뢰성 있는 데이터를 전송</li>
<li><u>TCP, UDP</u> 등</li>
</ul>
<br>

<h3 id="4계층---응용-계층application-layer">4계층 - 응용 계층(Application Layer)</h3>
<ul>
<li>OSI 7계층의 세션 계층, 표현 계층, 응용 계층에 해당</li>
<li><strong>TCP/UDP 기반의 응용 프로그램을 구현</strong>할 때 사용</li>
<li><u>SMTP, FTP, HTTP, SSH, DNS</u> 등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] Context Switching]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Context-Switching</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Context-Switching</guid>
            <pubDate>Wed, 29 Sep 2021 12:58:03 GMT</pubDate>
            <description><![CDATA[<h1 id="🚌-context-switching">🚌 Context Switching</h1>
<p>컨텍스트 스위칭에 대해서 알아보자.</p>
<br>

<h3 id="context-switching이란">Context Switching이란?</h3>
<p>CPU 사용을 A 라는 프로세스에서 B 라는 다른 프로세스에 넘겨주는 과정을 말한다. </p>
<p>: <strong>현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정</strong> </p>
<p>어떤 프로세스에게 CPU 사용을 넘겨줄지에 대해서는 CPU Scheduling에 의해 결정된다.</p>
<h4 id="why">why?</h4>
<p>&quot;<strong>멀티 프로그래밍</strong>&quot;의 이점을 살리기 위해서다. </p>
<blockquote>
<ul>
<li>컴퓨터가 매번 하나의 Task만 처리할 수 있다면?<ul>
<li>해당 Task가 끝날 때 까지 다음 Task는 기다려야 한다.</li>
<li>또한, 반응속도가 매우 느리고 사용하기 불편하다.</li>
</ul>
</li>
<li>다양한 사람들이 동시에 사용하는 것처럼 하기 위해서는?<ul>
<li>멀티테스킹을 통해 빠른 반응속도로 응답할 수 있다.</li>
<li>빠른 속도로 Task를 바꿔가며 실행하기 때문에 사람의 눈으론 실시간 처럼 보이게 된다.</li>
<li><strong>CPU가 Task를 바꿔가며 실행하기 위해 Context Switching이 필요하게 되었다.</strong></li>
</ul>
</li>
</ul>
</blockquote>
<br>

<h3 id="context-switching은-어떻게-진행될까">Context Switching은 어떻게 진행될까?</h3>
<ul>
<li>Task의 대부분 정보는 <u>Register에 저장되고 PCB(Process Control Block)로 관리</u>된다.</li>
<li><strong>현재 실행하고 있는 Task의 PCB 정보를 저장</strong>. (Process Stack, Ready Queue)</li>
<li>다<strong>음 실행할 Task의 PCB 정보를 읽어 Register에 적재</strong>하고 CPU가 이전에 진행했던 과정을 연속적으로 수행한다.</li>
</ul>
<br>

<h6 id="thread-간의-context-switching-비용이-낮은-이유">Thread 간의 Context Switching 비용이 낮은 이유?</h6>
<p>프로세스 간의 Context switching 시 PCB 값 전체를 바꿔야 한다.</p>
<p>하지만, Thread는 data, heap, code 영역을 공유하고 있기 때문에 stack 과 PC register의 값이 들어있는 TCB만 바꾸면 되기 때문에 Cost가 낮은 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 교착상태 4가지 조건]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C-4%EA%B0%80%EC%A7%80-%EC%A1%B0%EA%B1%B4</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C-4%EA%B0%80%EC%A7%80-%EC%A1%B0%EA%B1%B4</guid>
            <pubDate>Tue, 28 Sep 2021 13:17:38 GMT</pubDate>
            <description><![CDATA[<h1 id="🔒-교착상태-4가지-조건">🔒 교착상태 4가지 조건</h1>
<p><strong>교착상태 (deadlock 데드락)</strong>의 발생조건! </p>
<p>NCS 전공 시험에서도 자주 출제되고, 기술면접에서도 자주 물어보는 개념이다.! </p>
<br>

<h3 id="1-데드락이란">1. 데드락이란?</h3>
<ul>
<li><p><u>프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태</u>로, &#39;교착 상태&#39;라고도 하며, 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.</p>
<img src="https://user-images.githubusercontent.com/19389288/94839701-52540700-0452-11eb-9f3d-c814b942f1ad.jpg" width="550">

<blockquote>
<p>p1과 p2가 리소스1,2 둘 다를 얻어야 한다고 가정할 때,</p>
<p>t1에 p1이 리소스 1을 얻고, p2가 리소스 2를 얻었다면, t2때 p1은 리소스 2를, p2는 리소스 1을 기다리게 된다.</p>
<p>하지만 서로 원하는 리소스가 상대방에게 할당되어 있기 때문에 이 두 프로세스는 무한정 기다리게 되는데 이러한 상태를 DeadLock 상태라고 한다.</p>
</blockquote>
</li>
</ul>
<br>

<h4 id="발생되는-상황-예시">발생되는 상황 예시</h4>
<ul>
<li>멀티 프로그래밍 환경에서 한정된 자원을 사용하려고 서로 경쟁하는 상황 발생</li>
<li>어떤 프로세스가 자원을 요청했을 때, 그 시각에 그 자원을 사용할 수 없는 상황이 발생할 수 있고, 그 때는 프로세스가 대기 상태로 들어감.</li>
<li>대기 상태로 들어간 프로세스들이 실행 상태로 변경 될 수 없을 때 교착 상태 발생</li>
</ul>
<br>

<h3 id="🔒-데드락의-발생-조건-4가지">🔒 데드락의 발생 조건 4가지</h3>
<p>교착 상태는 한 시스템 내에서 다음의 <strong>4가지 조건이 동시에 성립</strong>할 때 발생한다.</p>
<br>

<ol>
<li><p><strong>상호 배제(Mutual Exclusion)</strong></p>
<p>: 자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.</p>
</li>
<li><p><strong>점유 대기 (Hold and Wait)</strong></p>
<p>: 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.</p>
<p>즉, 이미 자원을 사용중인데, 다른 프로세스가 사용중인 자원을 사용하기 위해 대기하고 있는 상태의 프로세스가 존재해야 한다.</p>
</li>
<li><p><strong>비선점 (No preemption)</strong></p>
<p>: 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.</p>
</li>
<li><p><strong>순환 대기 (Circular wait)</strong></p>
<p>: 프로세스의 집합에서 P0은 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고, P2...Pn-1d은 Pn이 점유한 자원을 대기하며 Pn은 P0이 점유한 자원을 요구해야 한다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 컴파일러와 인터프리터의 차이]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%99%80-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EC%99%80-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Tue, 28 Sep 2021 13:10:47 GMT</pubDate>
            <description><![CDATA[<p>컴파일러와 인터프리터에 대해 알아보자.</p>
<p>컴파일러와 인터프리터는 모두 고급 언어(java, c언어 등)를 PC가 읽을 수 있는 언어(2진법)로 변환하는 장치이다.</p>
<br>

<p>인터프리터와 컴파일러의 차이를 보면,</p>
<ol>
<li><strong>인터프리터</strong>란, 고급 언어로 작성된 원시 코드 명령문들을 한번에 <strong>한 줄씩 읽어들여서 실행하는 프로그램</strong>이며,</li>
<li><strong>컴파일러</strong>란, 특정 프로그램 언어로 작성된 문장을 처리하여 <strong>기계어 또는 컴퓨터가 사용할 수 있는 코드로 변경</strong>시켜주는 특수한 용도의 프로그램이다.</li>
</ol>
<BR>

<p>컴파일러와 인터프리터의 가장 큰 차이점은 <strong>해석을 한번에 하느냐 아니면 실행과 동시에 부분적으로 해석</strong>을 하느냐 이다.</p>
<blockquote>
<ol>
<li>컴파일러는 프로그램 전체를 한번에 기계어로 편집하는 것을 말하고,</li>
<li>인터프리터는 작성한 프로그램을 한 줄씩 번역하면서 실행하는 것이다.</li>
</ol>
</blockquote>
<br>

<h4 id="실행순서">실행순서</h4>
<ul>
<li>컴파일러의 실행과정<ol>
<li>어휘 분석</li>
<li>구분 분석</li>
<li>의미 분석</li>
<li>중간 코드 생성</li>
<li>기계어 코드 생성</li>
</ol>
</li>
<li>인터프리터의 프로그램 실행 과정<ol>
<li>한 명령어를 메모리에서 가져옴</li>
<li>가져온 명령어 해석</li>
<li>필요한 데이터 가져옴</li>
<li>명령 실행</li>
</ol>
</li>
</ul>
<br>

<h3 id="컴파일러와-인터프리터의-차이-요약-정리">컴파일러와 인터프리터의 차이 요약 정리</h3>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">컴파일러</th>
<th align="center">인터프리터</th>
</tr>
</thead>
<tbody><tr>
<td align="center">번역단위</td>
<td align="center">전체</td>
<td align="center">한줄씩</td>
</tr>
<tr>
<td align="center">실행속도</td>
<td align="center">상대적으로 빠름 =&gt; 실행파일이 생성되어 다음에 실행할 때는 이 파일만 실행하면 되기 때문에 실행 시간이 비교적 빠르다.</td>
<td align="center">상대적으로 느림 =&gt; 한 줄씩 번역을 하기 때문에 번역시간은 빠르지만 실행 시간은 비교적 느리다.</td>
</tr>
<tr>
<td align="center">번역속도</td>
<td align="center">상대적으로 느림</td>
<td align="center">상대적으로 빠름</td>
</tr>
<tr>
<td align="center">실행  파일 생성유무</td>
<td align="center">생성</td>
<td align="center">생성 안함</td>
</tr>
<tr>
<td align="center">메모리 할당</td>
<td align="center">할당 받음</td>
<td align="center">사용 안함</td>
</tr>
</tbody></table>
<br>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vuex 시작(1) - State]]></title>
            <link>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%911-State</link>
            <guid>https://velog.io/@dl_edge/Vue.js-Vuex-%EC%8B%9C%EC%9E%911-State</guid>
            <pubDate>Tue, 28 Sep 2021 13:02:06 GMT</pubDate>
            <description><![CDATA[<h1 id="💎-vuex-시작-1">💎 Vuex 시작 (1)</h1>
<p>Vue.js의 컴포넌트와 컴포넌트간 통신 방법을 알고 있다는 전제하에 시작한다.</p>
<br>

<h2 id="vuex란">Vuex란?</h2>
<ul>
<li><p>Vue.js의 <strong>상태 관리</strong>를 위한 패턴이자 라이브러리.</p>
</li>
<li><p>다른 상태 관리 패턴이나 라이브러리와 비교했을 때 뷰의 반응성 체계를 효율적으로 활용하여 화면을 업데이트 한다는 차이점이 있다.</p>
</li>
</ul>
<br>

<h3 id="vue의-상태관리는-왜-필요할까">Vue의 상태관리는 왜 필요할까?</h3>
<ul>
<li>컴포넌트 기반 프레임워크에서는 작은 단위로 쪼개진 <strong>여러 개의 컴포넌트로 화면을 구성</strong>한다.</li>
<li>이에 따라 <strong>컴포넌트 간의 통신이나 데이터 전달을 좀 더 유기적으로 관리할 필요성이 생긴다.</strong></li>
</ul>
<br>

<h3 id="상태-관리란">상태 관리란?</h3>
<blockquote>
<p>상태 관리란, 여러 <strong>컴포넌트 간의 데이터 전달과 이벤트 통신을 한 곳에서 관리</strong>하는 패턴을 의미한다.</p>
</blockquote>
<br>

<h3 id="상태-관리로-해결할-수-있는-문제점">상태 관리로 해결할 수 있는 문제점?</h3>
<p>상태 관리는 중대형 규모의 웹 애플리케이션에서 <u>컴포넌트 간에 데이터를 더 효율적으로 전달할 수 있다.</u></p>
<p>일반적으로 앱의 규모가 커지면서 생기는 문제점들은 아래와 같다.</p>
<ol>
<li>뷰의 컴포넌트 통신 방식인 props, event emit 때문에 <strong>중간에 거쳐야할 컴포넌트가 많아지거나</strong></li>
<li>이를 피하기 위해 <strong>Event Bus를 사용하여 컴포넌트 간 데이터 흐름을 파악하기 어려운 것</strong></li>
</ol>
<p>이러한 문제점을 해결하기 위해 모든 데이터 통신을 한 곳에서 <strong>중앙 집중식으로 관리</strong>하는 것이 상태 관리다.</p>
<br>

<h2 id="상태-관리-패턴">상태 관리 패턴</h2>
<p><strong>[상태 관리 구성요소]</strong></p>
<ul>
<li><strong>state</strong>: 컴포넌트 간에 공유할 <strong>data</strong></li>
<li><strong>view</strong>: 데이터가 표현될 <strong>template</strong></li>
<li><strong>actions</strong>: 사용자의 입력에 따라 반응할 <strong>methods</strong></li>
</ul>
<br>

<pre><code class="language-js">new Vue({
  // state = &gt; 공유할 데이터
  data() {
    return {
      counter: 0
    };
  },
  // view
  template: `
    &lt;div&gt;{{ counter }}&lt;/div&gt;
  `,
  // actions
  methods: {
    increment() {
      this.counter++;
    }
  }
});</code></pre>
<p>위 구성요소는 아래와 같은 <strong>단방향 흐름</strong>으로 동작한다.</p>
<img src="https://user-images.githubusercontent.com/19389288/92441521-54c39800-f1e9-11ea-9f0c-e5568f9dbbfe.jpg" width="50%">

<br>

<h2 id="🎨-예제-1---간단한-vue-app">🎨 예제 #1 - 간단한 Vue App</h2>
<p>뷰엑스를 알아보기 위해 버튼으로 숫자를 늘리고 줄일 수 있는 카운터 앱을 만들어보자. Vue CLI로 프로젝트를 생성한 다음 아래와 같이 Parent, Child 컴포넌트를 제작한다.</p>
<br>

<h3 id="appvue-parent-component">App.vue (Parent component)</h3>
<pre><code class="language-js">&lt;!-- App.vue(parent) --&gt;
&lt;template&gt;
  &lt;div id=&quot;app&quot;&gt;
    Parent counter : {{ counter }} &lt;br&gt;
    &lt;button @click=&quot;addCounter&quot;&gt;+&lt;/button&gt;
    &lt;button @click=&quot;subCounter&quot;&gt;-&lt;/button&gt;

    &lt;!-- Child 컴포넌트를 등록하고 counter 데이터 속성을 props로 전달한다. --&gt;
    &lt;child v-bind:num=&quot;counter&quot;&gt;&lt;/child&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
// chilc 컴포넌트 import
import Child from &quot;./Child.vue&quot;;

export default {
  components: {
    // child 컴포넌트를 App.vue의 하위 컴포넌트로 등록
    child : Child
  },

// data 등록
  data(){
    return {
      counter: 0
    };
  },
  methods: {
    // 이벤트 추가
    addCounter(){
      this.counter++;
    },
    subCounter(){
      this.counter--;
    }
  }
};
&lt;/script&gt;</code></pre>
<br>

<h3 id="childvue-child-component">Child.vue (Child Component)</h3>
<pre><code class="language-js">&lt;template&gt;
    &lt;div&gt;
        &lt;hr&gt;
        Child counter : {{ num }} &lt;br&gt;
        &lt;button&gt;+&lt;/button&gt;
        &lt;button&gt;-&lt;/button&gt;
    &lt;/div&gt;  

&lt;/template&gt;

&lt;script&gt;
export default {
    // 상위 컴포넌트에서 내려준 counter 속성을 num으로 받음
    props: [&quot;num&quot;]
};
&lt;/script&gt;</code></pre>
<p>하위 컴포넌트인 Child.vue는 App.vue에게서 <strong>props 속성</strong>으로 counter를 받는다.</p>
<p>그래서, 결국은 <strong>App.vue의 +를 누르거나 -를 눌러도 child.vue의 counter도 같은 값을 가지게 된다.</strong></p>
<img src="https://user-images.githubusercontent.com/19389288/92443273-4165fc00-f1ec-11ea-876a-cb6bfc749aac.PNG" width="30%">

<br>

<p>다르게 말해, <strong>같은 데이터 속성을 2개의 컴포넌트에서 접근하여 같은 값을 표현</strong>하고 있다는 것이다. 이 구조는 뷰의 props 속성을 이용한 기본적인 컴포넌트 통신 방법이다.</p>
<ul>
<li>만약 한 화면에서 표시해야 할 컴포넌트의 갯수가 무한정 많아진다면? </li>
<li>최상위 컴포넌트에서 최하위 컴포넌트에 데이터를 전달하기 위해 중간 계층의 컴포넌트에 모두 props, event emit을 선언해야 한다.</li>
</ul>
<br>

<img src="https://user-images.githubusercontent.com/19389288/92443791-f4365a00-f1ec-11ea-8d19-723bc012d36b.jpg" width="75%">

<p>이 비효율적인 컴포넌트 간 데이터 전달 방식을 <strong>Vuex로 해결</strong>할 수 있다!:mask:</p>
<br>

<h2 id="🎨-vuex-예제-2---vuex-설치-및-등록">🎨 Vuex 예제 #2 - Vuex 설치 및 등록</h2>
<ol>
<li><strong>Vuex 설치</strong></li>
</ol>
<pre><code class="language-js">npm install vuex</code></pre>
<br>

<ol start="2">
<li>뷰엑스를 등록할 <code>.js</code> 파일 새로 생성. 이름은 관례에 따라 <code>store.js</code>로 지정</li>
</ol>
<pre><code class="language-js">// store.js
import Vue from &quot;vue&quot;;
import Vuex from &quot;vuex&quot;;

Vue.use(Vuex);

export const store = new Vuex.Store({
  // ...
});</code></pre>
<ol start="3">
<li>프로젝트의 <code>main.js</code> 파일로 가서 <code>store.js</code>를 불러와 <strong>등록</strong>한다.</li>
</ol>
<pre><code class="language-js">import Vue from &quot;vue&quot;;
import App from &quot;./App.vue&quot;;
import router from &quot;./router&quot;;

// store.js를 불러오는 코드
import { store } from &quot;./store.js&quot;;

Vue.config.productionTip = false;

new Vue({

  // 뷰 인스턴스의 store 속성에 연결
  store: store,
  router,
  render: h =&gt; h(App)

}).$mount(&quot;#app&quot;);</code></pre>
<br>

<h2 id="🎨-vuex-예제-3----state-등록">🎨 Vuex 예제 #3 -  state 등록</h2>
<p>state를 vuex에 추가한다.</p>
<pre><code class="language-js">// store.js
import Vue from &quot;vue&quot;;
import Vuex from &quot;vuex&quot;;

Vue.use(Vuex);

export const store = new Vuex.Store({
  // counter 라는 state 속성을 추가
  state: {
    counter: 0
  }
});</code></pre>
<p>state에 정의된 <code>counter</code>속성은 Parent 컴포넌트에서 사용하던 data 속성 <code>counter</code>와 동일한 역할을 합니다. 이미 앞 상태 관리 패턴에서 설명했듯이, <strong>state는 컴포넌트 간에 공유할 data 속성을 의미한다.</strong></p>
<br>

<h2 id="🎨-vuex-예제-4---state-접근">🎨 Vuex 예제 #4 - state 접근</h2>
<p><strong>vuex의 state에 등록한 counter 속성</strong>은 컴포넌트 템플릿 코드에서 <code>$store.state.counter</code>로 <strong>접근</strong>할 수 있다.</p>
<pre><code class="language-js">&lt;!-- App.vue(parent) --&gt;
!&lt;template&gt;
  &lt;div id=&quot;app&quot;&gt;
    Parent counter : {{ $store.state.counter }} &lt;br&gt;
    &lt;button @click=&quot;addCounter&quot;&gt;+&lt;/button&gt;
    &lt;button @click=&quot;subCounter&quot;&gt;-&lt;/button&gt;

  &lt;!-- 기존코드 --&gt;
    &lt;!-- Child 컴포넌트를 등록하고 counter 데이터 속성을 props로 전달한다. --&gt;
   &lt;!-- &lt;child v-bind:num=&quot;counter&quot;&gt;&lt;/child&gt; --&gt;
   &lt;child&gt;&lt;/child&gt; 
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
// chilc 컴포넌트 import
import Child from &quot;./Child.vue&quot;;

export default {
  components: {
    // child 컴포넌트를 App.vue의 하위 컴포넌트로 등록
    child : Child
  },

/* 기존코드
// data 등록
  data(){
    return {
      counter: 0
    };
  }, */
  methods: {
    addCounter(){
      //this.counter++;
      this.$store.state.counter++;
    },
    subCounter(){
      //this.counter--;
      this.$store.state.counter--;
    }
  }
};
&lt;/script&gt;</code></pre>
<p>위 코드는 기존 App.vue 코드와 2가지가 다르다.</p>
<ol>
<li>data 속성으로 선언한 <code>counter</code> 값 제거</li>
<li>Child 컴포넌트로 <code>counter</code>를 전달하지 않음 <strong>(props 사용 x)</strong></li>
</ol>
<br>

<p>결국 Parent 컴포넌트에서 관리하던 <code>counter</code> 데이터를 Vuex의 state에 넘겨줬다.</p>
<p>Child 컴포넌트에서 접근하던 Parent 컴포넌트의 data 속성이 Vuex로 갔기 때문에 <strong>이제 Child에서는 Vuex의 state를 바라보면 된다.</strong></p>
<p>이제 Parent와 Child 모두 state에 접근할 수 있게 된 것. 이외에 모든 컴포넌트는 state에 접근을 할 수 있다. </p>
<p><br><img src="https://user-images.githubusercontent.com/19389288/92446585-fef2ee00-f1f0-11ea-81a2-08d79771c882.jpg" width="70%"></p>
<br>

<p>Vuex를 사용하고 나서도, Parent 컴포넌트의 + 버튼을 눌렀을 때 동일하게 동작하는 것을 볼 수 있다.</p>
<p>동일하게 Child 컴포넌트에도 뷰엑스 적용해보자.</p>
<pre><code class="language-js">!&lt;template&gt;
    &lt;div&gt;
        &lt;hr&gt;
        Child counter : {{ $store.state.counter }} &lt;br&gt;
        &lt;button&gt;+&lt;/button&gt;
        &lt;button&gt;-&lt;/button&gt;
    &lt;/div&gt;  
&lt;/template&gt;

&lt;script&gt;
export default {
    // 상위 컴포넌트에서 내려준 counter 속성을 num으로 받음
    /* 기존 코드
    props: [&quot;num&quot;]
    */
};
&lt;/script&gt;</code></pre>
<p>Parent 컴포넌트에서 props 속성으로 <code>counter</code>를 전달받던 방식에서 <strong>Vuex의 state인 counter를 바로 접근</strong>하는 방식으로 변경했다.</p>
<br>


<hr>

<br>

<p>📕 <strong>REFERENCE</strong>: [캡틴판교] <a href="https://joshua1988.github.io/web-development/vuejs/vuex-start/">https://joshua1988.github.io/web-development/vuejs/vuex-start/</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue.js] Vue.js 시작하기]]></title>
            <link>https://velog.io/@dl_edge/Vue.js-Vue.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dl_edge/Vue.js-Vue.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 27 Sep 2021 14:08:12 GMT</pubDate>
            <description><![CDATA[<h2 id="vuejs-입문을-위한-기초-정리">Vue.js 입문을 위한 기초 정리</h2>
<br>

<h2 id="🔔-vuejs란-무엇인가">🔔 Vue.js란 무엇인가?</h2>
<p><strong>MVVM 패턴</strong>의 ViewModel 레이어에 해당하는 화면단 라이브러리</p>
<br>

<img src="https://user-images.githubusercontent.com/19389288/87671926-17c0c380-c7ad-11ea-82c7-8c40e7bcc22a.PNG">


<h4 id="-장점-">[ 장점 ]</h4>
<ul>
<li><p>데이터 바인딩과 화면 단위를 컴포넌트 형태로 제공하며, 관련 API를 지원하는데에 궁극적인 목적이 있음</p>
</li>
<li><p>View와 Model간 <strong>양방향 바인딩</strong> 가능</p>
</li>
<li><p>하지만 <strong>컴포넌트 간 통신</strong>의 기본 골격은 React의 <strong>단방향 데이터 흐름(부모 -&gt; 자식)</strong>을 사용</p>
</li>
<li><p>가장 적은 러닝커브(문법 이해가 쉽다)</p>
</li>
<li><p>매우 적은 크기(30.67kb min+gzip)</p>
</li>
<li><p><a href="https://kr.vuejs.org/index.html">공식 사이트</a>의 상세한 설명</p>
</li>
<li><p>가장 최근에 릴리즈 시작한 프레임 워크(2014년)</p>
</li>
<li><p><strong>React와 Angular의 장점 적용</strong></p>
</li>
</ul>
<br>



<h2 id="mvvm-패턴">MVVM 패턴</h2>
<p>Backend 로직과 Client의 마크업 &amp; 데이터 표현단을 분리하기 위한 구조로 전통적인 MVC 패턴의 방식과 유사하다. </p>
<p>Frontend단의 <strong>화면 동작 관련 로직</strong>과 Backend단의 <strong>DB 데이터 처리 및 서버 로직을 분리</strong>하고, Backend에서 넘어온 데이터를 <strong>Model에 담아 View로 넘겨주는 중간지점</strong>이다.</p>
<br>

<h2 id="🔔-vuejs-시작">🔔 Vue.js 시작</h2>
<h3 id="설치방법">설치방법</h3>
<ul>
<li><p><code>&lt;script&gt; include</code></p>
<ul>
<li><p>다운로드</p>
</li>
<li><p>CDN </p>
<p><code>&lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;</code></p>
</li>
</ul>
</li>
<li><p>NPM 으로 설치</p>
</li>
<li><p>CLI</p>
</li>
</ul>
<br>

<h3 id="🔔-vue-instance">🔔 Vue Instance</h3>
<p>인스턴스는 Vue.js로 화면을 개발하기 위해 꼭 생성해야 하는 필수 단위이다.</p>
<h4 id="vue-instance-생성자">Vue Instance 생성자</h4>
<pre><code class="language-javascript">new Vue({
    // instance option properties
})</code></pre>
<p>Vue는 객체 생성시 필요한 정보를 함께 넘길 수도 있다.</p>
<pre><code class="language-javascript">{
    key: value
    key: value
        .
        .
        .
}</code></pre>
<p>{}안에 들어가는 내용들이 객체 형식으로 전달된다.</p>
<pre><code class="language-javascript">new Vue({
    template: &quot;&quot;,
    el: &quot;&quot;,
    methods: {}
    // ...
})</code></pre>
<h5 id="vue앱은-vue-함수로-인스턴스를-만드는-것부터-시작한다">Vue앱은 Vue 함수로 인스턴스를 만드는 것부터 시작한다!</h5>
<br>

<h3 id="vuejs-el">Vue.js el</h3>
<p>el: &quot;css 선택자&quot; or HTML Element, Vue가 적용될 요소를 지정한다.</p>
<pre><code class="language-javascript">new Vue({
    el: &quot;#app&quot; 
    // el은 객체 하나당 하나씩만 등록이 가능하기 때문에 문자열로 나타낸다
})</code></pre>
<br>

<h3 id="vuejs-data">Vue.js Data</h3>
<p>Vue에서 사용되는 정보 저장. 형식: 객체나 함수</p>
<pre><code class="language-javascript">new Vue({
    el: &quot;#app&quot;,
    data: {
        msg: &#39;Vue 반가워&#39;
        // 관리할 data가 하나가 아니기 때문에 객체로 나타낸다.
        // 화면과 상호작용을 할 수 있는 data가 된다.
    }
})</code></pre>
<pre><code class="language-html">&lt;div id=&quot;app&quot;&gt;
    &lt;h2&gt;
        {{msg}}  &lt;!-- Interpolation. v-text와 같은 기능 --&gt;
    &lt;/h2&gt;

&lt;/div&gt;</code></pre>
<br>

<h4 id="vuejs-기초문법-1---선언적정적-렌더링1rendering">Vue.js 기초문법 1 - 선언적(정적) 렌더링1(Rendering)</h4>
<pre><code class="language-html">&lt;div id=&quot;app&quot;&gt;
    {{message}}
&lt;/div&gt;
&lt;script&gt;
    var app = new Vue({
        el: &#39;#app&#39;,
        data: {
            message: &#39;안녕하세요! Vue!&#39;
        }
    })
&lt;/script&gt;</code></pre>
<br>

<h3 id="🔔-vuejs-directive-지시문">🔔 Vue.js [Directive 지시문]</h3>
<p>Directive의 종류</p>
<ul>
<li><p><code>v-text</code></p>
<p>: {{}} (Interpolation 보간법)과 똑같이 작용</p>
</li>
<li><p><code>v-html</code></p>
<p>: html형식으로 렌더링</p>
</li>
<li><p><code>v-show</code></p>
<p>: 해당 엘리먼트의 visibility를 결정</p>
</li>
<li><p><code>v-if, v- else, v-else-if</code></p>
<p>: 일반적인 조건문</p>
</li>
<li><p><code>v-pre</code></p>
<p>: 특정 엘리먼트를 무시하는 directive</p>
</li>
<li><p><code>v-cloak</code></p>
<p>: Javascript가 실행되기 전에 즉, Vue.js instance가 제대로 준비되기 전까지 우리의 템플릿을 위한 HTML 코드를 숨기고 싶을 때 사용하는 directive</p>
</li>
<li><p><code>v-once</code></p>
<p>: 초기에 딱 한번만 렌더링</p>
<p>변동이 없고 한결같은 정적인 부분에 사용</p>
</li>
</ul>
<br>

<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;ex1&lt;/title&gt;
    &lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot; v-cloak&gt;
        &lt;h1 v-if=&quot;value &gt; 5&quot;&gt;value가 5보다 크군요&lt;/h1&gt;
        &lt;h1 v-else-if=&quot;value===5&quot;&gt;value가 정확히 5네요&lt;/h1&gt;
        &lt;h1 v-else=&quot;value &gt; 5&quot;&gt;value가 5보다 작아요&lt;/h1&gt;
        &lt;h2&gt; {{ value + 1 }}&lt;/h2&gt;
        &lt;h2 v-once&gt;초기 값: {{value}}&lt;/h2&gt;
        &lt;h2&gt;현재 값: {{value}}&lt;/h2&gt;
        &lt;h1 v-pre&gt;{{ 그대로 렌더링 }}&lt;/h1&gt;
        &lt;h2 v-show = &quot;visible&quot;&gt;{{ visible }} 보이냐&lt;/h2&gt;
    &lt;/div&gt;
    &lt;script&gt;
        var app=new Vue({
            el: &#39;#app&#39;,
            data: {
                name: &quot;&lt;i&gt;italic&lt;/i&gt;&quot;,
                visible: false,
                value: 0
            }
        })
    &lt;/script&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre>
<br>

<ul>
<li><p><code>v-bind</code></p>
<p>: 엘리먼트의 속성값을 바꾸는 데 사용하는 directive</p>
<p>생략이 가능하며 내부에서 JavaScript 코드 사용이 가능하다.</p>
</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Ex2&lt;/title&gt;
    &lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot; v-cloak&gt;
        &lt;h1&gt;Hello, {{name}}&lt;/h1&gt;
        &lt;h2&gt;{{Date()}}&lt;/h2&gt;
        &lt;img :src=&quot;smile ? feelsgood : feelsbad&quot;/&gt;
    &lt;/div&gt;

    &lt;script&gt;
        var app = new Vue({
            el: &quot;#app&quot;,
            data :{
                name: &quot;Vue&quot;,
                smile: true,
                feelsgood: &quot;https://i.cbc.ca/1.4986551.1548087152!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_780/smile-emoji.jpg?&quot;,
feelsbad: &quot;https://i.pinimg.com/originals/4f/49/65/4f4965192fc86eeb8057219075ebc2bd.png&quot;
            }
        })
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br>

<ul>
<li><p><code>v-for</code></p>
<p>: for문이다.</p>
</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Ex3&lt;/title&gt;
    &lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot; v-cloak&gt;
        &lt;h2&gt;To do&lt;/h2&gt;
        &lt;ul&gt;
        &lt;li v-for=&quot;(todo, index) in todos&quot;&gt;{{index}}. {{todo.text}}&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
    &lt;script&gt;
        new Vue({
            el: &quot;#app&quot;,
            data: {
                todos: [
                    {text: &#39;Vue 공부하기&#39;},
                    {text: &#39;Vue 마스터 하기&#39;}
                ]
            }
        })
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li><p><code>v-model</code></p>
<p>: <strong>양방향 데이터 바인딩</strong>을 위한 directive</p>
</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;양방향 바인딩&lt;/title&gt;
    &lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;h1&gt;Hello, {{ name }}&lt;/h1&gt;
        &lt;h3&gt;
            &lt;input type=&quot;checkbox&quot; v-model=&quot;smile&quot;/&gt; smile emoji
        &lt;/h3&gt;
        &lt;img :src=&quot;smile? feelsgood : feelsbad&quot;/&gt;

    &lt;/div&gt;
    &lt;script&gt;
        new Vue({
            el: &quot;#app&quot;,
            data : {
                smile: true,
                feelsgood: &quot;https://i.cbc.ca/1.4986551.1548087152!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_780/smile-emoji.jpg?&quot;,
feelsbad: &quot;https://i.pinimg.com/originals/4f/49/65/4f4965192fc86eeb8057219075ebc2bd.png&quot;
            }
        })

    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<ul>
<li><p><code>v-on</code></p>
<p>: <strong>이벤트를 처리</strong>하기 위한 directive</p>
<p>Vue Object의 methods에 있는 함수 이용</p>
</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Ex5&lt;/title&gt;
    &lt;script src=&quot;https://unpkg.com/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
        &lt;h1&gt;Counter: {{number}}&lt;/h1&gt;
        &lt;button @click=&quot;increment&quot;&gt;increment&lt;/button&gt;
        &lt;button v-on:click=&quot;decrement&quot;&gt;decrement&lt;/button&gt;
    &lt;/div&gt;
    &lt;script&gt;
        new Vue({
            el: &quot;#app&quot;,
            data: {
                number: 0
            },
            // app Vue instance를 위한 methods
            methods: {
                increment: function(){
                    this.number++;
                },
                decrement: function(){
                    this.number--;
                }
            }
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>

<br>

<ul>
<li>참고<ul>
<li><a href="https://geonlee.tistory.com/151">https://geonlee.tistory.com/151</a></li>
<li><a href="https://joshua1988.github.io/web-development/vuejs/vuejs-tutorial-for-beginner/">https://joshua1988.github.io/web-development/vuejs/vuejs-tutorial-for-beginner/</a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 프로세스와 스레드 차이]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 27 Sep 2021 13:54:57 GMT</pubDate>
            <description><![CDATA[<h3 id="프로그램program-이란">프로그램(Program) 이란?</h3>
<p>어떤 작업을 위해 실행할 수 있는 파일</p>
<br>

<h3 id="프로세스process-란">프로세스(Process) 란?</h3>
<ul>
<li><p>사전적 의미</p>
<ul>
<li>컴퓨터에서 연속적으로 <strong>실행되고 있는 컴퓨터 프로그램</strong></li>
<li><strong>메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)</strong></li>
<li>운영체제로부터 시스템 자원을 할당받는 작업의 단위</li>
<li>즉, 동적인 개념으로는 <u>실행된 프로그램을 의미</u>한다.</li>
</ul>
</li>
<li><p>특징</p>
<ul>
<li><p>프로세스는 <strong>각각 독립된 메모리 영역(<code>Code, Data, Stack, Heap</code>의 구조)를 할당</strong>받는다.</p>
</li>
<li><p>기본적으로 프로세스 당 최소 1개의 스레드(메인 스레드)를 가지고 있다.</p>
</li>
<li><p>각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다.</p>
</li>
<li><p>한 프로세스가 다른 프로세스의 자원에 접근하려면 <strong>프로세스 간 통신 (IPC</strong>, inter-process communication)을 사용해야 한다.</p>
<p>ex. 파이프, 파일, 소켓 등을 이용한 통신 방법</p>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="스레드thread-란">스레드(Thread) 란?</h3>
<ul>
<li><p>사전적 의미</p>
<ul>
<li><strong>프로세스 내에서 실행되는 여러 흐름의 단위</strong></li>
<li>프로세스의 특정한 수행 경로</li>
<li>프로세스가 할당받은 자원을 이용하는 실행의 단위</li>
</ul>
</li>
<li><p>특징</p>
<ul>
<li>스레드는 프로세스 내에서 <strong>각각 <code>Stack</code>만 따로 할당</strong>받고, <code>Code, Data, Heap</code> <strong>영역은 공유</strong>한다.</li>
<li>스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.</li>
<li>한 스레드가 프로세스의 자원을 변경하면, 다른 이웃 스레드(Sibling thread) 도 그 변경 결과를 즉시 볼 수 있다.</li>
</ul>
</li>
</ul>
<br>

<h4 id="ie-자바-스레드-java-thread란">ie. 자바 스레드 (Java Thread)란</h4>
<ul>
<li>일반 스레드와 거의 차이가 없으며, JVM이 운영체제의 역할을 한다.</li>
<li>자바에는 프로세스가 존재하지 않고, 자바 스레드는 JVM에 의해 스케쥴되는 실행 단위 코드 블록이다.</li>
<li>아래와 같은 스레드와 관련된 많은 정보들도 JVM이 관리한다.<ul>
<li>스레드가 몇개 존재하는가?</li>
<li>스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인가?</li>
<li>스레드 우선순위는 무엇인가?</li>
</ul>
</li>
<li>즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청만 하면 된다.</li>
</ul>
<br>











]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] OSI 7계층]]></title>
            <link>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-OSI-7%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@dl_edge/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-OSI-7%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Mon, 27 Sep 2021 13:49:29 GMT</pubDate>
            <description><![CDATA[<h3 id="7계층은-왜-나눌까">7계층은 왜 나눌까?</h3>
<p>통신이 일어나는 과정을 단계별로 알 수 있고, 특정한 곳에 이상이 생기면 그 단계만 수정할 수 있기 때문이다.</p>
<br>

<h2 id="1-물리physical">1) 물리(Physical)</h2>
<p>단지 데이터를 전기적인 신호(0,1)로 변환해서 주고 받는 기능을 진행하는 공간이다.</p>
<p>즉, <strong>데이터를 전송하는 역할</strong>만 수행한다.</p>
<pre><code>ex) Repeaters, Hubs, Wireless</code></pre><br>

<h2 id="2-데이터-링크data-link">2) 데이터 링크(Data Link)</h2>
<p>물리 계층으로 송수신되는 정보를 관리하여 <strong>안전하게 전달되도록 도와주는 역할</strong></p>
<p>Mac 주소를 통해 통신한다. 프레임(Frame)에 Mac 주소를 부여하고 <strong>에러검출, 재전송, 흐름제어</strong>를 수행한다.</p>
<pre><code>ex) Bridges, Switch</code></pre><br>

<h2 id="3-네트워크network">3) 네트워크(Network)</h2>
<p>데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당한다.</p>
<p>라우터(Router)를 통해 이동할 경로를 선택하여 IP주소를 지정하고, 해당 경로에 따라 패킷을 전달해 준다.</p>
<p>라우팅, 흐름 제어, 오류 제어, 세그멘테이션 등을 수행한다.</p>
<pre><code>ex) Router, IP</code></pre><br>

<h2 id="4-전송transport">4) 전송(Transport)</h2>
<p>TCP와 UDP 프로토콜을 통해 통신을 활성화한다. 포트(port)를 열어두고, 프로그램들이 전송을 할 수 있도록 제공해준다.</p>
<blockquote>
<ul>
<li>TCP: 신뢰성, 연결지향적</li>
<li>UDP: 비신뢰성, 비연결성, 실시간</li>
</ul>
</blockquote>
<br>

<h2 id="5-세션session">5) 세션(Session)</h2>
<p>데이터가 통신하기 위한 논리적 연결을 담당한다. TCP/IP 세션을 만들고 없애는 책임을 지닌다.</p>
<pre><code>ex) API, Socket</code></pre><br>

<h2 id="6-표현presentation">6) 표현(Presentation)</h2>
<p>데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당한다.</p>
<p>파일 인토딩, 명령어를 포장, 압축, 암호화한다.</p>
<pre><code>ex) JPEG, MPEG 등</code></pre><br>

<h2 id="7-응용application">7) 응용(Application)</h2>
<p>최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.</p>
<p>사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공한다.</p>
<pre><code>HTTP, FTP, DNS 등</code></pre><br>]]></description>
        </item>
    </channel>
</rss>