์ํ์ 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 ๋ก ๋ค์ด๊ฐ๋ณด๋ฉด
'๋ฐ์ดํฐ๋ฒ ์ด์ค, SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค / ORM, Prisma, 3Tier (0) | 2025.05.22 |
---|---|
๋ฐ์ดํฐ๋ฒ ์ด์ค / JOIN (0) | 2025.05.20 |
๋ฐ์ดํฐ๋ฒ ์ด์ค / ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (0) | 2025.05.20 |
๋ฐ์ดํฐ๋ฒ ์ด์ค / SQL ๊ตฌ๋ฌธ ๋ฌธ๋ฒ (0) | 2025.05.20 |
๋ฐ์ดํฐ๋ฒ ์ด์ค / ๊ฐ์ (5) | 2025.05.19 |