Nest.JS TypeORM 으로 DB(MySQL) 연결하기
Nest.js에서 데이터베이스 연동은 TypeORM을 사용한다.
TypeORM은 typescript계의 Sequelize라고 생각하면 된다고 한다.
# 현재 typeorm 다른버전은 window에서 오류나는 이슈가 있음
npm i typeorm@0.3.0
npm i @nestjs/typeorm mysql
npm i @nestjs/config
# 만약 class-validator 이슈로 설치 실패하면 삭제 후 마지막에 다시 설치하면된다.
DATABASE_HOST="localhost"
DATABASE_PORT=3306
DATABASE_USERNAME="여러분들의 데이터베이스 아이디"
DATABASE_PASSWORD="여러분들의 데이터베이스 비밀번호"
DATABASE_NAME="데이터베이스 이름"
DATABASE_SYNCHRONIZE=true // 배포시에는 절대 true로 하면 안됨.
// imports에 아래 코드 추가
imports: [
ConfigModule.forRoot({ isGlobal: true }), // 무조건 가장 위에 위치해야함
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useClass: TypeOrmConfigService,
inject: [ConfigService],
})
]
constructor(private readonly configService: ConfigService) {}
createTypeOrmOptions(): TypeOrmModuleOptions {
return {
// 데이터베이스 설정에 관련된 내용
type: 'mysql',
host: this.configService.get<string>('DATABASE_HOST'),
port: this.configService.get<number>('DATABASE_PORT'),
username: this.configService.get<string>('DATABASE_USERNAME'),
password: this.configService.get<string>('DATABASE_PASSWORD'),
database: this.configService.get<string>('DATABASE_NAME'),
entities: [엔티티 클래스이름],
synchronize: this.configService.get<boolean>("DATABASE_SYNCHRONIZE"),
// 개발버전에서는 스키마의 용이한 수정을 위해 오버라이트(배포에는 절대 true안됨)
};
}
// 예시
import {
Column,
CreateDateColumn,
DeleteDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from "typeorm";
@Entity({ schema: "board", name: "articles" })
export class Article {
@PrimaryGeneratedColumn({ type: "int", name: "id" })
id: number;
@Column("varchar", { length: 10 })
author: string;
@Column("varchar", { length: 50 })
title: string;
@Column("varchar", { length: 1000 })
content: string;
@Column("varchar", { select: false })
// 데이터를 가져올때 따로 select해주지 않으면 password는 안가져옴
password: string;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt: Date | null;
}
@Injectable()
export class 파일명Service {
constructor(
@InjectRepository(엔티티 클래스이름) private 파일명Repository: Repository<엔티티 클래스이름>,
) {}
async getAll() {
return await this.파일명Repository.find({
where: {deletedAt: null},
select: ['id', '가져올 컬럼명2', '가져올 컬럼명3'] // 가져오고싶은 컬럼 선택할 수 있음
})
}
// ...
// 아래 내용 작성 생략
@Module({
// 매우 중요: 서비스에서 사용할 리포지토리 사용을 imports에 명시!
imports: [TypeOrmModule.forFeature([엔티티 클래스이름])],