๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/NextJS

[Next JS] Layout (feat. RouteGroup)

by Rising Oneโ˜… 2025. 8. 28.
728x90
๋ฐ˜์‘ํ˜•
SMALL

  1. Layout

  2. Root Layout

  3. ๊ณตํ†ต๋œ ๊ฒฝ๋กœ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š๋Š” page์— ๋™์ผ Layout ์„ค์ •๋ฒ•


๋ฐฉ๋ฒ•

  1.  Layout

 

- ํŠน์ • ํด๋” ์•„๋ž˜ layout.tsx๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด,

ํ•ด๋‹น layout ํŒŒ์ผ์€

ํด๋” ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  page ์ปดํฌ๋„ŒํŠธ์—

๋˜‘๊ฐ™์ด ์ ์šฉ๋˜๋Š” Layout์„ ์ •์˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ!

 

/search/setting/page.tsx ์ด์ง€๋งŒ,

=> search ํ•˜์œ„์˜ Layout์ด ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ ์šฉ!

 

 

 

 

 

 

 

 

 

 

์ค‘์ฒฉ๋œ Layout

 

๊ทธ๋ ‡๋‹ค๋ฉด, 

- /search / layout.tsx ์—๋„ ๋ ˆ์ด์•„์›ƒ์ด ์กด์žฌํ•˜๊ณ ,

- /search / setting / layout.tsx ํ•˜์œ„ ํด๋”์ธ setting์—๋„ ๋ ˆ์ด์•„์›ƒ์ด ์กด์žฌํ•˜๋ฉด?

 

=> ์ค‘์ฒฉ Layout์ด ๋˜์–ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

 


  2. Root Layout

 

ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ๋งˆ์ฃผํ•˜๋ฉด, app / layout.tsx ํŒŒ์ผ์„ ๋ณด๊ฒŒ ๋œ๋‹ค.

=> ์ด๋Š” Global Layout ๋˜๋Š” Root Layout์œผ๋กœ Next.js ์•ฑ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ์ด ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ

=> ๊ฒฐ์ฝ” ์—†์–ด์ ธ์„œ๋Š” ์•ˆ ๋˜๊ณ , name์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค.

 

# app/layout.tsx (root layout)

export default function RootLayout({ children,}: Readonly<{children: React.ReactNode;}>) {
  return (
    <html lang="en">
      <body
        className={`${geistSans.variable} ${geistMono.variable} antialiased`}
      >
        {children}
      </body>
    </html>
  );
}

 

- children props๋กœ ํ˜„์žฌ page์˜ ์—ญํ• ์„ ํ•  page ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์„œ

- return ๋ฌธ ๋‚ด๋ถ€์—์„œ <html> ๋‚ด๋ถ€, <body> ๋‚ด๋ถ€์— {children} ์œผ๋กœ page ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.


 

(TIP)

Layout.tsx๋กœ ์ƒ์„ฑํ•œ ๋ ˆ์ด์•„์›ƒ์€ ์ž๋™์œผ๋กœ 'children'์ด๋ผ๋Š” props๋ฅผ ํ†ตํ•ด

ํ˜„์žฌ page ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ „๋‹ฌ์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ์–ด์„œ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ ,

return๋ฌธ ์•ˆ์— page ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋””์— ๋ฐฐ์น˜ํ•  ๊ฑด์ง€ ์ง์ ‘ ์„ค์ •์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

 

import {ReactNode} from "react";

export default function Layout({ children }: {children: ReactNode}) {
  
  return (
    <>
    <div> ์ž„์‹œ ์„œ์น˜๋ฐ” </div>
      {children}
    </>
  );
}

 

- { children } props ํƒ€์ž…์ •์˜๋ฅผ ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ,

- { children }: { }                                         =====> ๊ฐ์ฒด์ธ๋ฐ,

- { children }: {children: }                          =====> children์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์ด๋ฉด ๋˜๊ณ ,

- { children }: {children: ReactNode}       =====> ReactNode ํƒ€์ž…์ด๋‹ค.

 


 

  3. ๊ณตํ†ต๋œ ๊ฒฝ๋กœ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š๋Š” page์— ๋™์ผ Layout ์„ค์ •๋ฒ•

 

โญ๏ธ " RouteGroup " : ๊ฒฝ๋กœ์ƒ์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ํด๋” ์˜๋ฏธ

=> app / ('xxxx') : app ํ•˜์œ„์— ์†Œ๊ด„ํ˜ธ () ๋กœ ๋งŒ๋“  ํด๋”

- ๊ฒฝ๋กœ์ƒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์˜ page์— layout์„ ์ ์šฉ O

 

 

- (with-searchbar) ๋ผ๋Š” RouteGroup์„ ๋งŒ๋“ค์—ˆ์Œ. (app ํ•˜์œ„ ์กด์žฌ)

ใ„ด> root page.tsx ์ปดํฌ๋„ŒํŠธ ์ด๋™

ใ„ด> ํŠน์ • layout.tsx ์ปดํฌ๋„ŒํŠธ ์ด๋™ (๊ฒฝ๋กœ ๋ฌด๊ด€ ์ง€์ •ํ• )

 

=> root page์™€ /search page ๋ชจ๋‘์— ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์ด ์ง€์ •๋จ!

=> RouteGroup ๋ฐ–์˜ /book page๋Š” ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ X

 

 

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
LIST

๋Œ“๊ธ€