<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>young_ee.log</title>
        <link>https://velog.io/</link>
        <description>기억보다는 기록을</description>
        <lastBuildDate>Sat, 21 Jan 2023 02:27:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>young_ee.log</title>
            <url>https://velog.velcdn.com/images/youn_gee/profile/48322dca-6b31-4616-9455-f21a95555ca7/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. young_ee.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/youn_gee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CSR, SSR, SSG, ISG, SPA, MPA, TTI, TTV]]></title>
            <link>https://velog.io/@youn_gee/CSR-SSR-SSG-SPA-MPA-TTI-TTV</link>
            <guid>https://velog.io/@youn_gee/CSR-SSR-SSG-SPA-MPA-TTI-TTV</guid>
            <pubDate>Sat, 21 Jan 2023 02:27:42 GMT</pubDate>
            <description><![CDATA[<p>브라우저에서 우리가 보는 화면이 있다, 이 화면이 어디서 만들어져서 보여주느냐에 따라, CSR과 SSR 로 나뉜다.</p>
<h1 id="🔍-csrclient-side-rendering">🔍 CSR(Client Side Rendering)</h1>
<p>클라이언트(브라우저)에서 웹 페이지를 렌더링하는 방식</p>
<ol>
<li>브라우저가 웹서버에 요청</li>
<li>웹서버는 비어있는 HTML문서(index.html)를 반환(HTML문서가 비어있기 때문에 처음에 접속하면 빈 화면이 보임)</li>
<li>HTML문서에 있는 어플리케이션 자바스크립트 링크를 참고하여 웹 서버로 부터 자바스크립트 파일을 다운받는다.</li>
<li>추가로 필요한 데이터가 있다면 서버에 요청해서 받아온다.</li>
<li>이것들을 기반으로 사용자에게 화면을 보여준다.</li>
</ol>
<blockquote>
<p>자바스크립트 파일에는 어플리케이션을 구성하는 로직, 라이브러리, 프레임워크를 포함 ex) react, vue, angular) 따라서 다운로드 받는데 많은 시간이 소요된다.</p>
</blockquote>
<h3 id="📌-단점">📌 단점</h3>
<ul>
<li>브라우저에 첫화면이 표시되기까지 많은 시간이 소요.(그동안 사용자는 빈 페이지를 보게 되므로 ux가 좋지 않다.)</li>
<li>SEO(Search Engine Optimization)가 좋지 않음. (브라우저의 검색엔진은 HTML문서를 보고 웹 크롤링을 하게 되는데 HTML문서가 바어져 있기 때문이다.)</li>
</ul>
<h1 id="🔍-ssrserver-side-rendering">🔍 SSR(Server Side Rendering)</h1>
<p>클라이언트에서 모든걸 처리하는 방식과는 다르게 서버로부터 완성된 HTML문서를 받아온다.(HTML문서 + 동적으로 처리 가능한 소스코드)
문서를 받은 클라이언트는 사용자가 화면을 바로 볼 수 있게 브라우저에 띄어준다. CSR 방식처럼 서버에 두번 요청하는 것과 같은 번거로움이 없다.</p>
<h3 id="📌-단점-1">📌 단점</h3>
<ul>
<li>사용자가 클릭을 했을때 전체적인 웹사이트를 서버에서 받아온다.(깜빡임 이슈가 나타난다 -&gt; 좋지않은 ux)</li>
<li>서버에 과부화가 걸리기 쉽다. 
사용자가  많을 수록 사용자가 클릭할때 서버에서 데이터를 가져와야 하기 때문이다.</li>
<li>사용자가 빠르게 웹 사이트 화면을 볼 수 있지만, 동적으로 처리가능한 자바스크립트를 다운받지 않아 반응이 없을 수 있다
(처음 HTML문서를 받았을때 TTV가 먼저 일어나고 이후 클릭을 했을때의 서버로부터 클릭에 대한 처리 코드를 받음으로써 TTI가 일어난다. 따라서 TTV와 TTI의 공백이 길다.)</li>
</ul>
<blockquote>
<p><code>TTV</code>(Time To View) 사용자가 웹 사이트를 볼 수 있는 시간
<code>TTI</code>(Time To Interact) 클릭 or 인터렉션이 가능하게 되는 시간</p>
</blockquote>
<h1 id="🔍-ssgstatic-site-generation">🔍 SSG(Static Site Generation)</h1>
<p>모든 유저에게 동일한 화면으로 보일 수 있는 페이지는 매 번 동적으로 생성하게 되며 비효율적이다. 즉, 한번만 생성한 이후 CDN에 저장해두고 필요할 때마다 로드 하면 된다.
SSG는 정적으로 웹 페이지를 빌드시 미리 생성해 두어서 서버에 베포해 놓은 방식으로 빠른 정적 렌더링이 가능한다. 웹 페이지들은 추가적으로 서버에서 데이터를 받아 오거나 동적으로 처리해야하는 로직이 있다면 자바스크립트 파일을 함께 가지고 있기 때문에 모든 페이지가 정적이 아닌 셈이다.
SSG는 쇼케이스 웹사이트 처럼 내용이 거의 변하지 않는 웹 사이트에서만 사용된다.
React의 경우 Next.js와 Gatsby.js에서 SSG을 제공해 준다.</p>
<h3 id="📌-장점">📌 장점</h3>
<ul>
<li>SEO에 친화적 (이미 생성된 파일을 전달하는 방식이기 때문이다.)</li>
<li>정적 사이트는 미리 만들어져서 사용자에게 제공될 준비가 되어 있기 때문에 가장 빠른 웹 페이지이다.</li>
</ul>
<h1 id="🔍-isgincremental-static-regeneration">🔍 ISG(Incremental Static Regeneration)</h1>
<p>ISG도 SSG와 같이 빌드 시에 구성된 데이터를 기반으로 페이지를 작성하고 보여준다.
ISG는 SSG와 달리 콘텐츠를 업데이트 했을 때 전체 사이트를 재빌드할 필요 없이 페이지별로 정적 생성을 사용할 수 있다. 그리고 설정된 시간이 지나면 자동으로 재빌드 하고 데이터를 업데이트 한다.
ISG는 SSR과 SSG의 장점을 합쳐져 있는 방식으로 매우 효과적이다.
(블로그와 같이 자주 변경되지 않는 사이트에 사용)</p>
<h3 id="📌-장점-1">📌 장점</h3>
<ul>
<li>SSG와 동일하게 ISR도 페이지를 미리 렌더링하고 캐시하기 떄문에 매우 빠르다.</li>
<li>SEO에 친화적</li>
<li>내용이 변경되어도 사이트를 다시 베포할 필요가 없다.</li>
</ul>
<h1 id="🔍-spasingle-page-application">🔍 SPA(Single Page Application)</h1>
<p>하나의 Page로 구성된 Application이다.
CSR의 렌더링 방식을 이용한다.
❗️but, 모든 SPA가 CSR 방식을 이용하는 것은 아니다.
❗️기본적으로 (react, vue, angular)가 있고 특히 react는 Next.js와 Gatsby.js에서 SSG을 제공하기 때문에 모든 SPA가 CSR 방식이 아니다.</p>
<p>처음 요청시 딱 한 페이지만 불러오고 페이지 이동 시 기존 페이지의 내부를 수정해서 보여주는 방식이다.(ajax의 방식으로 부분만 렌더링해주는 느낌이다.)
첫 페이지를 로딩한 시점에서 페이지 리로딩 없이 추가로 필요한 데이터만 서버로 부터 받아온다.</p>
<blockquote>
<p><strong>AJAX</strong>(Asynchronous JavaScript And XML)
서버와 통신하기 위해 <code>XMLHttpRequest</code> 객체를 사용하는 것을 말한다. JSON, HTML, XML, 텍스트 형식등의 다양한 포멧을 데이터를 주고 받는다. <code>AJAX</code>는 비동기성으로 전체페이지를 업데이트하지않고 일부분만 업데이트가 가능하게 해준다. 이는 좋은 ux 제공한다.</p>
</blockquote>
<h3 id="📌-장점-2">📌 장점</h3>
<ul>
<li>필요한 리소스만 부분적으로 로딩
클라이언트가 처음요청한 정적리소스와 받은 데이터들은 모두 캐시에 저장한다.<h3 id="📌-단점-2">📌 단점</h3>
</li>
<li>JavaScript 파일을 번들링해서 한 번에 받기 때문에 초기 구동 속도가 느리다. (Webpack의 code splitting으로 해결 가능)</li>
<li>검색엔진최적화(SEO)가 어려움 (SSR로 해결 가능)</li>
<li>보안 이슈 (프론트엔드에 비즈니스 로직 최소화)
SSR에서는 사용자에 대한 정보를 서버측에서 세션으로 관리를 하지만 CSR 방식에서는 클라이언트측의 쿠키말고는 사용자에 대한 정보를 저장할 공간이 마땅치 않다.</li>
</ul>
<blockquote>
<p><strong>Code Splitting</strong>이란?
<code>code splitting</code>의 기능으로 런타임시 동적으로 로드할 수 있는 여러 번들을 만들 수 있다. 
사용자가 현재 필요로하는 것들만 <code>lazy-load</code>할 수 있으므로 앱의 성능을 크게 향상시킬 수 있다. 앱의 전체 코드 양을 줄이지는 않지만 사용자가 필요로하지 않은 코드를 로드하는 것을 피하고, 초기 페이지 로드시 필요한 코드만 받게 됩니다.</p>
</blockquote>
<h1 id="🔍-mpamultiple-page-application">🔍 MPA(Multiple Page Application)</h1>
<p>여러 개의  Page로 구성된 Application이다.
MPA은 SSR렌더링 방식으로 이용한다.
새로운 페이지를 요청할 때마다 서버에서 렌더링된 정적 리소스가 다운된다. 페이지를 이동하거나 새로고침을 하면 전체 페이지를 다시 렌더링한다.
❗️ SSR과 장단점이 같다. (+단점: 페이지 이동시 불필요한 템플릿도 중복해서 로딩하므로 성능이 떨어진다.)</p>
<blockquote>
<p><a href="https://hanamon.kr/spa-mpa-ssr-csr-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%9C%BB%EC%A0%95%EB%A6%AC/">SPA와 MPA의 차이</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>