티스토리 뷰

Custom App
Next.js에서 `_app.js` 파일은 모든 구성요소를 Wrap하고 있는 요소라고도 할 수 있습니다. 따라서 `_app.js`에서 모든 컴포넌트에게 필요한 것들을 정의하고 초기화하여 조금이라도 반복되는 코드들을 줄일 수 있습니다.
공식문서에서는 다음과 같은 내용들을 수행할 수 있다고 합니다.
- 페이지 변경 간에 레이아웃 유지
- 페이지 탐색 시 고정적인 state를 유지
- 페이지에 추가 데이터 주입
- 글로벌 CSS 추가
하나씩 예시 코드를 살펴보며 무엇을 이야기하는지를 알아봅시다 :)
1. 페이지 변경 간에 레이아웃 유지
모든 페이지에 걸쳐 동일한 레이아웃을 유지해야 한다면 매번 컴포넌트의 최상단에 Layout 컴포넌트를 Wrapper로 씌워줄 필요가 없습니다. 이럴 때 `_app.js` 파일에서 한번에 Wrap해주면 되는데요.
📜 _app.js
export default function App({ Component }) {
const router = useRouter()
return (
// 아래와 같이 _app.js에서 Layout을 감싸주면
// _app.js는 전체 컴포넌트의 Wrapper이기 때문에 전부 적용된다.
<Layout home={router.pathname === '/'}>
<Component {...pageProps} />
</Layout>
)
}
위 코드에는 특정 페이지에서는 조금 다른 스타일이 필요한 경우를 위해 옵션도 prop으로 전달할 수 있도록 한 형태입니다. 위와 같이 작성해주면 다른 페이지 컴포넌트에서는 해당 컴포넌트의 View 로직만 집중해서 작성할 수 있겠습니다.
2. 페이지 탐색 시 고정적인 state를 유지
`_app.js`에서 어떤 state를 가지고 있고, 해당 state를 계속 유지하는 경우도 알아봅시다.
만약 모든 페이지에 걸쳐 언제 방문했는지 년-월-일-시간을 표시해야 하는 경우를 예시로 들어보겠습니다. 그런데 방문 시간은 해당 사이트에 처음 방문한 시간을 표시하죠? 즉, navigate를 넘나들더라도 방문시간이 그때그때마다 변경되지 않아야 한다는 말과 같습니다.
📜 _app.js
export default function App({ Component, pageProps }) {
const router = useRouter()
const [visitedTime] = useState(new Date())
return (
<Layout home={router.pathname === '/'}>
<div>visited: {format(visitedTime, "yyyy-MM-dd'T'HH:mm:ss.SSSxxx")}</div>
<Component {...pageProps} pathname={router.pathname} />
</Layout>
)
}

실행 화면을 보게되면 `_app.js`에서 관리하는 state이므로 navigate를 하더라도 변하지 않고 유지되는 것을 확인할 수 있었습니다.
3. 페이지에 추가 데이터 주입
만약 모든 페이지에 지금 페이지 pathname을 주입한다고 해보겠습니다.
📜 _app.js
export default function App({ Component, pageProps }) {
const router = useRouter()
return (
<Layout home={router.pathname === '/'}>
<Component {...pageProps} pathname={router.pathname} />
</Layout>
)
}
위와 같이 작성해주면 모든 페이지들은 prop으로 pathname을 받아 사용할 수 있게 됩니다.
📜 pages/posts/[id].js
export default Post({ postData, pathname }) {
// ...
return (
<h2>pathname: {pathname}</h2>
)
}

4. 글로벌 CSS 추가
`_app.js`에서 css를 import해주면 전역에서 스타일이 적용되게 됩니다.
📜 _app.js
import '@/styles/globals.css'
'프론트엔드 > Next.js' 카테고리의 다른 글
[Next.js] Next.js에서 Error Handling을 해서 원하는 에러 문구를 보여주자 (0) | 2023.06.28 |
---|---|
[Next.js] Web vitals와 성능 측정 도구에 대해 알아보자 (0) | 2023.06.28 |
[Next.js] ../ 때문에 길어지는 import문은 별칭 절대경로 @ 사용하기 (0) | 2023.06.27 |
[Next.js] Dynamic Import(Lazy load) & Hydration & Static Export (0) | 2023.06.27 |
[Next.js] /post/write 페이지에서 새로운 글을 쓸 수 있도록 해보세요 (0) | 2023.06.26 |
- Total
- Today
- Yesterday
- 딥러닝
- 프론트엔드
- 스타일 컴포넌트 styled-components
- 데이터분석
- JSP
- HTML
- 리액트
- react
- react-query
- 자바
- styled-components
- 프론트엔드 공부
- Python
- CSS
- 프로젝트 회고
- 리액트 훅
- 프론트엔드 기초
- 인프런
- 타입스크립트
- next.js
- 자바스크립트
- 디프만
- jest
- frontend
- rtl
- 머신러닝
- 파이썬
- 자바스크립트 기초
- TypeScript
- testing
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |