[MySQL] NestJS TypeORM DB 초기 세팅 시 발생한 오류
현재 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에서 보이는 모습은 다음과 같다.