Next.js: [RFC] ๋™์  ๊ฒฝ๋กœ

์— ๋งŒ๋“  2019๋…„ 06์›” 19์ผ  ยท  90์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

๋™์  ๊ฒฝ๋กœ

๋ฐฐ๊ฒฝ

๋™์  ๋ผ์šฐํŒ… (URL Slugs ๋˜๋Š” Pretty / Clean URL์ด๋ผ๊ณ ๋„ ํ•จ) ์€ Next.js ์—์„œ ์˜ค๋žซ๋™์•ˆ ์š”์ฒญ ๋œ ๊ธฐ๋Šฅ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์†”๋ฃจ์…˜์—๋Š” L7 ํ”„๋ก์‹œ , ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ ๋˜๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ ๋ฏธ๋“ค์›จ์–ด ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ž์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ถฉ๋ถ„ํžˆ _ ์ธ์ฒด ๊ณตํ•™์  _ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ํŽ˜์ด์ง€ ๋‹น ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ํ”„๋ ˆ์ž„ ์›Œํฌ ์ˆ˜์ค€ ๊ธฐ๋Šฅ์„ ์‹ค์ˆ˜๋กœ ์˜ตํŠธ ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ

  1. ๊ทœ์น™์„ ํ™œ์šฉํ•˜์—ฌ ์ถ”๋ก ํ•˜๊ธฐ ์‰ฌ์šด URL Slug ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์•ผ์ƒ์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  3. /blog/:post ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ <Link /> ๊ฒฝ๋กœ ์ „ํ™˜ ํ™•์ธ
  5. ๊ฒฝ๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ตฌํ˜„์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค.
  6. ๊ฒฝ๋กœ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‹ ์ฒญ

Next.js๋Š” ์ „์ฒด URL ์„ธ๊ทธ๋จผํŠธ ์™€ ์ผ์น˜ํ•˜๋Š” ๋ช…๋ช… ๋œ URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•ด์•ผ

  1. [] ๋กœ
  2. ๋ช…์‹œ ์  ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๋™์  ์„ธ๊ทธ๋จผํŠธ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฝ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํ•„์ˆ˜ ์ด๋ฉฐ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  4. ๊ฒฝ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” query ๊ฐœ์ฒด์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค ( getInitialProps ๋˜๋Š” router ๋ฅผ ํ†ตํ•ด withRouter ) โ€” ์ด๋Ÿฌํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก ๋‹ค์Œ ํŒŒ์ผ ํŠธ๋ฆฌ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

pages/
โ”œโ”€โ”€ [root].js
โ”œโ”€โ”€ blog/
โ”‚ โ””โ”€โ”€ [id].js
โ”œโ”€โ”€ customers/
โ”‚ โ”œโ”€โ”€ [customer]/
โ”‚ โ”‚ โ”œโ”€โ”€ [post].js
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ profile.js
โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ””โ”€โ”€ new.js
โ”œโ”€โ”€ index.js
โ””โ”€โ”€ terms.js

Next.js๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋“ฑ๋ก ๋œ ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

;[
  { path: '/', page: '/index.js' },
  { path: '/blog/:id', page: '/blog/[id].js' },
  { path: '/customers', page: '/customers/index.js' },
  { path: '/customers/new', page: '/customers/new.js' },
  { path: '/customers/:customer', page: '/customers/[customer]/index.js' },
  {
    path: '/customers/:customer/profile',
    page: '/customers/[customer]/profile.js',
  },
  { path: '/customers/:customer/:post', page: '/customers/[customer]/[post].js' },
  { path: '/terms', page: '/terms.js' },
  { path: '/:root', page: '/[root].js' },
]

์‚ฌ์šฉ ์˜ˆ

์ด ์˜ˆ์ œ๋Š” ๋ชจ๋‘ ํŒŒ์ผ ์ด๋ฆ„์ด pages/blog/[id].js ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

<Link /> ํŽ˜์ด์ง€ ํƒ์ƒ‰

<Link href="/blog/[id]" as="/blog/how-to-use-dynamic-routes">
  <a>
    Next.js: Dynamic Routing{' '}
    <span role="img" aria-label="Party Popper">
      ๐ŸŽ‰
    </span>
  </a>
</Link>

์œ„์˜ ์˜ˆ๋Š” /blog/[id].js ํŽ˜์ด์ง€๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋‹ค์Œ query ๊ฐœ์ฒด๋ฅผ _Router_์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

{
  id: 'how-to-use-dynamic-routes'
}

_Router_์—์„œ ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ฝ๊ธฐ

import { useRouter } from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

export default BlogPost

์ฐธ๊ณ  : withRouter ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

getInitialProps ์—์„œ ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ฝ๊ธฐ

function BlogPost({ blogText }) {
  return <main>{blogText}</main>
}

BlogPost.getInitialProps = async function({ query }) {
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = query.id

  const { text } = await fetch(
    '/api/blog/content?id=' + encodeURIComponent(blogId)
  ).then(res => res.json())

  return { blogText: text }
}

export default BlogPost

์ฃผ์˜ ์‚ฌํ•ญ

์„ ํƒ์  ๊ฒฝ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฒ„์ „์„ ๋‚ด๋ณด๋‚ด๋Š” ์Šคํ… ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์„ ํƒ์  ๊ฒฝ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฒ€์‚ฌ ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒฝ๋กœ์˜ ๊ฐ€์‹œ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

// pages/blog/comments.js
// (the optional version of `pages/blog/[id]/comments.js`)
export { default } from './[id]/comments.js'

๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๊ฒฝ๋กœ ์ด๋ฆ„ ์ค‘๊ฐ„์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Š” blog-[id].js ๊ฐ€ _literally_๋กœ ํ•ด์„๋˜๊ณ  /blog-1 ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ /blog/[id].js ์žฌ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ์ „์ฒด URL ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ blog- ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์•ˆ

[] ๋Œ€์‹  _ ์—ฌ๊ธฐ์— ๊ธฐํ˜ธ ์‚ฝ์ž… _์ด์žˆ๋Š” URL ์Šฌ๋Ÿฌ๊ทธ ํ‘œ์‹œ

ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํ˜ธ ๋Š” :name )๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ ๋ฐฉ๋ฒ•์€ ์œ ํšจํ•œ ํŒŒ์ผ ์ด๋ฆ„ ์ด

์„ ํ–‰ ๊ธฐ์ˆ ์„ ์กฐ์‚ฌํ•˜๋Š” ๋™์•ˆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ๋œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ธฐํ˜ธ๋Š” _ , $ ๋ฐ [] ์ž…๋‹ˆ๋‹ค.

_ ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ๋ผ์šฐํŒ… ํ•  ์ˆ˜์—†๋Š” ๋‚ด๋ถ€ ๊ฒฝ๋กœ ๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— _ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : _app , _document , /_src , /_logs ).
๋งค๊ฐœ ๋ณ€์ˆ˜ ํ™•์žฅ์„์œ„ํ•œ bash์˜์‹œ๊ธธ์ด๊ธฐ ๋•Œ๋ฌธ์— $ ๋„ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํฌ๊ด„์  ์ธ ์ง€์›์„ ์œ„ํ•ด path-to-regexp ํ™œ์šฉ

์ •๊ทœ์‹์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐํ˜ธ๋Š” ์œ ํšจํ•œ ํŒŒ์ผ ์ด๋ฆ„ ์ด

