BackEnd/Database

[MySQL] NestJS TypeORM DB 초기 세팅 시 발생한 오류

꼽파 2024. 8. 19. 12:44

현재 NestJS, MySQL, TypeORM을 사용하는 프로젝트를 진행하고 있다. 구현 중 발생한 오류와 진행상황을 문서화할 계획이다. 

 

우선 MySQL과 TypeORM을 config 폴더 안에  orm.config.ts 파일을 만들어서 설정을 해준다.

NestJS에서 TypeORM와 MySQL의 세팅은 다음 링크를 참조하였다.
https://codegear.tistory.com/116

 

1. TypeORM 개념과 셋팅 (2023, NestJS)

이 글은 TypeORM의 기본적인 개념에 대해 설명하고, 샘플 소스를 통해 TypeORM의 기본적인 사용법에 대해 설명합니다. 이 글의 동영상 강의를 보고 싶으시면 아래를 클릭하세요. https://youtu.be/yzsN620ZYp

codegear.tistory.com


프로젝트 폴더에서 TypeORM과 MySQL 세팅

config 폴더

 

orm.config.ts

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

function ormConfig(): TypeOrmModuleOptions {
  const commonConf = {
    SYNCHRONIZE: false, // 데이터베이스 스키마를 자동으로 동기화할지 여부
    ENTITIES: [__dirname + '/../entities/*{.ts,.js}'], // 엔티티 파일 경로 (TS 또는 JS 확장자를 가진 파일)
    MIGRATIONS: [__dirname + '/../migrations/**/*{.ts,.js}'], // // 마이그레이션 파일 경로
    MIGRATIONS_RUN: false, // 애플리케이션 실행 시 자동으로 마이그레이션을 적용할지 여부
  };

  return {
    name: '본인 프로젝트 Connection Name',
    type: 'mysql',
    database: process.env.DB_DATABASE,
    host: process.env.DB_HOST,
    port: Number(process.env.DB_PORT),
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    logging: process.env.TYPEORM_LOGGING === 'true',
    synchronize: commonConf.SYNCHRONIZE,
    entities: commonConf.ENTITIES,
    migrations: commonConf.MIGRATIONS,
    migrationsRun: commonConf.MIGRATIONS_RUN,
  };
}

export { ormConfig };

 

ConfigModule.ts는 .env 파일을 환경변수에서 불러와서 전역에서 사용할 수 있도록 설정하는 모듈이다.

NestConfigModule.forRoot()는 환경변수를 불러와서 이 설정을 전역 설정으로 만든다.

주의할 점은 orm.config.ts에서 정의한 설정은 app.module.ts 파일에서 TypeOrmModule.forRoot(ormConfig())로 주입을 해주어야 한다. 그래야 TypeORM이 MySQL 데이터베이스에 연결할 수 있다.

TypeOrmModule.forRoot(ormConfig())은 ormConfig() 함수에서 반환된 값(설정해 놓은 내용)을 사용하여 TypeORM과 MySQL을 초기화한다. 이로써 프로젝트 폴더 전체에서 DB와의 연결이 진행된다.

 

config.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule as NestConfigModule } from '@nestjs/config';

@Module({
  imports: [
    NestConfigModule.forRoot({
      envFilePath: '.env',
      isGlobal: true,
    }),
  ],
  exports: [NestConfigModule],
})
export class ConfigModule {}

 

User  등록해주기 (비밀번호도 설정)

 

설정이 완료되었다면 실행하면 된다. 실행 후 다음과 같은 오류가 발생할 수 있다.


오류 발생 및 해결

Access denied for user ''@'localhost' (using password: YES):

  • 원인: MySQL 사용자 이름이 올바르지 않거나 권한이 없다.
  • 해결: MySQL 사용자 이름과 비밀번호를 orm.config.ts 파일에 정확하게 입력하고, 해당 사용자에게 필요한 권한을 부여한다.
  • 주의 : Username 뿐만 아니라 grant 로 권한 설정도 잘 되어 있는지 확인한다.

 

Access denied for user 'userName'@'localhost' (using password: NO):

  • 원인: MySQL 사용자 비밀번호가 올바르지 않다.
  • 해결: MySQL 사용자 비밀번호를 orm.config.ts 파일에 정확하게 입력하고, MySQL에서 비밀번호 설정 여부를 확인한다.
  • 주의: 기본적으로 username만 등록하면 비밀번호가 없는 채로 설정이 된다. 

 

비밀번호 없이 사용자 생성

CREATE USER 'new_user'@'localhost';

 

비밀번호과 함께 사용자 생성

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'secure_password';

 

 

Unknown database 'databaseName':

  • 원인 : 지정된 데이터베이스가 존재하지 않거나 데이터베이스 이름이 잘못되었다.
  • 해결 : MySQL에서 SHOW DATABASES; 명령을 실행하여 존재하는 데이터베이스 목록을 확인하고, orm.config.ts파일의 database 속성에 정확한 데이터베이스 이름을 입력한다.
  • 주의 : Connection Name과 Database Name을 혼동하지 않도록 주의해야한다. Connection Name은 MySQL 서버에 연결하는 정보이고, Database Name은 실제 데이터를 저장하는 데이터베이스 이름이다.

 

본인은 Connection Name과 Database Name을 착각해서 시간을 좀 허비하였다.

MySQL CLI에서 SHOW DATABASES; 로 Database를 확인한 결과 해당 Database Name이 없었다.

CREATE DATABASE 'DB NAME';으로 하나 생성해주고, 이 이름을 환경변수에 넣어주었다.

실행이 잘 되었다.

 

 

 

MySQL Workbench에서 Connection을 처음 생성할 때 나오는 화면

 

 

MySQL Workbench에서 보이는 모습은 다음과 같다.

 

728x90