팀프로젝트

# postgresql와 docker 연결 오류 해결

KimMZ 2025. 2. 14. 23:12

1. 상황 설명

저희 팀은 프로젝트를 docker 컨테이너로 실행하기 위해

PostgreSQL 서비스는 docker-compose.yaml 파일에 설정 및 각자 db 환경에 맞는 변수를 따로 지정하기로 하였습니다.

# docker-compose.yaml
volumes:
  postgres-data:

services:
  db:
    container_name: db
    image: postgres:latest
    volumes:
      - postgres-data:/var/lib/postgresql/data
    env_file:
      - .env
    networks:
        - app_network
    ports:
      - "5432:5432"


networks:
  app_network:
    driver: bridge
# application.yml
spring:
  config:
      import: optional:file:.env[.properties]
  profiles:
    active: local
  datasource:
    url: ${SPRING_DATASOURCE_URL}
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}
    driver-class-name: org.postgresql.Driver
  jpa:
    defer-datasource-initialization: true
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  sql:
    init:
      mode: always
---
spring:
  config:
    activate:
      on-profile: local
  docker:
    compose:
      enabled: true
      start:
        command: up
      stop:
        command: stop
        timeout: 10s

---
spring:
  config:
    activate:
      on-profile: aws
  docker:
    compose:
      enabled: false

2. 문제

제가 postgreSQL Database를 새로 "deliveryninezo" 생성한 후, intelliJ에서 DB 연결을 하였습니다. 

이후, root 경로에 .env 파일을 아래와 같이 생성하고 application을 실행하니 로컬 DB에 연결이 잘 되었습니다.

# local PostgreSQL 연결 설정
POSTGRES_USER=postgres
POSTGRES_PASSWORD=master
POSTGRES_DB=deliveryninezo


SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/deliveryninezo
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=master

 

 

docker를 이용하여 컨테이너 내 DB를 사용할 수 있는 것과 로컬DB를 사용하는 것은 다른 개념이었습니다.

결론은 저도 다른 팀원들과 같이 로컬DB 연결이 아닌 .env 파일로 실행 시, docker 연결이 제대로 되지 않았습니다.

# Docker PostgreSQL 연결 설정
POSTGRES_USER=postgres
POSTGRES_PASSWORD=1234
POSTGRES_DB=mydb


SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=1234

 

3. 해당 오류

error message
Failed : JDBC connected "mydb"
  • database가 없어서 연결이 안된건가 싶었고, docker desktop의 container, volume, image를 모두 삭제하고 재실행도 해봤지만 동일한 오류가 계속 발생했습니다.
  • 실행 시, 콘솔에 인코딩 문제가 있어서 파일 인코딩도 UTF-8로 변경했지만 해결되지 않았습니다.

 

4. 의문점

  1. 팀원 내 2명은 docker desktop 관련 파일 삭제 후, 재실행하니 오류가 발생하지 않았고, 해당 팀원은 로컬에 DB를 설치하지 않은 상태였다.
  2. 저와 다른 팀원 1명은 로컬에 DB 설치가 되어있었고, 동일한 방식으로 실행해도 해결되지 않은 상황이었다.

 

5. 문제 해결

intelliJ에서 local DB 연결과 docker 환경에서 실행할 DB 연결을 포트 5432로 동일하게 설정한게 문제가 되었습니다.

local DB가 먼저 연결되어 이후 docker 실행 시, 포트 5432에 해당하는 database를 연결할 수 없었습니다.

  1. 포트 5432 중단
  2. application을 다시 실행해보니 정상적으로 docker desktop에서 postgreSQL 연결되고 오류 해결
# cmd 관리자
netstat -ano | findstr :5432
taskkill /f /pid {PID번호} # 해당 포트 강제종료

 

 

6. 배운점

# Docker PostgreSQL 연결 설정한 .env 파일에서 사용하는 환경변수가 컨테이너가 시작될 때 지정된 데이터베이스 이름(POSTGRES_DB=mydb)으로 자동 생성된다는 것이다.

따로 local 데이터베이스를 생성하고 지정할 수도 있다. 이때, 로컬 머신에 postgreSQL이 설치되어 있어야 하고, 처음 # local PostgreSQL 연결 설정한 .env파일대로 application을 실행하면 docker 컨테이너가 실행 중이지만, DB는 로컬로 연결된다는 것을 깨닫게 되었습니다.

 

매번 프로젝트 초기 설정이 어렵고 시간도 많이 소요되는 것 같다. 그렇지만 이런 시행착오를 거치면서 해결할 수 있는 방법을 찾아보고 더 깊이 이해할 수 있게 되는 것 같다.