์•ž์œผ๋กœ next.config.js ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒฝ๋กœ์— ์ •์˜ ๋œ path-to-regexp ๊ฒฝ๋กœ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜„์žฌ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ž˜ ํƒํ—˜

ํฌ๊ด„ ๋งค๊ฐœ ๋ณ€์ˆ˜

์•ž์œผ๋กœ๋Š” ํฌ๊ด„์  ์ธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ถ”๊ฐ€๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์•Œ๊ณ ์žˆ๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” URL ์˜ % ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๊ด„ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (์˜ˆ : pages/website-builder/[customerName]/%.tsx ).

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์„ค๋ฌธ ์กฐ์‚ฌ : ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด์ด ์ฃผ์„์— "+1"์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ  : ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š”์ด RFC์—์„œ ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ช…์‹œ์ ์ธ ๊ตฌ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค ( ์ฃผ์˜ ์‚ฌํ•ญ ์„น์…˜ ์ฐธ์กฐ).

๋ชจ๋“  90 ๋Œ“๊ธ€

์„ค๋ฌธ ์กฐ์‚ฌ : ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด์ด ์ฃผ์„์— "+1"์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ  : ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š”์ด RFC์—์„œ ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ช…์‹œ์ ์ธ ๊ตฌ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค ( ์ฃผ์˜ ์‚ฌํ•ญ ์„น์…˜ ์ฐธ์กฐ).

์„ค๋ฌธ ์กฐ์‚ฌ : ํฌ๊ด„์  ์ธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด์ด ์ฃผ์„์— "+1"์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ  :์ด ์Šค๋ ˆ๋“œ์—์„œ ํฌ๊ด„์  ์ธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค! ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ ๊ณต๊ฐ„์„ ๋” ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ์•ฝ ๋จ 3

ricardo.ch์—์„œ๋Š” ๋ผ์šฐํŒ…์„ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ ๊ฒฝ๋กœ์— ๋กœ์ผ€์ผ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์œ ํšจํ•œ ๊ฒฝ๋กœ์˜ ์˜ˆ :

  • / -์ž๋™ ๊ฐ์ง€ ๋œ ๋กœ์ผ€์ผ์ด์žˆ๋Š” ํ™ˆํŽ˜์ด์ง€
  • /:locale -๊ฐ•์ œ ๋กœ์ผ€์ผ์ด์žˆ๋Š” ํ™ˆํŽ˜์ด์ง€
  • /:locale/search -๊ฒ€์ƒ‰ ํŽ˜์ด์ง€
  • /:locale/article/:id -๊ธฐ์‚ฌ ํŽ˜์ด์ง€

๊ทธ๋Ÿฌํ•œ ์ ‘๋‘์‚ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ง€์› ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

ํ˜„์žฌ https://www.npmjs.com/package/next-routes ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•œ๊ฐ€์ง€ : ๊ธฐ์‚ฌ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ID๊ฐ€ 123์ด๋˜๋Š” /de/article/example-article-123 ์™€ ๊ฐ™์€ ID ์•ž์— ์Šฌ๋Ÿฌ๊ทธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ next-routes ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ์ •๊ทœ์‹์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฉฐ ์ €๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ API๋กœ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ณด์‹ญ์‹œ์˜ค.

@ValentinH ์ œ๊ณต๋œ ๊ฒฝ๋กœ๋Š” ์ œ๊ณต๋œ ๊ฒฝ๋กœ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • / => pages/index.js
  • /:locale => pages/$locale/index.js
  • /:locale/search => pages/$locale/search.js
  • /:locale/article/:id => pages/$locale/article/$id.js

๋˜ํ•œ ID๊ฐ€ 123์ด๋˜๋Š” / de / article / example-article-123๊ณผ ๊ฐ™์€ ID ์•ž์— ์Šฌ๋Ÿฌ๊ทธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์œ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ๊ฒฝ๋กœ ์ด๋ฆ„ ์ค‘๊ฐ„์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Š” blog-$id.js ๊ฐ€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ํ•ด์„๋˜๊ณ  /blog-1 ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ /blog/$id.js ์žฌ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ์ „์ฒด URL ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ blog- ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์†”๋ฃจ์…˜์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

$locale/index.js ํด๋”์™€ ํŒŒ์ผ๋กœ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค!

"์ค‘๊ฐ„์— ๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜"์— ๋Œ€ํ•ด์„œ๋Š” ์Šฌ๋Ÿฌ๊ทธ๊ฐ€ ๋‹ค์ด๋‚˜๋ฏนํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋‹ฌ๋ผ์„œ ๊ฐ„๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์™„์ „ํžˆ ์˜ณ์œผ๋ฉฐ ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๋‹จ๋ฝ์— ์˜ํ•ด ๋‹ค๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์—์„œ ์Šฌ๋Ÿฌ๊ทธ๋ฅผ ์ŠคํŠธ๋ผ์ดํ•‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐˆ ๊ธธ์ž…๋‹ˆ๋‹ค ๐Ÿ™‚

์ด์™€ ๊ฐ™์€ ๊ฒƒ (.hidden .files / .folders์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ๋งค๊ฐœ ๋ณ€์ˆ˜)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

pages/
โ”œโ”€โ”€ .root.js
โ”œโ”€โ”€ blog/
โ”‚ โ”œโ”€โ”€ .id/
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ comments.js <-- optional?
โ”œโ”€โ”€ customers/
โ”‚ โ”œโ”€โ”€ .customer/
โ”‚ โ”‚ โ”œโ”€โ”€ .post/
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ index.js
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ profile.js
โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ””โ”€โ”€ new.js
โ”œโ”€โ”€ index.js
โ””โ”€โ”€ terms.js

๋˜๋Š” $๋ฅผ ๊ทธ๋Œ€๋กœ๋‘๋ฉด ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dํ•˜์ง€๋งŒ ํ•ญ์ƒ $ folder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?

pages/
โ”œโ”€โ”€ $root.js
โ”œโ”€โ”€ blog/
โ”‚ โ”œโ”€โ”€ $id/
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ comments.js <-- optional?
โ”œโ”€โ”€ customers/
โ”‚ โ”œโ”€โ”€ $customer/
โ”‚ โ”‚ โ”œโ”€โ”€ $post/
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ index.js
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ profile.js
โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ””โ”€โ”€ new.js
โ”œโ”€โ”€ index.js
โ””โ”€โ”€ terms.js

npm ํŒจํ‚ค์ง€๋กœ ์ž‘๋™ํ•˜๋Š” ์•ฑ์˜ ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • /packages/express
  • /packages/express/dependencies
  • /packages/@babel/core
  • /packages/@babel/core/dependencies

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ”์œ„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ @ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ /packages/express/dependencies ๋ฐ /packages/@babel/core ์˜ ์„ธ๊ทธ๋จผํŠธ ์–‘์€ ๋™์ผํ•˜์ง€๋งŒ ํ•œ ๊ฒฝ์šฐ์—๋Š” /dependencies ์˜ express ์ด๊ณ  ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” /index / @babel/core .

๊ฒฐ๊ตญ ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ react-router ์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<Switch>
  <Route path={`/packages/`} exact component={PackagesOverview} />
  <Route path={`/packages/:name(@[^/]+/[^/]+)`} component={PackageView} />
  <Route path={`/packages/:name`} component={PackageView} />
</Switch>

