Skip to content

TIL -2025-05-22 [PostgreSQL + Spring Boot: 개발·배포·Docker Compose 통합] #73

@soheeGit

Description

@soheeGit

📌 PostgreSQL + Spring Boot: 개발·배포·Docker Compose 통합

https://hub.docker.com/_/postgres

1. PostgreSQL Docker 컨테이너 실행

docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=rootpass postgres:16-alpine 
docker logs postgres
docker ps
  • 컨테이너 이름: postgres
  • 비밀번호: rootpass
  • 포트 매핑: 5432:5432
Image Image Image

2. 개발 환경 (application-dev.yml)

server:
  port: 8080 # 충돌 문제 시 수정
spring:
  # JPA
  jpa:
    hibernate:
      ddl-auto: create 
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect # PostgreSQL
        show_sql: true
        format_sql: true
  # 데이터소스
  datasource:
    driver-class-name: org.postgresql.Driver # PostgreSQL
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: rootpass
  • localhost를 통해 로컬에서 PostgreSQL 컨테이너에 직접 연결

3. 개발 실행 결과

  • Pet 엔티티에 대응되는 테이블이 자동 생성됨 (Hibernate ddl-auto: create)
  • Docker PostgreSQL과 연결 성공 시 아래처럼 테이블이 보임
Image

4. 배포 환경 준비 (prod)

  • 네트워크 구성
docker network create db-network
docker network connect db-network postgres
docker network inspect db-network

Spring Boot 컨테이너와 PostgreSQL 컨테이너를 같은 네트워크에 연결
내부 통신 주소는 postgres (컨테이너 이름)

  • application-prod.yml
server:
  port: 8080 # 충돌 문제 시 수정
spring:
  # JPA
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect 
        show_sql: true
        format_sql: true
  # 데이터소스
  datasource:
    driver-class-name: org.postgresql.Driver 
    url: ${DB_URL}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  • .env 파일
DB_URL=jdbc:postgresql://postgres:5432/postgres
DB_USERNAME=postgres
DB_PASSWORD=rootpass

PostgreSQL 컨테이너 이름을 postgres로 사용하여 같은 네트워크 내에서 연결

5. 배포용 Spring Boot 이미지 빌드 & 실행

docker build -t my-boot:postgres -f Dockerfile .
docker run -d -p 8787:8080 --name boot-container-250522 --env-file .env --network db-network my-boot:postgres
docker logs boot-container-250522
  • 8787 포트로 외부에 노출
  • 환경 변수는 .env로부터 주입
  • PostgreSQL과 동일 네트워크(db-network) 사용
Image

3. Docker Compose로 통합 자동화

  • docker-compose.yml
services:
  # spring boot
  app:
    build: .
    ports:
      - "${APP_PORT}:8080"  # 외부 -> 내부 포트 연결
    env_file:
      - ".env"
    networks:
      - "app-network"
    depends_on:
      - postgresql  # DB 먼저 실행
  # Postgres
  postgresql:
    image: "postgres:16-alpine"
    env_file:
      - ".env"
    ports:
      - "${DB_PORT}:5432"  # 외부 -> DB 포트 연결
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - "app-network"

volumes:
  db-data:  # DB 데이터 영속화

networks:
  app-network:
  • .env
DB_URL=jdbc:postgresql://postgresql:5432/postgres
DB_USERNAME=postgres
DB_PASSWORD=rootpass
# 포트
APP_PORT=18787
DB_PORT=15432
# DB
POSTGRES_PASSWORD=rootpass

postgresql은 서비스 이름이며 내부 네트워크의 호스트명으로 작동

docker compose up  # 실행
docker compose down  # 중지 및 정리
Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions