서버로 부터 완전하게 만들어진 html파일을 받아와 페이지 전체를 렌더링 하는 방식이다.
중요한 부분은 렌더링 주체가 ‘서버’ 라는 점이다.
CSR은 페이지를 브라우저에서 서버로 부터 받은 JS 파일을 이용하여 직접 렌더링 하는 것을 의미한다.
중요한 부분은 렌더링 주체가 ‘브라우저’ 라는 점이다.
리액트로 구성된 CSR을 사용하는 프로젝트 페이지에서의 네트워크 탭을 통하여 파일을 어떻게 로드하고 있는지 살펴보자.
처음으로 HTML 파일을 로드 하는 부분이다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="theme-color" content="#000000" />
<title>Chatting</title>
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
</body>
</html>
그 후 리액트 관련 JS파일과 UI를 구현하고 상호작용에 필요한 JS파일을 다운받아 오는 것을 볼 수 있다.
mainJS 파일은 Minfy, Uglify 되어 알아볼 수 없는 코드로 구성되어 있는 것을 확인할 수 있다.
/*! For license information please see main.37b3cf38.js.LICENSE.txt */
function(){var e={892:function(e){e.exports=function(){"use strict";var e=1e3,t=6e4,n=36e5,r="millisecond",o="second",i="minute",a="hour",u="day",l="week",c="month",s="quarter",f="year",d="date",p="Invalid Date",h=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,v=/\
...
//# sourceMappingURL=main.37b3cf38.js.map
JS 코드를 이용하여 페이지에 필요한 콘텐츠를 동적으로 구성한다.
그 후 탭을 눌러 페이지를 이동하여도 필요한 데이터가 없다면 더 이상 서버에 HTML 파일을 요청하지 않는 것을 확인하였다.
그럼 이제 node + Express로 구성된 SSR을 사용하는 프로젝트 페이지를 살펴보자.
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/codemirror/theme/midnight.css">
<script src="/codemirror/lib/codemirror.js"></script>
<script src="/codemirror/mode/javascript/javascript.js"></script>
<script src="/codemirror/addon/edit/matchbrackets.js"></script>
<script src="/codemirror/addon/edit/closebrackets.js"></script>
<script src="/codemirror/addon/hint/show-hint.js"></script>
<script src="/codemirror/addon/hint/javascript-hint.js"></script>
<script src="/codemirror/addon/selection/active-line.js""></script>
<title>CodeWars</title>
</head>
<body>
<h2>피보나치 수열</h2>
<h4>정답자: 15명</h4>
<h4>난이도: Level 1</h4>
<div>설명: 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.</div>
<form action="/problems/627904cdd626d53e513898aa" method="post">
<textarea id="code" name="code"></textarea>
<button type="submit" class="submitButton">submit</button>
</form>
<script >
CodeMirror.fromTextArea(document.getElementById("code"), {
lint: true,
lineNumbers: true,
tabSize: 2,
styleActiveLine: true,
mode: "text/javascript",
matchBrackets: true,
autofocus: true,
autoCloseBrackets: true,
theme: "midnight",
}).setValue("function solution(arg) {\n // here!\n}");
</script>
</body>
</html>
그 후 필요한 JS 파일을 다운받는다.
그리고 마지막으로 CSR과 SSR의 로드한 파일의 크기를 비교해보자.
CSR과 SSR의 기본 개념과 각각의 장단점을 살펴보았다.
조사하고 느낀점은 어떤 방식이 더 우월하다는 것이 없다라고 느꼈다.
페이지 이동이 많고 유저와 상호작용이 많은 넷플릭스의 경우 CSR을 적극적으로 활용하고, 페이지 이동이 적고 SEO를 최적하여 검색 결과 상위에 위치해야 하는 회사 홈페이지의 경우 SSR이 적절할 것이다.
서비스의 성격에 따라 적절한 방식을 채용하고, 또 필요에 따라서 두가지를 섞는 방법도 고려해야 할 것이다.
그리고 이번 주제를 조사하면서 CSR과 SSR를 적절하게 섞을 수 있는 리액트 프레임워크인 ‘NextJS’ 에도 눈길이 갔다.
Next.js by Vercel - The React Framework
다음 조사 주제로 좋은 재료인 거 같다.
A Deep Dive into Server-Side Rendering (SSR) in JavaScript
The Benefits of Server Side Rendering Over Client Side Rendering