์ด RFC์—์„œ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ๊ด„ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ํด๋” ๊ตฌ์กฐ, ํŠธ ๋ฆฌ๋ทฐ, ํŠธ๋ฆฌ ๋งต๊ณผ ๊ฐ™์€ ์žฌ๊ท€ ์ ์œผ๋กœ ์ค‘์ฒฉ ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋”ฅ ๋งํฌ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด 2 ์„ผํŠธ : ํŒŒ์ผ ์ด๋ฆ„์˜ ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ๋Š” ์‰˜์—์„œ ์ธ์žฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. rm $root.js ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ‘์ค„์€ ๊ดœ์ฐฎ์€ ๋Œ€์•ˆ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ณด๋‹ค ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ : ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณผ๊ฑฐ์—๋„ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ํ™œ์šฉํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ์™„์ „ํ•œ ํ‘œํ˜„๋ ฅ์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ ์–ธ์  ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์  ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํŒจํ„ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์Šคํ‚ค๋งˆ์˜ ์ผ๋ถ€๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ๊ณ  ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ์ฝ”๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋Š” ์ข‹์€ ์ผ์ด์ง€๋งŒ์ด ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค.

@ValentinH ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ $ locale ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

/page.ts ๋ฐ /page/$locale/page.ts๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

"๊ธฐ๋ณธ"๋กœ์ผ€์ผ ๋˜๋Š” ์‚ฌ์ „ ์ •์˜ ๋œ ๋กœ์ผ€์ผ (์‚ฌ์šฉ์ž ์„ค์ •)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฝ์šฐ $ locale ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : / car / search / $ optional-filter-1 / $ optional-filter-2 / $ optional-filter-3

optional-filter-1 : color-red, optional-filter-2 : brand-ford ๋“ฑ ...

์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ / $ required-param / ๋ฐ / $$ optional-param /?

์ด๊ฒƒ์ด ๋กœ๋“œ๋งต์— ์˜ฌ๋ผ์˜ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋ž˜๋„ @timdp ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์ฐจ์ž„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. touch $file ์กฐ์ฐจ ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์ด๊ฒƒ์€ ๋งŽ์€ ํ˜ผ๋ž€์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ์—์„œ ํƒˆ์ถœ์„ ๊ธฐ์–ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. touch \$file; vim $file ๋Š” ํŒŒ์ผ์—†์ด vim์„ ์—ฝ๋‹ˆ ๋‹ค ($ file์€ ์ •์˜ ๋œ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—).
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰˜์—์„œ ํƒญ ์™„์„ฑ์€ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ด€์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ์‰˜์—์„œ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • = =customer page is a customer ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์ง€์ •๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ป—์–ด์žˆ๋Š” ์ฝœ๋ก ์ด๋˜๋„๋ก ์ •์‹ ์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • @ ๋„ ๊ฝค ์ž˜ ์ฝ์Šต๋‹ˆ๋‹ค. a customer ์— @customer

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ผ๋ถ€ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์•ฝ ๋œ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ). ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์€ "์„ ํ–‰ ๊ธฐ์ˆ "์ด๋ฉฐ ๋‹ค๋ฅธ ๋งŽ์€ ๋ผ์šฐํ„ฐ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

