Next.js 시작하기

김채은·2022년 5월 23일
post-thumbnail

🐇 CSR vs SSR

CSR과 SSR의 차이를 알아보기 전에 MPA와 SPA에 대해 알아보자.

SPA(Single Page Application)

  • 한 개의 페이지로 구성된 어플리케이션이다.
  • 최초 한 번 페이지를 전체 로드하고, 특정 부분만 데이터를 바인딩해서 렌더링한다.

MPA(Multi Page Application)

  • 여러 개의 페이지로 구성된 어플리케이션이다.
  • 인터렉션이 발생했을 때 서버로부터 정적 리소스가 다운로드 된다.
  • 페이지를 이동하거나 새로고침하면 페이지 전체를 새로 렌더링한다.

일반적으로 MPA를 SSR로, SPA를 CSR로 렌더링한다고 말한다. 그렇다면 CSR과 SSR은 무엇일까?

CSR(Client-Side Rendering)

  • 클라이언트에서 초기화면을 요청하면 서버에서 완전한 리소스를 응답한다.
  • 장점
    • 페이지에서 이벤트가 발생했을 때 수정된 데이터가 있다면 바로 표시된다.
    • 데이터가 수정될 때 깜빡임이 없기 때문에 사용자 친화적이다.
  • 단점
    • 모든 Javascript 파일을 다운 받아야 해서 초기 로딩이 오래 걸린다.

SSR(Server-Side Rendering)

  • 서버로부터 완전하게 만들어진 HTML을 받아와 전체 렌더링한다.
  • 장점
    • 필수 요소를 먼저 가져오기 때문에 초기 로딩이 빠르다.
    • 화면을 구성하는 각가의 페이지가 있고, 모든 데이터가 HTML에 담겨져 브라우저에 전달되기 때문에 SEO(Search Engine Optimization)에 유리하다.
  • 단점
    • 페이지를 요청할 때마다 새로고침되기 때문에 사용자 경험이 나빠진다.
    • 페이지를 매번 서버에 요청하기 때문에 서버 부하가 발생할 수 있다.

🐇 Next.js는 무엇인가?

Next.js는 리액트 프레임워크이며 다음과 같은 기능들을 지원한다. 공식문서를 참고하여 Next.js의 기능들을 정리해보았다.

Pre-rendering

  • Next.js는 모든 페이지를 pre-renders한다. 클라이언트 측의 Javascript로 모든 작업을 수행하는 대신 HTML을 미리 생성한다.
  • SSG, SSR을 가능케 하며 SSR과 CSR을 혼합하여 사용할 수 있다.

Code splitting

  • 자동으로 어플리케이션 번들을 작은 청크로 나눈다.
  • 요청된 페이지만 로딩하게 함으로써 초기 로딩 시간을 줄일 수 있다.
  • Dynamic import를 사용해서 모듈이 호출될 때만(사용될 때만) 모듈을 import 한다.

Client-side routing

  • Link 태그를 통해 client-side route transition이 가능하다.
  • Client 내부에서 Routing 하므로 root부터 해당 페이지까지 차례로 로딩한다.
  • Link 컴포넌트가 뷰포트에 보였을 때 관련한 페이지를 백그라운드에서 미리 가져다 놓는다.
  • 따라서 사용자가 빠르게 해당 페이지로 이동할 수 있고, 화면 전환 시 깜빡임이 없다.

CSS-in-JS 라이브러리

  • Javascript 코드 안에서 CSS를 사용할 수 있다.
  • 다만 성능에 영향을 줄 수 있다.
<style jsx>{`
        p {
          color: blue;
        }
        div {
          background: red;
        }
        @media (max-width: 600px) {
          div {
            background: blue;
          }
        }
 `}</style>

🐇 빠르게 시작하기

프로젝트 초기화

npx create-next-app@latest --typescript

타입스크립트를 사용하지 않을 땐 뒤의 --typescript 부분을 제외하면 된다.

프로젝트 실행

npm run dev

페이지 생성

자동 생성된 pages 디렉터리에 파일과 폴더를 생성하면 자동으로 Routing 된다. init 폴더 안에 first-page를 생성하고 다음과 같이 작성해주었다.

const firstPage = () => {
  return <div>Let's start!</div>;
};
export default firstPage;

http://localhost:3000/init/first-page 에 접속하니 first-page가 화면에 뜬다.

Reference
Next.js 공식문서

profile
배워서 남주는 개발자 김채은입니다 ( •̀ .̫ •́ )✧

0개의 댓글