๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev

[spotify-api] VINYLIFY : ์Šคํฌํ‹ฐํŒŒ์ด apiํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ + ์žฌ์ƒ ํ”„๋กœ์ ํŠธ(n+1) vercel ๋ฐฐํฌ vite.config.ts ์ ์šฉ ์•ˆ๋˜๋Š” ๋ฌธ์ œ

์ด์ „ ๊ธ€ : 2024.07.12 - [๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป dev] - [spotify-api] VINYLIFY : ์Šคํฌํ‹ฐํŒŒ์ด apiํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ + ์žฌ์ƒ ํ”„๋กœ์ ํŠธ(n) ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ react-infinite-scroll๊ณผ useInfiniteQuery๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ

 

[spotify-api] VINYLIFY : ์Šคํฌํ‹ฐํŒŒ์ด apiํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ + ์žฌ์ƒ ํ”„๋กœ์ ํŠธ(n)๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ react-infinite-scroll๊ณผ useI

๐Ÿ˜… ๋“œ๋””์–ด 2๋‹ฌ(?) ์ •๋„ ๊ธด ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„์งœ ๋์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋Š๋‚Œ! ๐Ÿฅณ ์ •๋ฆฌํ•ด์„œ ํ•œ๋ฒˆ์— ์˜ฌ๋ฆฌ๋ ค๋‹ค๊ฐ€ ์ถ•ํ•˜ ๊ธฐ๋…(?)์œผ๋กœ ์˜ค๋Š˜ ๋”ฐ๋ˆํ•˜๊ฒŒ ๋๋‚ธ react-infinite-scroll+ useInfiniteQuery๋ฌด

pyotato-dev.tistory.com

 

๐Ÿฅณ ๋“œ๋””์–ด vercel๋กœ ๋ฐฐํฌ! ํ•ด์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ ํ•œ๋ฒˆ ๋ณด์ž! ํ–ˆ๋Š”๋ฐ..
์œผ์•… ๋ฌด์Šจ ์ผ์ด์•ผ! ๊ฐ€์‚ฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” api๊ฐ€ ๊ณ„์† html document๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์–ด์„œ ๊ฐ€์‚ฌ๋ฅผ ์•„์˜ˆ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋‹ˆ..
๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋งŒ ๊ทธ๋ ‡๊ณ , dev ํ™˜๊ฒฝ์—์„œ๋Š” ์ž˜ ๋Œ์•„๊ฐ€์„œ ๋” ํ™ฉ๋‹นํ–ˆ๋‹ค.

 

๐Ÿ•ต๏ธ ๋ฌธ์ œ ํŒŒ์•…

1. dev์—์„œ ์ž˜ ๋Œ์•„๊ฐ€๊ณ , vercel๋กœ ๋ฐฐํฌํ•œ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. 

๊ฐ€์‚ฌ์•  ํ•ด๋‹น ๋˜๋Š” ๊ฒฐ๊ณผ genius api

2. genius api ์ด์™ธ์˜ ๋‹ค๋ฅธ api๋“ค์€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ์‹œ์ž‘๋œ ํ‹€๋ฆฐ ๊ทธ๋ฆผ ์ฐพ๊ธฐ.. 

์‹œ๋„ 1 : vite๋กœ spa๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ ค๋ฉด vercel.json์— ์„ค์ •์„ ํ•ด์ค˜์•ผํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‚˜?

vite spa๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์„ค์ •์„ vercel.json ํŒŒ์ผ์— ํ•ด์ค˜์•ผํ•œ๋‹ค.

{
  "rewrites": [
    {
    // ์„ค์ •์„ ์•ˆํ•˜๋ฉด '/'์ œ์™ธ ๋ชจ๋“  ํŽ˜์ด์ง€ 404
      "source": "/(.*)",
      "destination": "/index.html"
    }
  ],
}

 

