서버 사이드 렌더링은 UI를 서버에서 렌더링하는 것을 의미한다.
일반적으로 초기의 학습하는 리액트 프로젝트는 기본적으로 클라이언트 사이드 렌더링을
하고 있다. 클라이언트 사이드 렌더링은 UI렌더링을 브라우저에서 모두 처리하는 것이다.
즉, 자바스크립트를 실행해야 우리가 만든 화면이 사용자에게 보인다.
한 번 CRA로 프로젝트를 생성하고 개발 서버를 실행해보고, 크롬 개발자 도구의 네트워크 탭을 열고 새로고침을 해보길 바란다. 맨 위에 있는 localhost를 선택하고 Response를 보면
root 엘리먼트가 비어있는 것을 확인할 수 있다. 즉 이 페이지는 처음에 빈 페이지라는 뜻이다.
<div id="root"></div>
그 이후에 자바스크립트가 실행되고 리액트 컴포넌트가 렌더링되면서 우리에게 보이는 것이다.
서버 사이드 렌더링을 구현하면 사용자가 웹 서비스에 방문했을 때 서버 쪽에서 초기 렌더링을
대신해준다. 그리고 사용자가 html을 전달받을 때 그 내부에 렌더링된 결과물이 보인다.
서버사이드 렌더링은 결국 원래 브라우저가 해야할 일을 서버가 대신 처리하는 것이므로 서버 리소스가 사용된다는 단점이 있다. 갑자기 수많은 사용자가 동시에 웹 페이지에 접속하면 서버에 과부하가 발생할 수 있다. 따라서 사용자가 많은 서비스라면 캐싱과 로드 밸런싱을 통해 성능을 최적화해 주어야 한다.
또한 서버 사이드 렌더링을 하면 프로젝트의 구조가 좀 더 복잡해질 수 있고, 데이터 미리 불러오기, 코드 스플리팅과의 호환 등 고려해야 할 사항이 더 많아져서 개발이 어려워질 수도 있다.
서버 사이드 렌더링과 코드 스플리팅을 함께 적용하면 작업이 꽤나 까다롭다.
별도의 호환 작업 없이 두 기술을 함께 적용하면 다음과 같은 흐름으로 작동하면서 페이지에 깜박임이 발생한다.
1. 서버사이드 렌더링된 결과물이 브라우저에 나타남
2. 자바스크립트 파일 로딩 시작
3. 자바스크립트가 실행되면서 아직 불러오지 않은 컴포넌트를 null로 렌더링함
4. 페이지에서 코드 스플리팅된 컴포넌트들이 사라짐
5. 코드 스플리팅된 컴포넌트들이 로딩된 이후 제대로 나타남.
이러한 이슈를 해결하려면 라우트 경로마다 코드 스플리팅된 파일 중에서 필요한 모든 파일을 브라우저에서 렌더링하기 전에 미리 불러와야한다.
지금 공부하는 리액트 네이티브를 다루는 기술책에서는 이 문제를 해결하기 위해
Loadable Components라는 라이브러리에서 제공하는 기능을 써서 서버 사이드 렌더링 후 필요한 파일의 경로를 추출하여 렌더링 결과에 스크립트/스타일 태그를 삽입해주는 방법을 써서 해결한다.
내일은 실습을 해봐야겠다.
출처 및 참고 : 리액트를 다루는 기술