๐๐ป ์๋๋ ๋์ปค+express+postgresql๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ํ๋ ์์ ์ฝ๋ ์
๋๋ค.
Below is an example code that connects Docker + Express + PostgreSQL database.
๐๐ป ๋๋ ํ ๋ฆฌ / directory
my-app/
โโโ Dockerfile
โโโ compose.yaml
โโโ package.json
โโโ app.js
โโโ .env
โโโ db.js
โโโ routes/index.js
โโโ routes/health.js
โโโ ...
๐๐ป Dockerfile
FROM node:24-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
๐๐ป ์ฝ๋ / code
โ๏ธ compose.yaml
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: Myapp@1234
MYSQL_DATABASE: myapp
MYSQL_USER: myapp
MYSQL_PASSWORD: Myapp@1234
volumes:
- ./mysql-data:/var/lib/mysql
ports:
- "3306:3306"
app:
build: .
restart: always
depends_on:
- db
environment:
DB_HOST: db
DB_USER: myapp
DB_PASSWORD: Myapp@1234
DB_NAME: myapp
DB_PORT: 3306
ports:
- "3000:3000"
volumes:
- .:/app # ๊ฐ๋ฐ ์ค ์ฝ๋ ๋ณ๊ฒฝ ์ฆ์ ๋ฐ์
โ๏ธ app.js
require("dotenv").config();
const express = require("express");
const app = express();
const port = 3000;
app.use(express.json());
const indexRouter = require("./routes/index");
app.use("/", indexRouter);
app.use("/health", require("./routes/health"));
app.listen(port, () => {
console.log(`Express server running on port ${port}`);
});
โ๏ธ .env
POSTGRES_USER=myapp
POSTGRES_PASSWORD=myapp@1234
POSTGRES_DB=myapp
โ๏ธ db.js
const { Pool } = require("pg");
const pool = new Pool({
host: process.env.DB_HOST || "localhost",
port: process.env.DB_PORT || 5432,
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
// ์ฐ๊ฒฐ ํ ์ค์ (์ ํ)
// Set up connection pool (optional)
max: 10,
idleTimeoutMillis: 30000,
});
// ์ฐ๊ฒฐ ์ค๋ฅ ์ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ (๋๋ฒ๊น
์ฉ)
// Leave a log when a connection error occurs (for debugging)
pool.on("error", (err) => {
console.error("Unexpected error on idle client", err.stack);
});
module.exports = pool;
โ๏ธ routes/index.js
const express = require("express");
const router = express.Router();
const pool = require("../db");
// GET /
router.get("/", async (req, res) => {
try {
// PostgreSQL ํ์ฌ ์๊ฐ ์กฐํ
// PostgreSQL current time query
const result = await pool.query("SELECT CURRENT_TIMESTAMP AS now");
res.json({
success: true,
message: "Connected to PostgreSQL successfully!",
serverTime: result.rows[0].now,
});
} catch (err) {
console.error("Database query error:", err.stack);
res.status(500).json({
success: false,
error: "Database connection failed",
});
}
});
module.exports = router;
โ๏ธ routes/health.js
const express = require("express");
const router = express.Router();
const pool = require("../db");
// GET /health
router.get("/", async (req, res) => {
try {
// PostgreSQL ์ฐ๊ฒฐ ํ
์คํธ: ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ก ์ฐ๊ฒฐ ์ํ ํ์ธ
// Test PostgreSQL connection: Check connection status with a simple query
await pool.query("SELECT 1");
// DB ์ฐ๊ฒฐ์ด ์ ์์ผ ๋
// When the DB connection is normal
res.json({
status: "UP",
message: "Service is healthy",
timestamp: new Date().toISOString(),
});
} catch (err) {
// DB ์ฐ๊ฒฐ ์คํจ ๋๋ ์ฟผ๋ฆฌ ์๋ฌ ๋ฐ์ ์
// When DB connection fails or query error occurs
console.error("Health check failed:", err.message);
res.status(503).json({
status: "DOWN",
message: "Database connection failed",
timestamp: new Date().toISOString(),
// ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์์ธ ์๋ฌ ๋
ธ์ถ
// Detailed errors are only displayed in the development environment.
// error: process.env.NODE_ENV === "development" ? err.message : undefined,
});
}
});
module.exports = router;
โ๏ธ package.json
{
"name": "postgresqlmyapp",
"version": "1.0.0",
"description": "",
"license": "ISC",
"author": "",
"type": "commonjs",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"dotenv": "^17.2.3",
"express": "^5.2.1",
"pg": "^8.16.3"
}
}