NestJs에서 Wait-for-it 스크립트 적용하기

Jeong Choi(최현정)·2023년 9월 29일
0

NestJS

목록 보기
1/1

1) Wait-for-it 스크립트 적용계기

개발을 하는 도중에 아래와 같은 문제가 생겼습니다.

결국 정상적으로 서버가 켜져서 지장은 없었지만 한 번 앱을 로드 할때마다 아래와 같은 수많은 에러 메세지들이 너무 불편했으며, 전 프로젝트를 진행했을때는 이 문제로 인하여 앱이 켜지지 않는 상황까지 발생했기때문에 추후 문제 발생을 막기 위해 문제를 해결하고자 합니다.

Mysql을 load하는 도중에 TypeOrm Error라던지, 환경설정 문제로 load가 늦어지는 상황입니다. Docker설정에서 저의 Nest서버는 Mysql에 의존하고 있는 상태입니다.

즉, 순서는 Mysql → Nest 순서로 켜져야 하는 상황인데 현재 Mysql의 load시간이 오래 걸리는 바람에 Nest서버에서 에러 메세지를 계속 저에게 띄우고 있습니다.

Nest서버는 켜질 준비가 되어있는데, Mysql이 load가 되지 않는 바람에 자신도 load가 될 수 없다라는 상황이기 때문에 위 사진과 같은 에러가 계속 발생하는 상황입니다.

이 문제를 해결하기 위해서 wait-for-it 스크립트를 적용시키려고 합니다.

2) wait-for-it 스크립트란?

wait-for-it 스크립트는 Docker 설정에서 유용하게 쓰입니다. 여러 Docker Container들을 동시에 실행해야 할 때, 각각의 Container들의 실행 순서들을 지정해줍니다.

제 프로젝트에 적용시켜보겠습니다. Nest서버는 Mysql이 완전히 load되기 전에 실행이 되어 위의 에러메세지와 같은 에러들을 발생시킬 수 있습니다.

그래서 wait-for-it 스크립트를 적용시키면 Nest서버는 Mysql이 완전히 load되기 전까지 기다리며 Mysql이 완전히 load가 되면 그때 Nest서버를 load시키면서 위와 같은 에러들을 차단할 수 있습니다.

3) wait-for-it 스크립트 적용

[1][wait-for-it.sh](http://wait-for-it.sh) 설치

curl https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -o wait-for-it.sh

위의 명령어를 프로젝트 터미널창에 입력합니다.

위의 사진과 같이 wait-for-it.sh이 생성된 걸 확인할 수 있습니다.

[2] Dockerfile 수정

FROM node:15 

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

RUN npm install -g nodemon

COPY wait-for-it.sh /usr/wait-for-it.sh //추가

RUN chmod +x /usr/wait-for-it.sh //추가**

COPY . .

EXPOSE 8080

CMD ["nodemon", "src/main.ts"]

wait-for-it 스크립트를 복사하고, 권한 설정까지 해줍니다.

[3] docker-compose.yml 수정

version: '3'

services:
  nest:
    container_name: And-You-Backend
    image: nest
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db
      - neo4j
    environment:
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_NAME=${DB_NAME}
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    command: ["/usr/wait-for-it.sh", "db:3306", "--", "npm", "start"] //추가**

Nest 서버에 command를 추가하여 Mysql이 실행되기 전까지 기다리도록 합니다.

설정을 마친뒤에 다시 Docker를 켜봅시다.

더이상 에러메세지가 뜨지 않고 정상적으로 nest서버가 실행되는 걸 확인할 수 있습니다.

profile
Node와 DB를 사랑하는 백엔드 개발자입니다:)

0개의 댓글