<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>string_0.log</title>
        <link>https://velog.io/</link>
        <description>원인을 파악하자</description>
        <lastBuildDate>Tue, 08 Aug 2023 05:25:17 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. string_0.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/string_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[6. vue-router 파헤치기 - RouteRecordRaw 에 관하여]]></title>
            <link>https://velog.io/@string_0/6.-RouteRecordRaw-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@string_0/6.-RouteRecordRaw-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Tue, 08 Aug 2023 05:25:17 GMT</pubDate>
            <description><![CDATA[<p>route.ts 에서 </p>
<pre><code>import type { RouteRecordRaw } from &quot;vue-router&quot;;
export const route: RouteRecordRaw[] = [{}]</code></pre><p>형태로 경로 구조가 짜여진다는 것을 앞서 설명한적이 있다.</p>
<p>이것을 조금 상세히 파고들려고 한다.</p>
<p>타입스크립트에서는 변수의 타입을 지정한다.
그러니까 route라는 변수는 RouteRecordRaw[] 의 형식을 지니고 있다는 것을 의미한다.</p>
<p>RouteRecordRaw는 그럼 무엇일까?</p>
<p>앞서 npm i vue-router라는 명령어로 설치되어 node-modules라는 폴더에 들어있는 vue-router가 가지고 있는 타입이다.</p>
<p>RouteRecordRaw의 기본 형태는 다음과 같다.
redirect 같은 값도 있지만, 그런것을 상세히 다루려면 원문참조</p>
<pre><code>  {
    path: &quot;/&quot;,
    name: &quot;&quot;,
    meta: {},
    component: () =&gt; import(&quot;&quot;),
    children: [
    ]
  }
</code></pre><p>1depth의 경로는 설명하기에 적합하진 않으므로 확장하여 3depth의 경로를 예시로 들겠다.</p>
<br>

<br>

<br>

<br>

<br>


<h3 id="routerroutets">router/route.ts</h3>
<pre><code>import type { RouteRecordRaw } from &quot;vue-router&quot;;
export const route: RouteRecordRaw[] = [
  {
    path: &quot;/error&quot;,
    name: &quot;error&quot;,
    meta: {},
    component: () =&gt; import(&quot;@/views/layouts/EmptyLayout.vue&quot;),
    children: [
      {
        path: &quot;notFound&quot;,
        name: &quot;notFound&quot;,
        meta: {},
        component: () =&gt; import(&quot;@/views/contents/error/404.vue&quot;)
      }
    ]
  },
  {
    path: &quot;/:pathMatch(.*)*&quot;,
    redirect: &quot;/error/notFound&quot;
  },
  {
    path: &quot;/&quot;
    name: &quot;&quot;,
    meta: {},
    component: () =&gt; import(&quot;@/views/layouts/CommonLayout.vue&quot;),
    children: [
      {
        path: &quot;&quot;,
        name: &quot;home&quot;,
        meta: {},
        component: () =&gt; import(&quot;@/views/home/Main.vue&quot;),
      },
      {
        path: &quot;/&quot;,
        name: &quot;snb&quot;,
        meta: {},
        component: () =&gt; import(&quot;@/views/layouts/CommonSnb.vue&quot;),
        children: [
          {
            path: &quot;article&quot;,
            name: &quot;article&quot;,
            meta: {},
            children: [
              {
                path: &quot;main/:page&quot;,
                name: &quot;ArticleMain&quot;,
                meta: {},
                component: () =&gt; import(&quot;@/views/contents/article/ArticleMain.vue&quot;)
              },
              {
                path: &quot;view/:id&quot;,
                name: &quot;ArticleView&quot;,
                meta: {},
                component: () =&gt; import(&quot;@/views/contents/article/ArticleView.vue&quot;)
              },
            ]
          }
        ]
      }
    ]
  }
]</code></pre><br>

<br>


<p>간단한 경로를 만들어 보았다.</p>
<p>해당 route.ts 파일은 &#39;/&#39;, &#39;/article/main/:page&#39;, &#39;/article/view/:id&#39; 를 가지는 3depth 구조이다.</p>
<br>

<br>

<br>



<p>RouteRecordRaw 는 children에 RouteRecordRaw 배열을 가지며, 이들이 순차적으로 쌓여 나간다.</p>
<p>예를 들어
/article/main/:page 를 접근한다고 가정하자.</p>
<p>먼저 라우터는 path: &quot;/&quot;, 그리고 path: &quot;/&quot;, path: &quot;article&quot;를 거쳐 path: &quot;main/:page&quot;에 도달한다.
화면은 이렇게 오는 과정에 있었던 component들이 쌓여 만들어진다.</p>
<br>

<br>



<p>path: &quot;article&quot; 는 component가 없으므로 /article/main/:page는 </p>
<p>&quot;@/views/layouts/CommonLayout.vue&quot;
&quot;@/views/layouts/CommonSnb.vue&quot;
&quot;@/views/contents/article/ArticleMain.vue&quot;</p>
<p>이 한 화면을 이루게 될 것이다.</p>
<br>

<br>

<br>


<pre><code>  {
    path: &quot;/:pathMatch(.*)*&quot;,
    redirect: &quot;/error/notFound&quot;
  },</code></pre><p>이 부분은 routes.ts에 없는 경로로 접근했을 경우 redirect </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[5 . Index.ts로 관리]]></title>
            <link>https://velog.io/@string_0/5.-Vue</link>
            <guid>https://velog.io/@string_0/5.-Vue</guid>
            <pubDate>Tue, 08 Aug 2023 04:40:30 GMT</pubDate>
            <description><![CDATA[<p>stores/index.ts
stores/counter.ts
stores/user.ts
stores/loader.ts
....</p>
<p>가 있다고 가정하자</p>
<p>이때, index.ts에서 나머지들을 관리할 수 있다.</p>
<h3 id="storesindexts">stores/index.ts</h3>
<pre><code>import { useUserStore } from &quot;@/stores/user&quot;;
import { useLoaderStore } from &quot;@/stores/loader&quot;;
import { useSnbStore } from &quot;@/stores/counter&quot;;
....

export const stores = {
  useUserStore,
  useSnbStore,
  useLoaderStore....
};


</code></pre><p>이것이 Vue에서 참조되는 것은 이렇게 쓰인다.</p>
<h3 id="testvue">test.vue</h3>
<pre><code>import { stores } from &quot;@/stores&quot;;
const snbStore = stores.useSnbStore();</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[4. Vue 상태관리]]></title>
            <link>https://velog.io/@string_0/4.-Vue-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@string_0/4.-Vue-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Fri, 04 Aug 2023 07:55:10 GMT</pubDate>
            <description><![CDATA[<p>react든 vue든 상태관리를 한다. 
vue에서 vuex가 메이저한편이긴 한데 vue3로 넘어와서는 pinia가 각광받는다.</p>
<p>여기서는 pinia를 차용해서 설명하겠다. vuex도 근데 크게 다르지 않는다.</p>
<p>나는 route든 store든 index.ts를 두고 그 index.ts가 다른 여러개의 pinia, route 따위등을 참조하는것을 선호한다. 
코드가 너무 길어지게되면 눈에 들어오지 않고, 기능별로 분류가 되어있는 편이 오류를 수정하기에도 적합하기 때문이다.</p>
<p>store는 일반적으로 페이지가 변경되어도 같은 싱글페이지안에서는 상태가 유지된다.</p>
<p>그래서 유저 로그인 정보나 권한 정보 로딩 언어설정따위를 저장해두곤한다.</p>
<pre><code>import { defineStore } from &quot;pinia&quot;;

export const useCustomStore = defineStore(&quot;custom&quot;,
  state: () =&gt; {
    return {
      isData: false,
      data: null as Data | null,
    };
  },
    actions: {
    customActionSet(data:Data) {
      this.$state.isData = true;
      this.$state.data = data;

    },
    customActionDel() {
      this.$state.isData = false;
      this.$state.data = data;
    }
  },
    persist: {
    // storage: localStorage
    storage: sessionStorage
  }
}</code></pre><p>*Data는 타입으로 다른 타입형식을 차용해도 동작 
이런 형식이다~~ 라는 것</p>
<p>persist는 영속 위치를 정하는 걸로 로컬/세션에 저장하겠다~~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3. Vue 커스텀 플러그인]]></title>
            <link>https://velog.io/@string_0/3.-Vue-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8</link>
            <guid>https://velog.io/@string_0/3.-Vue-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8</guid>
            <pubDate>Fri, 04 Aug 2023 07:27:01 GMT</pubDate>
            <description><![CDATA[<p>vue 전역에서 사용가능한 플러그인을 만들자.
굳이 따지자면 전역함수 느낌이다.</p>
<h3 id="componentspluginscustomplugints">/components/plugins/CustomPlugin.ts</h3>
<pre><code>import type { App, Plugin } from &quot;vue&quot;;

export const CustomPlugin: Plugin = {
    install: (app: App) =&gt; {
        app.config.globalProperties.$myFunction = (value:String) =&gt; {

        return value;
        }
    }
}</code></pre><p>커스텀 플러그인은 main에서 Vue.use를 사용해 추가할 수 있다.</p>
<h3 id="maints">main.ts</h3>
<pre><code>import { createApp } from &quot;vue&quot;;
import App from &quot;./App.vue&quot;;

import router from &quot;./router&quot;; //앞선 1번의 라우터
import { CustomPlugin } from &quot;@/components/plugins/CustomPlugin&quot;;

const app = createApp(App);

import &quot;vuetify/styles&quot;;
import { createVuetify } from &quot;vuetify&quot;;
import * as components from &quot;vuetify/components&quot;;
import * as directives from &quot;vuetify/directives&quot;;

app
  .use(CustomPlugin)
  .use(vuetify)
  .use(router)
  .mount(&quot;#app&quot;);
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[2. vue.use ?]]></title>
            <link>https://velog.io/@string_0/2.-vue.use</link>
            <guid>https://velog.io/@string_0/2.-vue.use</guid>
            <pubDate>Fri, 04 Aug 2023 07:20:47 GMT</pubDate>
            <description><![CDATA[<h2 id="vueuse">Vue.use</h2>
<p>react랑 비슷하게 vue는 npm i 로 다른 사용자들이 만들어둔 모듈을 받아 사용할 수 있다. 그걸 사용하는 방식이 .use()이다.</p>
<p>index.html로 들어가고</p>
<h4 id="indexhtml">index.html</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;link rel=&quot;icon&quot; href=&quot;/favicon.png&quot;&gt;
    &lt;title&gt;Title&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;module&quot; src=&quot;./src/main.ts&quot;&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p><br/><br/><br/><br/></p>
<h4 id="maints">main.ts</h4>
<p>뭐 html은 다 일겠지만 app 위치에 main.ts가 들어간다.</p>
<pre><code>import { createApp } from &quot;vue&quot;;
import App from &quot;./App.vue&quot;;

import router from &quot;./router&quot;; //앞선 1번의 라우터

const app = createApp(App);

import &quot;vuetify/styles&quot;;
import { createVuetify } from &quot;vuetify&quot;;
import * as components from &quot;vuetify/components&quot;;
import * as directives from &quot;vuetify/directives&quot;;

app
  .use(vuetify)
  .use(router)
  .mount(&quot;#app&quot;);</code></pre><p>vuetify만 넣었다.
&#39;#app&#39; 그러니까 &lt;div id=&quot;app&quot;&gt; 저 위치에 마운트 된 App.vue가 들어간다.</p>
<br/>
<br/>
<br/>

<h4 id="appvue가">App.vue가</h4>
<pre><code>&lt;script setup lang=&quot;ts&quot;&gt;
import { RouterView } from &quot;vue-router&quot;;
&lt;/script&gt;

&lt;template&gt;
  &lt;RouterView /&gt;
&lt;/template&gt;
</code></pre><p>  이렇게 기초 구조가 잡힌다.
  이제 RouterView에 앞선 router/index.ts 의 route에 따라 경로가 잡힐것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. vue Router 디자인]]></title>
            <link>https://velog.io/@string_0/1.-vue-Router-%EB%94%94%EC%9E%90%EC%9D%B8</link>
            <guid>https://velog.io/@string_0/1.-vue-Router-%EB%94%94%EC%9E%90%EC%9D%B8</guid>
            <pubDate>Fri, 04 Aug 2023 07:04:59 GMT</pubDate>
            <description><![CDATA[<p>이러한 방식이 정답이라는 것은 아니지만 내가 프로젝트를 진행하며 vue 프로젝트의 라우터 구조를 짰던 방식에 대하여 기술한다.</p>
<br/>
<br/>
<br/>

<h3 id="-vite-vue3-타입스크립트-환경임">* vite, vue3, 타입스크립트 환경임</h3>
<p>vue에는 vue-router라는 일반적으로 프론트 라우트를 관리하는 모듈을 사용한다.</p>
<pre><code>node.js 깔고 cmd에서 npm i vue-router</code></pre><br/>
<br/>
<br/>

<h4 id="먼저-라우터의-경로-만을-저장하는-라우트-routets-파일을-만든다">먼저 라우터의 &#39;경로&#39; 만을 저장하는 라우트 route.ts 파일을 만든다.</h4>
<h4 id="routerroutets">router/route.ts</h4>
<pre><code>import type { RouteRecordRaw } from &quot;vue-router&quot;;

export const route: RouteRecordRaw[] = [{}]
</code></pre><blockquote>
<p><em>얘가 route 라는 이름으로 경로를 던져줄것이다.</em></p>
</blockquote>
<br/>
<br/>


<h4 id="그-경로를-가져다-쓰는-라우터를-생성한다">그 경로를 가져다 쓰는 라우터를 생성한다.</h4>
<p>createRouter =&gt; 라우터를 만듦
createWebHistory =&gt; 
import.meta.env.BASE_URL =&gt; vite 루트경로</p>
<h4 id="routerindexts">router/index.ts</h4>
<pre><code>import { createRouter, createWebHistory } from &quot;vue-router&quot;;
import { route } from &quot;@/router/routes&quot;;

const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL);
    routes: route
});</code></pre><h3 id="-왜-나눴음">* 왜 나눴음?</h3>
<p>이렇게 route와 router를 나누는 이유는 토이프로젝트가 아닌 
실질적인 프로젝트에서는 route가 너무 길다. </p>
<p>그래서 경로는 route.ts에서 관리.
라우트 접근 전/후에 일어나는 이벤트들은 index.ts에서 관리하려고 분할하는 것이다.
ex) 라우트 접근전 로그인 여부, 권한 확인 etc..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue 빠르게 훑기]]></title>
            <link>https://velog.io/@string_0/Vue-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%9B%91%EA%B8%B0</link>
            <guid>https://velog.io/@string_0/Vue-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%9B%91%EA%B8%B0</guid>
            <pubDate>Thu, 02 Mar 2023 01:18:46 GMT</pubDate>
            <description><![CDATA[<p>Differ between Vue2 and Vue3</p>
<blockquote>
<pre><code>1. Vue3에서는 다중루트노드 지원
2. Vue3에서는 Emit 정의 지원</code></pre></blockquote>
<p>web-app : </p>
<blockquote>
<pre><code>Means Single Page Application Vue, React, Angular etc..</code></pre></blockquote>
<p>Vue instance&#39;s Life Cycle:</p>
<blockquote>
<p>   beforeCreate : 가장 처음, data, methods 선언 전, DOM 접근 불가
    created : data methods 정의, 접근 가능, DOM 접근불가(template 속성)
    beforeMount : 인스턴스 부착 전
    mounted : 인스턴스 부착 후, template속성에서 정의한 DOM 접근 가능
    beforeUpdate : 데이터 변경 후 리렌더링 전, 데이터 변경 가능
    updated : 데이터 변경 후 리렌더링, 화면제어, 데이터 변경시 무한루프주의, DOM 로직 추천
    beforeDestroy : 인스턴스 파괴 전, 뷰의 데이터 삭제
    destroyed : 인스턴스 파괴 후</p>
</blockquote>
<p>Component : </p>
<blockquote>
<p>   Like React, Split page as Component</p>
</blockquote>
<p>Router : </p>
<blockquote>
<p>   Like React, Path control</p>
</blockquote>
<p>Event Bus (not recommend), Vuex (Recommend) : </p>
<blockquote>
<p>   State Management in Vue like Redux or Recoil in React</p>
</blockquote>
<p>HyperText Transfer Protocol : </p>
<blockquote>
<p>   HTTP recommended using axios lib</p>
</blockquote>
<p>Directive : </p>
<blockquote>
<p>   v-if(영역차지안함)
    v-for(반복처리)
    v-show(영역차지)
    v-bind(데이터바인딩)
    v-on(이벤트처리)
    v-model(데이터처리) </p>
</blockquote>
<p>Additional attribute:</p>
<blockquote>
</blockquote>
<pre><code>computed:
    data 값의 변경에 따른 재연산
methods: 
    호출시 연산
watch:
    data 변경시 비동기처리</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Spring MVC Layered Architecture]]></title>
            <link>https://velog.io/@string_0/Spring-MVC-Layered-Architecture</link>
            <guid>https://velog.io/@string_0/Spring-MVC-Layered-Architecture</guid>
            <pubDate>Fri, 30 Dec 2022 23:20:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/string_0/post/3adeb094-6b35-43db-a367-24be3fbb50c6/image.png" alt="">
출처 : <a href="https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html">https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html</a></p>
<p><img src="https://velog.velcdn.com/images/string_0/post/795566f6-62fd-4bf4-8945-6524e67e41ac/image.png" alt="">
출처 : <a href="https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html">https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html</a></p>
<p>Presentation Layer - controller package
Business Logic Layer - service package
Data Access Layer - repository package</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[농심 엔디에스 NDS 코테 후기]]></title>
            <link>https://velog.io/@string_0/%EB%86%8D%EC%8B%AC-%EC%97%94%EB%94%94%EC%97%90%EC%8A%A4-NDS-%EC%BD%94%ED%85%8C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@string_0/%EB%86%8D%EC%8B%AC-%EC%97%94%EB%94%94%EC%97%90%EC%8A%A4-NDS-%EC%BD%94%ED%85%8C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sat, 24 Dec 2022 00:42:33 GMT</pubDate>
            <description><![CDATA[<p>느닷없이 인성평가때 신뢰도 경고가 떠서 불안한 마음을 가지고 시작...</p>
<h3 id="문제">문제</h3>
<blockquote>
<p>1번 문제 - 괄호 여닫기 문제류.</p>
</blockquote>
<blockquote>
<p>2번 문제 - dfs, bfs문제 dfs로 풀었다.</p>
</blockquote>
<blockquote>
<p>3번 문제 - 제한된 가중치가 주어질때 가중치 순환큐에서 원소 갯수 최대문제? 
그냥 테케는 통과했는데 히든테케 30%정도를 통과못했다.. 
예외처리에서 실수한듯 싶은데 결국 못찾았다. ;ㅁ;</p>
</blockquote>
<blockquote>
<p>4번 문제 - SQL 기본문제, SELECT SUM AS FROM WHERE LIKE &quot;~%&quot; 정도</p>
</blockquote>
<p>3번 문제 한 한시간을 헤맸는데 결국 히든테케 에러를 잡지 못하고..</p>
<p>난이도는 쉬운편이었다. 백준 실버정도라고 생각한다.</p>
<p>제발 인성평가..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[와 정처기합격!]]></title>
            <link>https://velog.io/@string_0/%EC%99%80-%EC%A0%95%EC%B2%98%EA%B8%B0%ED%95%A9%EA%B2%A9</link>
            <guid>https://velog.io/@string_0/%EC%99%80-%EC%A0%95%EC%B2%98%EA%B8%B0%ED%95%A9%EA%B2%A9</guid>
            <pubDate>Tue, 29 Nov 2022 02:37:17 GMT</pubDate>
            <description><![CDATA[<p>다행히? 실기 2트에 붙었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 기본구조 뜯어보기 2]]></title>
            <link>https://velog.io/@string_0/React-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0-2</link>
            <guid>https://velog.io/@string_0/React-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0-2</guid>
            <pubDate>Tue, 22 Nov 2022 08:55:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/string_0/post/6ba6c2ad-3b14-405b-8bfb-6dc94b51d226/image.png" alt=""></p>
<h2 id="src">src</h2>
<p><img src="https://velog.velcdn.com/images/string_0/post/62d70dbd-274b-4562-80b2-b1828ded47f7/image.png" alt=""></p>
<p>css는 디자인 적인 부분이니 차치하고, 핵심 기능 역할을 수행하는 js를 위주로 살피자.</p>
<h3 id="들어가기-앞서-js-jsx">들어가기 앞서.. (JS? JSX?)</h3>
<p><br><br></p>
<p>일단 들어가기 앞서, create-react-app으로 자동 생성된 이 리액트는 확장자명 js 파일을 사용한다.
<br><br></p>
<p>하지만 조금만 구글링을해서 git 등에서 다른 사람들의 리액트 프로젝트를 보면 js(자바스크립트) 확장자 대신 jsx(자바스크립트 확장, eXtension)를 사용하는 경우를 심심치 않게 볼 수있다.
<br><br></p>
<p>그래서 js대신 jsx를 쓰는 리액트 프로젝트는 무엇인가에 대해 궁금함을 가질 수도 있다고 생각한다.
<br><br></p>
<p>여기 그 궁금증을 해결해 줄 오랜 친구 스택 오버 플로우를 살펴보자.
<br><br></p>
<p>링크 : 
<a href="https://stackoverflow.com/questions/46169472/reactjs-js-vs-jsx">JS vs JSX</a></p>
<p>jsx는 js와 확장자로서의 차이점은 없으나 
jsx가 표준 자바스크립트 문법이 아니므로 호환성 등을 고려해야 하는 논쟁이 있을 수 있고, 그냥 <strong>취향차이</strong> 에 가깝다.</p>
<br>

<p><em>다만, jsx는 표현식을 포함할 수 있는 강력한 객체를 제공함으써, 확실히 렌더링시 사용자의 편의를 줄 수 있다.</em></p>
<br>

<p>요약하면, </p>
<pre><code>1. js와 jsx의 확장자역할의 차이는 없고,
2. jsx는 js에 비해 강력한 객체를 확장해 지원하지만, 
3. 논쟁이 있을 수 있고, 취향차이에 가깝다는 것이다.</code></pre><br>
혹시 몰라 더 알아보고 싶은 사람을 위한, 
React 공식 홈페이지 jsx 소개 페이지 링크는 남겨 두겠다.

<br>

<p><a href="https://ko.reactjs.org/docs/introducing-jsx.html">JSX 소개</a></p>
<br>

<h3 id="appjs">App.js</h3>
<pre><code>import logo from &#39;./logo.svg&#39;;
import &#39;./App.css&#39;;

function App() {
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;header className=&quot;App-header&quot;&gt;
        &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;
        &lt;p&gt;
          Edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.
        &lt;/p&gt;
        &lt;a
          className=&quot;App-link&quot;
          href=&quot;https://reactjs.org&quot;
          target=&quot;_blank&quot;
          rel=&quot;noopener noreferrer&quot;
        &gt;
          Learn React
        &lt;/a&gt;
      &lt;/header&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><p><br><br></p>
<p>자 본론으로 돌아와서 App.js를 보자. html문법에 해당하는 return이하를 날리고 js 구조만을 생각해 보도록 하자.</p>
<p><br><br></p>
<h4 id="appjs-1">App.js</h4>
<pre><code>import logo from &#39;./logo.svg&#39;;
import &#39;./App.css&#39;;

function App() {
  return ( //...중략...
  );

 export default App;
}
</code></pre><br>

<p>얼마 안되니 순차적으로 살펴보겠다.</p>
<br>

<p><strong>import logo from &#39;./logo.svg&#39;;</strong></p>
<pre><code> App.js 파일이 위치한 폴더와 같은 폴더에 있는 logo.svg 파일을 
 logo라는 이름으로 이 App.js파일에 import해 사용하겠다.</code></pre><p><strong>import &#39;./App.css&#39;;</strong></p>
<pre><code>App.js 파일이 위치한 폴더와 같은 폴더에 있는 App.css 파일을 사용하겠다.</code></pre><p><strong>function App() { return ( //...중략... ) };</strong></p>
<pre><code>return 부 안쪽을 리턴하는 함수 App을 정의하겠다.</code></pre><p><strong>export default App;</strong></p>
<pre><code>함수 App을 default export 형태로 내보내겠다.</code></pre><p>여기서 가장 마지막 <strong>export default App</strong>에 집중해 보도록 하겠다.</p>
<p>java스크립트에서 export, 즉 내보내는 방법은 2가지가 있다.</p>
<br>
<br>
<br>
<br>

<p><em><strong>1. default export</strong></em></p>
<p>하나는 지금 이 default export다.</p>
<p><strong>export default class User {...}</strong> 의 형태로 export하고</p>
<p><strong>import User from ...</strong> 의 형태로 import한다.</p>
<p>여기서 default의 특장점은 </p>
<ol>
<li>한 js 파일에서 default export 는 유일하며 ,</li>
<li>import 받는 측에서 해당 명칭을 자유로이 수정하여 사용할 수 있다.</li>
</ol>
<p><br><br><br></p>
<p>한 js 파일에서 default export가 유일하다는 예시를 들면</p>
<h4 id="appjs-2">App.js</h4>
<pre><code>import logo from &#39;./logo.svg&#39;;
import &#39;./App.css&#39;;

function App() {
  return ( //...중략...
  );
}

function Test() {
  return ( //...중략...
  );
}
export default App;
export default Test;
</code></pre><p>이러면 export default Test에 빨간줄이 그어지는 것을 확인 할 수 있다.</p>
<p>import 받는 측에서 수정 가능하다는 예시를 들면</p>
<h4 id="indexjs">index.js</h4>
<pre><code>import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom/client&#39;;
import &#39;./index.css&#39;;
import Bpp from &#39;./App&#39;;
import reportWebVitals from &#39;./reportWebVitals&#39;;

const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(
  &lt;React.StrictMode&gt;
    &lt;Bpp /&gt;
  &lt;/React.StrictMode&gt;
);
</code></pre><p>실제로 App.js의 함수명은 App이지만 여기서는 Bpp로 명명해서 사용 가능한 것을 볼 수 있다.</p>
<br>
<br>
<br>
<br>


<p><em><strong>2. named export</strong></em>    </p>
<p>named export는 말그대로 이름이 있는 export이다.
해당 클래스, 컴포넌트, 펑션을 <em><strong>해당 이름 그대로 외부에 가져다 쓰겠다.</strong></em> 는 의미이다.</p>
<p><strong>export class User {...}</strong> 형태로 export 하고
<strong>import {User} from ...</strong>  형태로 import 한다.</p>
<p>상기된 App.js파일은 default export 형태로 작성되어 았으며
이렇게 class가 아닌 함수형 컴포넌트에서도 적용가능함을 인지하고,
named export 형태로 바꾼다면</p>
<h4 id="appjs-3">App.js</h4>
<pre><code>import logo from &#39;./logo.svg&#39;;
import &#39;./App.css&#39;;

export function App() { //여기에 export를 달아주어
  return ( //...중략...
  );
}

export function Bpp() { //여기에 export를 달아주어
  return ( //...중략...
  );
}


//여기서 export를 지우고
</code></pre><p>default 와는 달리 여러개의 함수를 export 할 수 있다.</p>
<h4 id="indexjs-1">index.js</h4>
<pre><code>import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom/client&#39;;
import &#39;./index.css&#39;;
import { App, Bpp } from &#39;./App&#39;;
import reportWebVitals from &#39;./reportWebVitals&#39;;

const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(
  &lt;React.StrictMode&gt;
    &lt;App /&gt;
    &lt;Bpp /&gt;
  &lt;/React.StrictMode&gt;
);</code></pre><p>이처럼 중괄호를 사용하여 App.js의 export function App에 접근 가능하다.</p>
<h3 id="indexjs-2">index.js</h3>
<pre><code>import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom/client&#39;;
import &#39;./index.css&#39;;
import App from &#39;./App&#39;;
import reportWebVitals from &#39;./reportWebVitals&#39;;

const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(
  &lt;React.StrictMode&gt;
    &lt;App /&gt;
  &lt;/React.StrictMode&gt;
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();</code></pre><p><strong>import App from &#39;./App&#39;;</strong></p>
<p>import =&gt;</p>
<p><strong>const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));</strong></p>
<p>document.getElementById(&#39;root&#39;)가 저번 public 폴더의 index.html의 id=&quot;root&quot;엘리먼트를 찾고 해당 엘리먼트를 루트라고 한다.</p>
<h3 id="indexhtml">index.html</h3>
<p><img src="https://velog.velcdn.com/images/string_0/post/e76553ef-1b2e-46c4-a4cc-2393631e59ab/image.png" alt=""></p>
<p><em>이 위치</em></p>
<p><strong>root.render(&lt;React.StrictMode&gt;<code>&lt;App /&gt;</code>&lt;/React.StrictMode&gt;)</strong></p>
<p>이번엔 index.js를 살피도록하자.</p>
<p>이것은 root에서 임포트한 App.js를 실행한다.
특히, React.StrictMode는 자바스크립트의 엄격모드와 같이 이하의 자식 컴포넌트에서 문법에 맞지않거나 맞지않을 우려가 있거나 지원 종료된 함수의 호출 등을 검사하는 기능을 수행한다.(빼도 된다)</p>
<p>reportWebVitals는 앱의 퍼포먼스 시간을 제공하는데 실행 플로우 이해상 그다지 중요하지는 않아 생략한다.</p>
<h2 id="gitignore">.gitignore</h2>
<p>프로젝트를 git에서 작업할 때, git에 push시 푸쉬하지 않는 영역을 지정한다.</p>
<pre><code># See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
</code></pre><p>git에 푸쉬할 때 
/node_modules 폴더를 제외한다, /.pnp를 제외한다....
이런 의미다.</p>
<p>여기엔 git에 올리기 민감한 정보, private_key, DB접근 url id pw 등등을 답은 .env 파일을 포함할 수 있으며</p>
<p>node npm 사용자로써 의식해야 하는 것은 </p>
<p>/node_modules를 제하고 푸쉬하므로 git에서 clone 받아 실행할 때, <strong>node_modules는 포함되어 있지 않기 때문에</strong> npm i를 수행해서 필요한 디펜던시 모듈들을 설치 하고, npm start를 해야한다.</p>
<h2 id="packagejson">package.json</h2>
<pre><code>{
  &quot;name&quot;: &quot;project_name&quot;,
  &quot;version&quot;: &quot;0.1.0&quot;,
  &quot;private&quot;: true,
  &quot;dependencies&quot;: {
    &quot;@testing-library/jest-dom&quot;: &quot;^5.16.5&quot;,
    &quot;@testing-library/react&quot;: &quot;^13.4.0&quot;,
    &quot;@testing-library/user-event&quot;: &quot;^13.5.0&quot;,
    &quot;react&quot;: &quot;^18.2.0&quot;,
    &quot;react-dom&quot;: &quot;^18.2.0&quot;,
    &quot;react-scripts&quot;: &quot;5.0.1&quot;,
    &quot;web-vitals&quot;: &quot;^2.1.4&quot;
  },
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;react-scripts start&quot;,
    &quot;build&quot;: &quot;react-scripts build&quot;,
    &quot;test&quot;: &quot;react-scripts test&quot;,
    &quot;eject&quot;: &quot;react-scripts eject&quot;
  },
  &quot;eslintConfig&quot;: {
    &quot;extends&quot;: [
      &quot;react-app&quot;,
      &quot;react-app/jest&quot;
    ]
  },
  &quot;browserslist&quot;: {
    &quot;production&quot;: [
      &quot;&gt;0.2%&quot;,
      &quot;not dead&quot;,
      &quot;not op_mini all&quot;
    ],
    &quot;development&quot;: [
      &quot;last 1 chrome version&quot;,
      &quot;last 1 firefox version&quot;,
      &quot;last 1 safari version&quot;
    ]
  }
}
</code></pre><p>dependencies를 위주로 보면 된다.
프로젝트를 진행 하다 보면 npm i [모듈명] 으로 외부 모듈을 가져다 쓰는 경우가 있을 텐데 해당 모듈들은 전부 이 dependencies에 명시된다. clone 받은 뒤에 비어있는 node_modules를 채우는 것도 이 파일을 중심으로 해결된다.</p>
<p>lock은 의존성 트리를 포함해서 저장하는데 여기는 크게 건드릴 게 없다. 알고만 있자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 기본 구조 뜯어보기]]></title>
            <link>https://velog.io/@string_0/React-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@string_0/React-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 22 Nov 2022 07:48:15 GMT</pubDate>
            <description><![CDATA[<h1 id="react의-구조">React의 구조</h1>
<br>
앞선 내용을 회고하고 시작하자.

<p>우리는 <strong>npx create-react-app [프로젝트 명]</strong> 이라는 CLI명령어로 
[프로젝트 명] 이라는 리액트 프로젝트를 생성하고 
<strong>cd [프로젝트 명]</strong> 으로 해당 프로젝트 폴더로 이동한 뒤 
<strong>npm start</strong> 로 localhost:3000 서버에 우리의 [프로젝트 명] 리액트 프로젝트를 실행하였다.</p>
<p><img src="https://velog.velcdn.com/images/string_0/post/bb66c957-97d0-4d3b-afd4-a847675b9f8c/image.png" alt=""></p>
<p>내 프로젝트 명은 ... 음... project_name이다.
너무 직관적인가? 하하...</p>
<p>아무튼 이 create-react-app으로 생성된 리액트 프로젝트를 뜯어보도록 하자!</p>
<h2 id="node_modules">node_modules</h2>
<p>열어보면 어질어질할 정도로 많은 폴더들이 당신을 반길 것이다.
괜찮다. 크게 신경 쓸 일 없는 폴더니까.
npm이 설치한 외부 모듈들이 저장되는 곳이다.
자세한 설명은 package.json을 설명하면서 하겠다.</p>
<h2 id="public">public</h2>
<p><img src="https://velog.velcdn.com/images/string_0/post/588bfe18-d2c6-41d7-b902-335354fbf234/image.png" alt=""></p>
<h3 id="faviconico">favicon.ico</h3>
<p>파비콘이다! 파비콘이 뭐냐면 </p>
<p><img src="https://velog.velcdn.com/images/string_0/post/09392ded-7529-4159-94a3-ef6738ef531d/image.png" alt=""></p>
<p>이 쬐끄마한 이미지다.
이 위치에 다른 이미지를 끼워 넣으면 이게 바뀐다.</p>
<h3 id="indexhtml">index.html</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;link rel=&quot;icon&quot; href=&quot;%PUBLIC_URL%/favicon.ico&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;
    &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;
    &lt;meta
      name=&quot;description&quot;
      content=&quot;Web site created using create-react-app&quot;
    /&gt;
    &lt;link rel=&quot;apple-touch-icon&quot; href=&quot;%PUBLIC_URL%/logo192.png&quot; /&gt;
    &lt;!--
      manifest.json provides metadata used when your web app is installed on a
      user&#39;s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    --&gt;
    &lt;link rel=&quot;manifest&quot; href=&quot;%PUBLIC_URL%/manifest.json&quot; /&gt;
    &lt;!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike &quot;/favicon.ico&quot; or &quot;favicon.ico&quot;, &quot;%PUBLIC_URL%/favicon.ico&quot; will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    --&gt;
    &lt;title&gt;React App&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;noscript&gt;You need to enable JavaScript to run this app.&lt;/noscript&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
    &lt;!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the &lt;body&gt; tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    --&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>주석을 달자면</p>
<pre><code>&lt;!DOCTYPE html&gt; &lt;!-- 문서의 타입은 html이다 명시--&gt;
&lt;html lang=&quot;en&quot;&gt; &lt;!-- html 의 lang 속성. 자동 생성이라 en으로 되어 있다. 한국은 ko --&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;  &lt;!-- 문자셋은 utf-8을 사용--&gt;
    &lt;link rel=&quot;icon&quot; href=&quot;%PUBLIC_URL%/favicon.ico&quot; /&gt;
    &lt;!-- 아까 위에서 보았던 파비콘 을 적용하는 줄입니다.--&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;
    &lt;!-- view 포트를 장치너비만큼 주고 최초 스케일을 줍니다.--&gt;
    &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;
    &lt;!-- 모바일 상단 주소 표시줄 색상에 변화를 줍니다.--&gt;
    &lt;meta
      name=&quot;description&quot;
      content=&quot;Web site created using create-react-app&quot;
    /&gt;
    &lt;!-- 웹 페이지에 대한 설명 : 이 웹사이트는 create-react-app으로 만들어 졌어~~ --&gt;
    &lt;link rel=&quot;apple-touch-icon&quot; href=&quot;%PUBLIC_URL%/logo192.png&quot; /&gt;
    &lt;!-- 파비콘의 아이폰 버전이라고 생각하면 된다... --&gt;
    &lt;link rel=&quot;manifest&quot; href=&quot;%PUBLIC_URL%/manifest.json&quot; /&gt;
    &lt;!--모바일에서의 manifest 사용, 뒤의 manifest에서 설명하겠다. --&gt;
    &lt;title&gt;React App&lt;/title&gt;
    &lt;!-- 상단에 표기될 이름--&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;noscript&gt;You need to enable JavaScript to run this app.&lt;/noscript&gt;
    &lt;!-- js의 스크립트를 지원하지 않을 때 대신 표현될 것--&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
    &lt;!-- 이곳에서 리액트가 조립될 예정!--&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>이렇게 볼 수 있겠다.</p>
<h3 id="logo192png-logo512png-manifestjson">logo192.png, logo512.png, manifest.json</h3>
<pre><code>{
  &quot;short_name&quot;: &quot;React App&quot;,
  &quot;name&quot;: &quot;Create React App Sample&quot;,
  &quot;icons&quot;: [
    {
      &quot;src&quot;: &quot;favicon.ico&quot;,
      &quot;sizes&quot;: &quot;64x64 32x32 24x24 16x16&quot;,
      &quot;type&quot;: &quot;image/x-icon&quot;
    },
    {
      &quot;src&quot;: &quot;logo192.png&quot;,
      &quot;type&quot;: &quot;image/png&quot;,
      &quot;sizes&quot;: &quot;192x192&quot;
    },
    {
      &quot;src&quot;: &quot;logo512.png&quot;,
      &quot;type&quot;: &quot;image/png&quot;,
      &quot;sizes&quot;: &quot;512x512&quot;
    }
  ],
  &quot;start_url&quot;: &quot;.&quot;,
  &quot;display&quot;: &quot;standalone&quot;,
  &quot;theme_color&quot;: &quot;#000000&quot;,
  &quot;background_color&quot;: &quot;#ffffff&quot;
}</code></pre><p>start_url : &quot;.&quot; 의 위치에 있는 
favicon.ico logo192.png logo512.png 를 사용하는데 사용하는 파일이다.</p>
<h3 id="robotstxt">robots.txt</h3>
<p>웹 크롤러의 접근 제한을 권고하는 파일입니다.
자세한 작성 방식은 따로 찾아보고 이런게 있구나 하고 넘어갑시다.</p>
<p>길어지니 나머지는 다음으로!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React의 시작]]></title>
            <link>https://velog.io/@string_0/React%EC%9D%98-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@string_0/React%EC%9D%98-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 22 Nov 2022 06:35:44 GMT</pubDate>
            <description><![CDATA[<h2 id="react-시작하기">React 시작하기</h2>
<br>
--
[리액트 페이지 바로가기](https://reactjs.org/docs/create-a-new-react-app.html)
--
<br>

<p>페이지에 명시된 Node &gt;= 14.0.0 and npm &gt;= 5.6
node와 npm이 설치된 상태로 진행하겠다.
추후 페이지가 수정된다 하더라도 해당 버전만 확인하면 쉬이 해결 할 수 있을 것이다.
<br></p>
<p>react 공식 홈페이지의 순서대로 진행하면</p>
<blockquote>
<p>npx create-react-app my-app
cd my-app
npm start</p>
</blockquote>
<p>터미널 CLI에 입력하게 될 이 코드를 만나게 된다.
순차적으로 뜯어보자.</p>
<br>
<br>

<h4 id="npx-">npx =&gt;</h4>
<p>이 글을 보는 이 명령어를 처음 보는 사람들이 이 명령어를 처음 보았을 때의 나처럼 어? npm도 아니고 npx? 이건 뭐지? 하는 생각이 들었으면 좋겠다.</p>
<p>npm은 &#39;Node Package Manager&#39;라고 생각되는 것처럼
npx는 &#39;Node Package eXecuter&#39;라고 생각하면 된다.</p>
<p>노드 패키지를 설치하는 것이 아닌 실행시키는 명령어이다.
따라서 create-react-app 패키지는 설치되지 않으며 가상환경에서 실행되는 것이다.</p>
<h4 id="create-react-app-">create-react-app =&gt;</h4>
<p>이녀석이 react 프로젝트를 만들어 줄 것이다. </p>
<p>앞서 말한 npx가 패키지를 임시설치한 환경에서 실행되어 후술할 명칭의 폴더를 생성하고 그 이하에 리액트 프로젝트를 만든다.</p>
<h4 id="my-app-">my-app =&gt;</h4>
<p>이것은 내가 만들 리액트 프로젝트의 명칭이다.
원하는 것으로 변경해도 된다.
npx create-react-app frontend 라던지
npx create-react-app [프로젝트 명] 이라던지.</p>
<br>
<br>
<br>
<br>
<br>

<p>자 여기까지 수행하면 아래와 같이 콘솔에 뜰 것이다.</p>
<p><img src="https://velog.velcdn.com/images/string_0/post/61f4bf7b-9fdb-4d18-a5f6-4b4ce1e238c3/image.png" alt=""></p>
<p>이대로 수행하면 react 공식의 내용과 같다.</p>
<h4 id="cd-my-app-">cd my-app =&gt;</h4>
<p>my-app(프로젝트 명) 폴더로 cd(change directory) 하기</p>
<h4 id="npm-start-">npm start =&gt;</h4>
<p>정식 명칭은 npm run start 이지만 약식으로 이렇게 사용한다. 혹여 외부 다른 Docker나 script에서 npm을 수행할때는 대신 반드시 npm run start를 적어야하니 잡지식으로 기억해두자.</p>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

<h2 id="hello-react">Hello, React!</h2>
<p><img src="https://velog.velcdn.com/images/string_0/post/fc7226ed-781c-4393-9a8e-676133432b08/image.png" alt=""></p>
<p>자 이제 뱅글뱅글 돌아가는 React 로고를 확인할 수 있을 것이다.
다음 게시물에서는 디폴트 페이지를 분석하며 리액트의 구성 방식을 알아보도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[그래서 React가 뭔데?]]></title>
            <link>https://velog.io/@string_0/%EA%B7%B8%EB%9E%98%EC%84%9C-React%EA%B0%80-%EB%AD%94%EB%8D%B0</link>
            <guid>https://velog.io/@string_0/%EA%B7%B8%EB%9E%98%EC%84%9C-React%EA%B0%80-%EB%AD%94%EB%8D%B0</guid>
            <pubDate>Tue, 22 Nov 2022 05:44:12 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트는-어쩌다-만들어졌을까">리액트는 어쩌다 만들어졌을까?</h1>
<p>DOM 을 직접 건드리면서 작업을 하면 코드가 난잡해지기 쉬움</p>
<p>리액트는 어떠한 상태가 바뀌었을때, 처음부터 모든걸 새로 만들어서 보여주자는 아이디어에서 시작</p>
<p>속도와 성능 문제는 Virtual DOM으로 해결
Virtual DOM은 메모리에 가상으로 존재하는 DOM으로 (자바스크립트 객체) 변경 속도가 빠름</p>
<p>Virtual DOM과 브라우저 DOM을 비교하여 차이가 있는 곳을 감지 =&gt; 브라우저 DOM에 패치</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0. 기술 블로그 시작]]></title>
            <link>https://velog.io/@string_0/0.-%EA%B8%B0%EC%88%A0-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@string_0/0.-%EA%B8%B0%EC%88%A0-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 22 Nov 2022 05:05:12 GMT</pubDate>
            <description><![CDATA[<h2 id="20221122">2022.11.22</h2>
<p>꽤 늦었지만 누군가의 말처럼 늦었다고 생각했을 때가 가장 빠르다고 오늘부터라도 기술 블로그를 시작하기로 했다.</p>
<p>이 블로그가 내가 아는 지식들을 다시 정리하며 
훗날 되돌아 보았을 때 이정표가 되었으면 한다.</p>
]]></description>
        </item>
    </channel>
</rss>