작년 9월, 팀원들과 새로운 프로젝트를 Next.js를 사용하여 구현해보던 중이었다. 그 때 당시에는 졸업 프로젝트와 학업에 떠밀려 Next.js의 여러 장점을 채 알지 못한채 기존의 CSR로 작동하는 React프로젝트처럼 사용했던 것 같다. 구현하면서도 Image
최적화나 파일기반 시스템정도만 체감했다. 이번기회에 Next.js의 기술에 몇주간 공부했던 점을 기록해보려 한다.
Next를 사용하는 주요 이유를 구글링해보면 SSR(Server Side Rendering)이라고 나온다.
그런데 지금까지 공부한 내용을 보면 Next.js을 사용하는 이유는 그것만이 아니라는 생각이 든다.
이 노트에서는 Next.js의 대표적인 장점인 사전렌더링이 무엇이고 그것이 기존의 React앱과 비교하여 어떤 기술적 가치가 있는지 알아보자
먼저 React.js의 기본적인 동작방식인 CSR은 클라이언트측(브라우저)에서 직접 화면을 랜더링하는 방식이다.
이과정을 조금 찬찬히 보자면
브라우저에게 전송되는 JS 번들에는 이 서비스에서 접근가능한 모든 컴포넌트 코드가 존재한다. 때문에 이 첫 초기접속과정 이후, 사용자가 링크나 버튼을 클릭해서 페이지를 이동하게 되더라도 브라우저는 서버에게 새로운 페이지를 요청하지 않아도된다.
즉, 초기접속이 발생한 시점부터 화면이 보이기 까지 꽤 오랜시간이 소요된다.
이러한 지표를 FCP(first contentful pain)이라고 하는데 FCP는 웹페이지의 성능을 대표할 정도로 중요한 지표이다.
그렇다면 Next.js는 CSR의 이런 단점을 어떻게 해결했을까?
Client Side Rendering
의 단점을 효율적으로 해결하는 기술이해를 돕기위해 freeform으로 동작방식을 정리해 보았다..
// 여기까지 진행된 과정에서는 사용자에게 화면이 보이기는 하나 아직 클릭이나 페이지 이동과 같은 인터랙션(상호작용)은 동작하지 않는다. ( 상호작용은 HTML이 아닌 JS가 처리하는 영역이기 때문이다. )
이렇게 요청으로 부터 사용자가 인터렉션이 가능해질때까지 걸리는 시간을 TTI라고 한다.
Next.js의 이러한 사전렌더링 활용한 렌더링에는 SSR, SSG, ISR, on-demand ISR이 있다.
✅ 리액트앱의 단점 해소 →( 초기접속요청과정에서 ) 빠른 FCP 달성
✅ 리액트앱의 장점 승계 → ( 초기접속이후 ) 빠른 페이지 이동
CSR은 초기접속시간이 걸리는 대신, 보여지는 시간과 인터렉션이 가능해지는 시간(TTI)가 동일하지만,
SSR은 빠른 FCP를 달성하고 쾌적한 페이지 이동이 가능하지만, 보여지는 시간과 인터렉션이 가능해지는 시간사이에 공백이 생길 수 있다는 점을 알게되었다.
개인적으로는 초기접속요청이후 사용자가 빈화면이 랜더링되길 기다리도록 놔두는 것보다, 일단 무엇이라도 보여준 이후 빠르게 인터렉션할 수 있도록 하는 것이 좋다고 생각이든다.