docker) nestjs + postgresql docker-compose
기존에는 nestjs 사용시 mysql을 사용하다가 이번에 postgresql을 사용하는데 docker-compose가 마음대로 되지 않아서 몇시간을 잡아먹었다......
그래서 삽질한 나의 후기를 적고자 한다.
먼저, 덤프파일 작성 시 에러다.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydatabase
depends_on:
- ts_db
ts_db:
image: postgres:14
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydatabase
ports:
- "5434:5432"
expose:
- "5434"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./UGLYUS_DB_SCHEMA.sql:/docker-entrypoint-initdb.d/UGLYUS_DB_SCHEMA.sql
volumes:
postgres_data:
위의 도커 컴포즈는 완성된 도커컴포즈인데, 몇가지 문제점이 있었다.
1. 도커 내부 host 에러
nestjs 실행 시 env에서 host는 localhost로 잡혀있는데, 도커컴포즈로 도커 컨테이너를 만드니까 127.0.0.1:5432가 연동이 안되는 것이다.
이는 도커 host설정 시 도커 컴포즈의 ts_db와 매칭을 시켜줘야 되는데 localhost라고 작성해서 생긴 문제이다.
이는 env파일에서 DB_HOST=ts_db 로 변경해서 도커 내부에서 통신 가능하도록 변경하였다.
2. DB PORT 에러
두번째로 DB 포트에 대해서 5434로 도커 컴포즈에서 변경하였는데 계속해서 nestjs 실행 시 DB에 연결이 안되는 문제가 있었다.
이는 env파일에서 포트를 5434로 잡아놨는데 이를 5432로 해야 연결이 되는 문제였다.
3. postgresql 대소문자 이슈
세번째로는 db 덤프파일로 테이블을 생성하고 데이터를 넣는데 대소문자 이슈가 있었다.
postgresql은 대소문자를 구분할때 "" 따움표를 달아주면 대문자 그대로 넣어지고 따움표가 없으면 소문자로 들어간다. 그래서 nestjs 실행시 따움표 없이 sql문을 작성하면 같은 테이블이 2개 생기는 경험을 할 수 있다.
덤프파일은 아래와 같이 대문자를 원하면 따움표를 넣어주도록 하자.
-- 열거형 타입 정의
CREATE TYPE "LESSON_lesson_type_enum" AS ENUM ('ONETIME', 'REGULAR');
CREATE TYPE "LESSON_lesson_dow_enum" AS ENUM ('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
-- COACH 테이블 생성s
CREATE TABLE "COACH"
(
"COACH_NO" bigserial
PRIMARY KEY,
"COACH_NM" varchar NOT NULL
);
-- COURT 테이블 생성
CREATE TABLE "COURT"
(
"COURT_NO" bigserial
PRIMARY KEY,
"COURT_NM" varchar NOT NULL
);
-- CUSTOMER 테이블 생성
CREATE TABLE "CUSTOMER"
(
"CUST_NO" bigserial
PRIMARY KEY,
"CUST_NM" varchar NOT NULL,
"CUST_TEL" varchar NOT NULL,
"CUST_ID" varchar NOT NULL,
"CUST_PW" varchar NOT NULL
);
-- LESSON 테이블 생성
CREATE TABLE "LESSON"
(
"LESSON_NO" bigserial
PRIMARY KEY,
"LESSON_TYPE" "LESSON_lesson_type_enum" NOT NULL,
"LESSON_DOW" "LESSON_lesson_dow_enum" NOT NULL,
"LESSON_FREQ" integer NOT NULL,
"LESSON_TIME" timestamp DEFAULT now() NOT NULL,
"DURATION" varchar NOT NULL,
"CREATED_AT" timestamp DEFAULT now() NOT NULL,
"UPDATED_AT" timestamp DEFAULT now() NOT NULL,
"CUST_NO" bigint
REFERENCES "CUSTOMER",
"COACH_NO" bigint
REFERENCES "COACH",
"COURT_NO" bigint
REFERENCES "COURT",
"USE_YN" varchar DEFAULT 'y'::character varying NOT NULL,
"LESSON_GROUP_ID" uuid
);
-- COACH 테이블에 데이터 삽입
INSERT INTO "COACH" ("COACH_NO", "COACH_NM")
VALUES (1, '김민준'),
(2, '오서준'),
(3, '이도윤'),
(4, '박예준');
-- COURT 테이블에 데이터 삽입
INSERT INTO "COURT" ("COURT_NO", "COURT_NM")
VALUES (1, 'A코트'),
(2, 'B코트'),
(3, 'C코트'),
(4, 'D코트'),
(5, 'E코트');