pages/
โ”œโ”€โ”€ {root}.js
โ”œโ”€โ”€ blog/
โ”‚ โ””โ”€โ”€ {id}.js
โ”œโ”€โ”€ customers/
โ”‚ โ”œโ”€โ”€ {customer}/
โ”‚ โ”‚ โ”œโ”€โ”€ {post}.js
โ”‚ โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ”‚ โ””โ”€โ”€ profile.js
โ”‚ โ”œโ”€โ”€ index.js
โ”‚ โ””โ”€โ”€ new.js
โ”œโ”€โ”€ index.js
โ””โ”€โ”€ terms.js

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜์™€ ๋๋‚˜๋Š” ์œ„์น˜ (์˜ˆ : /product-{productId}-{productColor} ๊ฐ€ ๋ช…ํ™• ํ•ด ์ง€๋ฏ€๋กœ ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์˜ ์ค‘๊ฐ„์— ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ  ์„ธ๊ทธ๋จผํŠธ ๋‹น ์—ฌ๋Ÿฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Next.js์— ๋™์  ๊ฒฝ๋กœ๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋ช…๋ช… ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ Spectrum์—์„œ ๋…ผ์˜ ๋œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค : https://spectrum.chat/next-js/general/rfc-move-parameterized-routing-to-the-file-system~ce289c5e-ff66 -4a5b-8e49-08548adfa9c7. ์—ฌ๊ธฐ์—์„œ ํ† ๋ก ์„์œ„ํ•œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” Sapper๊ฐ€ [brackets] ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ Nuxt๊ฐ€ ๋ฒ„์ „ 3์—์„œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ๋™์  ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<Link /> ์‚ฌ์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” href ๋ฐ as ์†์„ฑ์„ ๋ชจ๋‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์žŠ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๋ฅผ ๋„์ž… ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— href ์†์„ฑ์— "๋ณ‘ํ•ฉ"ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ ๋” ์šฐ์•„ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ค‘๊ด„ํ˜ธ๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„ Bash์—์„œ ๋ช…๋ น์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

<Link /> ์‚ฌ์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ @ stephan281094 ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ˆ˜์˜ ์›์ธ์ด๋ฉ๋‹ˆ๋‹ค.

๋™์  ๋ผ์šฐํŒ…์€ ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ดํŽด๋ณด๊ณ  ์†”๋ฃจ์…˜, ๊ฑฐ๋Œ€ํ•œ ์†Œํ’ˆ์„ ์ƒ๊ฐํ•ด ๋‚ธ ๊ฒƒ์ด ์ •๋ง ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค!

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์™€์ผ๋“œ ์นด๋“œ ๊ฒฝ๋กœ๋„ ์ œ์•ˆ์— ์ถ”๊ฐ€ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์กฐ์‚ฌ ํ•  ํ•ญ๋ชฉ์œผ๋กœ ํฌ๊ด„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ N ๊ฐœ์˜ ๋ ˆ๋ฒจ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” /category/* ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. category ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

: ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋‘๊ฐ€ ์ด๋ฏธ Express์˜ ๋Œ€ํšŒ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

$ ์…ธ ๋ณ€์ˆ˜์™€ ์ถฉ๋Œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

: ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋‘๊ฐ€ ์ด๋ฏธ Express์˜ ๋Œ€ํšŒ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ : ๋Š” Windows์—์„œ ๊ธˆ์ง€ ๋œ ๋ฌธ์ž์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์—์„œ ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— _ ๊ฒƒ๋„ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ [brackets] ์ด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋ฏธ๋ž˜์˜ ์ฆ๊ฑฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Next.js๊ฐ€ ํ–ฅํ›„ post-12345 ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์—†์ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”ผํ•ด์•ผ ํ•  ๋ฌธ์ž ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ์˜ ์ถฉ๋Œ : : , * , " , < , > , |
  • ์‰˜ ๋ณ€์ˆ˜์™€์˜ ์ถฉ๋Œ : $
  • bash ์ค‘๊ด„ํ˜ธ ํ™•์žฅ { , } ์™€ ์ถฉ๋Œ

๋‹ค๋ฅธ ๊ฑด ์—†๋‚˜์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ค‘์•™ ์ง‘์ค‘์‹ ๋ผ์šฐํŠธ ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ž๋™์œผ๋กœ ์ƒ์„ฑ ๋œ ์‚ฌ์ดํŠธ ๋งต์ด ์žˆ์œผ๋ฉฐ ํŒŒ์ผ ์‹œ์Šคํ…œ๋งŒ์œผ๋กœ๋Š”์ด๋ฅผ ์ •์˜ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋ช…๋ช… ๋œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ๋Œ€์ƒ "ํŽ˜์ด์ง€"๋Š” ๋นŒ๋“œ์‹œ ์•Œ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ๋กœ๋“œ ํ•  ํŽ˜์ด์ง€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋…ผ๋ฆฌ๋Š” ๊ฒฝ๋กœ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ํŽ˜์ด์ง€ ํด๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” Relay๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ด๋Š” GraphQL๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“ˆ์ด ๊ณ ์œ ํ•˜๊ฒŒ ๋ช…๋ช…๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” ์ข…์ข… ๋ผ์šฐํŠธ ์„ธ๊ทธ๋จผํŠธ ์ด๋ฆ„์ด ๋ชจ๋“ˆ ์ด๋ฆ„๊ณผ ๊ฐ™์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. index.js ํ™•์‹คํžˆ ๊ณ ์œ ํ•˜์ง€ ์•Š์œผ๋ฉฐ edit ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ณตํ†ต ์„ธ๊ทธ๋จผํŠธ๊ฐ€์žˆ๋Š” ๊ณณ์„ ๋ด…๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ํŽ˜์ด์ง€ ๋ชจ๋“ˆ ์ž์ฒด์˜ ํ˜•์ œ๋กœ์„œ ์ผํšŒ์„ฑ ํŽ˜์ด์ง€ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฉฐ, ์ด๋Š” Next.js๊ฐ€ ํŽ˜์ด์ง€ ํด๋” ๋‚ด์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๋ฅผ ์œ„ํ•ด ์ €๋Š”์ด ์ œ์•ˆ์ด ๊ธฐ์กด ํŽ˜์ด์ง€ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ์œ„ํ•œ ํ–ฅ์ƒ๋œ ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ๊ฐ„๋‹จํžˆ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋” ์ค‘์ ์„๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ณณ์—์„œ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค : https://gist.github.com/AndrewIngram/8d4c4ccd9bd10415a375caacade9f5ca

๋‚ด๊ฐ€ ๋ณด์ง€ ๋ชปํ•˜๋Š” ์ฃผ์š”ํ•œ ๊ฒƒ์€ URL ์žฌ์ •์˜์™€ ๊ฐ™์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํ‘œํ˜„๋˜์ง€ ์•Š์€ ์•”์‹œ ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ URL์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

/some-vanity-url/

ํ˜„์žฌ Next.js ์šฉ์–ด์—์„œ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ (์˜ˆ : Product.js?id=foo&language=en ๊ฐ€์žˆ๋Š” ์ œํ’ˆ ํŽ˜์ด์ง€์— ๋งคํ•‘ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์šฐ๋ฆฌ ์›น ์‚ฌ์ดํŠธ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ตญ๊ฐ€ "์‚ฌ์ดํŠธ"๋Š” ์ตœ์ƒ์œ„ ์„ธ๊ทธ๋จผํŠธ (์˜ˆ : es ๋˜๋Š” ie )๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋˜์ง€๋งŒ gb ์‚ฌ์ดํŠธ๋Š” ํ•ด๋‹น ์„ธ๊ทธ๋จผํŠธ์—†์ด ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  gb ํŽ˜์ด์ง€์—๋Š” ์•”์‹œ ์  country ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตญ๊ฐ€์—์„œ๋Š” ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋‹จ์ ์€ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ 'ํŽ˜์ด์ง€'๊ฐ€ URL ์•„ํ‚คํ…์ฒ˜์˜ ์—ฌ๋Ÿฌ ๋งˆ์šดํŠธ ์ง€์ ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ์ˆ˜์˜ ๋ฒˆ๋“ค (์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘๋ณต ์ง„์ž… ์ )์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ์ด ์ œ์•ˆ์€ ๋Œ€๋ถ€๋ถ„์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ _all_ ์‚ฌ๋ก€์—์„œ ๊ฒฝ๋กœ ๊ตฌ์„ฑ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„์˜ ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ˜„์žฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š” happy-path API๋ผ๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ์ง„์งœ ๋ฐ˜๋Œ€๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

{id} ์ œ์•ˆ์„์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ํ›จ์”ฌ ๋” ์ข‹์•„ ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ React์™€ ๋” ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” file/&param.js ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. URL์—์„œ ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋ฉฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ bash์™€ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” _ ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์„ ์ •๋ง๋กœ ํ•„์š”๋กœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด next.config.js ์—์„œ ์žฌ์ •์˜๋ฅผ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ž ์‹œ ๋™์•ˆ ๊ทธ๊ฒƒ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค! โค๏ธ

๋†€๋ž„ ๋งŒํ•œ! ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰

์—ฌ๊ธฐ์„œ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” Link href ๋ฐ as ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<Link to="blog/123" /> : Nextjs๋Š” ํŽ˜์ด์ง€ ํด๋”์˜ ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ "/blog/$id" ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”ผํ•ด์•ผ ํ•  ๋ฌธ์ž ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

& ๋Š” ๋น„๋™๊ธฐ ์„œ๋ธŒ ์‰˜์—์„œ ์ธ์ˆ˜์˜ ์™ผ์ชฝ์„ ์‹คํ–‰ํ•˜๋Š” bash์˜ ์ œ์–ด ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํ…์ŠคํŠธ : open pages/&customer ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ open pages/ ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํฌ ๊ทธ๋ผ์šด๋“œ ์…ธ์—์„œ customer ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •๋ง ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ƒ๋‹นํ•œ ์ˆ˜์˜ ๋‹จ์ผ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์›๋ž˜ ์˜ˆ์ œ์˜ /blog/$id ์ฒ˜๋Ÿผ). ๋‘ ๊ฐœ์˜ ํ›„ํ–‰ ๋ผ์šฐํŠธ ๋งค๊ฐœ ๋ณ€์ˆ˜ (์˜ˆ : /git/compare/$hash1/$hash2 )๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๋ Œ๋”๋งํ•˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์ด $id.js ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ blog.js ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์„ค๋ช… ์ ์ž…๋‹ˆ๋‹ค.

@customRoute ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๊ฒฐํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

// pages/blog.js
import {useRouter, @customRoute} from 'next/router'

@customRoute('/blog/:id')
function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

export default BlogPost

์ด๊ฒƒ์€ ์ œ์•ˆ ๋œ ํฌ๊ด„ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋” ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜์— ์ ์šฉ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ (๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ์€ ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?) ์ œ์•ˆ์€ ์–ด์ฐจํ”ผ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‹น์‹ ์ด ๊ทธ ๊ธธ์„ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์•„๋งˆ ์ง€๊ธˆ AMP๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ฐฉ์‹์œผ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// /pages/blog.js
export const config = {
  amp: true,
  dynamicRoute: true // adds a [blog] property to the query object
  // dynamicRoute: /\d+/ // could even support regex if you want
};

ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์œ ์šฉ ํ•  ๊ฒƒ ๊ฐ™์œผ๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. RFC์— ์„ค๋ช… ๋œ๋Œ€๋กœ ๊ธฐ๋ณธ ์ง€์›๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ์‹ค์ œ ์‚ฌ์šฉ๋ฒ•์„ ์–ป์€ ๋‹ค์Œ ์ค‘๋‹จ๋˜๋Š” ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ํ”ผํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๋ฌธ์ž๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฌธ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€์ด ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ์œ„ํ•œ ์ง„์งœ ์ฐจ๋‹จ์ œ์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„๋ฆฌ์Šค ์†”๋ฃจ์…˜์— ์นœ์ˆ™ํ•œ ์บ๋ฆญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”! (Aws์—๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜์žˆ๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ตฌ์„ฑ ์š”์†Œ ํ‚ค๋กœ ๊ตฌ์„ฑ ๊ฐœ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹ซ์–ดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HOC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function BlogPost(props) {
    return <div />
}

export default withCustomRoute(BlogPost, "/blog/:id")

ํŽ˜์ด์ง€์— ์ •์  ํ•„๋“œ (์˜ˆ : getInitialProps)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

// pages/blog.js
import {useRouter} from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

// By default it would be as it is now
BlogPost.route = '/blog/:id';

export default BlogPost

@ dmytro-lymarenko ๋ธŒ๋ผ์šฐ์ €์—์„œ /blog ๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? 404?

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •์ ์œผ๋กœ ๋ถ„์„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. HOC ๋˜๋Š” ์ •์  ์†์„ฑ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •์ ์œผ๋กœ ๋ถ„์„ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. HOC ๋˜๋Š” ์ •์  ์†์„ฑ์€

์ง€๊ธˆ๊นŒ์ง€ ์ œ๊ณต๋œ ๋ชจ๋“  ์ •์  ์†์„ฑ ์˜ˆ์ œ๋Š” ์ •์ ์œผ๋กœ ๋ถ„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ์‰ฝ๊ฒŒ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ). ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์ •์ ์œผ๋กœ ๋ถ„์„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๋กœ ์†์„ฑ์„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ๋Ÿฐํƒ€์ž„์— ์„ค์ •๋˜์—ˆ์ง€๋งŒ ์ •์  ๋ถ„์„๊ธฐ์— ์˜ํ•ด ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ๊ฒฝ๋กœ ์†์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ / blog๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? 404?

@kingdaro -IMO, ์˜ˆ. /blog ๋ฐ /blog/:blogId ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ •๋‹นํ•ฉ๋‹ˆ๋‹ค.

pages/
โ”œโ”€โ”€ blog/
โ”‚ โ”œโ”€โ”€ $id.js
โ”‚ โ””โ”€โ”€ index.js

๊ธ€์Ž„, ๋‹น์‹ ์ด ๊ทธ ๊ธธ์„ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์•„๋งˆ ์ง€๊ธˆ AMP๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ฐฉ์‹์œผ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// /pages/blog.js
export const config = {
  amp: true,
  dynamicRoute: true // adds a [blog] property to the query object
  // dynamicRoute: /\d+/ // could even support regex if you want
};

ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์œ ์šฉ ํ•  ๊ฒƒ ๊ฐ™์œผ๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. RFC์— ์„ค๋ช… ๋œ๋Œ€๋กœ ๊ธฐ๋ณธ ์ง€์›๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ์‹ค์ œ ์‚ฌ์šฉ๋ฒ•์„ ์–ป์€ ๋‹ค์Œ ์ค‘๋‹จ๋˜๋Š” ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ํ”ผํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๋ฌธ์ž๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฌธ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€์ด ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ์œ„ํ•œ ์ง„์งœ ์ฐจ๋‹จ์ œ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋™์ ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฑฐ์ณ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— config๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์„ค์ •ํ•˜๋ฉด ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์ด์ƒ์˜ ํ‘œ์ค€ ๋ผ์šฐํŒ… ์†”๋ฃจ์…˜์„ ๊ณ ๋ คํ•ด์•ผํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์€ Next / React๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ๋‚˜ ๊ฐ„๋‹จํ•œ ์•ฑ์„ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ›Œ๋ฅญํ•œ ํŒ๋งค ํฌ์ธํŠธ์ด์ง€๋งŒ ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ด ํŒจํ„ด์— ๋™์  ๋ผ์šฐํŒ…์„ ์ ์šฉํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ด๋ฆ„์œผ๋กœ ๋‹จ์ˆœ์„ฑ์„ ๋ง์น˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์„ ์ฝ๊ณ  Next.js ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ ํ›„, ๋Œ€์ฒด (๋ณด์กฐ) ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ผ๊ธ‰ ์ง€์›์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ์Šค๋ ˆ๋“œ (์˜ˆ : ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ ์ œ์•ˆ)์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ์ค‘ ์ผ๋ถ€๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ๊ทธ ์•„์ด๋””์–ด์—๋Š” ๋ถ„๋ช…ํžˆ ์ž์ฒด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฉ‹์ง„ ๊ฒƒ์„ ์ƒ๊ฐ ํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ํ‚ค๋กœ ๊ตฌ์„ฑ ๊ฐœ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹ซ์–ดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HOC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function BlogPost(props) {
    return <div />
}

export default withCustomRoute(BlogPost, "/blog/:id")

๊ฝค ๋ฉ‹์ง€์ง€๋งŒ ๊ฒฝ๋กœ ์ •๋ณด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ํŒŒ์ผ๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ตฌ์„ฑ (ํŒŒ์ผ ๋‚ด)๊ณผ ์ „์—ญ ๊ตฌ์„ฑ ( route.js )์„ ์ œ์•ˆํ•˜๋Š” ๋‚˜์˜ ์›๋ž˜ ์ƒ๊ฐ์€ ๋‚ด ์ฒซ ๋ฒˆ์งธ ์ฃผ์„์—์„œ ์–ธ๊ธ‰ ํ•œ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค (๋””๋ ‰ํ† ๋ฆฌ์—์žˆ๋Š” ์œ ์ผํ•œ ํŒŒ์ผ ์ธ ๊นŠ์ด ์ค‘์ฒฉ ๋œ ํŒŒ์ผ, ์˜๋ฏธ์—†๋Š” ํŒŒ์ผ ์ด๋ฆ„ ๋ฐ catch-all-params).

์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์—„๊ฒฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ URL์ด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ง์ ‘ ๋งคํ•‘๋˜๊ณ  "์ถ”๊ฐ€"๋งค๊ฐœ ๋ณ€์ˆ˜ ๋งŒ ๋กœ์ปฌ ๊ตฌ์„ฑ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์‚ฐ ๋œ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์„ ์ฝ˜์†”์— ์˜ˆ์˜๊ฒŒ ์ธ์‡„ํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋œ ํŒŒ์ผ์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝ๋กœ๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@merelinguist ์š”์•ฝ ํ‘œ์— ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Windows์—์„œ = ๊ฐ€ ๊ธˆ์ง€๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. : ๊ฐ€ ๊ธˆ์ง€๋˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜์ง€๋งŒ Microsoft Windows ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ • ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋™์ผํ•œ ๋ฌธ์ž๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด๋ฏธ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋™์  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํŒ…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ด๋ฒˆ ์ฃผ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค).

ํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ์€ ์ƒˆ๋กœ์šด next @ canary API ๊ธฐ๋Šฅ์ด _ ๋˜ํ•œ _ ๋™์  ๋ผ์šฐํŒ…์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

{ path: '/api/:customer', page: '/api/$customer/index.js' }

[email protected]๋กœ ๋ฐฉ๊ธˆ ์‹œ๋„ํ–ˆ๋Š”๋ฐ 404๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•„์ง ๊ฑฐ๊ธฐ์—์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ธฐ๋Šฅ (API + ๋™์  ๊ฒฝ๋กœ)์ด URL ๋ผ์šฐํŒ…์— ํŒจ๋ฆฌํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

@remy ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ณง ๋‚ด ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Windows ๋ฐ Linux ์‹œ์Šคํ…œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๋„ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
https://en.wikipedia.org/wiki/Filename#Comparison_of_filename_limitations

์ œ์•ˆ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€์— ์ •์  ํ•„๋“œ (์˜ˆ : getInitialProps)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ?

// pages/blog.js
import {useRouter} from 'next/router'

function BlogPost() {
  const router = useRouter()
  // `blogId` will be `'how-to-use-dynamic-routes'` when rendering
  // `/blog/how-to-use-dynamic-routes`
  const blogId = router.query.id
  return <main>This is blog post {blogId}.</main>
}

// By default it would be as it is now
BlogPost.route = '/blog/:id';

export default BlogPost
  1. ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ ์†์„ฑ์— ๋Ÿฐํƒ€์ž„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
const route = `/blog/${somethingElse}`;
BlogPost.route = route; // is not allowed
  1. ์ด ํ˜„์žฌ RFC (ํด๋”์— ๋™์ ์ž„์„ ์‹๋ณ„ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋นŒ๋“œ ํ•  ๋•Œ ํŒŒ์ผ์„ ์ฝ๊ณ ์ด ํŽ˜์ด์ง€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํŽ˜์ด์ง€์—์„œ ์ •์  ๊ฒฝ๋กœ ์†์„ฑ์„ ์ฐพ์œผ๋ฉด ์ฐจ์ด์ ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Lingui๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Trans ๊ฐ€ ๋™์ ์ด๋˜๋„๋ก id๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
<Trans id="msg.docs" /* id can only be static string */>
   Read the <a href="https://lingui.js.org">documentation</a>
   for more info.
 </Trans>

์ด๋ฏธ ๋‚˜์—ด๋œ ์ ‘๋‘์‚ฌ ๋ชฉ๋ก์œผ๋กœ ์ด๋™- @ ๊ธฐํ˜ธ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” _not_ ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ์ง€๋งŒ Nuxt์™€ ๋™๋“ฑ ํ•ด์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์—์„œ ์ „ํ™˜ํ•˜๋ฉด ์ฆ‰์‹œ ์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉ์ž ์˜ต์…˜์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์ง€ ๋งŒ, ์›ํ•œ๋‹ค๋ฉด ์ ‘๋‘์‚ฌ query__{...} ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์ƒ๊ฐ.

@remy ์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ Next๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ API๋ฅผ ์™„์ „ํžˆ ์—ด์–ด ๋ณด๋Š” ๊ฒƒ์€

@ scf4 PoC ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ now.json ๊ฒฝ๋กœ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๊ธฐ ์—์„œ๋„ nextjs๋กœ ๋ฒ”์šฉ ๋ผ์šฐํŒ…์„ ์ˆ˜ํ–‰

Zeit ํŒ€๋„ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฒฝ๋กœ ํŒŒ์„œ๋ฅผ ์˜คํ”ˆ ์†Œ์Šคํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Nuxt๋ฅผ ๋ณด๋ฉด _id.js ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ๋ง์”€ํ•˜์‹ ๋Œ€๋กœ ์ด๋ฏธ _app ๋ฐ _document.js ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณต๊ฐœ์ ์œผ๋กœ ๋ผ์šฐํŒ… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์  ๊ฒฝ๋กœ๋Š” ๋งŽ์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์ด๋ฏ€๋กœ ๋ผ์šฐํŒ… ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  ์‚ฌ์ดํŠธ ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?

(์ด๊ฑด ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ)

๋˜ํ•œ Next.js๊ฐ€ ์ƒ์„ฑ ๋œ ๊ฒฝ๋กœ๋ฅผ ๋‹จ์ผ ํŒŒ์ผ (๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆจ๊ฒจ์ ธ์žˆ์„ ์ˆ˜ ์žˆ์Œ)์— ์ธ์‡„ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜์ค‘์— ๊ฐ•๋ ฅํ•œ ๋™์  ๋ผ์šฐํŒ…์„์œ„ํ•œ ๋ฌธ์„ ์—ด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋Ÿฐํƒ€์ž„์‹œ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ์— ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ API์˜ ์ด์ ์„ ์žƒ์ง€ ์•Š๊ณ  ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ / ๋ณ€๊ฒฝ (์˜ˆ : ๋ณต์žกํ•œ ํŒจํ„ด ์ผ์น˜)ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๊ฒฐ๋œ๋‹ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ scf4 Next.js์—๋Š” ์ด๋ฏธ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ์˜ ๋™์ผํ•œ ์–‘์˜ ์ฝ”๋“œ๋กœ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์•„ ๊ทธ๋ž˜, ์ถฉ๋ถ„ํžˆ ๊ณตํ‰ ํ•ด.

ํŽธ์ง‘ ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ผ ๊ฒฝ๋กœ ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์–ด์จŒ๋“  ํ›จ์”ฌ ๋” ๋‚˜์€ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•œ ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€

  • [param] ๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ „ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค (Sapper์—์„œ ์‚ฌ์šฉ๋จ).
  • : ์€ (๋Š”) Express ์‚ฌ์šฉ์ž์—๊ฒŒ ์ต์ˆ™ํ•˜์ง€๋งŒ _sworn_ Windows FS์— ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • $ ๋ฐ {param} ๋Š” ์‰˜์—์„œ ๋ณ€์ˆ˜ ๋ฐ ์ค‘๊ด„ํ˜ธ ํ™•์žฅ์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ CLI์—์„œ ๋” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • _ _ ๊ฐ€๋Šฅ _ํ•˜์ง€๋งŒ "๋น„๊ณต๊ฐœ"ํ‘œ์‹œ๊ธฐ๋กœ์„œ ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋ผ์šฐํŠธ ( /^index\. )์™€ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ( /^_/ )์— ๋Œ€ํ•œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ํ–ˆ์ง€๋งŒ /pages ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

API ๊ฒฝ๋กœ (# 7297)๋ฅผ ์ง€์›ํ•˜๊ธฐ์œ„ํ•œ ์ตœ๊ทผ ๋…ผ์˜๋ฅผ ํ†ตํ•ด /pages ์˜ ์ƒˆ ํ™ˆ์—์„œ /routes /api ๋ฐ /pages ๋ชจ๋‘๋ฅผ ์ง€์›ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ _ ๊ฐ•๋ ฅํ•œ "๊ทธ๋Ÿฌ๋‚˜"_, Next.js ์ƒํƒœ๊ณ„๋Š” _ ์ฆ๊ฐ€์ ์ธ _ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ๋ณด์ฆ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํฝ๋‹ˆ๋‹ค. "์ด๋Ÿฐ, ์šฐ๋ฆฌ๊ฐ€์ด ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๋ฉด _์ด ๋ฐฉ์‹"์„ค๊ณ„๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ด„ํ˜ธ ( [example] )๋Š” zsh์—์„œ ํŒจํ„ด ์ผ์น˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„ ์ƒ์„ฑ์˜ ์˜ˆ๋ณด๊ธฐ

๋Œ€๊ด„ํ˜ธ [] ๋Š” ํŒจํ„ด ์ผ์น˜๋ฅผ ์œ„ํ•ด zsh์—์„œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/zeit/next.js/pull/7623 ์—์„œ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋„ ๊ฑฐ๊ธฐ์— ๋Œ“๊ธ€์„ ์˜ฌ๋ ธ๋‹ค.

[id] ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค (์˜ˆ : cd \[id\]/view.js ). ์ด์ค‘ ๋ฐ‘์ค„ __id (์˜ˆ : cd __id/view.js )๋„ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ๋‚ด๋ถ€ ํŒŒ์ผ / ํด๋” (์˜ˆ : _app.js )์™€ ๊ตฌ๋ณ„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•ฝ๊ฐ„ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Œ).

@AaronDDM zsh ์žˆ์Šต๋‹ˆ๊นŒ? bash์—์„œ [ ๋˜๋Š” ] ๋ฅผ ์ด์Šค์ผ€์ดํ”„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ zsh ์™€ ํ•จ๊ป˜ ๋‚˜์—๊ฒŒ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค-์ด๋Ÿฌํ•œ ๋””๋ ‰ํ† ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

$ mkdir [asdf]
zsh: no matches found: [asdf]
$ mkdir \[asdf\]
$ cd [asdf]
zsh: no matches found: [asdf]
$ cd \[asdf\]

๊ทธ๋ฆฌ๊ณ  zsh ๋Š” macOS Catalina์—์„œ ๊ธฐ๋ณธ ์…ธ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

__id.js ๋™์˜

ํ , ์ •๋ง __ ์„ (๋ฅผ) ์ข‹์•„ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‚˜์—๊ฒŒ ์ข‹์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@merelinguist em, Jest๋Š” ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ํด๋”์— __tests__ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” __ ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@YUFENGWANG ์•„๋งˆ๋„ ๊ฐ€๋Šฅํ•˜๋ฉด ํ•˜๋‚˜์˜ ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. = ์™€ ๊ฐ™์€ ํ•ฉ๋ฆฌ์ ์ธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ธฐ๋ณธ๊ฐ’
  2. ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๊ฒฝ๋กœ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” next.config.js ์˜ต์…˜
  3. ์–ด๋–ค ์บ๋ฆญํ„ฐ๊ฐ€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๋ฌธ์„œ

๋‹จ์ผ ์บ๋ฆญํ„ฐ์— ๋™์˜ํ–ˆ์ง€๋งŒ ์ œ๋กœ ๊ตฌ์„ฑ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ ์ƒ๊ฐ์—๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์„œ์— ์„ค๋ช…ํ•˜๋”๋ผ๋„ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

= ๋Š” zsh์— ์˜ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ :

๋‹จ์–ด๊ฐ€ ์ธ์šฉ๋˜์ง€ ์•Š์€ '='๋กœ ์‹œ์ž‘ํ•˜๊ณ  EQUALS ์˜ต์…˜์ด ์„ค์ •๋œ ๊ฒฝ์šฐ, ๋‚˜๋จธ์ง€ ๋‹จ์–ด๋Š” ๋ช…๋ น์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฆ„์˜ ๋ช…๋ น์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋‹จ์–ด๋Š” ๋ช…๋ น์˜ ์ „์ฒด ๊ฒฝ๋กœ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์•„์ด๋””์–ด; ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด [email protected] ๋“ฑ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌธ์ž๊ฐ€ ์œ ํšจํ•œ ํ•œ ์‰˜ ๋ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ด์Šค์ผ€์ดํ”„ํ•˜๊ณ  ์ž‘์—…ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ด์Šค์ผ€์ดํ”„ ํ•  ํ•„์š”์—†์ด zsh ๋ฐ bash์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

[email protected]
example~.js
example=.js

์˜ค. ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ํ›„ํ–‰ URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ [email protected] ๋Š” blog/:id ๋ฉ๋‹ˆ๋‹ค.

compare@[email protected] ๋Š” compare/:a/:b ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์œ„์—์„œ ๋ฐ˜๋Œ€ํ–ˆ๋˜ ๊นŠ๊ฒŒ ์ค‘์ฒฉ ๋œ ๋‹จ์ผ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ „์ฒด ๋ผ์šฐํŒ… ์ •์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

/blogs/_var_blog-id/index.js
/blogs/_var_blog-id.js

์ ‘๋‘์‚ฌ _var_ JS ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋ชจ๋ฐฉํ•˜๋ ค๋Š” ์‹œ๋„. ์•„๋‹ˆ๋ฉด ๋งค์šฐ ์งง๊ณ  ํ•œ ์บ๋ฆญํ„ฐ ์—ฌ์•ผํ•ฉ๋‹ˆ๊นŒ?

~ ์บ๋ฆญํ„ฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

/blogs/~id ์ฒ˜๋Ÿผ.

~ ๋ฅผ ์ ‘๋‘์–ด๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ POSIX ํ˜ธํ™˜ ์‰˜์˜ ํ™ˆ ํด๋”๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

[0-9a-zA-Z-._] (์ •๊ทœ์‹)๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž๋Š” ์šด์˜ ์ฒด์ œ, ์…ธ ๋ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ ‘๋‘์‚ฌ๋กœ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฌธ์ž๋Š” ์•ˆ์ „ํ•œ ์ธ๋ผ์ธ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์ฒด์— ๋Œ€ํ•œ zsh

๋˜ํ•œ ํ™”๋ คํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ง๊ด€์ ์ด๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์˜์‚ฌ ์†Œํ†ตํ•˜๊ธฐ ์‰ฌ์›Œ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • [params].js ๋Œ€๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์šฐ์•„ํ•˜๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. (sapper, nuxt v3?).
  • ๋ฐ‘์ค„ ์ ‘๋‘์‚ฌ pages/_helper.js ๋ณดํ†ต private ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋ฉฐ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ํด๋” ๋‚ด์— ๋„์šฐ๋ฏธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

imho : ์ด๊ฒƒ์€ ๋” ํฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ์‹œ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์‹œ์ž‘ํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ์ข‹์ง€๋งŒ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ฒฝ๋กœ, ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋“ฑ์ด์žˆ์„ ๋•Œ๋Š” ํ™•์žฅ์ด ์ž˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์ด์žˆ๋Š” ๊ฒฝ์šฐ (๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์— routes.js ํŒŒ์ผ์ด์žˆ์„ ์ˆ˜ ์žˆ์Œ) ๋” ๋‚˜์€ ์žฅ๊ธฐ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ nextjs๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ (SSR, ์†๋„ ๋“ฑ)์œผ๋กœ ์ธํ•ด ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ๋ฆฝ๋‹ˆ๋‹ค.

@mmahalwy ๋‹น์‹ ์€ ๋จธ๋ฆฌ์— ๋ชป์„ ์ณค์Šต๋‹ˆ๋‹ค.

Next.js๋Š” ์ด๋ฏธ ๊ฒฝ๋กœ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜). ์ด ๊ตฌ์„ฑ์„๋ณด๋‹ค ๋ช…์‹œ ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ "์ œ๊ฑฐ"ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์›ํ™œํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mmahalwy @ scf4 FWIW, ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ์ •๋‹น์„ฑ์€ ์ค‘์•™ ์ง‘์ค‘์‹ ํŒŒ์ผ์„ ๊ฐ€์งˆ ํ•„์š”๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Next.js์˜ ๋งํฌ ๋ฐ ๋ผ์šฐํŒ… ์šฉ API ์ „์ฒด๊ฐ€์ด ์ œ์•ฝ์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ์‰ฝ๊ฒŒ ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ๊ตฌ์„ฑ์˜ ๋ฌธ์ œ์ ์€ ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ˆ˜๋ฐฑ์—์„œ ์ˆ˜์ฒœ์— ์ด๋ฅด๋Š” ๋ผ์šฐํŠธ ๋ฒˆํ˜ธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ๋‹นํžˆ ๋งŽ์€ ์ฝ”๋“œ ๋ฒˆ๋“ค์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ (์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ @timneutkens ์™€ ์—ฌ๋Ÿฌ ๋ฒˆ์ด ๋ฌธ์ œ๋ฅผ ์—†์ด๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜์—†๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋ฅผ ์ด์ „ ์˜๊ฒฌ์— ๋‚˜์—ดํ–ˆ์ง€๋งŒ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์ž‘์„ฑ์ž๊ฐ€ ์‚ฌ์ดํŠธ์˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” CMS ๊ธฐ๋ฐ˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๋ชจ๋“ˆ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ‰๋ฒ”ํ•œ ์ด์ „ URL๋กœ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ค‘์•™ ์ง‘์ค‘์‹ ๊ฒฝ๋กœ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด URL์„ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ผ์น˜์‹œํ‚ค๊ณ ๋กœ๋“œ ํ•  ํŽ˜์ด์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค (๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, next-route-resolver ๋Š”์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ). .

๋ผ์šฐํŠธ ๊ตฌ์„ฑ์—†์ด ์ž‘์—…์ค‘์ธ ์‚ฌ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ํฌ๊ธฐ ํ—ˆ์šฉ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ผ์šฐํŠธ ๊ตฌ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ผ์šฐํŒ…๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋‹จ์ผ ์†”๋ฃจ์…˜์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋ผ์šฐํŒ…์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด์ด ์ œ์•ˆ์— ๊ด€ํ•œ ํ•œ ๋ผ์šฐํŒ… ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋งค๋˜๋Š” ํ•œ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์•ฝ๊ฐ„ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. :)