ํ˜น์‹œ ์œ„์˜ ์„ค์ • ๋•Œ๋ฌธ์— ๋ชจ๋“  GET ์š”์ฒญ์ด html์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •์ด ๋˜์—ˆ๋‚˜?

 

NOPE! ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด์–ด ๋„คํŠธ์›Œํฌ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ๋‹ค๋ฅธ GET ์š”์ฒญ๋“ค์€ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. 

 

์‹œ๋„ 2 :  vite.config.ts ์„ค์ •์ด ์•ˆ ๋จน๋‚˜? vercel.json์—๋„ rewrite ๋˜‘๊ฐ™์ด ํ•ด๋ณด์ž

dev ํ™˜๊ฒฝ์—์„œ vite.config.ts๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •์„ ํ•ด๋’€๊ณ , ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ /genius/api๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด 

์„œ๋ฒ„์ธ https://api.genius.com์œผ๋กœ ๋ณด๋‚ด ์ฃผ๋ฉด cors ๋ฌธ์ œ์—†์ด api์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  server: {
    proxy: {
      '/genius/api': {
        target: 'https://api.genius.com',
        changeOrigin: true,
        rewrite: path => path.replace(/^\/genius\/api/, ''),
      },
    },
  },

 

vercel.json์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด ์คฌ๋‹ค.


{
  "rewrites": [
    {
      "source": "/genius/api/:match*",
      "destination": "https://api.genius.com/:match*"
    },
    {
      "source": "/(.*)",
      "destination": "/index.html"
    }
  ]
}

 

 

์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋ฉด ๊น”๋”ํ•˜๊ฒ ์ง€๋งŒ, ์ „ํ˜€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์•˜๋‹ค.

์˜คํžˆ๋ ค CORS ์—๋Ÿฌ ใ…œใ…œ ๋ฐœ์ƒ.. header ์„ค์ •๋„ ํ•ด์คฌ์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.

 

์‹œ๋„ 3 :  ๋˜๋Š” ๊ฑธ ๋”ฐ๋ผ ํ•˜์ž.

๋‹ค๋ฅธ api๋“ค์€ ๋”ฐ๋กœ vercel์ด๋‚˜ vite.config.ts์—์„œ ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค.

๊ทผ๋ฐ๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ ๋ณด๋ฉด ๊ฑฐ๊ธฐ์„œ ํ•ด์คฌ๋˜ ๋Œ€๋กœ ํ•ด๋ณด๊ณ ์ž ky ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

// ์Šคํฌํ‹ฐํŒŒ์ด api
const api = ky.extend({
  prefixUrl: API.SPOTIFY,
  hooks: {
    beforeRequest: [
      req =>
        req.headers.set(
          'Authorization',
          `Bearer ${localStorage.getItem(VINYLIFY_TOKEN)}`,
        ),
    ],
// ... ์ƒ๋žต


// ๊ฐ€์‚ฌ api ์ˆ˜์ •
import ky from 'ky';
const api = ky.extend({
  prefixUrl: API._GENIUS, //๋ณ€๊ฒฝ
  hooks: {
    // ... ์ƒ๋žต
  },
  
  // @/constants/url.ts
  export const API = {
  LOGIN: 'https://vinylify-express.vercel.app/',
  SPOTIFY: 'https://api.spotify.com/v1/',
  _GENIUS: 'https://api.genius.com/',
  GENIUS:
    '/genius/api' /** proxy vite.config.ts ์„ค์ • (https://api.genius.com) */,
  EXPRESS: 'https://vinylify-express.vercel.app/',
};

 

๊ทธ๋žฌ๋”๋‹ˆ ํ•ด๊ฒฐ!


๐Ÿ“š References

 

https://vercel.com/docs/frameworks/vite#using-vite-to-make-spas

 

Vite on Vercel

Learn how to use Vercel's features with Vite.

vercel.com

 

https://vercel.com/guides/how-to-enable-cors

 

How to Enable CORS on Vercel

Learn how to enable CORS in a single Node.js Serverless Function, in a Next.js app, and using vercel.json.

vercel.com