https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-nextjs?srsltid=AfmBOop98SToIvyP4ZLiwetJfX_FMn0dbu097kRsUWsuX9BOUxCY1Ihi
위 내용을 바탕으로 강의를 수강하며 정리하였습니다.
현재 많은 기업에서 사용되고 있는 안정적인 라우터
React Router처럼 페이지 라우팅 기능 제공
Pages라는 이름의 폴더를 기준으로 페이지를 라우팅
Pages 이름의 폴더 아래에 JS 파일이 있다면 파일의 경로와 이름에 따라 페이지 라우팅 제공


동적 경로(Dynamic Routes): 경로 상에 어떠한 가변적인 값을 포함하고 있는 경로
원하는 위치에 프로젝트 폴더 생성
나의 폴더 위치: .../onebite-next/
vscode로 열기
vscode를 열어서 생성한 폴더 열기
터미널에서 section2 폴더 생성
vscode에서 터미널을 열어서 npx create-next-app@14 section02 명령어 실행
→ Ok to proceed에서 y 입력
→ 타입스크립트를 사용할 거냐는 질문에 Yes 선택 후 엔터
→ ESLint를 사용할 거냐는 질문에 Yes 선택 후 엔터
→ Tailwind CSS를 사용할 거냐는 질문에 No 선택 후 엔터
→ src/ 디렉토리를 사용할 거냐는 질문에 Yes 선택 후 엔터
→ App Router를 사용할 거냐는 질문에 No 선택 후 엔터
→ import alias를 사용할 거냐는 질문에 No 선택 후 엔터
import alias: 임포트 문을 사용할 때 절대 경로를 사용해서 값을 불러올 수 있게 하는 그러한 기능
npx 명령어create-next-app 명령어@14 명렁어npm run dev 명령어 실행Ctrl+D나 Ctrl+C 입력Pages 폴더의 index.tsx 확인
Home 컴포넌트가 사용되고 있는 것을 확인 가능
/src/pages/test.tsx 파일 새로 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter01/src/pages/test.tsx
→ http://localhost:3000/test 로 이동하면 화면에 TEST가 출력되는 것을 확인 가능
Pages 폴더의 _app.tsx, _document.tsx 확인
Pages 폴더 밑에 있긴 하지만 페이지 역할을 하는 파일은 아님
Next.js 앱의 모든 페이지에 공통적으로 적용될 로직이나 공통적으로 적용될 레이아웃 또는 데이터를 다루기 위해 필요한 파일
_app.tsxComponent 매개변수: 현재 페이지 역할을 할 컴포넌트를 받음pageProps 매개변수: Component 매개변수에게 전달될 페이지의 프롭스들을 모두 객체로 보관한 것export default function App({ Component, pageProps }: AppProps) {
return (
<>
<header>글로벌 헤더</header>
<Component {...pageProps} />
</>
);
}_document.tsxnext.config.mjs 파일
넥스트 앱의 설정을 관리하는 파일
기본적으로 reatStrictMode가 true로 켜져 있는데, false로 수정 (실습시 디버깅 용이함을 위해)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: false,
};
export default nextConfig;
한입 북스(Onebite Books) 프로젝트
vscode로 section02 폴더 열기
→ vscode 터미널을 열어서 npm run dev로 서버 열기
src/pages/index.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter02/src/pages/index.tsx
src/styles/global.css 코드 수정
전부 삭제
src/styles/Home.module.css 코드 파일 삭제
src/pages/search/index.tsx 코드 생성경로의 끝에 물음표와 함께 명시되는 값이므로 페이지 경로 자체에는 영향을 주지 않음
= 폴더 구조를 따로 변경해야 하지는 않음
단, 사용을 위해서는 파일의 최상단에 useRouter라는 훅을 Next Router라는 패키지로부터 불러오면 됨
import { useRouter } from "next/router";
Next.js는 전달한 쿼리 스트링을 읽는 과정 중에서 컴포넌트를 한 번 더 렌더링 함
→ 한 번 더 렌더링 할 때 쿼리 스트링을 읽어옴
쿼리 스트링을 읽는 방법
const { q } = router.query;
const { id } = router.query;
북 페이지는 가변적인 값을 포함하는 동적 경로를 사용
→ url 파라미터를 사용해서 동적 경로를 갖는 페이지 생성
src/pages/book/[[...id]].tsx 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter02/src/pages/book/%5B%5B...id%5D%5D.tsx
[...idx].tsx라고 설정해두면 실제 웹에서 http://localhost:3000/book/123/123/123/123 과 같이 접속하게 될 경우, 모든 id에 다 대응할 수 있음[[...idx]]tsx라고 설정해두면 실제 웹에서 http://localhost:3000/book 과 같이 접속하게 될 경우에도 404 에러가 뜨지 않고 접속 가능src/pages/404.tsx 코드 생성
Key Point: 어떻게 하면 클라이언트 사이드 렌더링 방식으로 페이지를 이동시킬 수 있는가?
section02 폴더 열기npm run dev로 서버 열기src/pages/_app.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter03/src/pages/_app.tsx
Next.js 앱에서는 링크를 만들 때 <a> 태그보다 자체적으로 제공하는 링크 컴포넌트를 이용하는 것이 훨씬 좋음
<a> 태그는 클라이언트 사이드 렌더링 방식
"사전에 미리 불러온다"
Next.js의 프리페칭
▼ 아래의 동작 과정은 현재 페이지에 대해서만 동작하는 것
▼ 최종 동작 과정
웹에서 프리패칭 확인 방법
F12 - 네트워크를 통해 페이지를 이동시키면 불러오는 JS 코드들을 확인 가능vscode로 section02 폴더 열기
→ vscode 터미널을 열어서 npm run build로 서버 열기
npm run dev로 개발 모드를 가동해놓고 있을 때에는 프리패칭 동작 X
→ 프리패칭 동작을 확인하려면 빌드에서 실행하는 프로덕션 모드로 실행 시켜야 함
/src/pages/_app.tsx 코드에서와 같이 <Link> 컴포넌트로 명시된 경로가 아니라면 프리패칭이 이루어지지 않음
그렇다면 어떻게 해야 하는가?
→ 앱 컴포넌트가 화면에 마운트 되었을 때, 라우터 객체의 특정 메서드를 통해 프로그래메틱하게 테스트 페이지를 프리매칭 하도록 코드 작성하면 됨
/src/pages/_app.tsx 코드 수정▼ 아래와 같이 수정하면 됨
<Link href={"/search"} prefetch={false}>
search
</Link>
Next.js에서 API를 구축할 수 있게 해주는 기능
API Routes 공식 문서
https://nextjs.org/docs/pages/building-your-application/routing/api-routes
사실상 자주 사용되는 기능은 아니기 때문에... 우선 있다 정도로만 알고 있기
section02 폴더 열기npm run dev로 서버 열기/src/pages/api/ 아래에서 동작하는 파일은.../src/pages/api/time.ts 코드 생성
section02 폴더 열기npm run dev로 서버 열기리액트의 컴포넌트 스타일을 설정하는 과정과 동일
앱 컴포넌트가 아니라면 css 파일을 그대로 불러오는 것은 제한
WHY? css 충돌 방지를 위해
그렇다면 css는 어떻게 불러와야 할까?
→ Next.js가 기본적으로 제공하는 CSS 모듈 기능 활용 가능
: 기존의 css 파일을 마치 모듈처럼 사용할 수 있도록 돕는 기능
: CSS 파일에 작성해둔 클래스 네임들이 다른 css 파일과 중복되지 않도록 자동으로 클래스 네임들을 유니크한 이름으로 파일마다 변환시켜주는 기능
/src/pages/index.tsx 파일의 컴포넌트 스타일 지정
index.tsx에서 직접 <style> 태그를 통해 설정하기index.tsx에서 불러오기/src/pages/index.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter06/src/pages/index.tsx
/src/pages/index.module.css 파일 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter06/src/pages/index.module.css
section02 폴더 열기npm run dev로 서버 열기완성본 데모 사이트
https://onebite-books-page-woad.vercel.app/
글로벌 레이아웃 설정을 위해서는 Next.js 앱의 모든 페이지의 부모 컴포넌트 역할을 하는 루트 컴포넌트인 _app.tsx 컴포넌트의 레이아웃을 적용시켜주면 됨
글로벌 레이아웃을 설정하는 컴포넌트 추가해서 코드 분리
/src/components/global-layout.tsx 코드 생성/src/components/global-layout.css 코드 생성/src/styles/globals.css 코드 수정 - 백그라운드 스타일 지정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter07/src/styles/globals.css
/src/pages/_app.tsx 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter07/src/pages/_app.tsx
section02 폴더 열기npm run dev로 서버 열기완성본 데모 사이트
https://onebite-books-page-woad.vercel.app/
일부 페이지에만 존재하는 레이아웃을 설정하는 방법 알아보기
당연하게도 일부 페이지에만 존재하려면 /src/pages/_app.tsx에 컴포넌트를 추가하면 안 됨
→ 제작한 컴포넌트가 추가되길 원하는 페이지의 파일에 (자체 제작한) getLayout() 메서드를 추가해서 활용
함수와 메서드 관련 보충 자료
https://reactjs.winterlood.com/0f33b159-6b19-433b-8db4-68d6b4a122e0
검색 레이아웃 틀 생성: src/components/searchable-layout.tsx 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter08/src/components/searchable-layout.tsx
검색 레이아웃 디자인 생성: src/components/searchable-layout.css 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter08/src/components/searchable-layout.css
생성한 검색 레이아웃 틀을 원하는 페이지에 적용: /src/pages/index.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter08/src/pages/index.tsx
생성한 검색 레이아웃 틀을 원하는 페이지에 적용: /src/pages/search/index.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter08/src/pages/search/index.tsx
루트 컴포넌트 수정: src/pages/_app.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter08/src/pages/_app.tsx
다시 듣기
section02 폴더 열기npm run dev로 서버 열기/src/pages/index.tsx 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/pages/index.tsx
/src/pages/index.module.css 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/pages/index.module.css
도서 아이템 리스팅을 위한 코드 생성: src/components/book-item.tsx 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/components/book-item.tsx
src/components/book-item.tsx에 필요한 데이터 타입을 별도로 생성: /src/types.ts 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/types.ts
도서 아이템 리스팅의 디자인 코드 생성: src/components/book-item.module.css 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/components/book-item.module.css
mock 데이터 생성: src/mock/books.json 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/mock/books.json
검색 기능 동작 구현: src/pages/search/index.tsx 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/pages/search/index.tsx
북 페이지 수정: src/pages/book/[id].tsx 파일명 수정 + 코드 수정
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/pages/book/[id].tsx
북 페이지의 디자인 구현: src/pages/book/[id].module.css 코드 생성
https://github.com/onebite-nextjs/vod__onebite-next-codes/blob/main/section02/chapter09/src/pages/book/[id].module.css