@AndrewIngram ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ

@mmahalwy ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด ์š”์ ์„ ์˜คํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ผ์šฐํŒ…์ด ํ•ด๊ฒฐ ๋œ ๋ผ์šฐํŒ… ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ์ œ์‹œ๋œ๋‹ค๋ฉด ์‹ค๋ง ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์œ ์Šค ์ผ€์ด์Šค ์„ธํŠธ์— ๋Œ€ํ•œ ๊ฐœ์„ ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„ ์„ธํŠธ (์˜ˆ : ๊ท€ํ•˜์™€ ๋‚˜)๋ฅผ ๊ธฐ๊บผ์ด ์„ ํƒํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„์œ„ํ•œ ์ผ์ข…์˜ ๊ฒฝ๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ˜•์‹๋„ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

์ค‘์•™ ์ง‘์ค‘์‹ ๋˜๋Š” ๊ณ ๊ธ‰ ๋ผ์šฐํŒ… ๊ตฌ์„ฑ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ ๋ฐ / ๋˜๋Š” ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด RFC์—์„œ ๋ชจ๋‘ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” OP๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ˆ„๊ตฌ๋„ ์ด๊ฒƒ์ด ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ์— ๋™์  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค ( $ ํ–ˆ์ง€๋งŒ 3 ์ผ ์ „์— ์นด๋‚˜๋ฆฌ์•„ ์ €์žฅ์†Œ์—์„œ [param] ๋กœ ์ด๋™ํ–ˆ์ง€๋งŒ ์–ด์จŒ๋“  ์–ด์จŒ๋“ ).

