Skip to content

TypeORM config 설정 ( typeorm‐naming‐strategies)

cdj2073 edited this page Dec 14, 2023 · 1 revision

TypeORM, MySQL 설치, config 설정

npm i @nestjs/typeorm typeorm mysql2
  • app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}
  • synchronize
    • 엔티티를 통해 오버라이드되며 테이블이 생성됨
    • 개발 과정에서는 스키마의 용이한 수정을 위해 true로 사용하지만
    • 배포 버전에서는 반드시 false여야 한다.
      • 누군가가 엔티티를 수정하면 테이블이 변경됨!
  • logging
    • 쿼리를 로그에 찍어준다.
  • autoLoadEntities

위처럼 모듈에 DB 정보가 노출된다. 이전에는 dotenv 패키지를 사용했는데 Nest에서는 @nestjs/config를 대신 사용한다.

npm i @nestjs/config
  • app.module.ts
@Module({
	imports: [
		ConfigModule.forRoot({isGlobal: true})
		TypeOrmModule.forRootAsync({
			imports: [ConfigModule],
			inject: [ConfigService],
			useFactory: (configService: ConfigService) => ({
				type: 'mysql',
				host: configService.get<string>('DB_HOST'),
				port: configService.get<number>('DB_PORT'),
				username: configService.get<string>('DB_USER'),
				password: configService.get<string>('DB_PASSWORD'),
				database: configService.get<string>('DB_DATABASE'),
				entities: [EventEntity],
				synchronize: false,
				logging: true,
			}),
		}),
		// module 추가
	],
	...
})
  • forRoot -> forRootAsync
    • Nest 웹 어플리케이션이 bootstraping될 때 DB의 동적 구성을 허용할 수 있어야 하는데 TypeOrmConfigService가 동적 구성되지 않고 타이밍을 못맞춰 설정이 안될 경우가 있으므로 Async 사용

typeorm-naming-strategies

@Entity()
export class EventEntity extends commonEntity {
	@Column('varchar', { length: 64 })
	title: string;

	@Column()
	startDate: Date;

	@Column()
	endDate: Date;

	@Column()
	isJoinable: boolean;

	@Column('varchar', { length: 255 })
	announcement: string;
}

Nest에서는 camelCase를, MySQL에서는 snake_case를 사용한다.

=> typeorm-naming-strategies 패키지를 이용해 쉽게 변환할 수 있다.

TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (configService: ConfigService) => ({
    type: 'mysql',
    host: configService.get<string>('DB_HOST'),
    port: configService.get<number>('DB_PORT'),
    username: configService.get<string>('DB_USER'),
    password: configService.get<string>('DB_PASSWORD'),
    database: configService.get<string>('DB_DATABASE'),
    entities: [Event],
    synchronize: true,
    logging: true,
    namingStrategy: new SnakeNamingStrategy(),
  }),
}),

⚽️협업 룰

코딩 컨벤션

📔회고

팀 회고

개인 회고

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

👨‍🏫멘토링 회의록

💻개발일지

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

💡트러블슈팅

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

📋회의록

스크럼 회의

스프린트 회의

밋밋 회의

공통

BackEnd

Android

기획

Clone this wiki locally