React는 클라이언트 사이드 렌더링(CSR) 방식을 사용하고 Next.js (SSR)를 지원한다.
CSR 방식은 클라이언트 측에서 데이터를 처리하기 때문에 속도가 빠르다는 장점이 있다.
반면 웹사이트에 로드되는 정보가 적으므로 검색엔진 최적화적인 면에서 좋지 않다는 단점이 있다.
Next.js는 SSR 방식으로 Client가 Server에 Html 파일을 요청하여 Html 파일을 받아 정적인 페이지를 구성하게 된다. 이후 Server로 부터 JavaScript 파일을 요청하여 클라이언트는 Html에 JS를 적용하여 동적인 페이지를 구성하게 되는데, 이를 하이드레이션 (Hydration) 이라고 한다.

라이브러리를 사용하는 사람이 자유롭게 코드를 사용할 수 있는 개념이다
개발자가 라이브러리를 이용하여 만들어야 하며 개발자가 주도성을 가지고 라이브러리를 이용하는 개념이다. 대표적인 라이브러리로 React가 있다.
별도의 규칙이 존재하며 개발자가 이를 지켜야 코드를 작성할 수 있다.
주도성이 개발자에게 있는 것이 아닌 프레임워크 측에 있으며 라이브러리에 비해 자유로운 코드를 작성하기 어렵지만 규칙을 알고 있으면 세부적인 제어에 관여할 필요가 없다는 점에서 라이브러리와 다르다.
컴포넌트를 표시하기 위해 children을 받는 layout.tsx

npx create-next-app@latest .
src: 컴포넌트, js, tsx 저장
app: app router 저장
명령어를 모를 때 package.json script 객체를 참고하자
기본적으로 글로벌 스타일, tailwind, CSS module 방식을 지원한다.
런타임에서 작동하는 CSS in JS를 사용이 제한적으로 가능하다.
https://nextjs.org/docs/app/building-your-application/styling/css-in-js
React 처럼 url를 import 해올 수 있지만 별도의 폰트 패키지를 import 해서 지정할 수 있음
import {Inter} from "next/font/google";
const inter = Inter({subset: ["latin"]});
구글 폰트를 임베드해서 사용하는 것과 차이 :
구글 폰트 패키지는 폰트가 내장되어 있기 때문에 외부 요청을 하지 않음
요청을 하지 않고 바로 사용할 수 있기 때문에 성능상 이득
<Image src={bridge} alt={"bridge"}/>
<Image> 컴포넌트 사용할 때 src, alt, width, heigth 속성이 필수
hero 이미지 (사용자 눈에 보이는 이미지) 설정할 때 priority={true}로 설정
<img> 태그와 다른 점:사용자가 경로를 입력하면 페이지로 이동하는 행위 자체를 말함
라우팅을 관리하고 처리하는 기능을 제공하는 도구
ex)
페이지 라우터: 'next/router'
앱 라우터: 'next/navigation'
특정 url과 컴포넌트 간의 매핑
리엑트에서는 router/index.ts 파일에서 라우트를 정의
자체적으로 프레임워크 상에서 라우팅하는 시스템
일종의 폴더 구조를 통해 Route를 정의 할 수 있다.
app/about/page.tsx : localhost:3000/about
app이라는 폴더가 url 경로를 담당한다.
무조건 page.tsx 파일명을 지켜야 한다.
함수명은 자유
폴더의 폴더를 중첩하여 중첩 경로 지정이 가능하다.
app/blogs/[id]
id 값에 특정 경로가 지정된 경우를 제외하면 아무 값이나 올 수 있다.
app/blogs/[id]/review/[reviewid]
반드시 다이나믹 경로명이 겹치면 안된다!
app/docs/[...slug]
모든 하위 경로가 허용된다.
(폴더명)
경로로 인식하지 않는다.
_폴더명
해당 폴더에 접근 할 수 없는 프라이빗 폴더이다.
<Link href=""></Link>
다이나믹 세그먼트를 참조할 수 있다
{params}: {params: {id: string}}
// 모든 다이나믹 세크먼트 받기
// 단, VSC에서 자동완성 기능 사용 불가
params: {[key: string]: string}
링크에서 쿼리스트링을 참조 할 수 있다.
{searchParams}: {lang: string; order: string}
// 모든 쿼리스트링 참조
searchParams: {[key:string]: string}
use client
모든 hook은 클라이언트 컴포넌트에서만 사용이 가능하다.
const params = useParams<{ tag: string; item: string }>()
const searchParams = useSearchParams();
const search = searchParams.get('쿼리스트링 키');