이번 포스팅에서는 SPA기반 SSR의 개념과 동작 원리, 구현 방법을 다룹니다. 이런 개념과 동작 원리, 구현 방법을 상세히 알지 못하고 SSR프레임워크를 사용시 구현과 버그 대응에 어려움을 겪을 수 있습니다. 이를 공부함으로써 SPA기반 SSR앱을 구현 시, 자신감 있게 구현할 수 있습니다!!
SSR ( Server-side Rendering )이란?
말그대로 서버에서 렌더링을 합니다.
과정
1. 최초 요청 시, 서버에서 사용자에게 렌더링할 준비가 된 full HTML파일을 보내준다.
서버가 이미 렌더링 할 준비가 된 full HTML을 응답하기 때문에 사용자는 이때부터 아래와 같은 의미있는 (Contentful)컨텐츠를 볼 수 있습니다.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test-ssr</title>
<style data-styled="true" data-styled-version="5.2.1">
.gEplBc {
background-color: #aaaaaa;
border: 1px solid blue;
}
/*!sc*/
data-styled.g1[id="App__Container-atnr6o-0"] {
content: "gEplBc,"
}
/*!sc*/
</style>
</head>
<body>
<div id="root">
<div class="App__Container-atnr6o-0 gEplBc">
<button data-page="home">Home</button>
<button data-page="about">About</button>
<div>
<h3>This is about page</h3>
</div>
</div>
</div>
<script src="/dist/main.23427ea2a2813f223cb6.js"></script>
</body>
</html>
2. 필요한 자원(JS, CSS...) 등을 다운로드 합니다.
3. 브라우저에서 리액트를 실행한다. 이 과정에서 최초 요청 시, 서버에서 사용자로부터 응답한 HTML파일의 요소들을 리액트가 흡수(hydration)하여 리액트의 Shadow DOM을 만들어 냅니다.
4. 위 과정이 모두 끝나면 유저는 컨텐츠를 볼 수 있을 뿐만 아니라, 인터랙티브하게 사용할 수 있습니다.
CSR ( Client-side Rendering) 이란?
과정
1. 최초 요청 시, 서버에서 사용자에게 아래와같은 빈 HTML파일을 보내줍니다.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<link rel="icon" href="/favicon.ico"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="theme-color" content="#000000"/>
<meta name="description" content="Creatrip admin site"/>
<link rel="apple-touch-icon" href="/logo192.png"/>
<link href="https://fonts.googleapis.com/css?family=Nanum+Gothic:400,700&display=swap&subset=korean" rel="stylesheet"/>
<title>Admin | Creatrip</title>
<link href="/static/css/2.101d5f7a.chunk.css" rel="stylesheet">
<link href="/static/css/main.6b8af435.chunk.css" rel="stylesheet">
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!-- ... -->
<script src="/static/js/2.57f617cf.chunk.js"></script>
<script src="/static/js/main.84842dc5.chunk.js"></script>
</body>
</html>
2. 필요한 자원(JS, CSS...)등을 다운로드 한다.
3. 브라우저에서 리액트를 실행한다. 이떄, 리액트는 빈 HTML문서를 채워넣을 DOM요소를 만들어내 채운다.
4. 위 과정이 모두 끝나면 유저는 컨텐츠를 볼 수 있고, 인터랙티브하게 사용할 수 있습니다.
SSR vs CSR 성능 비교
- SSR은 Contentful HTML을 최초 응답으로 보내고, CSR은 비어있는 HTML을 최초응답으로 보내기 때문에 FCP는 SSR이 우세합니다.
- SSR은 최초 응답까지 서버 사이드에서 렌더링하는 시간이 소요되고, CSR은 정적 파일(HTML, CSS, JS등)을 바로 응답하기 때문에 TTFB는 CSR이 우세합니다.
- TTI는 상황에 따라 달라집니다. SSR은 hydration과정에서 부하가 일어나 Interactive해지는 시점이 늦춰질 수 있습니다. CSR또한 컨텐츠를 위한 데이터 패칭등의 병목으로 인해 Interacitve해지는 시점이 늦춰질 수 있습니다.
'React > ReactJs' 카테고리의 다른 글
SPA기반 SSR구현하기 - 3 (0) | 2022.02.20 |
---|---|
SPA기반 SSR 구현하기 - 2 (0) | 2022.02.19 |
React - Code-spliting, Lazy Reloading (0) | 2022.02.19 |
Webpack을 통한 React개발환경 구축하기 (0) | 2022.02.19 |
useMemo, useCallback, ( React.memo ) (0) | 2022.02.18 |