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

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, SQL

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค / Pagila ์›น์•ฑ ์ž‘์„ฑํ•˜๊ธฐ (1)

 

์˜ํ™”์˜ post ๋ชฉ๋ก, ์ข‹์•„์š” ๊ธฐ๋Šฅ, ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Pagila ์›น์•ฑ ์‹ค์Šต์ด๋‹ค.

์‹ค์Šต ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜
  • Express - ์„œ๋ฒ„
  • prisma - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ต
  • Postgresql, supabase - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

 

 

๋ณธ ํฌ์ŠคํŠธ์—์„œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€๋ถ„์€ ๊ธฐ์กด์— ์ œ๊ณต๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฑ์—”๋“œ ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ–ˆ๋‹ค

 

 


 

 

์ดˆ๊ธฐ ์„ค์ •

 

#๊นƒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ
git init
#package.json ์ดˆ๊ธฐ ํŒŒ์ผ ์ƒ์„ฑ
npm init -y

#prisma ์„ค์น˜
npm install prisma -D
#prisma ์ดˆ๊ธฐ ์„ค์ •
npx prisma 
npx prisma init

 

 

package.json์— ์ถ”๊ฐ€

  "type": "module",
  "main": "src/index.mjs",

 

* mjs : ECMAScript ๋ชจ๋“ˆ(ESM)์„ ์œ„ํ•œ JavaScript ํŒŒ์ผ ํ™•์žฅ์ž. ์ด ํ™•์žฅ์ž๊ฐ€ ๋ถ™์€ ํŒŒ์ผ์€ ES ๋ชจ๋“ˆ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, import ์™€ export ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

Supabase ์—ฐ๊ฒฐ

1. ์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ƒ๋‹จ ์ค‘์•™์˜ Connect ํด๋ฆญ

 

2. ORMS - .env.local ํƒญ์˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด .env ํŒŒ์ผ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ

[YOUR-PASSWORD] ๋ถ€๋ถ„์€ ๋‚ด๊ฐ€ ์ฒ˜์Œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•  ๋•Œ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋Œ€์ฒด

 

DATABASE_URL์˜ ๋งํฌ ๋์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ connection_limit ์ถ”๊ฐ€ (pgbouncer=true๋„ ์—†์„ ๊ฒฝ์šฐ ์ถ”๊ฐ€ํ•œ๋‹ค)

&connection_limit=1

 

 

3. schema.prisma ํŒŒ์ผ

datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  directUrl         = env("DIRECT_URL")
}

generator client {
  provider = "prisma-client-js"
}

 

 

4. supabase์˜ postgresql๊ณผ์˜ ์—ฐ๊ฒฐ ํ™•์ธ

#Supabase์˜ postgresql์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค
npx prisma db pull

 

 

 

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 

1. prisma ํด๋”์— migrations/0_init ํด๋” ์ƒ์„ฑ ํ›„ prisma ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ sql ์ƒ์„ฑ

npx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/0_init/migration.sql

 

 

2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ •๋ณด ์ ์šฉ

npx prisma migrate resolve --applied 0_init

 

The migration ~~ is already recorded as applied in the database ๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด ์ด๋ฏธ ์ ์šฉ๋๋‹ค๋Š” ๊ฒƒ์ด๋‹ˆ ์‹ ๊ฒฝ์•ˆ์จ๋„ ๋œ๋‹ค

 

 

3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์ž‘

npx prisma migrate dev

 

 

 

์„œ๋ฒ„

npm i express morgan dotenv cors cookie-parser
npm i -D nodemon
npm i -D eslint@^8 eslint-config-prettier eslint-plugin-prettier prettier

 

 

  • morgan : http ์š”์ฒญ ๋กœ๊ฑฐ ๋ฏธ๋“ค์›จ์–ด (๋””๋ฒ„๊น… ์‹œ ์œ ์šฉํ•จ)
  • dotenv : .env ํŒŒ์ผ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ process.env๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์คŒ
  • nodemon : ํŒŒ์ผ์„ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘์‹œํ‚ค๋Š” ํˆด

 

index.mjs

import express from "express";
import cors from "cors";
import morgan from "morgan";
import dotenv from "dotenv";
import cookieParser from "cookie-parser";

// .env ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
dotenv.config();

// HTTP ์„œ๋ฒ„ ์ƒ์„ฑ
const app = express();

// CORS ์„ค์ •
const corsOrigin = ["http://localhost:5173", "http://localhost:3000"];

app.use(
  cors({
    origin: corsOrigin,
    methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
    preflightContinue: false,
    optionsSuccessStatus: 204,
    credentials: true,
  }),
);

// ์ฟ ํ‚ค, body ํŒŒ์‹ฑ
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// HTTP ์š”์ฒญ ๋กœ๊น…
app.use(
  morgan(":method :url :status :res[content-length] - :response-time ms"),
);

// Health Check
app.get("/health", (_, res) => {
  return res.status(200).json({
    message: "health check",
  });
});

// ๋‚˜๋จธ์ง€ ์š”์ฒญ์€ ๋ชจ๋‘ 404
app.use((_, res) => {
  return res.status(404).json({
    error: "Not Found",
  });
});

app.listen(8090, () => console.log("Listening to 8090..."));

 

 

nodemon์œผ๋กœ ํ•œ๋ฒˆ ์„œ๋ฒ„ ์‹คํ–‰์ด ์ž˜๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด package.json์˜ script์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค

  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview",
    // ์ถ”๊ฐ€
    "server": "nodemon src/index.mjs"
  },

 

๊ทธ๋ฆฌ๊ณ  npm run server๋กœ ์‹คํ–‰ ํ›„  http://localhost:8090/health ๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด

 

์„œ๋ฒ„ ์…‹ํŒ…๊นŒ์ง€ ์™„๋ฃŒ!