당연하면서도 서비스 특성상 보안이 특히 중요하기에, 저희 데이터베이스 서버는 프라이빗 서버에 위치해 있습니다. 이때문에 로컬에서 개발할 때 바로 데이터베이스에 연결하기 위해서는 SSH 터널링을 뚫어줘야 합니다. 다만 터널링을 하더라도 배포용 데이터베이스를 개발 과정에서 건드리는 것이 어색하게 느껴집니다.
이 때문에 개발 환경에 따라 다른 데이터베이스 설정을 지원합니다. 직접 mysql을 로컬에 설치해 사용해줄 수도 있지만.. 설치 → 실행 → 계정 작업.. 너무 귀찮으니 deploy를 제외한 다른 환경에서는 인메모리 데이터베이스인 sqlite를 사용하게 구현하였습니다.
import { registerAs } from '@nestjs/config';
import type { TypeOrmModuleOptions } from '@nestjs/typeorm';
export default registerAs('typeOrmConfig', () => {
const isDevEnv = ['development', 'test', 'debug'].includes(process.env.NODE_ENV as string);
return (
isDevEnv
? {
type: 'sqlite',
database: ':memory:',
dropSchema: true,
autoLoadEntities: true,
synchronize: true,
logging: ['query', 'error'],
logger: 'advanced-console',
}
: {
type: 'mysql',
host: process.env.DB_HOST,
port: process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
autoLoadEntities: true,
synchronize: false,
}
) as TypeOrmModuleOptions;
});
import를 간결히 하기 위해 nestjs/config의 registerAs를 사용하였습니다.
useFactory와 configService를 직접 사용하면 모듈 선언부의 가독성이 너무 좋지 않아 registerAs와 asProvider를 선호합니다.