이번에 Next.js로 과제를 진행을 했었는데, 과제를 진행하면서 굉장히 신기했다. 지식으로만 알고 있던 SSR과 CSR의 차이점을 몸소 느낀 부분들이 많았다. 일단 아래 SSR과 CSR의 차이점을 정리한 부분이다.
SSR(Server Side Rendering) 과 CSR(Client Side Rendering)
1. SSR이란?
서버 ⇒ 클라이언트
서버쪽에서 렌더링 준비를 끝마친 상태로 클라이언트에 전달하는 방식.
즉, 서버에서 이미 ‘렌더 가능한' 상태로 클라이언트에 전달되기 때문에, JS가 다운로드 되는 동안 사용자는 무언가를 보고 있을 수 있다.
특정 기능을 실행하기 위해 사이트 전체가 다시 로딩되는 문제가 발생한다.
- 검색 엔진 최적화
- 구글, 네이버와 같은 검색 사이트에서 검색했을 때 결과가 많이 노출될 수 있도록 최적화 하는 기법. 특히, SNS에서 링크를 공유했을 때 해당 웹 사이트의 정보를 이미지와 설명으로 표시해주는 OG(Open Graph) Tag를 페이지 별로 적용하기 위해서는 서버 사이드 렌저링이 효율적
- 빠른페이지렌더링
- 서버에서 미리 그려서 브라우저로 보내주기 때문에 페이지를 그리는 시간을 단축 할 수 있다.
- 정적인 사이트에 좋음
단점
- Node.js에 대해 알아야 한다.
- 서버쪽 환경 구성과 함께 클라이언트, 서버 빌드에 대한 이해 필요
- 잦은 서버 요청
- 모든 페이지를 리로딩
- 전체적으로 느린 페이지 렌더링
2. CSR이란?
브라우저의 자바스크립트를 통해 상호작용하는 방식.
클라이언트 사이드 렌더링은 초기 로딩 이후 서버 사이드 렌더링에 비해 빠르다는 장점이 있다. 웹페이지 일부만 불러온다.
- 서버에서 처리 없이 클라이언트로 보내주기 때문에 자바스크립트가 모두 다운로드 되고 실행이 끝나기 전까지 사용자는 볼 수 있는게 없다.
장점
- 사이트 상호작용 활발
- 초기 로딩 이후 빠른 웹사이트 렌더링
- 웹 애플리케이션에 좋음
- 자바스크립트 라이브러리 활용
- 동적인것에 좋다.
단점
- 제대로 구현하지 않을 경우 검색엔진최적화가 취약함
- 초기 로딩에 더 많은 시간이 걸림
- 대부분의 경우 추가적인 라이브러리를 필요로 함
- SSR과는 다르게 하나의 HTML파일로 모든 페이지를 구성하기 때문에 meta 태그 정의에 약점이 있다.
이런 차이를 알았는데, Next.js에 대해 찾아보면서 프로젝트를 진행하다보니, 더 색다르게 다가왔다. title부분을 각 페이지마다 바꿔주는 부분이나, pre-rendering 되는 부분, 정적으로 데이터를 받아오는 부분들 등 CSR과 확연히 달랐다. 각 페이지마다 메소드를 적절히 활용해주면, SEO에 특히 친화적이다. 아래는 Next.js에 대한 간략한 정리글이다.
NEXT.js란?
Next의 모든 페이지는 사전 렌더링(Pre-rendering)을 원칙으로 하고 있다.
사전 렌더링에는 두 가지 형태가 있다.
- 정적 생성
- SSR
두 형태를 구분하는 기준은 언제 html파일을 생성하는가? 에 있다.
정적 생성이란?
- 프로젝트가 빌드하는 시점에 html파일들이 생성됨
- 모든 요청에 빌드 파일을 재사용 (즉, 만들어 두고 요청이 들어 올때마다 재사용함)
- Next의 경우 정적 생성을 퍼포먼스의 이유로 권고하고 있다.
- 정적 생성된 페이지들은 CDN의 캐시가 된다.
- 만약 미리 만들어 놔도 상관없는 페이지의 구성인 경우, getStaticProps, getStaticPaths 사용해서 정적 생성
getStaticProps: 빌드시 고정되는 값으로, 빌드 이후에는 변경이 불가능하다
SSR이란?
- SSR은 매 요청이 들어올때 마다 html을 생성함
- 항상 최신 상태를 유지함
- 요청에 다이나믹한 구조가 필요한 경우, getServerSideProps 사용
getServerSideProps : 빌드와 상관없이, 매 요청마다 데이터를 서버로부터 가져온다.
'Frontend' 카테고리의 다른 글
useContext란? (0) | 2022.07.19 |
---|---|
Zustand - 상태 관리 라이브러리(굉장히편하다) (0) | 2022.06.27 |
발행 - 구독 패턴(Publisher - Subscriber) (0) | 2022.06.23 |
package.json에 대해 아시나요? (0) | 2022.05.26 |
함수 선언식과 표현식의 차이점(일반 함수와 화살표 함수의 차이점은?) (0) | 2022.04.25 |