Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions