Front-end

Next.js 13 <Link /> with Middleware

FuterNomad 2023. 9. 12. 08:51
๐Ÿ’ก Issue : <Link /> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ™”๋ฉด์ด ์ด๋™ ํ•˜๊ธฐ ์ „, ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ™”๋ฉด ์ด๋™์„ ์ œ์–ด ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

 

๐ŸŒŸ Middleware ๋ฅผ ์‚ฌ์šฉํ•˜์ž!

 

Middleware

: request๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• .
๋“ค์–ด์˜ค๋Š” request์— ๋”ฐ๋ผ, request ๋˜๋Š” ์‘๋‹ต ํ—ค๋”๋ฅผ ์žฌ์ž‘์„ฑ, redirecting, ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์‘๋‹ตํ•˜์—ฌ response๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 Middleware๋Š” ์บ์‹œ๋œ content์™€ ๊ฒฝ๋กœ๊ฐ€ ์ผ์น˜ํ•ด์ง€๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
 ์‚ฌ์šฉ์ž๋ฅผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด ์žˆ๊ฑฐ๋‚˜ ์ธ์ฆ์ด ํ•„์š”ํ•  ๋•Œ, Middleware๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
๐Ÿ‘‰๐Ÿผ <Link /> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ œ๋Œ€๋กœ fetching ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, Next.js์—๊ฒŒ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ url๊ณผ ๋ฏธ๋ฆฌ fetchingํ•  url ๋ชจ๋‘๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์™€ ๋ฐฉ๋ฌธ์ž์˜ ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์„ ๋ถ„๊ธฐ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// middleware.js (ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— ์œ„์น˜)
export function middleware(req) {
	const nextUrl = req.nextUrl
    	if(nextUrl.pathname === '/dashboard') {
            if(req.cookies.authToken) {
                return NextResponse.rewrite(new URL('/auth/dashboard', req.url))
            } else {
                return NextResponse.rewrite(new URL('/public/dashboard', req.url))
            }
        }
}

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํŽ˜์ด์ง€ ํ™”๋ฉด์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด,

// Page.js
import Link from 'next/link'
import useIsAuthed from './hooks/useIsAuthed'

export default function Page() {
	const isAuthed = useIsAuthed()
	const path = isAuthed ? '/auth/dashboard' : '/dashboard'
        return (
            <Link as="/dashboard" href={path}>
                Dashboard
            </Link>
        )
}

 

๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” as ์™€ href  props๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Dynamic Route๋ฅผ middleware๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Link href={{ pathname: '[๋ชฉ์  ์ฃผ์†Œ]', query: { key: [value] } }} as='[๋…ธ์ถœ๋  ์ฃผ์†Œ]'>[๋งํฌ๋ช…]</Link>

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ Next.js ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜จ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ํ™•์ธํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<Link href={{ pathname: '/dashboard/authed/[user]', query: { user: username } }} as="/dashboard/[user]">Profile</Link>

 

 

References..

https://nextjs.org/docs/app/building-your-application/routing/middleware

https://nextjs.org/docs/app/building-your-application/routing/middleware#matching-paths