-정적 웹사이트 vs 동적 웹사이트
-빌드란?
-정적 웹사이트 형태로 만들어지는 현대의 웹 앱이 왜 빌드 과정을 필요로 하는지 알 수 있다.
-정적 웹사이트 배포, 디버깅
-Landing Page라 불리는 정적 웹사이트에서 사용하는 다양한 프론트엔드 기술들을 스스로 찾아볼 수 있다.
SSR vs CSR
이 콘텐츠에서는 SSR과 CSR(Client Side Rendering)의 차이점을 설명합니다.
웹 개발에서 이 두 가지의 차이점을 아는 것은 매우 중요합니다.
먼저 SSR과 CSR의 정의와 차이점을 설명합니다.
SSR은 Server Side Rendering의 줄임말입니다.
웹 페이지를 브라우저가 아니라 서버에서 렌더링합니다.
브라우저 -GET 요청-> 서버의 URI
서버 -정해진 웹 페이지 파일-> 브라우저
그리고 서버의 웹 페이지가 브라우저에 도착하면 완전히 렌더링됩니다.
서버에서 웹 페이지를 브라우저로 보내기 전에, 서버에서 완전히 렌더링했기 때문에 Server Side Rendering 이라고 합니다.
웹 페이지의 내용에 데이터베이스의 데이터가 필요한 경우,
서버는 데이터베이스의 데이터를 불러온 다음 웹 페이지를 완전히 렌더링 된 페이지로 변환한 후에
브라우저에 응답으로 보냅니다.
웹 페이지를 살펴보던 사용자가, 브라우저의 다른 경로로 이동하면 어떻게 될까요?
브라우저가 다른 경로로 이동할 때마다 서버는 이 작업을 다시 수행합니다.
CSR은 Client Side Rendering 을 의미합니다.
CSR은 클라이언트에서 페이지를 렌더링합니다. 웹 개발에서 사용하는 대표적인 클라이언트는 웹 브라우저입니다. 브라우저의 요청을 서버로 보내면 서버는 웹 페이지를 렌더링하는 대신,
=> 웹 페이지의 골격이 될 단일 페이지를 클라이언트에 보냅니다.
이때 서버는 웹 페이지와 함께 JavaScript 파일을 보냅니다.
클라이언트가 웹 페이지를 받으면, 웹 페이지와 함께 전달된 JavaScript 파일은 브라우저에서 웹 페이지를 완전히 렌더링 된 페이지로 바꿉니다.
웹 페이지에 필요한 내용이 데이터베이스에 저장된 데이터인 경우에는 어떻게 해야 할까요?
브라우저는 데이터베이스에 저장된 데이터를 가져와서 웹 페이지에 렌더링을 해야 합니다.
이를 위해 API가 사용됩니다.
웹 페이지를 렌더링하는 데에 필요한 데이터를 API 요청으로 해소합니다.
마지막으로, 브라우저가 다른 경로로 이동하면 어떻게 될까요?
CSR에서는 SSR과 다르게, 서버가 웹 페이지를 다시 보내지 않습니다.
브라우저는 브라우저가 요청한 경로에 따라 페이지를 다시 렌더링합니다.
이때 보이는 웹 페이지의 파일은 맨 처음 서버로부터 전달받은 웹 페이지 파일과 동일한 파일입니다.
The Difference
CSR과 SSR의 주요 차이점은 페이지가 렌더링되는 위치입니다.
Use SSR
Use CSR
SSR 예시
1)네이버 블로그
네이버 블로그는 2020년에 SSR 방식을 도입했습니다. 여러 가지 이유가 있겠지만 대표적인 이유는 SSR이 검색엔진 최적화(Search Engine Optimization, SEO)에 유리한 이점이 있기 때문입니다.
네이버 블로그의 네트워크 탭을 보시면: html 파일에 내용이 똑같이 담긴 상태인 것을 볼 수 있습니다.
따라서 구글, 네이버 같은 검색엔진 크롤러가 html에 접근하여 쉽게 내용을 가져갈 수 있습니다.
The NewYork Times
뉴욕 타임스 홈페이지도 SSR 방식을 사용하고 있습니다. SSR의 대표적인 단점인 많은 사용자가 클릭할 때마다 전체 웹사이트를 다시 서버에서 받아오기 때문에 발생하는 서버 과부하 이슈가 있음에도 불구하고, CSR에 비해 초기 로딩 속도가 빠르기 때문에 구독자가 신문기사를 빠르게 읽을 수 있다는 장점이 있습니다.
그뿐만 아니라 해당 신문사의 기사가 검색엔진에 노출되는 것이 중요하기 때문에 SEO(Search Engine Optimization)에 유리한 SSR을 이용하고 있습니다.
위의 예시를 보시면, todayspaper라는 완성된 html 파일을 받아와서 렌더링을 합니다. 그 html 파일 안에 해당 내용이 그대로 담겨있는 상태이기 때문에 검색엔진 크롤러가 내용을 수집하기 용이합니다.
CSR 예시
1)아고다
아고다뿐만 아니라 많은 예약 사이트들은 CSR을 사용하고 있습니다. SSR에서는 서버에서 렌더링을 해야 하기 때문에 상호작용(interaction)이 많아질수록 서버에 부담이 많은 반면에, CSR에서는 서버가 클라이언트에 필요한 데이터만 넘겨주기 때문에 부담이 적습니다. 그리고 SPA(Single Page Application)를 기반으로 화면의 일부만 받아온 데이터로 변경해 주기 때문에 빠른 렌더링으로 User Experience(사용자 경험)에 유리합니다.
최근까지 아래 예시처럼 html이 빈 페이지이기 때문에 검색엔진 최적화(SEO)를 하기에는 SSR에 비해 불리하다는 특징이 있었으나, 구글에서 이러한 부분을 보완하기 위해 삽입된 자바스크립트 코드를 분석, 실행시켜 크롤링을 하고 있습니다. 그러나 검색엔진 최적화가 꼭 필요한 서비스라면 조금 더 최적화에 유리한 SSR을 사용하는 것을 권장하고 있습니다.
정적 : html, css, js
-> 페이지가 정적인 게 아니라 not generated on the server, hosted on a server and lying there
source code doesn't change with the requests that we send
동적 : node sever.js
not done with js in browser but
static
html + css + js
not dynamically rendered on a server
(served by a server)
page content can change via js
=> doesn't mean that the page never changes
it's just pre-built during development
render in Browser, empty html + js file
=> higher reactivity but data needs to be fetched after initial rendering
SEO can't see the data, sees the empty page only
static host suffices, no complex server-side setup required
dynamic
server-side lang
returns dynamically generated html page
is not involved in page rendering after serving it
=> doesn't mean that there's no html page being served,
it's just built dynamically for each request
rendering happens on Server, finished page is served but needs to be generated first
security tends to be easier
host which supports the chosen server-side lang
얼핏 들으면, 정적 웹사이트보다 동적 웹사이트가 좀 더 최신 기술처럼 들릴지도 모르겠습니다. 하지만 현대의 2-tier Architecture에서는 정적 웹사이트의 사용이 더욱 보편적입니다. 그렇다면, 이 둘의 차이는 무엇이고 어떤 특징을 갖고 있을까요?
정적 웹사이트: HTML 파일(코드) 자체로 배포되는 사이트 (CSR, Client Side Rendering)
동적 웹사이트: 서버에 의해 HTML 파일이 동적으로 생성되는 사이트 (SSR, Server Side Rendering)
웹사이트 렌더링 방식의 변천
AJAX 이전에는요청에 따라 결과가 변하는 동적인 웹페이지를 만들려면, 서버가 매번 동적으로 생성하는 수밖에 없었습니다. 한편 동적 웹사이트를 받아오기 위해서는, 서버가 HTML의 형태로 브라우저에 제공해 주어야만 했기 때문에, 헤더나 푸터 등의 페이지 구성요소의 중복 요청/응답이 빈번했습니다.
따라서, 네트워크 상에서 주고받는 패킷의 크기가 다소 컸습니다.
이처럼 AJAX 이전에는 서버에서 웹페이지를 만드는 기술이 보편화되었고, 이러한 동적 웹사이트를 만드는 기술로는 PHP, JSP, ASP 등이 널리 사용되었습니다.
(물론 node.js로도 동적 웹페이지를 만드는 것이 가능합니다)
// 동적 웹페이지 예제 (node.js)
const http = require('http');
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/html'); // HTML 문서의 형태로 전달됨
res.end('<h1>동적 웹페이지</h1><p>with 랜덤한 값</p>' + Math.random()); // 서버에 의해서 동적으로 바뀜
});
server.listen(3000);
그러나, 점차 브라우저의 발달과 AJAX 기술이 보편화되면서, 모든 동적인 정보들을 서버가 부담할 필요는 없게 되었습니다. 필요한 부분만 클라이언트가 요청할 수 있게 되었고, 이로 인해 서버의 부하가 다소 줄어들게 되었습니다.
이에 따라 서버는 JSON과 같은 순수한 데이터 포맷만 제공해 주는 형태로 흐름이 바뀌기 시작했으며, 클라이언트 사이드, 즉 웹페이지는 자바스크립트와 AJAX 기술을 이용한 보다 고도화된 웹 앱, 즉 Single Page Application으로 변모하기 시작합니다. 자바스크립트가 동적인 렌더링을 지원하나, 결국 서버가 웹페이지를 렌더링하지 않으며, HTML/CSS/JS 파일의 소스 코드 그대로 작동하는 특징을 갖고 있기 때문에, 이는 정적 웹사이트입니다.
그렇지 않습니다. 클라이언트 사이드가 고도화된 것이 사실이지만, 앞서 CSR, SSR의 차이에서 살펴볼 수 있듯, SSR의 장점을 살리기 위해서 다양한 방법으로 동적 웹사이트가 만들어지기도 합니다. 성능의 향상을 극대화하기 위해 CCR, SSR의 하이브리드 형태로 구성하는 경우도 많습니
이처럼 현대의 웹 앱은 정적 웹페이지와 AJAX 기술을 함께 사용하며, SPA(Single Page Application)으로 변모함에 따라 클라이언트 사이드의 규모가 커지게 되었습니다.
이때 웹사이트 구성요소를 각 파일로 분리하는 모듈화가 이뤄지게 되며, React와 같은 클라이언트 기술이 발전하면서, 단일 파일로 자바스크립트나 페이지를 만드는 작업은 보다 고도화되기 시작했습니다.
고도화된 클라이언트 웹 앱은 수많은 모듈로 이뤄져 있습니다. 이처럼 수많은 모듈을 하나로 묶어주는 작업을 번들링(bundling)이라고 하며,
=> 이 과정에서 JSX 파일과 같이 브라우저에서 자체적으로 해석이 불가능한 다양한 보조 기술들을 브라우저가 해석할 수 있도록 만들어주는 작업들이 수반되었습니다.
이러한 과정을 통칭해 "소프트웨어 빌드"라고 부릅니다.
소프트웨어 빌드는, 소스코드를 실행 가능한 결과물로 변환하는 작업을 의미합니다.
다양한 모듈은 정적 파일들로 결과가 만들어져야만 하며, 따라서 이러한 빌드 과정은 배포에 필수적입니다.
예를 들어, React 프로젝트를 내 로컬 컴퓨터에서 자체적으로 실행하기 위해서는 npm start로 개발 서버를 실행해 줘야
하지만, 인터넷상에 배포하기 위해서는 이러한 개발 서버를 실행할 필요가 없으며, 정적 파일을 호스팅하는 서비스에 결과물만 업로드하면 됩니다.
Create React App 등으로 생성한 React 프로젝트의 경우에는, npm build 명령어가 package.json 파일에 포함되어 있으며, 이는 모듈을 정적인 파일로 만들어주게 됩니다.