[linux,docker,postgresql]docker+express+postgresql

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

Leave a Reply