프론트 개발자라면 단순히 코드 개발하는 것을 뛰어넘어 브라우저가 어떤 동작을 하는지, 어떻게 렌더링을 수행하는지에 대해 아는 것이 굉장히 중요하다. 결국 내가 친 코드는 브라우저라는 브라우저라는 소프트웨어 프로그램 상에서 수행되기 때문이다. 아무리 잘 짜여진 코드라도 그 코드가 수행될 프로그램의 동작 방식에 대해 이해하지 못한다면, 코드가 의도한 대로 퍼포먼스를 내기란 어려울 것이다.
1. URI에 접속한다.
2. 브라우저는 서버로부터 HTML 문서를 모두 전달 받아 읽어들인다.
HTML
, CSS
, JS
, Web Assembly
뿐이다.php
, jsp
, asp
같은 서버 템플릿 언어도 기본적으로는 HTML으로 내려주게 되어 있다<link>
: 외부 리소스와 연결시켜주는 태그이다. 보통 CSS 파일에서 많이 쓰며 해당 태그도 만나면 연결된 주소를 통해 외부 리소스를 다운 받는다.<script>
: JS 파일과 연결시켜주는 태그이다. 해당 태그를 만나면 잠시 렌더링을 멈추고 다운로드를 받기 시작한다. JS 파일이 크면 클수록 렌더링이 느려지는 이유도 있다.<img>
: Link와 마찬가지로 외부 리소스와 연결시켜주는 태그이다. 해당하는 외부 리소스를 다운로드 받아온다. (이 과정은 mp4, 비디오, 오디오 요소도 마찬가지이다)3. 렌더링 엔진은 전달받은 HTML 문서를 파싱하여 DOM 객체 모델을 만든다.
* 파싱
: 브라우저의 렌더링 엔진이 HTML 파일을 위에서 아래로 한 줄씩 읽어 내려가는 것
DOM이란?
Document Object Model이다. 트리 구조로 이루어진 객체 모델이다.
4. 다운 받았던 외부 CSS 파일과 함께 포함된 스타일 요소를 파싱해 CSSOM 객체 모델을 만든다.
CSSOM이란?
CSS Object Model 이다. 해당 객체 모델 또한 트리 구조로 이뤄진다.
어휘와 구문을 분석하여 CSS 파일을 파싱하고, 파싱 트리를 생성한다.
5. 3에서 만든 DOM 트리와 4에서 만든 CSSOM 트리를 합쳐 렌더 트리를 구축한다.
* 모든 HTML은 기본적으로 다 스타일을 가지고 있기 때문에 CSS가 없는 HTML은 없다.
6. Layout을 한다.
7. Paint를 한다.
이 과정을 Render라고 한다!
더 자세히 브라우저 렌더링 과정에 알고 싶다면 이 글을 보면 된다!
CSR, SSR은 브라우저 상에 그릴 콘텐츠를 어디서 만드는가가 기준이다.
결과적으로 웹에서 콘텐츠를 만들어 유저에게 보여주겠다는 목표는 같으며, 그 목표를 이루기 위한 방법으로 클라이언트 사이드 렌더링은 클라이언트에서 HTML을 DOM을 이용해서 만들어 화면에 그리는 것이고,
서버 사이드 렌더링은 서버에서 HTML을 만들어서 내려보내준다는 점의 차이만 있다!!
➡ 여기서 말하는 클라이언트는 브라우저를 뜻한다. 하지만 원래 브라우저에서 하지 않나?
라는 생각이 들 수도 있다. 다만 여기서 말하는 브라우저에서의 렌더링은 DOM - Render Tree - Layout - Paint- Render
의 과정을 거친다. DOM은 HTML이 파싱되면서 나온 객체 모델이다.
➡ 파싱할 HTML은 가장 기초적인 것만 가져가고, 나머지는 JS를 이용해서 DOM을 만들고, 만들어진 DOM을 HTML에 덧붙여주면 어떨까?
라는 생각에서부터 시작을 했다! 따라서 나머지 HTML을 모두 DOM을 이용해 그리기 때문에 실제 HTML 파일 자체의 용량은 낮아지게 되었다. 이것은 최초에 사이트에 접근해 다운 받는 HTML 자체의 용량은 적어지기 때문에, 페이지를 로딩하는 데에 드는 시간이 비약적으로 줄어든다는 장점을 가지게 된다.
➡ 하지만 장점만 있는 것은 아니다! HTML을 기본적인 것만 가져가고 나머지는 전부 DOM을 이용해 그리기 때문에 JS 파일이 그만큼 커지게 된다. 따라서 script 태그를 통해 JS 파일을 다운로드 해오는 데에 드는 시간이 상대적으로 늘어나게 된다. 그러나 JS를 사용해 DOM을 직접 만들어 그려주고 있기 때문에, 어떻게 보면 필요한 DOM만 그때 그때 만들어서 쓴다는 것은 HTML을 다시 불러오지 않고 JS에서 그때마다 DOM을 새로 만들어서 구현한다는 것에 집중할 수 있다!
➡ React
, Angualr
, Vue
등이 있다.
이 라이브러리들은 브라우저에서 컴포넌트를 만들어, 그 컴포넌트를 브라우저 화면에 그리는 것 (렌더링) 을 최우선 목표로 하고 있다. 컴포넌트를 만드는 것은 JavaScript로 DOM을 만드는 것과 같다. 따라서 기본적으로 해당 라이브러리들은 CSR을 수행한다.
➡ 실제로 JS로 일일히 DOM을 생성하고, 붙이고, 그리는 과정은 굉장히 번거롭다. 그래서 해당하는 라이브러리들은 일일히 DOM을 생성하고, 붙이고, 그리는 과정을 대신 해준다. (ex. React의 JSX)
예전에는 페이지 A에서 B로 넘어가는 과정이 부자연스러웠다(traditional web)고 한다. 항상 넘어가는 과정에서 흰색 화면이 노출되어 화면이 깜빡이는 현상이 있었고, 데이터를 갱신할 때마다 새로고침을 해줘야하는 것이 필수여싿고 한다. 또한 사이트 이동 사이에는 약간의 로딩이 필요한데 새로고침을 해야만 데이터를 불러올 수 있어서 로딩 인디케이텨를 보여줄 수 없어서 UX적으로 마이너스였다고 한다. 하지만 데이터를 불러오는 레이어에서 좀 빠르다는 장점도 있었다고 하였다. 즉, 클라이언트 사이드 렌더링은 UX를 위해 나왔다고 할 수 있다! 그러나 HTML을 그리는 것외에는 모든 것을 JS언어로 해결하기에 JS 번들 사이즈가 많이 커지게 되어서 크롬 같은 브라우저의 메모리가 많이 잡아먹는다는 것을 작업관리자를 통해 알 수 있다. 그럼에도 클라이언트 사이드 렌더링을 통해 한 번 렌더링을 시키고 난다면 그 다음에는 빨라지고, 렌더링 최적화만 잘 시켜준다면 유저 경험 측면에서 긍정적인 영향을 줄 수 있다!
실시간성이 보장되어야하는 사이트들이다. 지메일이나, 구글 DOCS와 같이 실시간으로 데이터를 전송 받아야하는 사이트들 트위터나 인스타그램, 페이스 북 같이 유저 간의 교류가 실시간으로 일어나는 SNS 사이트들이 클라이언트 사이드 렌더링을 하면 좋은 사이트들이다!
서버에서 진행하는 렌더링을 서버 사이드 렌더링이라고 한다.
서버 사이드 렌더링은 보통 웹 콘텐츠가 많을 때 많이 쓰이는 렌더링 방식이다. 서버에서 콘텐츠를 만들어서 웹으로 내려보내 렌더링을 하는 방식이다. 여기서 서버에서 콘텐츠를 만들어서 웹으로 내려보낸다는 의미는 서버에 존재하는 데이터베이스(DB)에서 마련된 API를 받아와 그 API에서 필요한 데이터를 받고, 그 데이터를 통해서 HTML을 만드는 것이 모두 서버에서 이뤄진다는 뜻이다.
SSR을 이용한다면 서버에서 HTML을 만들어줘서 웹으로 내려보내주기에 속도면에서 훨씬 이점을 보인다. 왜냐하면 서버가 가진 컴퓨팅 파워, 즉 자체적인 성능이 브라우저가 가진 성능보다 훨씬 우월하기 때문이다.
또한 검색엔진에서 서버 사이드 렌더링으로 만든 웹사이트를 우선적으로 노출시킬 수 있다. 이것은 검색 엔진 최적화라고도 한다. 서버 사이드 렌더링을 사용하면 콘텐츠가 쓰는 속도가 클라이언트 사이드 렌더링보다 빠르기 때문에 훨씬 빠르게 웹사이트가 뜰 것이고, 그렇기에 상위 노출이 가능해져 최적화에 훨씬 유리하다.
하지만 최초 로딩은 빠를 수 있지만 두번째 페이지로 이동할 때에는 CSR이 더 빠를 수 있습니다. 그렇기에 두 개의 장단점을 사용하여 잘 활용할 수 있어야 합니다.
Next.js
를 사용하는 방법Node.js
에서 템플릿 엔진을 활용하는 방법Hydrate
를 사용해서 서버 사이드 렌더링처럼 동작시키는 방법