[내일배움캠프] TIL_230216

JungHoon Han·2023년 2월 16일
0

내일배움캠프

목록 보기
71/78
post-thumbnail

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 이슈로 설치 실패하면 삭제 후 마지막에 다시 설치하면된다.
  • .env 파일 생성 및 작성
DATABASE_HOST="localhost"
DATABASE_PORT=3306
DATABASE_USERNAME="여러분들의 데이터베이스 아이디"
DATABASE_PASSWORD="여러분들의 데이터베이스 비밀번호"
DATABASE_NAME="데이터베이스 이름"
DATABASE_SYNCHRONIZE=true // 배포시에는 절대 true로 하면 안됨.
  • app.module.ts
// imports에 아래 코드 추가
imports: [
  ConfigModule.forRoot({ isGlobal: true }), // 무조건 가장 위에 위치해야함
  TypeOrmModule.forRootAsync({
    imports: [ConfigModule],
    useClass: TypeOrmConfigService,
    inject: [ConfigService],
  })
]
  • config/typeorm.config.service.ts
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안됨)
    };
  }
  • 파일명.entity.ts
// 예시
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;
}
  • 파일명.service.ts
@Injectable()
export class 파일명Service {
  constructor(
    @InjectRepository(엔티티 클래스이름) private 파일명Repository: Repository<엔티티 클래스이름>,
  ) {}
  
 async getAll() {
   return await this.파일명Repository.find({
     where: {deletedAt: null},
     select: ['id', '가져올 컬럼명2', '가져올 컬럼명3'] // 가져오고싶은 컬럼 선택할 수 있음
   })
 }
  // ...
  // 아래 내용 작성 생략
  • 파일명.module.ts
@Module({
  // 매우 중요: 서비스에서 사용할 리포지토리 사용을 imports에 명시!
  imports: [TypeOrmModule.forFeature([엔티티 클래스이름])],
profile
Node.js 주니어 개발자

0개의 댓글