SKID901's DEVLOG

NestJS 설치 및 MySQL 연동

1. NestJS 설치

  • NestJS cli 설치 및 프로젝트 생성

    npm i -g @nestjs/cli
    nest new project-name
    

2. NestJS DB 커넥션 모듈 추가

  • 의존성 라이브러리 설치

    npm i --save @nestjs/config
    npm install --save @nestjs/typeorm typeorm mysql2
    
  • .env 파일 추가

    ## .env.development
    DB_HOST=localhost
    DB_PORT=3306
    DB_USERNAME=scott
    DB_PASSWORD=tiger
    DB_DATABASE=local
    
  • Config 모듈 및 TypeORM 모듈 추가

    // config/configuration.ts
    import 'dotenv/config';
    
    export default () => ({
      host: process.env.DB_HOST ?? '',
      port: process.env.DB_PORT ?? 3306,
      username: process.env.DB_USERNAME ?? '',
      password: process.env.DB_PASSWORD ?? '',
      database: process.env.DB_DATABASE ?? '',
    });
    
    // app.module.ts
    import { ConfigModule, ConfigService } from '@nestjs/config';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import configuration from './config/configuration';
    import { join } from 'path';
    
    @Module({
      imports: [
        ConfigModule.forRoot({
          isGlobal: true,
          load: [configuration],
          envFilePath: ['.env.development', '.env.production', '.env'],
        }),
        TypeOrmModule.forRootAsync({
          imports: [ConfigModule],
          useFactory: (configService: ConfigService) => ({
            type: 'mysql',
            host: configService.get('host'),
            port: +configService.get<number>('port'),
            username: configService.get('user'),
            password: configService.get('password'),
            database: configService.get('database'),
            entities: [join(__dirname, '/**/*.entity.js')],
            synchronize: true,
          }),
          inject: [ConfigService],
        }),
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}
    

3. Docker-compse로 MySQL 환경 구성

  • docker-compose.yml 파일 추가

    version: '3.9'
    
    volumes:
      db_dev: {}
    
    services:
    
      db:
      image: mysql
      command: --default-authentication-plugin=mysql_native_password
      restart: always
      volumes:
        - db_dev:/var/lib/mysql
      ports:
        - ${DB_PORT}:3306
      environment:
        - MYSQL_RANDOM_ROOT_PASSWORD=yes
        - MYSQL_USER=${DB_USERNAME}
        - MYSQL_PASSWORD=${DB_PASSWORD}
        - MYSQL_DATABASE=${DB_DATABASE}
    
      adminer:
      image: adminer
      restart: always
      ports:
        - 8080:8080
    
    
  • docker-compose 실행

    docker-compose --env-file ./.env.development --file docker-compose.dev.yml up -d
    
  • 트러블 슈팅

    1. docker-compose.yml 파일에서 environment 타입 오류 발생

      environment: key:valueenvironment: key=value 로 수정

    2. docker-compose.yml 로 이미지 생성 후 실행 시 db 컨테이너가 재시작 하는 오류 발생

      MYSQL_USERroot가 아닌 다른 이름으로 수정

    3. adminer 서비스에서 db 서비스로 로그인이 안됨

      adminer 로그인 서버 정보를 localhost 가 아니라 docker-compose.yml 에서 지정한 서비스 명인 db로 입력

4. 참고 링크

profile thumbnail
웹 개발자 skid901
개발자로서의 기록 ・ 성장 ・ 공유를 위한 기술 블로그 입니다.
Go back to the homepage