MPA는 새로운 페이지를 요청할 때마다 정적 리소스가 다운로드된다. 매번 전체 페이지가 다시 렌더링 된다.
SPA는 웹 에플리케이션에 필요한 모든 정적 리소스를 최초 한 번에 다운로드한다.
그 이후 새로운 페이지 요청이 있을 때, 페이지 갱신에 필요한 데이터만 전달 받아서 페이지를 갱신한다.
👉 SPA를 CSR(Client Side Rendering) 방식으로 렌더링한다고 말한다.
👉 MPA를 SSR(Server Side Rendering) 방식으로 렌더링한다고 말한다.
CSR은 Client Side Rendering의 약자이며, CSR은 body가 비어있는 HTML을 최초 다운받는다. 이후 화면에 그려주기 위해 필요한 JS 파일을 내려받는 과정이 필요하다. JS 파일까지 내려받으면 실행한 후 화면에 그려줄 HTML을 만들어주는 과정을 거친다.페이지가 변경되더라도 최초의 JS를 다운받아 렌더링할 때 모든 페이지를 다 가지고 있으므로 서버에게 요청하지 않는다.(대표적으로 React, Vue, Angular, Svelte가 있다)
SSR은 Server Side Rendering의 약자이며, 웹 브라우저가 서버에서 렌더일을 진행하고 연산, 분석이 완료된 HTML 파일을 화면에 뿌려주는 것을 의미합니다.
👍 MPA 장점
👎 MPA 단점
그런데 CSR 방식으로 만든 SPA 앱은 검색엔진최적화(SEO)가 어렵다.
일반적인 SPA 앱을 검색로봇 입장에서 보면 모든 페이지의 소스가 아래와 같이 보인다. 해당 페이지 접속 후 페이지 소스보기 시 HTML이 비어있는 모습을 확인할 수 있다.
👍 SPA 장점
👎 SPA 단점
⚠️ 주의점
CRS != SPA
전통적인 웹페이지 렌더링 방식 != SSR
SSR과 CSR 두 가지 렌더링 방식에 대해 살펴보았는데 다시한번 정리하자면 이렇다.
차이점으로 초기렌더링속도, SEO, 보안이 있다.
SPA를 SSR 방식으로 렌더링 할 수도 있다?!
React 애플리케이션을 위한 Next.js 프레임워크가 있다면, Vue를 위해 SSR을 지원하는 프레임워크가 Nuxt.js이다.
정의하자면 Nuxt.js는 Vue를 기반으로 하여 SSR 기반의 Web Application을 컴포넌트 단위로 개발 할 수 있게 해주는 프레임워크이다.
Angular, React, Vue SPA 삼대장들이 출시되고 나서 SPA의 단점을 극복하고자 많은 노력들이 있었지만, 정통 SSR(MPA) 방식의 장점을 완벽하게 커버하기란 불가능 하였다. 그래서 SSR(MPA) 방식에서 SPA의 장점 중 일부라도 누려보기 위해서 나온 프레임워크가 Next.js(React 기반), Nuxt.js(Vue 기반)들이 아닐까 추측된다.
Next.JS의 작동원리는 다음과 같다.
create-react-app로 만든 React.js 앱은 CSR(Client-Side-Rendering)이고,
creat-next-app로 만든 Next.js 앱은 SSR(Server-Side-Rendering)이다.
1) React 동작 방식 (CSR)
유저와 서버, 브라우저 각각의 입장을 나눠서 생각하면 이해하기가 쉽다. (브라우저는 유저와 앱의 연결통로)
유저가 브라우저를 통해 앱에 접속하면,
앱은 브라우저에게 javascript 정보가 들어있는 빈 html 문서을 전달한다. 즉, 브라우저에게 javascript파일을 전달하는 것으로 볼 수 있다.
브라우저는 javascript파일을 다운로드하고 동시에 유저는 빈 화면을 보게 된다(접속에 대한 응답).
브라우저에서 js 파일의 다운로드가 끝나면, 리액트 코드가 있는 js파일을 실행한다.
브라우저에 있는 리액트 코드가 UI를 렌더링한다. (동적으로 렌더링)
유저는 드디어 앱이 보여주고자 했던 화면을 보게 된다.
즉, 브라우저가 javascript 코드를 가지고 있지 않거나, 요청 중인 상태라면 UI를 구성할 수 없고, 유저는 빈 화면을 보게 된다. 리액트 코드가 실행되기 전까지는 유저 화면에 아무것도 보이지 않는 것이다. 이렇게 클라이언트 측에서 UI를 빌드하는 것을 CSR 방식이라 한다.
2) Next 동작 방식 (SSR)
Next.js란 무엇인가?
Next.js는 리액트를 위해 만든 오픈소스 자바스크립트 웹 프레임워크로, 리액트에는 없는 서버 사이드 렌더링server-side rendering(SSR), 정적 사이트 생성static site generation(SSG), 증분 정적 재생성incremental static regeneration(ISR)과 같은 다양하고 풍부한 기능을 제공.
유저와 서버, 브라우저 각각의 입장을 나눠서 생각하면 이해하기가 쉽다. (브라우저는 유저와 앱의 연결통로)
유저가 브라우저를 통해 앱에 접속하면,
서버에서 리액트를 실행한다.
리액트는 UI를 렌더링한다.
렌더링된 결과를 통해 브라우저에게 HTML을 제공한다. 이때 유저는 앱의 초기화면을 보게 된다(접속에 대한 응답).
이후 브라우저는 리액트 코드가 있는 Javascript 파일을 다운받고 실행시킨다. 이때부터 일반적인 리액트 앱과 같이 CSR의 동작(동적 렌더링)을 하게 되고 이 과정을 hydration이라고 한다.
즉, 서버에서 UI를 모두 구성한 후 유저에게 응답해 화면을 보여주는 방식으로, 화면이 pre-rendering되어 유저는 인터넷 속도에 상관없이 화면에 뭔가 나오는 것을 볼 수 있다. 이렇게 서버 측에서 UI를 렌더링하는 것을 SSR 방식이라 한다.
cf) hydration - 리액트 코드가 브라우저에 이미 존재하는 HTML과 동기화하여 앱이 동적으로 상호작용할 수 있도록하는 과정
리액트에서 라우트 시스템을 구축하기 위해 사용할 수 있는 2가지 선택지
리액트 라우터(React Router): 가장 많이 사용되는 리액트의 라우팅 관련 라이브러리입니다. 컴포넌트 기반으로 라우팅 시스템을 설정할 수 있습니다.
Next.js: 리액트 프로젝트의 프레임워크이며 파일 경로 기반으로 작동합니다. 다양한 기능(리액트 프로젝트 설정을 하는 기능, 라우팅 시스템, 최적화, 다국어 시스템 지원, 서버사이드 렌더링 등)을 제공합니다.
Library vs Framework
React.js는 라이브러리이고, Next.js는 React.js의 프레임워크이다.
이 둘의 궁극적인 차이점은 "응용 프로그램의 흐름 주도권을 누가 가지고 있느냐"이다.
1) Framework
코드를 작성하는 기본적인 틀을 제공해서 보다 효율적으로 어플리케이션을 만들 수 있도록 하는 소프트웨어 환경
2) Library
어플리케이션을 만들 때 필요한 자원(기능: 함수)의 모임
즉, React에서는 우리가 모든 것을 직접 생성하고 설정해 주었던 것들이 Next에서는 이미 만들어져 있다.
Next.js는 브라우저에 렌더링 할때 기본적으로 pre-rendering(사전 렌더링)을 해준다.
사전 렌더링이란? Server단에서 DOM 요소들을 Build하여 HTML 문서를 렌더링하는 것을 말합니다.
위 사진처럼 HTML을 미리 렌더링하고, 그 뒤에 요청이 오면 Chunk 단위로 javascript를 보내주어 이벤트가 작동하게 되는 것이 Hydration이며, Next.js에서 사용되는 방법입니다.
https://narup.tistory.com/230
이러한 빌드 과정, 웹 페이지 요청 과정이 SSR인 것은 아니다!
서버에서 pre-rendering하는 것까지가 Next.js의 특징인 것이고, pre-rendering을 동적으로 해서 페이지를 생성하느냐, 정적으로 페이지를 생성하느냐의 차이가 SSR과 SSG의 차이라고 생각하면 된다.
정적 사이트 생성기는 누가 접속하든 항상 동일한 내용을 보여주는 웹사이트롤 만들 때 적합한 방식이다. 즉 미리 서버에 화면을 저장해두었다가 꺼내쓰는 방식이다. 그래서 컨텐츠 변경이 잦지 않은 소규모 웹사이트를 제작할 때 유용하며 사이트도구는 Gastsby, Hugo등을 주로 사용한다.
만들어 놓은 웹페이지를 그대로 보여주기 때문에 빠르다는 장점이 있다. 컨텐츠를 자주 업데이트하는 사이트에는 빌드시간이 길어져 비효율적이다.
SSR은 요청 시 서버에서 즉시 HTML을 만들어 응답하기에 데이터가 달라지거나 자주 바뀌어서 미리 만들어 두기 어려운 페이지에 적합하고, SSG는 페이지들을 서버에 모두 만들어 둔 후에 요청 시 해당 페이지를 응답하는 것이므로 바뀔 일이 거의 없어 캐싱해두면 좋을 페이지에 사용하면 적합하다.
https://gyyeom.tistory.com/56
https://blog.naver.com/pjt3591oo/222533482899
https://eunjinii.tistory.com/105
https://dev-ellachoi.tistory.com/28
https://1nnovator.tistory.com/77
https://velog.io/@ka0son/%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%82%BC%ED%98%95%EC%A0%9C-CSR-SSR-SSG-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://velog.io/@wong0220/TIL-SPACSR-SSRTTVTTISSG