ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Next.JS로 웹사이트 만들기
    코드잇 부스트 2024. 11. 15. 09:29

    Next.JS

    • 토픽 소개
      • 프리렌더링
      • Vercel을 이용한 호스팅
      • 파일 시스템 기반 라우팅
      등 Next.JS로 해결할 수 있다.
    • 리액트를 활용한 클라이언트 사이드 렌더링의 경우 초기로딩이 느리고 검색 엔진에 제공할 수 있는 정보가 적다.
    • 프로젝트 생성위 코드로 next.js 프로젝트를 생성할 수 있다.위 명령어로 개발 모드로 들어갈 수 있다.
    • npm run dev
    • npx create-next-app .
    • css 적용
    • @를 이용하여 전역 경로를 설정할 수 있다.
    • 위와 같이 app.js 에서 import 하면 전역 css를 적용할 수 있다.
    • 전역 css 적용하기
    • 다음과 같이 css를 적용할 수 있다.
    • styles에서 css를 정의한다.
    • 초기 프로젝트는 다음과 같이 4개의 디렉토리를 가지고 있다.
    • Next.js에서 css 적용하기.

    라우팅

    • 페이지 나누는 법[] 대괄표기법을 사용하면 다이나믹 라우팅을 사용할 수 있다.
    • 이는 폴더에도 자유롭게 사용 가능하다.
    • 폴더를 사용하면 다중 path를 사용하게 된다.
    • pages 폴더에 js 파일을 만들고 export하면 파일명을 path로 사용하게 된다.
    • next.js에서는 파일시스템 기반 라우팅을 사용한다.
    • Link 컴포넌트 임포트 후 Link를 사용하면 효율적으로 불러올 수 있다.
    • import Link from 'next/link';
    • next.js에서는 a태그는 Link로 대체하면 된다.
    • a태그로 path를 변경하면 전체 html을 전부 요청해서 받아온다.
    • useRouter: 쿼리 사용하기param 값은 다음과 같이 useRouter를 import 해서 가져온다.“주소/search?q=티셔츠”
    • 쿼리 값은 다음과 같이 가져올 수 있다.
    • useRouter: 페이지 이동하기import한 router에 push메소드로 path를 이동할 수 있다.
    • 실습 api 주소https://www.codeit.kr/tutorials/55/watchit-api-documentation
    • https://www.codeit.kr/tutorials/53/codeitmall-api-documentation
    • api 연동하기lib라는 폴더를 생성한 후 axios.js 파일을 생성한 뒤, axios instance를 생성해준다.다음과 같이 api를 요청하고 불러올 수 있다.
    • 리다이렉트Redirects - Next.js다음과 같이 source와 destination 주소를 지정해줌으로 리다이렉트를 할 수 있다.
    • 개발자 도구의 네트워크 탭에서 preserve를 체크하면 리스폰스를 확인할 수 있다.
    • 틀린 주소로 접속 시 맞는 주소로 바꿔주는 기능.
    • 커스텀 404 페이지
    • pages 폴더에 404.js 파일을 만들면 커스텀 404 페이지를 만들 수 있다.
    • 커스텀 app과 documentdocument 컴포넌트에서는 html 태그의 lang속성이나 html 태그를 추가할 수 있다.
    • React에서 사용하는 기능은 사용할 수 없다.
    • 공통된 컴포넌트는 app컴포넌트에 구현하면 된다.
    • Context 활용하기위 useEffect를 추가함으로 document 컴포넌트에 class를 react 코드없이 적용할 수 있다.마지막으로 이를 export하여 useTheme()라는 Hook으로 themeContext의 값을 받아올 수 있다.불러오기다음과 같이 쉽게 불러올 수 있다.
    • (context의 적용은 app.js에서 전역적으로 하면 된다.)
    • lib에 ThemeContext.js에서 Context를 정의해주었다.
    • Context 정의하기
    • API 라우팅 (선택)Next.js에서는 페이지를 만드는 것처럼 간단하게 백엔드 API를 만들 수 있다.
    • https://nextjs.org/docs/api-routes/introduction

    사이트 완성하기

    • Image 컴포넌트 소개next.js에서는 최적화된 이미지 태그를 지원한다.레이지 로딩이 적용되어 필요한 순간에만 이미지를 불러온다.
    • 이미지를 불러오면 최적화된 사이즈로 확인할 수 있고,
    • import Image from 'next/image'
    • Image 컴포넌트 사용법Image 태그는 반드시 width랑 height를 지정해줘야한다.다른 방법으로는 fill 속성을 사용하여 상위 컴포넌트에 가득 채우는 방식이있다.이는 css에서 objectFit : cover을 사용해서 방지할 수 있다.
    • 외부 이미지의 hostname과 pathname을 지정해줌으로 사용할 수 있다.
    • next.js에서는 외부 이미지를 사용할 경우 미리 next.config.js 에서 처리를 해주어야 한다.
    • 외부 이미지 사용법
    • fill 속성을 사용하면 이미지의 모양이 망가질 수 있다.
    • Head 컴포넌트
    • icon을 public 폴더에 넣고 다음과 같이 하면 아이콘을 설정할 수 있다.
    • js파일에서 Head 태그를 사용하면 title을 설정할 수 있다.
    • 구글 폰트 적용하기app.js 에서 Noto*_*Sans 폰트를 적용하는 방법은 다음과 같다.subsets는 사용할 언어를 지정해준다. (영문만 사용하는 폰트라면 ['latin'])아니면 Next.js에서 제공하는 Head 컴포넌트를 활용해서 전역 스타일로 적용할 수도 있다.
    • 폰트를 적용하고 개발자 도구를 열어서 Network 탭의 세부 탭인 Font 탭을 살펴보면 구글 사이트가 아니라, 우리 사이트에서 폰트 파일을 받아 온다. 이는 초기 로딩 속도를 빠르게 최적화한다.
    • <Head> <style>{` html { font-family: ${notoSansKR.style.fontFamily}, sans-serif; } `}</style> </Head>
    • 폰트 객체를 만들고 문자열로 굵기를 지정해준다.
    • import { Noto_Sans_KR } from '@next/font/google'; const notoSansKR = Noto_Sans_KR({ weight: ['400', '700'], subsets: [], });
    • 빌드하기와 실행하기next.js에서도 이 과정이 필요하고, 이를 빌드한다고 표현한다.위 코드를 실행하면 .next에 빌드 파일이 생성된다.
      npm run start 
      
      위 코드로 서버를 실행할 수 있다. (빌드 이후)
    • next.js 서버와 웹브라우저와 api는 서로 상호작용한다.
    • 이는 소스코드를 실행할 수 있는 상태로 변환하는 것이다.
    • npm run build
    • jsx는 브라우저에서 바로 실행할 수 없어서 트랜스파일이라는 과정을 거친다.
    • 프로젝트를 GitHub에 올리기
    • https://www.codeit.kr/topics/building-a-website-with-nextjs/lessons/5975

    프리렌더링

    • 프리렌더링이란?즉 HTML 코드를 받아오기 전에 렌더링을 하는 것이다.빈화면이 보였다가 렌더링이 진행된다.)빌드과정에서 HTML을 생성한다.서버사이드 렌더링이점.검색 엔진이 최적화 된다. (빈 HTML이 아니기 때문)
    • 초기 로딩이 빨라진다.
    • 웹브라우저가 get요청을 보낼 때마다 HTML을 생성해서 보내준다.
    • 이후 웹브라우저에서 Pre-Rendering된 HTML과 리액트를 연결한다. (Hydration)
    • 정적생성
    • (React는 초기 빈 HTML을 보낸 뒤 JS를 통해 페이지를 렌더링하기 때문에
    • 웹페이지 로딩 이전에 렌더링을 진행하는 것.
    • 정적 생성 1
    • 정적 생성을 하는 시점에서 받은 데이터를 초기데이터로 보내주는 방식으로 자주 바뀌는 데이터에는 적절하지 않은 방법이다.
    • 이를 컴포넌트에 Props로 내려주는 식이다.
    • 위 함수에서는 리액트 Hook을 사용할 수 없다.
    • 위와 같이 getStaticProps라는 함수를 export하면 정적생성 시 next.js가 함수를 실행시킨다.
    • next.js 에서는 빌드를 하면 자동으로 정적생성을 실행한다.
    • 정적 생성 2다이나믹 페이지 경로에서의 정적생성은 다음과 같이 context로 진행한다.또 다이나믹한 경로의 경우 어떤 path로 정적생성을 진행할지 위와 같이 지정을 해주어야 한다.true로 해두면 접근시 api요청을 보내 값을 받아온다.
    • 모든 path를 하드코딩해서 적어두는 방식보다 위와 같이 효율적으로 구현이 가능하다.
    • (존재하지 않는 경로에 대한 처리는 try catch문으로 진행하면 된다.)
    • fallback 값을 false로 해두면 정적생성된 이외의 경로에 접근시 따로 처리하지 않는다는 뜻이다.
    • 서버사이드 렌더링쿼리스트링의 값은 정적생성시 알 수 없다.q값은 products와 같이 Props로 페이지에 내려준다.자주 변하는 값이 있는 경우 서버 사이드 렌더링을 사용하는 것이 적절하다.
    • 서버사이드렌더링과 정적생성은 동시에 사용할 수 없다.
    • 따라서 다음과 같이 getServerSideProps라는 함수를 사용한다.
    • 클라이언트에서 데이터 주고 받기입력폼을 만들어 서버와 데이터를 주고 받는 시나리오에선 프리렌더링으로 불러온 값을 초기값으로 state에 저장해서 사용한다.입력폼을 submit한 이후 response를 sizeReviews에 넣어주면 제출과 즉시 반영이 가능해진다.setReviews를 사용할 때는 콜백함수로 사용해야한다.
    • setMovieReviews((prevMovieReviews) => [ nextMovieReview, ...prevMovieReviews, ]);
    • sizeReviews라는 값을 intitialSizeReviews라는 값으로 가져와서 state에 초깃값으로 넣어준다.
    • 렌더링 과정 살펴보기
      1. 프리렌더링 HTML을 받아옴
      2. 필요한 json만 받아옴
      따라서 새로고침보다 Link로 이동할 경우 json만 받아오기 때문에 훨씬 빠르다.
    • next.js에서는 최적화가 잘 되어있어서 그때그때 필요한 데이터만 불러와서 렌더링을 진행한다.
    • 정적생성 vs SSR
      • 항상 최신 데이터를 보여 줘야 하는 경우
      • 데이터가 자주 바뀌는 경우
      • 리퀘스트의 데이터를 사용해야 하는 경우 (예: 헤더, 쿼리스트링, 쿠키 등)
      그 외에 특별한 이유가 없다면 되도록 정적 생성을 하는 걸 권장한다.
    • App Router 소개Next.js 13.4 이후 버전부터는 App Router라는 새로운 라우팅을 지원한다.서버에서만 렌더링되는 컴포넌트라는 점이 기존의 컴포넌트와의 차별점이다. 그 밖에도 공통된 레이아웃을 적용하는 방식이나, 메타데이터를 사용하는 방식, 그리고 데이터를 받아오는 방식 등이 달라졌습니다.React Server Component(RSC)란?리액트 서버 컴포넌트와 리액트 클라이언트 컴포넌트의 문법에서 가장 큰 차이는 데이터를 가져오는 방식입니다. 클라이언트에서 리퀘스트를 보내서 데이터를 받아오거나, Next.js에서 프리렌더링을 한다면 데이터를 Props로 내려받는데, 리액트 서버 컴포넌트를 사용하면 컴포넌트를 async/await 함수로 만들 수 있고, 함수 최상위(top-level)에서 await 로 데이터를 가져올 수 있습니다.
    • async/await를 사용해서 컴포넌트 함수를 작성하기 때문에 훨씬 직관적인 문법으로 컴포넌트를 개발할 수 있고, 서버에서 모든 데이터를 가져온 다음 렌더링까지 해서 보내주기 때문에 서버와 클라이언트가 여러 번 리퀘스트를 주고받을 때보다 빠르게 페이지를 보여줄 수 있다. 게다가 서버 컴포넌트 렌더링에 필요한 자바스크립트는 서버에서만 실행하기 때문에 클라이언트가 다운로드해야 할 자바스크립트 코드의 양도 줄어든다.
    • 리액트 서버 컴포넌트는 서버에서만 렌더링하는 컴포넌트이다. 기존에 사용하던 컴포넌트 방식은 서버 컴포넌트와 구분하기 위해서 리액트 클라이언트 컴포넌트라고 부르기도 한다.
    • Introducing Next.js App Router - Vercel on Youtube
    • App Router의 가장 큰 차이는 /pages 폴더가 아닌 /app 폴더에 페이지 컴포넌트들을 추가한다는 것이다. 이 페이지 컴포넌트들은 기본적으로 리액트 서버 컴포넌트(React Server Component)이다.
    • 우리가 이번 챕터에서 배웠던 것은 Pages Router라고 부른다.

    '코드잇 부스트' 카테고리의 다른 글

    코드잇 부스트 조각집 토이 프로젝트 회고  (2) 2024.10.29
    GIt  (0) 2024.08.05
    실용적 유닉스 커맨드  (0) 2024.08.05
    리액트로 데이터 다루기  (0) 2024.08.05
    React 웹 개발 시작하기  (0) 2024.07.13
Designed by Tistory.