프로젝트를 하다보면 하나의 서버에서 여러개의 DB에 연결이 필요할 때가 있습니다.
이럴때엔 DB에 연결하는 부분을 모듈화하여 해결이 가능합니다.
// mariadb.module.ts
import { ConfigService } from '@nestjs/config';
import { TypeOrmModule, TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
import path from 'path';
import { SelectDatabase } from '@util/utils';
function createDBConfig(type: number): TypeOrmModuleAsyncOptions {
const entities = [];
entities.push(path.join(__dirname, './entity/illangAdmin/*.entity.{ts,js}'));
entities.push(path.join(__dirname, './entity/admin/*.entity.{ts,js}'));
entities.push(path.join(__dirname, './entity/game/*.entity.{ts,js}'));
entities.push(path.join(__dirname, './entity/jonghun/*.entity.{ts,js}'));
return {
name: `DATA_BASE_${type}`,
inject: [ConfigService],
useFactory: (cs: ConfigService) => ({
type: 'mariadb',
host: cs.get(`DATABASE_HOST_${type}`),
port: cs.get(`DATABASE_PORT_${type}`),
username: cs.get(`DATABASE_USER_${type}`),
password: cs.get(`DATABASE_PASSWORD_${type}`),
database: cs.get(`DATABASE_NAME_${type}`),
synchronize: cs.get(`DATABASE_SYNCHRONIZE_${type}`) === 'true',
logging: cs.get(`DATABASE_LOGGING_${type}`) === 'true',
entities: entities,
autoLoadEntities: true
})
};
}
const loadDadaBaseList: number[] = [];
const selectDB: number[] = SelectDatabase(process.env.NODE_ENV);
for (const r of selectDB) loadDadaBaseList.push(r);
const typeOrmModuleList = [];
for (const t of loadDadaBaseList) {
typeOrmModuleList.push(TypeOrmModule.forRootAsync(createDBConfig(t)));
}
export const TypeOrmModules = typeOrmModuleList;
app.module.ts에선 배열로 저장한 모듈을 전개하여 서버가 켜질때 여러개의 DB를 연결합니다.
// app.module.ts
import { Module, NestModule, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { LoggerMiddleware } from './middleware/logger.middleware';
import { RedisModules } from './redis/redis.module';
import { ScheduleService } from './util/util.schedule';
import { S3Module } from './s3/s3.module';
import { AuthModule } from './api/auth/auth.module';
import { MaintenanceModule } from './api/maintenance/maintenance.module';
import { MailModule } from './api/mail/mail.module';
import { NoticeModule } from './api/notice/notice.module';
import { UsersModule } from './api/users/users.module';
import { AppService } from './app.service';
import { TypeOrmModules } from './mariadb/mariadb.module';
const ApiModules = [AuthModule, MaintenanceModule, MailModule, NoticeModule, UsersModule];
@Module({
imports: [
ConfigModule.forRoot({ envFilePath: `./env/.env.${process.env.NODE_ENV}`, isGlobal: true }),
RedisModules,
...TypeOrmModules,
...ApiModules,
S3Module
],
exports: [ConfigModule],
controllers: [AppController],
providers: [ScheduleService, AppService]
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.exclude({ path: '', method: RequestMethod.ALL })
.forRoutes('*');
}
}