QueenCards / ProjectAnalysis

플젝뿌셔
1 stars 0 forks source link

[05] next.js의 레이아웃과 템플릿에 대해서 설명해주세요 #6

Closed hyeyoonS closed 2 months ago

hyeyoonS commented 2 months ago

📎 질문

next.js의 레이아웃과 템플릿에 대해서 설명해주세요

(page라우터와 app라우터와의 비교를 중심으로)

✏ 구술 답변 키워드

✏ 서술 답변

레이아웃

Page Router

App Router

템플릿

Nahyun-Kang commented 2 months ago

next.js 앱 라우터에 페이지, 공유 레이아웃, 템플릿을 쉽게 생성할 수 있는 새로운 파일 컨벤션이 도입되었다.

레이아웃

여러 페이지에서 공유하는 UI로, 라우팅이 일어나고 탐색하는 시점에도 레이아웃은 상태를 보존하고 리렌더링이 일어나지 않는다. 레이아웃끼리 중첩이 가능하여 상위 레이아웃 아래 하위 레이아웃을 둘 수 있다.

app 라우터에서 app 디렉토리는 루트 레이아웃을 필수로 가지고 있어야 한다. 애플리케이션의 모든 페이지에 적용된다. html 태그와 body태그를 포함해야 한다.

앱 라우터와 페이지 라우터의 레이아웃 비교

템플릿

템플릿은 페이지 컴포넌트를 래핑한다는 점에서 레이아웃과 비슷하지만, 템플릿의 경우에 탐색할 때마다 새로 마운트 되고, DOM 요소 역시 매번 새로 만들어지고 상태도 보존되지 않는다.

olseul commented 2 months ago

레이아웃

레이아웃은 여러 페이지에서 공유하는 UI입니다. 탐색하는 시점에도 레이아웃은 상태를 유지하고 리랜더링이 일어나지 않습니다. 레이아웃 또한 중첩이 가능합니다. 레이아웃은 layout.tsx로 정의가 가능합니다. children을 props로 받을 수 있고 렌더링하는 동안 하위 레이아웃이나 하위 페이지로 채워집니다.

템플릿

템플릿은 웹개발에서 중요한 역할을 수행하는데, 이는 각 페이지 또는 자식 컴포넌트를 감싸며 일관된 구조를 제공하면서도, 각 탐색마다 새로운 인스턴스를 생성하여 컴포넌트의 상태를 초기화시키는 특징을 가지고 있습니다. 이로 인해 여러 유용한 기능이 구현 가능해집니다.

  1. 입/출입 애니메이션: CSS 또는 애니메이션 라이브러리를 이용해 템플릿에 다양한 페이지 전환 효과를 적용할 수 있습니다. 페이드 인/아웃이나 슬라이드와 같은 시각적 효과는 사용자 경험을 향상시키는데 기여합니다.

  2. 기본 프레임워크 동작의 변경: 템플릿을 사용하면 기본적으로 정의된 프레임워크의 동작을 변경할 수 있습니다. 예를 들어, React의 Suspense 경계에서는 템플릿을 활용하여 페이지 전환 시마다 대체 콘텐츠를 보여주도록 설정할 수 있습니다. 이는 로딩 상태를 보다 세밀하게 관리할 수 있게 해줍니다.

HaydenDevK commented 2 months ago
Jyophie commented 2 months ago

레이아웃

const Layout = ({ children }) => ( <>

<main>{children}</main>
<Footer />

</> );

export default Layout;

// pages/index.js import Layout from '../components/layout';

const Home = () => (

Welcome to the homepage!

);

export default Home;


### 템플릿
- 특정 유형의 페이지 또는 컴포넌트에 대한 구조와 디자인을 미리 정의해둔 형태(블로그 포스트, 제품 정보 페이지의 템플릿, ...)
- 일반적으로 레이아웃 내에 포함되어 사용되며, 데이터를 템플릿의 프로퍼티로 전달하여 동적으로 컨텐츠를 렌더링 할 수 있음

// components/blogTemplate.js const BlogTemplate = ({ title, content }) => (

{title}

);

export default BlogTemplate;

// pages/blog/[id].js import BlogTemplate from '../../components/blogTemplate'; import Layout from '../../components/layout';

const BlogPost = ({ post }) => (

);

export default BlogPost;

wise-Ag commented 2 months ago

리액트는 컴포넌트를 조합하여 페이지를 이룰 수 있습니다.

Layout

여러 페이지에서 공통 구조로 재사용되는 컴포넌트를 레이아웃으로 정리할 수 있습니다.

App router 고유의 layout.js 파일로 정의되고 사용됩니다. 폴더 단위로 중첩 사용할 수 있습니다. (/dashboard 내의 레이아웃은 하위 폴더인 /dashbord/public에도 적용됨) 모든 page.js에 적용되는 root layout이 필수입니다. app 디렉토리 최상위에 위치해아하며 html, body태그를 포함해야합니다.  Page router의 _app.js와 _document.js을 대체합니다.

Page router 레이아웃 컴포넌트를 생성 후 사용하는 페이지에서 import해서 사용할 수 있습니다. getLayout 프로퍼티로 중첩하여 사용할 수 있습니다.

Template

템플릿은 페이지를 공통 구조로 감싸는 점에서 레이아웃과 유사합니다. 레이아웃과는 달리 템플릿은 각 페이지에 대해 새로운 인스턴스를 생성하며, 상태가 유지되지 않고, 효과가 다시 동기화됩니다. 따라서 동일한 템플릿을 공유하는 경로 간에 이동할 때마다 새로운 자식 인스턴스가 마운트되고 DOM 요소가 다시 생성됩니다.

hyeyoonS commented 2 months ago

layout.tsx, template.tsx 파일 컨벤션은 App router에만 존재합니다. 또한 레이아웃을 이용하면 여러 페이지에서 공유하는 UI를 구성할 수 있습니다.

Page router

컨벤션은 아니지만, 레이아웃 컴포넌트를 생성 후 사용하는 페이지에서 import해서 사용할 수 있습니다. getLayout 을 이용해서 중첩해서 사용할 수 있습니다.

AppRouter

kanglocal commented 2 months ago

레이아웃

템플릿