๋ฐฉ๊ธˆ getRequestHandler ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ–ˆ๊ณ  ์„œ๋ฒ„ ์ธก์—์„œ ๋™์  ๋ผ์šฐํŒ…์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ์ธ๊ฐ€, ์˜๋„์ ์ธ๊ฐ€ (์˜ˆ : getRequestHandler ), ์•„๋‹ˆ๋ฉด getRequestHandler ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๋ผ์šฐํŒ…์„ ์™„์ „ํžˆ ๋„๋Š”๊ฐ€ (์ด์ œ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€๊ฐ‘๋‹ˆ๋‹คโ€ฆ) ?

์ค‘์•™ ์ง‘์ค‘์‹ ๋˜๋Š” ๊ณ ๊ธ‰ ๋ผ์šฐํŒ… ๊ตฌ์„ฑ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ ๋ฐ / ๋˜๋Š” ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” Now (ํ˜„์žฌ ๋ชจ๋“  ๋™์  ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹น ๊ตฌ์„ฑ์˜ ์ผ๋ถ€๊ฐ€๋˜์–ด์•ผ ํ•จ)์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ํ•„์š”๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด RFC์—์„œ ๋ชจ๋‘ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” OP๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ˆ„๊ตฌ๋„ ์ด๊ฒƒ์ด ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ , ๋‚ด๊ฐ€ ๋ณธ ๋งŽ์€ ํ† ๋ก  (๋‚ด๊ฐ€ ์ง์ ‘ ์ฐธ์—ฌํ•œ ํ† ๋ก  ํฌํ•จ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์–ด๋Š ์ •๋„ ๊ณผ์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒฝ๋กœ ๋ฐ ๋‚ด ์ž์‹ ๊ณผ ๊ฐ™์€ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ด RFC๋กœ ์ถฉ์กฑ ๋˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์ œ์•ˆ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ณ€๊ฒฝ์œผ๋กœ ์‹คํ˜„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ์ชฝ์ด๋“ , ์ œ์•ˆ๋˜๋Š” ๊ฒƒ์˜ ํ•œ๊ณ„์— ๋Œ€ํ•œ ์ธ์‹์„ ๋†’์ด๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

FWIW๋Š” Pinterest์—์„œ [param] ์Šคํƒ€์ผ FS ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (Next๋Š” ์•„๋‹˜). ์ง€๊ธˆ๊นŒ์ง€ ์ •๋ง ์ž˜ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋น„ํŒ์€ Jest๊ฐ€ [] ์„ regexp ์Œ์œผ๋กœ ํ•ด์„ํ•˜๋ฏ€๋กœ param-ful ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@chrislloyd ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ๊ฒฝ๋กœ / ํŒŒ์ผ์— ๋Œ€ํ•ด์ด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝํ—˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€ zsh๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

[] ๊ฐ€ zsh์—์„œ ํŒจํ„ด ์ผ์น˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ (Jest์—์„œ ๋งํ–ˆ๋“ฏ์ด) ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ดˆ๋ณด์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ธ์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ! ์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ /pages/id!.js ๋ฐ ? ์ฒ˜๋Ÿผ ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ, /pages/posts/id?.js .

์œ„์˜ ์„ค๋ช…๊ณผ ๊ฐ™์ด ์ ‘๋‘์–ด์— ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ ! ๊ฐ€ ํ•„์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•๊ณผ ? ๊ฐ€ ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

Windows๋Š” ํŒŒ์ผ ์ด๋ฆ„์— ๋ฌผ์Œํ‘œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ? ๊ทธ๋ฆฌ๊ณ ! Bash์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

API ๊ฒฝ๋กœ๋Š” ์ด์ œ ๋™์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. # 7629 ๐Ÿš€

@remy getRequestHandler ์€ (๋Š”) ๋™์  ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌํ˜„ ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ๋ณ„๋„์˜ ๋ฒ„๊ทธ / ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? :๋นŒ๋‹ค:

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์ด RFC์— ๋Œ€ํ•œ ๋†€๋ผ์šด ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด RFC๋Š” Next.js 9์—์„œ ์•ˆ์ •์ ์œผ๋กœ ๊ตฌํ˜„ ๋ฐ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ œ๊ณต๋œ ๋ชจ๋“  ๊ณ ๊ธ‰ ํ”ผ๋“œ๋ฐฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ–ฅํ›„ ์ƒˆ๋กœ์šด RFC๋ฅผ ๊ฒŒ์‹œ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