{"componentChunkName":"component---src-templates-blog-post-js","path":"/JavaScript/Server_Side_Rendering/","result":{"data":{"site":{"siteMetadata":{"title":"JULog","author":"[Ju Chan Hwang]","siteUrl":"https://julog.netlify.app","comment":{"disqusShortName":"","utterances":"JuChanHwang/gatsby-starter-bee"},"sponsor":{"buyMeACoffeeId":"jbee"}}},"markdownRemark":{"id":"8f8a63ee-1ffe-5546-a577-3a42e50f699b","excerpt":"서버 사이드 렌더링(SSR) 전통적인 웹 애플리케이션은 서버 사이드 렌더링 방식 요청시마다 서버에서 처리한 후 새로고침으로 페이지에 대한 응답(view) 웹에서 많은 정보와 기능이 많아지면서 spa개념이 생김 ssr 클라이언트 사이드 렌더링(CSR) 클라이언트에서 자바스크립트를 통해 렌더링 하는 방식 SPA는 클라이언트 사이드 렌더링 방식 csr CSR vs SSR csrVsSsr Single Page Application(SPA) 단일 페이지 애플리케이션(Single Page…","html":"<h2 id=\"서버-사이드-렌더링ssr\" style=\"position:relative;\"><a href=\"#%EC%84%9C%EB%B2%84-%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81ssr\" aria-label=\"서버 사이드 렌더링ssr permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>서버 사이드 렌더링(SSR)</h2>\n<ul>\n<li>전통적인 웹 애플리케이션은 서버 사이드 렌더링 방식</li>\n<li>요청시마다 서버에서 처리한 후 새로고침으로 페이지에 대한 응답(view)</li>\n<li>웹에서 많은 정보와 기능이 많아지면서 spa개념이 생김</li>\n</ul>\n<p><img src=\"https://user-images.githubusercontent.com/36187948/84455530-871c3280-ac98-11ea-8c0c-6748da88301e.png\" alt=\"ssr\"></p>\n<h2 id=\"클라이언트-사이드-렌더링csr\" style=\"position:relative;\"><a href=\"#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81csr\" aria-label=\"클라이언트 사이드 렌더링csr permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>클라이언트 사이드 렌더링(CSR)</h2>\n<ul>\n<li>클라이언트에서 자바스크립트를 통해 렌더링 하는 방식</li>\n<li>SPA는 클라이언트 사이드 렌더링 방식</li>\n</ul>\n<p><img src=\"https://user-images.githubusercontent.com/36187948/84455534-87b4c900-ac98-11ea-828f-36c2570a4c0a.png\" alt=\"csr\"></p>\n<h3 id=\"csr-vs-ssr\" style=\"position:relative;\"><a href=\"#csr-vs-ssr\" aria-label=\"csr vs ssr permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CSR vs SSR</h3>\n<p><img src=\"https://user-images.githubusercontent.com/36187948/84455926-a1a2db80-ac99-11ea-8db5-aa50b36fab05.png\" alt=\"csrVsSsr\"></p>\n<h3 id=\"single-page-applicationspa\" style=\"position:relative;\"><a href=\"#single-page-applicationspa\" aria-label=\"single page applicationspa permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Single Page Application(SPA)</h3>\n<p>단일 페이지 애플리케이션(Single Page Application, SPA)는 모던 웹의 패러다임이다. SPA는 기본적으로 단일 페이지로 구성되며 기존의 서버 사이드 렌더링과 비교할 때, 배포가 간단하며 네이티브 앱과 유사한 사용자 경험을 제공할 수 있다는 장점이 있다.</p>\n<p>link tag를 사용하는 전통적인 웹 방식은 새로운 페이지 요청 시마다 정적 리소스가 다운로드되고 전체 페이지를 다시 렌더링하는 방식을 사용하므로 새로고침이 발생되어 사용성이 좋지 않다. 그리고 변경이 필요없는 부분를 포함하여 전체 페이지를 갱신하므로 비효율적이다.</p>\n<p>SPA는 기본적으로 웹 애플리케이션에 필요한 모든 정적 리소스를 최초에 한번 다운로드한다. 이후 새로운 페이지 요청 시, 페이지 갱신에 필요한 데이터만을 전달받아 페이지를 갱신하므로 전체적인 트래픽을 감소할 수 있고, 전체 페이지를 다시 렌더링하지 않고 변경되는 부분만을 갱신하므로 새로고침이 발생하지 않아 네이티브 앱과 유사한 사용자 경험을 제공할 수 있다.</p>\n<p>모바일의 사용이 증가하고 있는 현 시점에 트래픽의 감소와 속도, 사용성, 반응성의 향상은 매우 중요한 이슈이다. SPA의 핵심 가치는 <strong>사용자 경험(UX) 향상</strong>에 있으며 부가적으로 애플리케이션 속도의 향상도 기대할 수 있어서 모바일 퍼스트(Mobile First) 전략에 부합한다.</p>\n<h2 id=\"서버-사이드-렌더링은-왜-필요한가요\" style=\"position:relative;\"><a href=\"#%EC%84%9C%EB%B2%84-%EC%82%AC%EC%9D%B4%EB%93%9C-%EB%A0%8C%EB%8D%94%EB%A7%81%EC%9D%80-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%9C%EA%B0%80%EC%9A%94\" aria-label=\"서버 사이드 렌더링은 왜 필요한가요 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>서버 사이드 렌더링은 왜 필요한가요?</h2>\n<ol>\n<li><a href=\"https://static.googleusercontent.com/media/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf\">검색 엔진 최적화(SEO)</a>를 통해 웹 크롤러에 대응하기 위해</li>\n<li>모바일 장비와 저사양 장비에서 동작하는 성능을 끌어올리기 위해</li>\n<li><a href=\"https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint\">사용자에게 유효한 첫 페이지</a>를 빠르게 표시하기 위해</li>\n</ol>\n<h3 id=\"웹-크롤러-대응하기seo\" style=\"position:relative;\"><a href=\"#%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%9F%AC-%EB%8C%80%EC%9D%91%ED%95%98%EA%B8%B0seo\" aria-label=\"웹 크롤러 대응하기seo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>웹 크롤러 대응하기(SEO)</h3>\n<p>Google, Bing, Facebook, Twitter와 같은 소셜 미디어 사이트는 웹 애플리케이션 컨텐츠를 수집하고 검색에 활용하기 위해 웹 크롤러를 사용한다. 그런데 이런 웹 크롤러는 진짜 사람이 하는 것처럼 애플리케이션 페이지를 효율적으로 이동하면서 원하는 내용을 수집하지는 못한다. 대부분의 웹 크롤러, 봇들이 자바스크립트 파일을 실행시키지 못한다. 때문에 HTML 에서만 콘텐츠를 수집하게 되고 클라이언트 사이드 렌더링되는 페이지를 빈 페이지로 인식하게 된다. 웹 크롤러에 대응하는 과정은 <a href=\"https://static.googleusercontent.com/media/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf\">검색 엔진 최적화(search engine optimization, SEO)</a>라고도 합니다.</p>\n<h3 id=\"모바일-장비와-저사양-장비에서-동작하는-성능-끌어올리기\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%B0%94%EC%9D%BC-%EC%9E%A5%EB%B9%84%EC%99%80-%EC%A0%80%EC%82%AC%EC%96%91-%EC%9E%A5%EB%B9%84%EC%97%90%EC%84%9C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-%EC%84%B1%EB%8A%A5-%EB%81%8C%EC%96%B4%EC%98%AC%EB%A6%AC%EA%B8%B0\" aria-label=\"모바일 장비와 저사양 장비에서 동작하는 성능 끌어올리기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>모바일 장비와 저사양 장비에서 동작하는 성능 끌어올리기</h3>\n<p>JavaScript를 지원하지 않는 디바이스가 존재하기도 하고 JavaScript를 실행하는 것이 오히려 사용자의 UX를 해치는 디바이스도 존재한다. 이런 경우에는 클라이언트에서 JavaScript를 실행하지 않고 서버에서 미리 렌더링된 앱을 보내서 간단하게 실행하는 것이 더 좋다. 앱을 이렇게 제공하면 원래 사용자에게 제공하려던 기능을 모두 제공할 수는 없겠지만, 앱을 전혀 사용할 수 없는 상황은 피할 수 있다.</p>\n<h3 id=\"첫-페이지를-빠르게-표시하기\" style=\"position:relative;\"><a href=\"#%EC%B2%AB-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A5%BC-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%91%9C%EC%8B%9C%ED%95%98%EA%B8%B0\" aria-label=\"첫 페이지를 빠르게 표시하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>첫 페이지를 빠르게 표시하기</h3>\n<p>사용자의 재방문을 유도하려면 첫 페이지를 빠르게 표시하는 것이 무엇보다 중요하다. 첫 페이지가 3초 안에 표시되지 않는다면 <a href=\"https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/\">53%의 모바일 사용자가 재방문하지 않는다는 통계</a>도 있다. 사이트를 방문한 사용자가 다른 곳으로 발길을 돌리는 것을 원하지 않는다면 앱을 최대한 빠르게 실행하는 것이 좋다.</p>\n<blockquote>\n<p>참고 및 출처</p>\n<p><a href=\"https://angular.kr/guide/universal\">서버 사이드 렌더링 (Server-side Rendering, SSR): Angular Universal</a></p>\n<p><a href=\"https://developers.google.com/web/updates/2019/02/rendering-on-the-web\">Rendering on the Web</a></p>\n<p><a href=\"https://linked2ev.github.io/devlog/2018/11/15/Javascript-2.-What-is-SSR/\">서버 사이드 렌더링(SSR:Server Side Rendering)이란?</a></p>\n<p><a href=\"https://poiemaweb.com/js-spa\">Single Page Application</a></p>\n</blockquote>","frontmatter":{"title":"서버 사이드 렌더링(SSR)","date":"June 12, 2020"}}},"pageContext":{"slug":"/JavaScript/Server_Side_Rendering/","previous":{"fields":{"slug":"/Today I Learned/css_grid와_scroll_snap_사용하기/"},"frontmatter":{"title":"css grid와 scroll snap 사용하기","category":"Today I Learned","draft":false}},"next":{"fields":{"slug":"/JavaScript/Prototype_Chaining/"},"frontmatter":{"title":"Prototype Chaining","category":"JavaScript","draft":false}}}},"staticQueryHashes":["3128451518","96099027"]}