๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/Next.js

[ Next.js ] Rewrites์™€ Redirects ์•Œ์•„๋ณด๊ธฐ

by YWTechIT 2022. 10. 11.
728x90

๐Ÿ“ Rewrites์™€ Redirects ์•Œ์•„๋ณด๊ธฐ

๋กœ์ปฌ์—์„œ Next.js๋กœ ์ž‘์—…ํ•  ๋•Œ ํ•œ ๊ฐœ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋กœ๊ทธ์ธ์„ ๋‹ด๋‹นํ•˜๋Š” Aํ”„๋กœ์ ํŠธ(port: 3001)์—์„œ ๋ณธ์ธ์ธ์ฆ์„ ๋‹ด๋‹นํ•˜๋Š” Bํ”„๋กœ์ ํŠธ(port: 3000)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋‹ค. ์ด๋Ÿด ๋•Œ A์—์„œ Bํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐ€๋ ค๋ฉด http://localhost:3000/verifications๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค์‹œ B์—์„œ Aํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด์˜ฌ ๋•Œ๋Š” http://localhost:3001/auth-web์„ ์ž‘์„ฑํ•˜๊ณ  AWS๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ ํ•  ๋•Œ๋Š” path๋งŒ ๋‚จ๊ฒจ๋‘๊ณ , ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๋Š” ๋‹ค์‹œ ํ˜ธ์ŠคํŠธ์™€ ํฌํŠธ๋ฅผ ๋ถ™์ด๊ณ .. ์ด๋ ‡๊ฒŒ ์ˆ˜๋™์ ์ด๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ์ง€์†ํ•˜๋‹ค๊ฐ„ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

 

์ด๋Ÿด ๋•Œ next.config.js์—์„œ ๊ด€๋ จ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ๋ฐ”๋กœ Rewrites์™€ Redirects์ด๋‹ค.

Rewrites์™€ Redirects์˜ ๊ณตํ†ต์ ์ธ ํŠน์ง•์€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ(incoming request)๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฅธ ๊ฒฝ๋กœ(destination path)๋กœ ๋งคํ•‘ํ•ด์ค€๋‹ค. ๊ฒฐ์ •์ ์ธ ์ฐจ์ด๋Š” ๋ฐ”๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋Š๋ƒ์ธ๋ฐ, Rewrites๋Š” destination path์— URL ํ”„๋ก์‹œ์™€ ๋งˆ์Šคํ‚น์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž์˜ ๋ˆˆ์— ๋ณ€ํ•จ์ด ์—†๋Š”(hasn't changed)๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ , ๋ฐ˜๋Œ€๋กœ Redirects๋Š” ์ƒˆ ํŽ˜์ด์ง€๋กœ ๋ผ์šฐํŒ…๋˜๊ณ  URL ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ ๋ˆˆ์— ๋ณ€ํ•จ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

728x90

Rewrites์™€ Redirects ๋ชจ๋‘ next.config.js์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. source๋Š” incoming request path ์ฆ‰, ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•˜๊ณ , destination์€ ๋ผ์šฐํŒ…ํ•˜๊ณ  ์‹ถ์€ path๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

Redirects๋Š” Rewrites์™€ ๋‹ค๋ฅด๊ฒŒ permanent property๊ฐ€ ์žˆ๋Š”๋ฐ, true์ผ ๊ฒฝ์šฐ 308 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ฃผ๊ณ , false์ผ ๊ฒฝ์šฐ์—๋Š” 307 ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค. ์ƒํƒœ์ฝ”๋“œ 308๊ณผ 307์˜ ์ฐจ์ด๋Š” redirect forever & cache, redirect temporary & is not cached์˜ ์ฐจ์ด์ธ๋ฐ, ์ „ํ†ต์ ์œผ๋กœ temporary redirect์ธ ๊ฒฝ์šฐ์—๋Š” 302๋ฅผ, permanent redirect์ธ ๊ฒฝ์šฐ 301์„ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ๋งŽ์€ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด original method์™€ ๊ด€๊ณ„์—†์ด redirect์˜ ์š”์ฒญ ๋ฐฉ๋ฒ•์„ GET์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ /v2/users ์œ„์น˜์— ์žˆ๋Š” 302 ์ฝ”๋“œ์™€ ํ•จ๊ป˜ POST /v1/users์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ, POST /v2/users ์š”์ฒญ์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋Œ€์‹  GET /v2/users๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Next.js๋Š” 307, 308 ์ƒํƒœ ์ฝ”๋“œ๋กœ ์š”์ฒญ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

// next.config.js

// Rewrites
module.exports = {
  async rewrites() {
    return [
      {
        source: '/about',
        destination: '/',
      },
    ]
  },
}

// Redirects
module.exports = {
  async redirects() {
    return [
      {
        source: '/about',
        destination: '/',
        permanent: true,
      },
    ]
  },
}

์ž‘์„ฑํ–ˆ๋˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์„œ๋ก ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ A์—์„œ Bํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ์˜ Rewrites์™€ B์—์„œ Aํ”„๋กœ์ ํŠธ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ Rewrites๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// A(3001) -> B(3000)
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/verifications/:path*',
        destination: `http://localhost:${B_PORT}/verifications/:path*`,
        basePath: false,
      },
     ]
  }
}

// B(3000) -> A(3001)
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/auth-web/:path*',
        destination: `http://localhost:${A_PORT}/auth-web/:path*`,
        basePath: false,
      },
   ]
  }
}

โ‘ Reference

  1. Next.js Docs Rewrites
  2. Next.js Docs Redirects
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€