* 렌더링 방식
1) CSR(Client Side Rendering)
리액트만으로 만들면 발생
렌더링하는 주체자가 클라이언트(브라우저)
- 장점) 한번만 로딩되면, 빠른 UX 제공
부분적으로 가져오니까 서버의 부하가 적음
- 단점) 페이지 로딩시간(TTV)이 길다(소스코드까지 다 다운-> FCP까지 오래걸림)
js 활성화 필수
SEO 최적화가 힘들다(크롤러들이 로드해서 확인하는게 아닌 이상은 빈페이지만 보여져서 확인하기 어려움)
보안에 취약함(클라이언트에 모든 코드와 키를 다운 받아야함)
CDN에 캐쉬가 안됨
=> 단점 해결 : SSG, SSR
2) SSG(Static Site Generation)
CSR의 문제로 인해 "옛날처럼 정적으로 배포하는게 어떨까?" 해서 나온 방법
렌더링하는 주체자가 서버, "언제 렌더링하냐"에 따라 SSG, SSR로 나뉘는 것
-> 배포해서 빌드할때 처음 렌더링
빌드할때 렌더링됨(ex. react코드를 html으로 변환)
사전에 미리 만들어두고 클라이언트에서 접속하면 html 보내줌 -> 다음 요청부터는 서버까지 가지 않아도 cdn에 캐시된 html파일을 빠르게 가져올 수 있음.
- 장점) 페이지 로딩시간(TTV)이 짧음(서버에서 미리 만들어둔 파일만 가져오면 되니까)
js 필요 없음
SEO 최적화가 좋음(웹 크롤러가 효율적으로 확인하고 인덱스 가능)
보안이 뛰어남
CDN에 캐쉬 됨
- 단점) 데이터가 정적임 -> 데이터가 가변적인 웹사이트라면 안좋음
사용자별 정보 제공의 어려움(모든 사용자들에게 동일 데이터를 주므로 사용자가 만명이라면 ..사용자별로 데이터 줄 것임? x)
=> 단점 해결 : ISR, SSR
3) ISR(Incremental Static Regeneration)
주기적으로 다시 만드는 방식
렌더링하는 주체자가 서버, 주기적으로 렌더링
-> 설정한 주기만큼 계속해서 다시 만들어줌
SSG와 동일한 원리이지만, 정해진 주기에 따라 페이지를 다시 렌더링하여 생성함
- 장점) 페이지 로딩시간(TTV)이 짧음(서버에서 미리 만들어둔 파일만 가져오면 되니까)
js 필요 없음
SEO 최적화가 좋음(웹 크롤러가 효율적으로 확인하고 인덱스 가능)
보안이 뛰어남
CDN에 캐쉬 됨
데이터가 주기적으로 업데이트 됨
- 단점) 주기적이긴 하지만 여전히 실시간 데이터는 아님
사용자별 정보 제공의 어려움
=> 단점 해결 : SSR
4) SSR(Server Side Rendering)
렌더링하는 주체자가 서버, 요청시 렌더링
클라이언트가 요청할때 새롭게 만들어 줌
- 장점) 페이지 로딩시간(TTV)이 짧음(서버에서 미리 만들어둔 파일만 가져오면 되니까)
js 필요 없음
SEO 최적화가 좋음(웹 크롤러가 효율적으로 확인하고 인덱스 가능)
보안이 뛰어남
실시간 데이터를 사용
사용자별 필요한 데이터를 사용
- 단점) 비교적 느릴 수 있음
서버에 과부하가 걸릴 수 있음(사용자별로 데이터 받아와서 페이지 만드니까, 오버헤드)
CDN에 캐쉬 안됨(요청할때마다 다시 만드니까)
* Hybrid Web App
한 어플리케이션 내에서도 각기 다른 렌더링 방식을 혼합해서 웹앱을 만들 수 있음
심지어 한 페이지 내에서도, 페이지 부분별로 섞어서 만들 수 있음
=> 각각 렌더링 방식별로 특징/장단점이 다르므로, 페이지 별 특징에 따라서 데이터가 얼마만큼 바뀌는지 어떤데이터인지에 따라 성능 높이기 위해 선택
* Hydration
넥스트에서 사용하는 하이브리드를 가능하게 하는 Hydration
1. 클라이언트에서 서버에 요청 보냄
2. 넥스트는 필요한 것들을 받아와서 페이지를 구성, 여기서의 페이지는 정적인 html페이지(사용자에게 의미있는 데이터를 먼저 보여주기 위해 ui보여줌: pre-rendering)
3. 사용자에게 페이지를 보여주기 위해 서버에서는 정적인 html 먼저 클라이언트에 보내줌.
(사용자는 클릭을 해도 이걸 처리할 코드가 없음, 아무 반응이 일어나지 않음)
4. 그 이후에 페이지에서 interaction처리를 위해 필요한 react 코드와 js 코드를 클라이언트에 보내줌
5. 클라이언트에서 이 소스코드와 라이브러리들을 다 다운받은 이후에는 Hydration을 해줌.(리액트로 페이지를 가득 채움, 컴포넌트 렌더링을 해서 정적인 html페이지 대신에 실제 컴포넌트 쓸 수 있게 해준다는 뜻.)
6. 이제부터는 실제 리액트의 컴포넌트이기 때문에, 사용자가 클릭하면 내부로직이 실행되며 요청이 처리됨
+ 예전 버전 넥스트 페이지를 보면 웹페이지를 보다가 순간 깜빡임이 발생하는 경우가 있음.
이 깜빡임이 정적인 html페이지를 실제 리액트 컴포넌트로 대체
'개인공부 > next' 카테고리의 다른 글
SEO (Search Engine Optimization), 검색 엔진 최적화 (0) | 2023.12.30 |
---|---|
정적 라우팅과 동적 라우팅 slug, generateStaticParams (0) | 2023.12.29 |
Next.js 공부 (1) (0) | 2023.12.14 |
Next.js app router (1) | 2023.12.08 |
React와 Next 차이 (0) | 2023.07.20 |