<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>landvibe-nextjs.log</title>
        <link>https://velog.io/</link>
        <description>Next.js 씹어먹자</description>
        <lastBuildDate>Wed, 25 Aug 2021 13:32:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>landvibe-nextjs.log</title>
            <url>https://images.velog.io/images/landvibe-nextjs/profile/c49d6626-c39c-402c-8041-2ef47c5cb457/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. landvibe-nextjs.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/landvibe-nextjs" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Redux]]></title>
            <link>https://velog.io/@landvibe-nextjs/Redux</link>
            <guid>https://velog.io/@landvibe-nextjs/Redux</guid>
            <pubDate>Wed, 25 Aug 2021 13:32:33 GMT</pubDate>
            <description><![CDATA[<h2 id="redux란"><strong>Redux란?</strong></h2>
<p>리액트에서 상태를 더 효울적으로 관리하는데 사용하는 상태 라이브러리.</p>
<h2 id="왜-하필-redux인가"><strong>왜 하필 Redux인가?</strong></h2>
<p><strong>컴포넌트끼리 직접 소통하는 방법</strong>도 있지만, 코드가 굉장히 많이 꼬여버리기 때문에 권장하지 않는 방식.</p>
<p><strong>App 컴포넌트</strong>는 구조상 부모 컴포넌트에서 모든걸 관리하고 내려주는 것이기 때문에 직관적이고, 관리하기 편하지만, 앱의 규모가 커지면 보여지는 컴포넌트 개수도 늘어나고, 데이터도 늘어나고, 유지보수가 힘들어진다.</p>
<p><strong>예시)</strong>
    <img src="https://images.velog.io/images/landvibe-nextjs/post/2a09d099-0dfd-4760-8cd3-896497f94966/amqLkOi.png" alt="">
    <img src="https://images.velog.io/images/landvibe-nextjs/post/0bb356b7-b074-4001-a4d7-32f930a48fe2/nWgg01Z.png" alt="">
props를 차례대로 아래쪽으로 흘려 보냄.
내려가는 과정: <strong>A-&gt;E-&gt;G</strong></p>
<h2 id="그럼-redux는">그럼 Redux는?</h2>
<p>리덕스에는 알아야 하는 개념 5가지가 있습니다.</p>
<ol>
<li>Store</li>
<li>Subscribe</li>
<li>Dispatch &amp; Action</li>
<li>Reducer</li>
<li>Listener</li>
</ol>
<h2 id="ㆍstore">ㆍStore</h2>
<p>ㆍ어플리케이션의 상태 값들을 내장하고 있다.
(중앙에서 변수 관리 개념이라고 생각하면 편하다.)
ㆍ리듀스에 의해서만 state의 값이 변경된다.
<img src="https://images.velog.io/images/landvibe-nextjs/post/05351fc5-6c97-4686-b902-c5f94d6d80a5/c6A4cHg.png" alt=""></p>
<h2 id="ㆍsubscribe">ㆍSubscribe</h2>
<p>ㆍ스토어 값이 필요한 컴포넌트는 스토어를 구독함.
ㆍ리액트 컴포넌트에서 리덕스 스토어를 구독하는 작업은 후에 react-redux의 connect 함수가 대신 한다.
ㆍ리덕스의 내장 함수를 사용해 subscribe, unsubscribe 함수를 사용가능.
<img src="https://images.velog.io/images/landvibe-nextjs/post/547874b5-9b41-4c75-b7ab-c4d06f345a9e/uROrrOc.png" alt=""></p>
<h2 id="dispatch--action">Dispatch &amp; Action</h2>
<blockquote>
<p>ㆍDispatch는 액션을 스토어에 전달하는 것을 의미.</p>
</blockquote>
<h4 id="action">Action:</h4>
<p>ㆍ상태 변화를 일으킬 때 참조하는 객체이다.</p>
<p>함수는</p>
<pre><code>const mapActionToProps=(dispatch)=&gt;{}</code></pre><p>를 사용한다.</p>
<p>ㆍAction이라는 단어는 Event와 같다고 생각하면 된다.
ㆍDispatch 인수에서 Reduce로 넘길 객체(Type)를 정의한다.
ㆍAction이 실행되고 끝나면 type을 반환하는데 이는 Reduce로 간다.
<img src="https://images.velog.io/images/landvibe-nextjs/post/f68f6cc1-5446-4f60-a573-13b08b601c5a/1e4ltmz.png" alt=""></p>
<h2 id="reducer">Reducer</h2>
<p>ㆍStore(스토어)의 문지기라고도 불리는 존재
ㆍ액션 객체를 받으면 타입에 따라 어떻게 상태를 업데이트 해야 할 지 정의를 해줌.</p>
<p>ㆍ리듀서 함수는 <strong>state(현재 상태)</strong> 와 <strong>action(액션 객체)</strong> 두가지의 파라미터를 받는다.
<strong>ex)</strong></p>
<pre><code>export function reducer(state = {state : 10, age:100}, action)</code></pre><p>ㆍReducer 함수를 생성 할 때 살찐 에로우를 사용하지 않는다.
ㆍReducer 함수는 순수 함수여야 한다. 결과 값을 출력 할 때는 파라미터 값에만 의존해야 하며, 언제나 같은 결과를 출력해야 함
ㆍReducer에서 state를 사용하면 반드시 초기화 해야 함
ㆍReducer에서 state의 변화가 일어남
ㆍ값의 갱신은 반드시 reducer에서
<img src="https://images.velog.io/images/landvibe-nextjs/post/e6e86b52-3701-40a2-8389-41d8c66f337b/vasxqlQ.png" alt=""></p>
<h2 id="listener">Listener</h2>
<p>ㆍ상태에 변화가 생기면, 구독한 컴포넌트에게 새로운 상태를 받게 해주는 함수</p>
<p><img src="https://images.velog.io/images/landvibe-nextjs/post/6ede2257-aafc-4a9f-9ec5-a7cc8a4adfbf/FkqTNhu.png" alt=""></p>
<h1 id="정리">정리</h1>
<p>리덕스를 이용하면 스토어를 사용해 상태를 컴포넌트 구조의 바깥에 두고, 스토어를 중간자로 두고 상태를 업데이트 하거나 새로운 상태를 받을 수 있다.</p>
<p>즉, 여러 컴포넌트를 거치지 않고 깊숙한 컴포넌트에 있다 하더라도 직속 부모에서 받아오는것처럼 편리하게 관리가 가능하다.</p>
<h4 id="참고">참고</h4>
<p>ㆍ <a href="https://velog.io/@mokyoungg/Redux-Redux%EC%9D%98-%EA%B8%B0%EC%B4%88-%ED%9D%90%EB%A6%84">https://velog.io/@mokyoungg/Redux-Redux%EC%9D%98-%EA%B8%B0%EC%B4%88-%ED%9D%90%EB%A6%84</a>
ㆍ <a href="https://hwan1001.tistory.com/38">https://hwan1001.tistory.com/38</a>
ㆍ <a href="https://k39335.tistory.com/76">https://k39335.tistory.com/76</a>
ㆍ <a href="https://velopert.com/3528">https://velopert.com/3528</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[API Routes]]></title>
            <link>https://velog.io/@landvibe-nextjs/API-Routes</link>
            <guid>https://velog.io/@landvibe-nextjs/API-Routes</guid>
            <pubDate>Tue, 10 Aug 2021 17:22:06 GMT</pubDate>
            <description><![CDATA[<h3 id="1-api-라우트-생성하기">1. API 라우트 생성하기</h3>
<p>Next.js에서는 Node.js Serverless function으로 api endpoint를 쉽게 만들 수 있다.
<code>/pages/api</code> 디렉토리에 함수 하나만 만들면 된다. </p>
<blockquote>
<p>옵션에 따라 Serverless 가능</p>
</blockquote>
<p><code>page/api/user.js</code> 는 상태코드 200과 함께 json 형식의 응답을 한다.</p>
<pre><code class="language-javascript">export default function handler(req, res) {
  res.status(200).json({ name: &#39;John Doe&#39; })
}</code></pre>
<p>확인해보자.</p>
<p>다른 HTTP method(POST, GET, DELETE 등)를 처리하기 위해 &#39;req.method&#39;를 사용할 수 있다.</p>
<h4 id="예시">예시)</h4>
<pre><code class="language-javascript">export default function handler (req, res) =&gt; {
     if (req.method === &#39;POST&#39;) {
    // POST request 처리
  } else {
    // 다른 HTTP method 처리
  }
}</code></pre>
<p>ㆍreq : 요청 데이터
ㆍres : 응답 데이터</p>
<h3 id="dynamic-api-routes">Dynamic API Routes</h3>
<p>API Routes도 dynamic routes를 제공해준다.</p>
<p>예를 들어, <code>pages/api/post/[pid].js</code> 파일이 다음과 같다고 하자.</p>
<pre><code class="language-javascript">export default function handler(req, res) {
  const { pid } = req.query
  res.end(`Post: ${pid}`)
}</code></pre>
<p><code>/api/post/abc</code>를 호출하면 &#39;Post: abc&#39;가 나타날 것이다. 
동적 경로 라우팅과 같다.</p>
<h3 id="restful-api-만들기">RESTful API 만들기</h3>
<p>RESTful api 패턴은 대표적으로 아래와 같다.</p>
<blockquote>
<p>RESTful api가 무엇인지는 <a href="https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html">여기</a> 를 참고하자.</p>
</blockquote>
<p>ㆍGET <code>api/posts</code> -블로그 글들의 리스트를 불러온다.
ㆍGET <code>api/posts/12345</code> - 글 아이디(예시)가 12345인 글의 api 결과를 불러온다.</p>
<p>두가지 방법으로 구현할 수 있는데,</p>
<p>-Option 1:
 <code>/api/posts.js</code>
 <code>/api/posts/[postId].js</code></p>
<p>-Option 2:
 <code>/api/posts/index.js</code>
 <code>/api/posts/[postId].js</code></p>
<p>두 개는 동일하다. 두 방법 모두 리스트가 반환될 지, 글 한 개가 반환될 지 코드를 구분해서 사용할 수 있기 때문에 추후에 Serverless 형태로 가기 좋은 구조이다.
실제로 서버 구현할 때 많이 사용되는 방법이다. </p>
<p><code>/api/posts/[postId].js</code> 만 사용하는 세번 째 옵션은 유효하지 않다.
Dynamic Routes(Catch-all routes를 포함하는)가 &#39;undefined&#39; 상태를 가지지 않기 때문에! 그래서 <code>/api/posts</code> 는 <code>/api/posts/[postId].js</code> 와 매치되지 않을 것이다.</p>
<h3 id="catch-all-api-routes">Catch all API routes</h3>
<h4 id="하위-경로를-전부-포함하기">하위 경로를 전부 포함하기</h4>
<p>위에서 <code>api/post/12345</code> 가 url 하나에만 매칭되었다면, <code>api/post/12345/a</code>, <code>api/post/12345/a/b</code> 와 같이 여러 depth에 걸친 url을 함께 다루기도 가능하다.</p>
<p>방법은 파일명의 대괄호 안에 점 3개(...)를 추가하여 모든 경로가 잡히도록 확장시키는 것!</p>
<h4 id="예시-1">예시)</h4>
<p><code>pages/api/post/[...slug].js</code> 는  <code>/api/post/a</code> 와 매치된다. 또한, <code>/api/post/a/b</code> 와 <code>/api/post/a/b/c</code> 등에도 전부 매칭이 이루어진다.</p>
<p>만약 <code>api/post/a</code> url이 매칭되면 req객체의 query는 다음과 같다.</p>
<blockquote>
<p>{ &quot;slug&quot;: [&quot;a&quot;] }</p>
</blockquote>
<p>url이 <code>api/post/a/b/c</code>인 경우,</p>
<blockquote>
<p>{ &quot;slug&quot;: [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;] }</p>
</blockquote>
<h4 id="예시-2">예시)</h4>
<pre><code class="language-javascript">export default function handler(req, res) {
  const { slug } = req.query
  res.end(`Post: ${slug.join(&#39;, &#39;)}`)
}</code></pre>
<p>리턴 값은 &quot;Post: a,b,c&quot;가 된다.</p>
<h4 id="상위경로-포함하기">상위경로 포함하기</h4>
<p>추천하는 방법은 아니지만, <code>api/post</code>와 <code>api/post/a</code> 두 개의 경로를 한 번에 다룰수 있기는 하다.
방법은 파일명에 대괄호 두 번 사용하기!</p>
<p><code>pages/api/post/[[...slug]]</code></p>
<p>query 값은 아래와 같이 나올 것이다.</p>
<blockquote>
<p>{} // <code>api/post</code>
{ &quot;slug&quot;: [&quot;a&quot;] } // <code>api/post/a</code>
{ &quot;slug&quot; : [&quot;a&quot;,&quot;b&quot;] }  //<code>api/post/a/b</code></p>
</blockquote>
<h4 id="우선순위">우선순위</h4>
<blockquote>
<p>사전 정의된 api 라우트 &gt; 동적 api 라우트 &gt; catch all api 라우트</p>
</blockquote>
<h3 id="api-middlewares">API Middlewares</h3>
<p>req를 해석하는 built-in된 미들웨어</p>
<p>ㆍreq.cookies : 요청에 쿠키가 보내졌는지 담는 객체. 기본 {}
ㆍreq.query : 쿼리스트링을 포함하는 객체. 기본 {}
ㆍreq.body : content-Type 별로 해석된 body를 담는 객체, body에 아무것도 없으면 null</p>
<p>모든 api 경로는 <code>config</code> 객체를 사용하여 기본 설정을 변경할 수 있다.</p>
<pre><code class="language-javascript">export const config = {
  api: {
    bodyParser: {
      sizeLimit: &#39;1mb&#39;,
    },
  },
}</code></pre>
<p>sizeLimit은 해석된 body에 담길 최대 크기이다. (byte 단위)</p>
<p>bodyParser는 body parsing을 활성화, Stream으로 처리하고 싶으면 비활성화</p>
<pre><code class="language-javascript">export const config = {
  api: {
    bodyParser: false,
  },
}</code></pre>
<p>아래의 <code>externalResolver</code> 속성은 경로가 외부 확인자(express or connect)에 의해 처리되고 있음을 서버에 알리는 플래그이다.
해당 옵션을 사용하면 확인되지 않은 요청에 대한 경고가 비활성화 된다.</p>
<pre><code class="language-javascript">export const config = {
  api: {
    externalResolver: true,
  },
}</code></pre>
<h4 id="connectexpress-middleware">Connect/Express middleware</h4>
<p>적합한 middleware를 connect 연결할 수 있다.
예로, api endpoint를 위해서 <code>CORS</code> 설정이 필요한 경우에 cors 패키지를 활용하여 수행할 수 있다.</p>
<blockquote>
<p>cors란? Cross-Origin Resource Sharing(CORS)은 추가적인 HTTP header를 사용해서 애플리케이션이 다른 origin의 리소스에 접근할 수 있도록 하는 메커니즘을 말한다. 하지만 다른 origin에서 내 리소스에 함부로 접근하지 못하게 하기 위해 사용된다.</p>
</blockquote>
<p><code>cors</code>를 설치하자.</p>
<blockquote>
<p>npm i cors
or
yarn add cors</p>
</blockquote>
<p>그 후, <code>cors</code>를 api route에 더해주면 된다.</p>
<pre><code class="language-javascript">import Cors from &#39;cors&#39;

// Initializing the cors middleware
const cors = Cors({
  methods: [&#39;GET&#39;, &#39;HEAD&#39;],
})

// Helper method to wait for a middleware to execute before continuing
// And to throw an error when an error happens in a middleware
function runMiddleware(req, res, fn) {
  return new Promise((resolve, reject) =&gt; {
    fn(req, res, (result) =&gt; {
      if (result instanceof Error) {
        return reject(result)
      }

      return resolve(result)
    })
  })
}

async function handler(req, res) {
  // Run the middleware
  await runMiddleware(req, res, cors)

  // Rest of the API logic
  res.json({ message: &#39;Hello Everyone!&#39; })
}

export default handler</code></pre>
<h3 id="response-helper">Response Helper</h3>
<p>api route의 response는 개발자 환경을 개선시키고, 새로운 api endpoint를 만드는 속도를 높이기 위해, Express.js와 유사한 method set을 포함한다.</p>
<p>ㆍ<code>res.status(code)</code> : 상태 코드를 설정하는 함수이다. 코드는 유효한 HTTP 상태 코드여야 한다. (보통 200이 성공)
ㆍ<code>res.json(body)</code> :  json 응답을 보낸다. body는 직렬화가능한 객체여야한다.
ㆍ<code>res.send(body)</code> : HTTP 응답을 전송한다. body는 문자열, 객체, 또는 버퍼일 수 있다.
ㆍ<code>res.redirect([status,] path)</code> : 지정된 경로, url로 리디렉션된다. status는 유효한 HTTP 상태 코드여야 한다. 지정하지 않을 시, 상태 코드는 307(임시 리디렉션)으로 기본 설정된다.</p>
<p><a href="https://nextjs.org/docs/api-routes/introduction">참고</a>
책은 p.135부터 참고하면 될듯하다. (typescript기반이지만 비슷할듯하다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[API Call]]></title>
            <link>https://velog.io/@landvibe-nextjs/API-Call</link>
            <guid>https://velog.io/@landvibe-nextjs/API-Call</guid>
            <pubDate>Sun, 01 Aug 2021 07:30:23 GMT</pubDate>
            <description><![CDATA[<p>Next.js는 기본적으로 모든 페이지를 미리 렌더링한다. 미리 렌더링을 하여 html을 생성하게 되면 더 나은 성능과 SEO 이점을 얻을 수 있다.</p>
<p>Next.js에서는 두 가지 형태의 사전 렌더링이 존재</p>
<ol>
<li>정적 생성: 빌드 시에 페이지를 HTML로 만들어 요청시 제공한다.</li>
<li>서버 사이드 렌더링: 페이지 요청 시, 서버 사이드 렌더링을 통하여 HTML을 제공한다.</li>
</ol>
<p>외부 데이터를 필요로 하지 않는다면, Next.js는 빌드 시에 페이지를 렌더링하여 요청시마다 제공한다.(정적 생성)</p>
<p>외부 데이터를 필요로 한다면, 서버 사이드 렌더링을 통하여 외부 데이터를 이용하여 렌더링을 한 후 HTML을 제공한다.</p>
<h2 id="getserversideprops">getServerSideProps</h2>
<p>Next.js는 getServerSideProps라는 페이지의 데이터를 서버로부터 제공받는 기본 API를 가지고 있음.</p>
<p>서버에서 데이터를 Fetch하여 초기 데이터를 전달하도록 구성</p>
<p>서버 측에서 props를 받아오는 기능을 하게됨.</p>
<p>페이지를 요청할 때마다 미리 실행되어서 Page 컴포넌트의 props로 넘겨주게 됨.</p>
<pre><code class="language-jsx">export default function Home({user}) { // 미리 실행된 getServerSideProps() 함수의 결과 값을 props로 넘겨받음.
    const username = user &amp;&amp; user.name;
    return (
        &lt;div&gt;
            {username}
        &lt;/div&gt;
    )
}

// 미리 실행됨 
export const getServerSideProps = async () =&gt;{
    try {
        const res = await fetch(&#39;https://api.github.com/users/raccoonback&#39;)
        if(res.status === 200) {
            const user = await res.json()
            return { // 결과를 Home 컴포넌트의 props로 넘겨줌 
                props: {user} 
            }
        }
    } catch (e) {
        console.error(e)
        return { // 결과를 Home 컴포넌트의 props로 넘겨줌 
            props: {}
        }
    }
}</code></pre>
<p><code>getServerSideProps</code> 에서 반환한 props 값들은 페이지의 props로 전달되게 된다.</p>
<h2 id="getstaticprops">getStaticProps</h2>
<p><code>getStaticProps</code>는 <code>getServerSideProps</code>와 다르게 빌드 시에 데이터를 불러와 결과를 json으로 저장하여 사용하게 됨. 즉, 일관된 데이터를 보여주게 됨.</p>
<p><img src="https://images.velog.io/images/landvibe-nextjs/post/b61539bd-5b01-4524-9969-2930b317bcf5/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/landvibe-nextjs/post/0b3f4f77-b2e5-4c1a-804a-f07bc0c0078b/image.png" alt=""></p>
<p>사전 렌더링된 html에 날짜 데이터가 들어가 있는 것을 확인할 수 있다. </p>
<p>뿐만 아니라, <code>next build &amp;&amp; next start</code> 명령어를 통해 빌드하여 실행하게 되면 새로고침 이후에도 데이터가 갱신되지 않는 것을 확인할 수 있다.</p>
<p>9.5 버전부터는 <code>revalidate: 시간(초)</code> option을 주면 주어진 시간(초)마다 갱신되도록 설정할 수 있다.</p>
<h3 id="getstaticpaths">getStaticPaths</h3>
<p><code>getStaticPaths</code> 이용하여 미리 paths를 지정할 수 있다. 즉, 해당 경로가 외부 데이터에 의존할 때 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Routing]]></title>
            <link>https://velog.io/@landvibe-nextjs/Routing</link>
            <guid>https://velog.io/@landvibe-nextjs/Routing</guid>
            <pubDate>Sun, 01 Aug 2021 04:34:23 GMT</pubDate>
            <description><![CDATA[<ul>
<li>/pages : 라우팅을 담당하는 디렉터리<ul>
<li>index.jsx 는 <code>/</code> 루트 경로를 가지게 됨</li>
</ul>
</li>
</ul>
<h2 id="ssr--csr">SSR &amp; CSR</h2>
<p><img src="https://images.velog.io/images/landvibe-nextjs/post/67b0ee25-5ea0-44e2-bda1-da84e100eae7/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/landvibe-nextjs/post/b10d2900-6aa8-40df-9c99-5aa164302b32/image.png" alt=""></p>
<h2 id="정적-페이지-라우팅">정적 페이지 라우팅</h2>
<h3 id="nextlink">next/Link</h3>
<ul>
<li>페이지 전체를 새로 불러오지 않고 주소 이동시켜주는 컴포넌트</li>
<li>History API 이용하여 뒤로 가기 등을 할 때 이전에 렌더링된 페이지를 가져오게 됨</li>
</ul>
<pre><code class="language-tsx">// seo, 웹 접근성에 유리 
// history api로 주소 이동 
&lt;Link href={&#39;/test&#39;}&gt;
        &lt;a&gt;move&lt;a/&gt;
&lt;/Link&gt;

// 주소 이동은 하지만, seo/웹 접근성이 불리 
&lt;Link href={&#39;/test&#39;}&gt;
        &lt;p&gt;move&lt;p/&gt;
&lt;/Link&gt;

// 컴포넌트 전체에 라우팅 기능을 추가하고 싶다면, &lt;Child/&gt; 컴포넌트를 &lt;a&gt; 태그로 감싸주어야 함
const Child = () =&gt; {
    return &lt;p&gt;Move to &#39;/tomato&#39;&lt;/p&gt;
}

&lt;Link href={&quot;/&quot;}&gt;
    &lt;a&gt;
    &lt;Child/&gt;
    &lt;/a&gt;
&lt;/Link&gt;
</code></pre>
<h2 id="동적-페이지-라우팅">동적 페이지 라우팅</h2>
<ul>
<li><p><code>[].jsx</code> 같이 대괄호로 감싼 이름으로 파일을 만들면 이는 동적 페이지임을 의미</p>
</li>
<li><p>파일 이름에서 대괄호 안에 있는 값은 라우터 객체(router)의 query 속성으로 들어가게 됨</p>
</li>
<li><p>router 객체 값은 <code>useRouter() hooks</code> 로 확인 가능</p>
<pre><code class="language-tsx">  import {useRouter} from &quot;next/router&quot;;

  const router = useRouter()
  console.log(router.query)</code></pre>
</li>
</ul>
<h2 id="router-객체-사용하여-라우팅하기">Router 객체 사용하여 라우팅하기</h2>
<ul>
<li>함수 내에서 라우팅해야 하는 경우에는 <code>router</code> 객체에서 사용하는 메서드를 이용해서 <code>정적 주소 이동</code> or <code>동적 주소 이동</code> 이 가능하다.</li>
</ul>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Web/API/History_API">History API</a></li>
<li><a href="https://reactrouter.com/web/guides/quick-start">react-router-dom</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정적 분석 도구]]></title>
            <link>https://velog.io/@landvibe-nextjs/%EC%A0%95%EC%A0%81-%EB%B6%84%EC%84%9D-%EB%8F%84%EA%B5%AC</link>
            <guid>https://velog.io/@landvibe-nextjs/%EC%A0%95%EC%A0%81-%EB%B6%84%EC%84%9D-%EB%8F%84%EA%B5%AC</guid>
            <pubDate>Sun, 01 Aug 2021 04:33:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Next는 암시적으로 <code>import React from &quot;react&quot;</code>를 적용해줌</p>
</blockquote>
<h3 id="eslint-정적-분석-도구">Eslint: 정적 분석 도구</h3>
<p>미리 에러를 방지하고, 코드 스타일을 규정할 수 있음 </p>
<ul>
<li>ref: <a href="https://github.com/airbnb/javascript/tree/master/react">https://github.com/airbnb/javascript/tree/master/react</a></li>
</ul>
<h3 id="prettier-코드-스타일을-정해진-규칙대로-변환해주는-코드-포맷터">Prettier: 코드 스타일을 정해진 규칙대로 변환해주는 코드 포맷터</h3>
<p>Prettier를 사용해서 세미콜론을 자동으로 붙여주거나 따옴표 사용을 쌍따옴표로 자동 변환할 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발환경 세팅]]></title>
            <link>https://velog.io/@landvibe-nextjs/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@landvibe-nextjs/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Sun, 01 Aug 2021 04:29:21 GMT</pubDate>
            <description><![CDATA[<h1 id="기본-환경-구성">기본 환경 구성</h1>
<ul>
<li><a href="https://goddaehee.tistory.com/215">jetbrain 학생 인증</a></li>
<li><a href="https://goddaehee.tistory.com/216">git 설치(블로그)</a></li>
</ul>
<h1 id="ide-환경-구성">IDE 환경 구성</h1>
<ul>
<li><p><a href="https://www.jetbrains.com/ko-kr/webstorm/">webstorm 설치</a></p>
</li>
<li><p><a href="https://nodejs.org/ko/download/">node 설치(windows installer)</a></p>
<ul>
<li>설치 후 버전 확인<ul>
<li><code>node -v</code></li>
<li><code>npm - v</code></li>
</ul>
</li>
</ul>
</li>
<li><p>yarn 설치</p>
<p>  <code>npm install --global yarn</code></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>