Next 개념

Next.js 소개
16년도에 제작된 리액트 프레임워크
Vercel은 클라우드 플랫폼을 서비스하는 회사이기 때문에 Next.js 로 만든 웹앱을 Vercel을 통하여 쉽게 배포가 가능함.
리액트 공식사이트에서도 서버사이드 렌더링으로 추천하는 프레임워크
경쟁툴로는 Remix가 존재.
Remix vs Next.js 를 비교하는 글은 다음 블로그를 참조 (링크)
Remix가 더 좋을 것 같은 느낌이 들지만, 아직 Next.js가 너무나 강세인 상황

Next.js 6가지 원칙

16년
1.
복잡한 설정 없이 프레임워크를 사용하기 쉽도록 하겠다.
2.
자바스크립트로 모든 것을 하겠다. (풀스택)
3.
개발자가 설정 없이 자동 코드스플릿팅 과 서버렌더링을 제공하겠다. (렌더링 속도 향상)
4.
데이터 패칭을 설정 가능하게 만들겠다. (위치, 어떻게 등등)
5.
요청사항을 예상 가능하게 만들겠다. (필요한 부분을 미리밀 예측하여 보여주겠다.)
6.
배포를 손쉽게 만들겠다.
20년 7월 9.3 버전
ISR 추가 (특정 주기별 렌더링)
ReWrite, ReDirect추가
22년 10월 13 버전
폴더링 라우팅 추가
중첩 레이아웃
서버 컴포넌트
스트리밍
new toolchain(Turbopack) = webpack을 능가하는 모듈 번들러

Next.js가 추구하는 기능

React Framework
Full-stack
File-based Routing
SEO, Image, Font Optimization
Server Side Rendering
Hybrid Rendering

렌더링 방식

CSR

Client Side Rendering
렌더링의 주체 : 클라이언트(브라우저)
장점?
한번 로딩되면, 빠른 UX 제공
서버의 부하가 적음.
단점?
페이지 로딩 시간 TTV = FCP(First Contentful Paint)가 길다.
브라우저 설정에서 자바스크립트 활성화가 필수
SEO 최적화가 어려움
보안 취약
CDN에 캐시가 불가능

SSG

Static Site Generation
렌더링의 주체 : 서버
언제 렌더링 하는가 : 빌드할 때
장점?
CDN에 캐시가 가능하기 때문에, 자주 서버로 요청할 경우, 캐시된 데이터를 보내줌.
페이지 로딩 시간 TTV = FCP(First Contentful Paint)가 적다.
자바스크립트 활성화 필요 없음.
SEO 최적화 좋음
보안이 좋음
CDN에 캐시 됨
단점?
빌드 시점에 렌더링이 되어 있기 때문에, 데이터가 정적임.
사용자별로 정보 제공의 어려움

ISR

Incremental Static Regeneration
렌더링의 주체 : 서버
언제 렌더링 하는가 : 주기적인 렌더링 (시간단위 설정가능)
장점?
페이지 로딩 시간 TTV = FCP(First Contentful Paint)가 적다.
자바스크립트 활성화 필요 없음.
SEO 최적화 좋음
보안이 좋음
CDN에 캐시 됨
데이터가 주기적으로 업데이트 됨.
단점?
주기적이긴 하지만, 필요한 경우 최신화된 데이터를 제공하지 않음.
사용자별로 정보 제공의 어려움

SSR

Server Side Rendering
렌더링의 주체 : 서버
언제 렌더링 하는가 : 요청시 렌더링
장점?
페이지 로딩 시간 TTV = FCP(First Contentful Paint)가 적다.
자바스크립트 활성화 필요 없음.
SEO 최적화 좋음
보안이 좋음
실시간 데이터를 사용
사용자별 동적인 데이터를 받을 수 있음.
단점?
요청마다 서버에서 렌더링 되기 때문에, SSG, ISR 대비 느릴 수 있음.
서버의 과부하가 걸릴 수 있음.
요청할 때마다 페이지를 만들기 때문에 CDN에 캐시가 불가능.

Hybrid

필요에 따라, 렌더링 방식을 2개 이상 홉합하여 사용한다.
예시)

Hydration (SSG, ISR, SSR)

Hydration은 Server Side 단에서 렌더링 된 정적 페이지와 번들링된 JS파일을 클라이언트에게 보낸 뒤, 클라이언트 단에서 HTML 코드와 React인 JS코드를 서로 매칭 시키는 과정을 말한다.
1.
사용자에게 페이지를 빠르게 보여주기 위하여 서버에서 정적인 html 페이지를 보여준다. (이 때, 화면은 보이나 클릭이벤트가 동작이 안됨.)
2.
서버에서 React 코드(js파일)를 보내줌.
3.
브라우저에서 React 코드(js파일)를 받아 하이드레이션(컴포넌트 렌더링)을 하여 정적인 페이지 대신에 리액트 코드로 대체하는 작업을 함. (이후, 클릭이벤트 등이 동작 가능)

어떤 경우에 어떤 렌더링 방식을 사용해야 하는가?