[DB] TypeOrm을 사용하여 여러개의 DB 연결하기

홍종훈·2023년 12월 18일
0

BE

목록 보기
7/9
post-thumbnail

프로젝트를 하다보면 하나의 서버에서 여러개의 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('*');
    }
}
profile
Search Engineer

0개의 댓글