Spring Boot + Docker Postgres 연결 시 password authentication failed 삽질기

양갱·2025년 9월 3일
post-thumbnail

프로젝트에서 Spring Boot와 PostgreSQL을 Docker로 띄워 연결하는 중, password authentication failed 오류를 맞닥뜨렸다.
분명히 application.yml에 올바른 계정과 비밀번호를 적어두었는데도 연결이 안 되었다. 문제 해결 과정을 기록해둔다.


문제 상황

Spring Boot 실행 로그에 다음과 같은 에러가 찍혔다.

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "db_user"

DB 계정은 db_user, 비밀번호는 password, DB 이름은 project-db로 맞춰두었다.
Docker 컨테이너 안에서 psql로 직접 접속하면 잘 되는데, 애플리케이션만 접속이 안 된다.


원인 파악

처음에는 비밀번호 설정 불일치를 의심해서 컨테이너 내부에서 비밀번호를 재설정했다.

ALTER ROLE db_user WITH PASSWORD 'password';

그럼에도 불구하고 문제는 해결되지 않았다.

이후 서버 로그를 자세히 보니 role "postgres" does not exist, database "db_user" does not exist 같은 다른 에러도 섞여 있었다.
→ 즉, Spring Boot가 엉뚱한 DB 인스턴스에 연결하고 있었다는 신호였다.

포트 점유 확인

원인을 찾기 위해 포트 5432를 누가 점유하고 있는지 확인했다.

netstat -ano | findstr :5432

결과는 충격적이었다.

TCP    0.0.0.0:5432   LISTENING   10804
TCP    0.0.0.0:5432   LISTENING   22300

5432 포트를 두 개의 프로세스가 동시에 점유하고 있었다.
PID를 확인해 보니:

  • 22300 → com.docker.backend (Docker가 포워딩 중)
  • 10804 → postgres.exe (로컬에 깔린 PostgreSQL)

즉, 내 애플리케이션이 localhost:5432로 연결할 때 로컬 Postgres로 갈 수도 있고, Docker Postgres로 갈 수도 있는 상태였다.
비밀번호가 맞을 리가 없었다.


해결 방법

방법 1. 로컬 Postgres 종료

로컬에 깔려 있던 PostgreSQL을 종료하고, 자동 시작도 꺼두었다.

taskkill /PID 10804 /F

이제 5432 포트는 Docker만 점유하게 되었고, Spring Boot는 정상적으로 연결되었다.

방법 2. 포트 변경 (대안)

만약 로컬 Postgres도 필요하다면, Docker 컨테이너를 5433 포트로 노출하는 것도 방법이다.

services:
  project-db:
    image: postgres:16
    ports:
      - "5433:5432"

그리고 Spring Boot 설정을 다음과 같이 수정한다.

spring:
  datasource:
    url: jdbc:postgresql://localhost:5433/project-db
    username: db_user
    password: password

교훈

  1. 비밀번호 인증 실패가 항상 진짜 비밀번호 문제는 아니다.
    엉뚱한 인스턴스에 붙고 있는 경우도 많다.

  2. 포트 충돌을 먼저 확인하자.
    netstat이나 lsof로 어떤 프로세스가 포트를 점유하고 있는지 확인하는 습관을 들이자.

  3. 로컬 환경에서는 서비스 이름(project-db) vs localhost 구분도 중요하다.

    • 앱이 로컬에서 실행 → localhost
    • 앱이 컨테이너 안에서 실행 → project-db (docker-compose 서비스 이름)

마무리

이 문제는 단순히 비밀번호를 틀린 게 아니라, 두 개의 Postgres가 같은 포트를 쓰고 있었던 충돌이었다.
덕분에 삽질을 오래 했지만, 포트 확인 습관의 중요성을 배웠다.

혹시 누군가 비슷한 문제를 겪는다면, netstat -ano | findstr :5432 한 줄부터 꼭 확인해 보길 추천한다.

profile
일기장처럼 기록하는 용도

0개의 댓글