👉🏻 아래는 도커+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"
}
}