NestJS 환경에서 Prisma, Docker, PostgreSQL을 사용해 개발 중이었다.
분명 처음에 세팅할 때는 Docker로 PostgreSQL 컨테이너를 띄운 뒤 pulseuser라는 사용자도 잘 생성되었다. 실제로 개발 중에도 아무 문제 없이 쿼리를 날릴 수 있었다.
그런데 노트북을 재부팅하고 나서부터 갑자기 PostgreSQL 접속이 되지 않기 시작했다.

지피티가 시키는 대로 컨테이너를 초기화했다가 다시 생성하기도 하고, volume을 사용해서 컨테이너를 생성하기도 하고 사용자를 수동으로 주입하는 등 여러 방법을 사용해봤지만 계속해서 동일한 에러가 발생했다.
내가 했던 것들...
- 컨테이너를 초기화했다가 재생성
- volume을 제거하고 다시 mount
- init.sql로 사용자 직접 생성 시도
- pg_hba.conf 수정
- docker exec로 컨테이너 안에서 수동 생성 시도
-> 다 실패했음
결국 구글링을 통해 stack overflow에서 답을 얻을 수 있었다!!!!
https://stackoverflow.com/questions/48593016/postgresql-docker-role-does-not-exist
이 자리를 빌려 샤라웃합니다.
위 링크 내용을 요약하면, 작성자는 Docker로 Postgres 컨테이너를 띄워서 각종 DB와 유저를 생성하였고 컨테이너 내부에서는 유저와 DB 생성이 잘 되었지만 psql -h localhost -U postgres 또는 U ming로 외부에서 접속하려 하면 “role does not exist” 에러가 발생하는 문제를 겪고 있었다.
원인
원인은 role이 존재하지 않는 것이 아니라, docker 밖에서 실행 중인 Mac의 로컬 Postgres 서버에 접속되고 있었기 때문이었다. 즉, Docker 컨테이너의 5432 포트가 Mac의 로컬 Postgres가 이미 점유한 상황이라 Docker의 포트 매핑이 안 되고,
결국 psql -h localhost -p 5432 명령은 docker 컨테이너가 아니라 Mac에 이미 떠 있는 로컬 Postgres 서버에 연결을 시도하기 때문에 role이 존재하지 않는다는 에러가 발생하는 것이었다.
해결 방법
1. Mac에서 로컬 PostgreSQL 종료
brew services stop postgresql
(Mac OS 기준)
2. 포트 점유 상태 확인
lsof -n -i:5432
아무것도 안 나오면 성공
3. Docker PostgreSQL 재시작 또는 재생성
로컬 PostgreSQL을 껐으면 이제 Docker가 포트를 쓸 수 있으니, 아래 명령으로 실행한다.
docker rm -f myproject-ecs-postgresql-1
docker volume rm pulse_pgdata
docker volume create pulse_pgdata
docker run -d \
--name myproject-ecs-postgresql-1 \
-e POSTGRES_USER='your-user' \
-e POSTGRES_PASSWORD='your-password' \
-e POSTGRES_DB='your-db' \
-v pulse_pgdata:/var/lib/postgresql/data \
-p 15432:5432 \
postgres:14
이렇게 하면 처음부터 Docker 전용 Postgres가 올라오고, role도 제대로 설정된다!
앞으로 지피티 맹신보단 스택오버플로우를 애용해봐야지,,,
'Dev > Backend' 카테고리의 다른 글
| GraphQL이란? (3) | 2025.07.03 |
|---|---|
| [Springboot] Spring IoC 컨테이너 쉽게 이해하기 (2) | 2025.04.06 |
| RESTful API란? (0) | 2025.03.31 |
| [Spring] 이메일 전송 로직 구현하기 (0) | 2025.01.24 |
| [Node.js / TypeScript] 발생한 문제와 해결 방법들 (2) | 2024.08.26 |