not-found와 layout

2024. 6. 19. 14:01·Next.js/실험실
반응형

Not Found는 Next.js에서 404 에러가 발생했을 때 렌더링되는 페이지이다. 

일반적인 사용 방법은 Not Found 가 필요한 위치에 not-found.jsx 파일을 만들어주면 끝이다. 

 

근데 한가지 이상한 점이 있었다. 

모든 페이지에 Header와 Footer라 필요해서 app 폴더 아래에 있는 layout에게 Header와 Footer를 불러왔다. 

const RootLayout = () => {
  return (
    <html>
      <body>
        <Header />
        {children}
        <Footer />
      </body>
    </html>
  )
};

export default RootLayout;

 

사건 재현을 위해서 Header와 Footer에는 특별한 기능이 있는 것은 아니고 간단한 문자만 렌더링 했다. 

그 결과는 당연히 page 컴포넌트 위 아래에 Header와 Footer가 잘 렌더링 된다. 

예를들어 [ /, /community, /board, /board/[id] ] 경로가 있다고 생각하자 

여기서 사용자가 /shop 이라는 페이지를 들어갔을 때 404 오류가 나오면서 오류 화면을 렌더링 시켜줘야 했다. 

 

그러므로 root 경로에 not-found 파일을 만들어서 오류 문구를 렌더링 시켜줬다. 

const NotFound = () => {
  return <div>난 오류 문구요!</div>;
};

export default NotFound;

 

이론상 404 화면이 렌더링 되면 다른 어떤 UI도 나오지 않고 NotFound 요소만 나와야 할 것이다. 

이제 결과를 보자 : 

오류 결과는 Header와 Footer가 포함된 not-found 페이지가 렌더링이 되었다. 

그렇다면 Layout에서는 Header와 Footer를 사용하면 안되는 것일까? 

(출처) https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts#root-layout-required

 

공식 문서를 보면 layout에서 공유할 UI 요소, header나 sidebar를 넣으라고 한다. 

그러면 Next.js에서 버그가 있어서 이런걸까? 

 

당장 개발을 위해서 나는 어쩔 수 없이 NotFound 컴포넌트에게 [ position: fixed ]를 주고 오류 화면을 처리했다. 

하지만 분명 방법이 있을 것 같아서 이것 저것 테스트를 하는 도중 방법을 찾았다. 

 

우선 위와 같은 결과가 발생하는 이유는 RootLayout이라는 특이 케이스 때문으로 보인다. 

[ /child ] 경로에 Nav와 Header를 Layout에 넣어주고 처리하면 문제 없이 처리가 된다. 

 

그렇다면 RootLayout에서만 컴포넌트가 지워지지 않는 것인데, 앞으로 작업할 때 무조건 자식 경로를 만들고

그쪽에 Layout을 만들어야 하는 것인지 고민이 들던 그때! 

 

Route Group 이라는 기능이 생각났다. 

(그룹명) 폴더를 만들면 url에는 경로가 추가되지 않지만 해당 폴더 아래에 있는 경로를 하나로 묶을 수 있다. 

그리고 해당 그룹에게 Layout과 Not Found를 준다면 해결되지 않을까? 

 

즉시 시도를 해봤는데, 역시 가능했다. 

RootLayout과 동일한 레이아웃 구조를 Route Group에 만들어주고 처리 하는 방식이 가능했다. 

 

정리하면.

RootLayout의 요소는 다른 페이지의 기능으로 사라지지 않는다. 

지금와서 생각해보면 당연한게 Layout 요소가 제대로 렌더링되지 않는다면 RootLayout에 있는 html 태그나 body 태그가 

없어지는 문제가 생길 수 밖에 없을 것이다. 

 

그런 이유로 next.js에서는 오류가 발생하더라도 RootLayout의 요소는 남겨두는 것 같다. 

 

이 문제를 해결하기 위해서는 RootLayout이 아닌 자식 요소에게 Layout을 줘야하는데, 

글쓴이가 택한 방식은 Route Group을 사용해서 가상으로 그룹을 만들어서 묶어준 다음 layout을 주는 방식으로

처리했다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Next.js > 실험실' 카테고리의 다른 글

Next.js Layout.js  (1) 2024.07.04
Next.js Atomic Design Pattern 그 모시깽한 모시깽  (1) 2024.06.30
포괄 검색어로 홈페이지 노출시키기  (2) 2024.06.09
NextJS 근본적인 여정  (1) 2024.06.02
NextJS Pages Router에서의 Styled Components  (1) 2024.05.30
'Next.js/실험실' 카테고리의 다른 글
  • Next.js Layout.js
  • Next.js Atomic Design Pattern 그 모시깽한 모시깽
  • 포괄 검색어로 홈페이지 노출시키기
  • NextJS 근본적인 여정
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    react
    ChatGPT
    ReactNative
    CCNA
    Docker
    typescript
    다이소
    덤프
    프로그래머스
    바질 키우기
    리얼클래스
    Babel
    네트워크
    바질
    타일러영어
    타입스크립트
    영어독학
    식물
    webpack
    Node.js
    영어회화
    네이버 부스트캠프
    리액트
    알고리즘
    자바스크립트
    next.js
    javascript
    리얼학습일기
    redux
    CSS
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
not-found와 layout
상단으로

티스토리툴바