app router

Next 13 ๋ฒ„์ „์— ์ถ”๊ฐ€๋œ App Router ๋ฐฉ์‹์€ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Page Router ๋ฐฉ์‹๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด์ž.

ํด๋” ๊ตฌ์กฐ

Page Router์—์„œ page ํด๋”์•ˆ์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด App Router ๋ฐฉ์‹์—์„œ๋Š” app ํด๋”์•ˆ์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    -app
        -dashboard
            -settings
                -page.tsx

root ํด๋”์ธ app ํด๋”์•ˆ์— ์ƒ์„ฑ๋œ ํด๋”๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค. ์œ„์— ์žˆ๋Š” ํด๋” ๊ตฌ์กฐ์˜ url ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. domain.com/dashboard/settings

App Router์—์„œ๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ธฐ๋ณธ ํŒŒ์ผ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. layout, page, loading, not-found, error ํ•ด๋‹น ๋‚ด์šฉ๋„ ์ž์„ธํžˆ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.

๋™์ ๋ผ์šฐํŒ…

๋™์ ๋ผ์šฐํŒ… ํด๋”๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์€ Page Router์™€ ๋™์ผํ•˜๋‹ค. ๋Œ€๊ด„ํ˜ธ([])๋กœ ๋งŒ๋“  ํด๋”๋Š” Next๊ฐ€ ๋™์ ๋ผ์šฐํŒ… ํด๋”๋กœ ์ธ์‹ํ•œ๋‹ค.

    -app
        -product
            -[id]

ํ•ด๋‹น ํด๋” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ url๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. domain.com/product/1 product ์„ธ๊ทธ๋จผํŠธ ๋’ค์—๋Š” ์–ด๋–ค ๊ฐ’์ด ์™€๋„ url ๊ฒฝ๋กœ๋กœ ์ธ์‹๋œ๋‹ค. ๋™์  ์„ธ๊ทธ๋จผํŠธ๋Š” page, layout ๋“ฑ์—์„œ props๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    // routing : app/product/[id]
    // url : domain.com/product/1
    export default function ProductDetailPage(props) {
        console.log("props:", props)
        return (
            <ProductDetailComponent>
        )
    }

    // ์ถœ๋ ฅ : { params: { id: '1' }, searchParams: {} }

๊ทธ๋ฃน ๋ผ์šฐํ„ฐ

app ํด๋”์•ˆ์— ์ƒ์„ฑ๋œ ํด๋”๋Š” url ๊ฒฝ๋กœ๋กœ ์ธ์‹๋˜์ง€๋งŒ ๋ผ์šฐํ„ฐ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ url ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. Next ๋ฌธ์„œ์—์„œ๋Š” ๊ทธ๋ฃน ๋ผ์šฐํ„ฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์†Œ๊ฐœํ•œ๋‹ค.

  • Organizing routes into groups e.g. by site section, intent, or team.

  • Enabling nested layouts in the same route segment level:

    • Creating multiple nested layouts in the same segment, including multiple root layouts

    • Adding a layout to a subset of routes in a common segment

๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋˜‘๊ฐ™์€ layout์„ ๊ณต์œ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ๊ฐ™๋‹ค. (layout์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์ž์„ธํžˆ ๋‹ค๋ฃฐ ์˜ˆ์ •)

๊ด„ํ˜ธ๋กœ ๋งŒ๋“  ํด๋”์•ˆ์— ์žˆ๋Š” ํด๋”๋Š” ๊ทธ๋ฃน ๋ผ์šฐํŒ…์œผ๋กœ ์ธ์‹๋œ๋‹ค.

    -app
        -(shop)
            -product
                -page.js
            -account
                -page.js

product ์™€ account๋Š” ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์„ธ๊ทธ๋จผํŠธ๋กœ ์ธ์‹๋˜๊ณ , shop์€ url ๊ฒฝ๋กœ์— ์•„๋ฌด ์˜ํ–ฅ๋„ ์ฃผ์ง€ ๋ชปํ•œ๋‹ค. ๊ฐ์ž domain.com/product, domain.com/account ์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ ์„ค์ •๋œ๋‹ค.

    -app
        -(shop)
            -layout.js // product
            -product
                -page.js
            -account
                -page.js

product์™€ account๋Š” (shop)์•ˆ์— ์žˆ๋Š” layout.js๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Page

Page Route ๋ฐฉ์‹์—๋Š” url ๊ฒฝ๋กœ๊ฐ€ ๋  ํด๋”์•ˆ์— index ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์คฌ๋‹ค๋ฉด App Router์—์„œ๋Š” page ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

    -app
        -product
            -page.js
// `app/product/page.js` 
 export default function ProductListPage() {
    return <h1>Product List page </h1>
 }

Layout

Layout์€ ๊ฐ™์€ route ์•ˆ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” UI์ด๋‹ค. ์—ฌ๋Ÿฌ page๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” UI๊ฐ€ ์žˆ๋‹ค๋ฉด layout.js ํŒŒ์ผ์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

    export default function RootLayout({children}:{children: React.ReactNode}) {
        return (
            <html lang="en">
                <body>
                    <main>{children}</main>
                </body>
            </html>
        )
    }

Next๋Š” layout์„ ๋จผ์ € ๋žœ๋”๋ง ํ•œ ํ›„, ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋žœ๋”๋งํ•œ๋‹ค. /product ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด ํ™”๋ฉด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋žœ๋”๋ง๋œ๋‹ค.

    <RootLayout>
        <ProductList />
    </RootLayout>

layout์€ ์ค‘์ฒฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. route ํด๋”์•ˆ์— layout ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ™์€ ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์€ ๊ฐ™์€ layout์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์Œ ํด๋”๊ตฌ์กฐ์—์„œ product/about ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋žœ๋”๋ง๋œ๋‹ค.

    -app
        -page.js
        -layout.js
        -product
            -page.js
            -layout.js
            -about
                -page.js
    <RootLayout>
        <ProductLayout>
            <Product>
                <About />
            </Product>
        </ProductLayout>
    </RootLayout>

Last updated