Post

개발, 프로덕션, 테스트 환경 분리 대작전(Package.json 과 dotenv)

🤔 Problem

로컬에서 개발을 하면서 Dev 용 데이터베이스와 Test 용 데이터베이스를 분리해서 진행하고 싶었다.

그래서 도커로 각각 따로따로 데이터베이스를 띄워두고 사용했는데 제법 편리했다. dotenv 와 package.json 으로 명령어를 분리하니 어렵지 않게 구현이 가능했다.

그러던 중 배포서버에서 Oauth 로그인을 진행하려면 별도의 환경변수와 redirect URL을 기록해야 했기 때문에 각각의 환경에서 사용할 .env 파일과 npm 명령어를 나누어 작성하는 테크닉을 사용하기로 했다.

🌱 Solution

  1. Dotenv 패키지를 설치한다.

    npm install dotenv --save


  2. 각각의 환경에 맞는 환경변수 파일을 작성한다.

    1
    2
    3
    
      .env.development
      .env.test
      .env.production
    


  3. package.json 의 Script 부분에 해당 .env 에 맞는 파일을 사용하게끔 명령어를 작성한다.

    1
    
    $ dotenv -e ./.env.development -- <<명령어>>
    
    package.json 코드
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    
    "scripts": {
    
      # 개발환경 --------------------------------------------------------------------------
    
      # 개발 환경용 데이터베이스 컨테이너 제거
      "db:dev:rm": "docker compose rm dev-db -s -f -v",
    
      # 개발 환경용 데이터베이스 컨테이너 실행
      "db:dev:up": "docker compose up dev-db -d",
    
      # 상기 명령어 조합 : 개발 환경용 데이터베이스 컨테이너 제거 후 재시작 및 Prisma 마이그레이션 실행
      "db:dev:restart": "npm run db:dev:rm && npm run db:dev:up && sleep 1 && npm run prisma:dev:deploy",
    
      # Prisma 스튜디오 실행 (개발 환경)
      "prisma:dev:studio": "dotenv -e ./.env.development -- npx prisma studio",
    
      # 개발 환경용 Prisma 마이그레이션 실행
      "prisma:dev:deploy": "dotenv -e ./.env.development -- prisma migrate dev",
    
      # 개발 환경 설정을 적용한 개발 모드로 Nest.js 앱 실행
      "dev": "dotenv -e .env.development -- nest start --watch",
    
    
      # 테스트 환경 --------------------------------------------------------------------------
    
      # 테스트 환경용 Prisma 마이그레이션 실행
      "prisma:test:deploy": "dotenv -e ./.env.test -- prisma migrate deploy",
    
      # 테스트 환경용 데이터베이스 컨테이너 제거
      "db:test:rm": "docker compose rm test-db -s -f -v",
    
      # 테스트 환경용 데이터베이스 컨테이너 실행
      "db:test:up": "docker compose up test-db -d",
    
      # 테스트 환경용 데이터베이스 컨테이너 제거 후 재시작 및 Prisma 마이그레이션 실행
      "db:test:restart": "npm run db:test:rm && npm run db:test:up && sleep 1 && npm run prisma:test:deploy",
    
      # 엔드투엔드 테스트 전에 테스트 환경용 데이터베이스 컨테이너 재시작
      "pretest:e2e": "npm run db:test:restart",
    
      # 엔드투엔드 테스트 실행
      "test:e2e": "dotenv -e ./.env.test -- jest --watch --no-cache --config ./test/jest-e2e.json",
    
      # Prisma 모델 코드 생성
      "prisma:generate": "npx prisma generate",
    
    
      # 프로덕션 환경 --------------------------------------------------------------------------
    
      # 프로덕션 환경에서 Prisma 마이그레이션 실행 및 앱 실행 (Dockerfile 및 docker-compose.yml에서 사용)
      "start:migrate:prod": "prisma migrate deploy && npm run start:prod"
    
      # 개발 모드로 Nest.js 앱 실행
      "start:dev": "nest start --watch",
    }
    


  4. Dockerfile에 해당 환경에 맞는 환경 변수를 추가한다.

    Dockerfile 코드
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    # 개발용 스테이지
    FROM node:18-alpine AS development
    
    WORKDIR /app
    
    # package.json과 package-lock.json 파일 복사
    COPY package\*.json ./
    
    # 종속성 설치
    RUN npm install
    
    # 생성된 Prisma 파일 복사
    COPY prisma ./prisma/
    
    # 환경 변수 복사
    COPY .env.production ./
    
    # tsconfig.json 파일 복사
    COPY tsconfig.json ./
    
    # 소스 코드 복사
    COPY . .
    
    # 서버를 포트 5000으로 실행하도록 설정
    EXPOSE 5000
    
    # 마이그레이션을 포함하여 시작 스크립트 실행
    CMD ["npm", "run", "start:migrate:prod"]
    
이슈명링크
NestJs Course for Beginners - Create a REST APIhttps://www.youtube.com/watch?v=GHTA143_b-s
This post is licensed under CC BY 4.0 by the author.