13버전 이전까지 모든 페이지는 각각의 물리적으로 구별된 파일로 독립돼 있었다.
무언가를 집어 넣을 수 있는 곳은 _document와 _app이 유일하다.
<html> 과 <body> 태그를 수정하거나, 일부 CSS-in-JS를 지원하기 위한 코드를 삽입하는 제한적인 용도로 사용된다.이전깍지 공통 레이아웃을 유지할 방법이 _app으로 유일했고, 제한적인 레이아웃의 한계를 극복하기 위해 나온것이 Next.js의 app 레이아웃이다.
/page 로 정의하던 라우팅 방식이 /app 디렉토리로 이동했고, 파일명으로 라우팅하는 것이 불가능해졌다.
라우팅을 정의하는 법
Next.js의 라우팅은 파일 시스템을 기반으로 하고 있다.
/pages/a/b.tsx , /pages/a/index.tsx 는 모두 동일한 주소로 변환된다. 파일명이 index라면 이 내용은 무시된다./app/a/b 는 /a/b 로 변환되며, 파일명은 무시된다.layout.js
페이지의 기본적인 레이아웃을 구성하는 요소다. 해당 폴더에 layout이 있다면 그 하위 폴더 및 주소에 모두 영향을 미친다.
따라서 루트에 단 하나의 layout을 만들고, 공통 UI를 포함하거나 웹페이지를 시작하는 데 필요한 공통 코드를 삽입할 수도 있다.
page.js
?a=1 과 같은 URLSearchParams를 의미한다.error.js
특정 라우팅별로 서로 다른 에러 UI를 렌더링하는 것이 가능해진다.
error 페이지는 에러 정보를 담고 있는 error 객체와 에러 바운더리를 초기화할 reset를 props로 받는다.
💡에러 바운더리는 클라이언트에서만 작동하므로 error 컴포넌트도 클라이언트 컴포넌트여야 한다.
not-found.js
특정 라우팅 하위의 주소를 찾을 수 없는 404 페이지를 렌더링할 때 사용된다.
loading.js
Suspense 기반으로 해당 컴포넌트가 불러오는 중임을 나타낼 때 사용한다.
route.js
/pages/api 와 동일하게 /app/api 를 기준으로 디렉터리 라우팅을 지원한다.디렉토리가 라우팅 주소를 담당하며 파일명은 route.js로 통일됐다.
route 함수들이 받을 수 있는 파라미터는 다음과 같다.
lazy를 사용해 조건문을 통해 사용하지 않고 서버에서 수행한다면, 자연스럽게 성능 이점을 누릴수 있을 것이다.이처럼, 서버 사이드 렌더링은 정적 콘텐츠를 빠르게 제공하고, 서버에 있는 데이터에 손쉽게 제공할 수 있는 반면 사용자의 인터랙션에 따른 다양한 사용자 경험을 제공하기는 없다.
따라서 이 두 구조의 장점을 모두 취하고자 하는 것이 바로 리액트 서버 컴포넌트이다.
하나의 언어, 하나의 프레임워크, 하나의 API와 개념을 사용하면서 서버와 클라이언트 모두에서 컴포넌트를 렌더링할 수 있는 기법을 의미한다. 일부 컴포넌트는 클라이언트에서, 일부 컴포넌트는 서버에서 렌더링 되는 것이다.
한가지 주의점은 클라이언트 컴포넌트는 서버 컴포넌트를 import 할 수 없다는 것이다.

위와 같이 클라이언트 및 서버 컴포넌트가 혼재된 상황은 children으로 자주 사용되는 ReactNode에 달려 있다.
그렇다면 리액트는 이 3가지 컴포넌트를 어떻게 판단할까? 리액트는 모든 것을 공용 컴포넌트도 판단한다. 대신 클라이언트 컴포넌트라는 것을 명시적으로 선언하려면 use client 라고 작성하면 된다.
둘은 완전 다른 개념으로 볼 수 있다.
서버 사이드 렌더링
응답받는 페이지 전체를 HTML로 렌더링하는 과정을 서버에서 수행한 후 그 결과를 클라이언트에 내려준다. 이후 클라이언트에서 하이드레이션 과정을 거쳐 서버의 결과물을 확인하고 이벤트를 붙이는 등의 작업을 수행한다.
따라서 이후 서버사이드 렌더링과 서버 컴포넌트를 활용해 서버에서 렌더링할 수 있는 컴포넌트는 서버에서 완성해서 제공받은 다음, 클라이언트는 서버 사이드 렌더링으로 초기 HTML으로 빠르게 전달받을 수 있다.
이 두가지 방법을 결합하면 컴포넌트를 빨리 보여줄 수 있고, 동시에 클라이언트에서 내려받아야 하는 자바스크립트의 양도 줄어들어 브라우저의 부담을 덜 수도 있다. 결론적으로 둘은 대체제가 아닌 상호보완하는 개념이다.

장점