Nest.js
를 사용함에 따라 TypeScript
를 잘 지원하는 TypeORM
을 사용해야 한다.
하지만 현재 3가지의 강의를 다 봤지만 TypeORM
은 성장 과도기를 겪는 탓에 버전이 업그레이드 될 때 마다 기능이 확확 변하고 있다. 따라서 1년 지난 강의는 당장 못쓰는 기능이 많다고 느꼈다.
강의 마다 DB연결하는 방법이 다 다르게 나와서 정말....혼란스럽기 짝이 없다.
Sequelieze
, Prisma
에 이어서 TypeORM
을 사용함에 따라 node.js에서 사용하는 3대장 ORM을 써보는 것이다.
쓰던 것만 쓰면 편하겠지만 안써본 새로운 기술이 있다? 못참는다..
하지만 점점 더 복잡한 쿼리를 위해서는 ORM에 의지하면 안된다고 했다. 나~중에 되어서 고성능의 프로그램을 짜기 위해서는 RAW쿼리
도 사용할 줄 알아야 하기 때문에 ORM을 사용한다고 해서 SQL
을 소홀히 하지 말자는 배움도 얻었기에 SQL
공부도 열심히 해야겠다.
TypeORM
은 NodeJS
, React Native
, NativeScript
, Expo
및 Electron
플랫폼에서 실행할 수 있고 TypeScript
및 JavaScript(ES5, ES6, ES7, ES8)
와 함께 사용할 수 있는 ORM이다 . 그 목표는 항상 최신 JavaScript 기능을 지원하고 몇 개의 테이블이 있는 소규모 애플리케이션부터 여러 데이터베이스가 있는 대규모 엔터프라이즈 애플리케이션에 이르기까지 데이터베이스를 사용하는 모든 종류의 애플리케이션을 개발하는 데 도움이 되는 추가 기능을 제공한다.
TypeORM
은 현재 존재하는 다른 모든 JavaScript ORM과 달리 Active Record
와 Data Mapper
패턴을 모두 지원한다. 즉, 느슨하게 결합되고 확장 가능하며 유지 관리 가능한 고품질 애플리케이션을 가장 생산적인 방식으로 작성할 수 있다.
TypeORM은 Hibernate
, Doctrine
및 Entity Framework
와 같은 다른 ORM
의 영향을 많이 받는다.
데이터베이스와의 상호 작용은 DataSource
를 통해서 하는데 이전 버전들과는 달라진 점이다.
초기 연결을 설정하려면 인스턴스 DataSource
의 initialize
메소드를 호출 해야한다.
npm i mysql2 typeorm @nestjs/typeorm
패키지를 먼저 다운 받는다. 나는 MySQL
을 이용하기 때문에 mysql2
를 다운 받았다.
root 디렉토리에 먼저 DataSource
provider를 만들어준다.
// /database.providers.ts
import { DataSource } from 'typeorm';
import { configDotenv } from 'dotenv';
import { Board } from 'src/entities/board.entity';
configDotenv();
export const databaseProviders = [
{
provide: 'DATA_SOURCE',
useFactory: async () => {
const dataSource = new DataSource({
type: 'mysql', // 사용하는 db에 맞게 설정
host: process.env.DB_HOST,
port: 3306, // 사용하는 db에 맞게 포트 설정
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
entities: [Board], // 절대경로로 설정 하는 경우가 많은데 나는 잘 안되서 직접 임포트했다.
synchronize: true, // 개발 단계에서만 true한다 아니면 데이터가 날라가니 조심
charset: 'utf8mb4_general_ci',
logging: true, // 로그
});
return dataSource
.initialize()
.then(() => {
console.log('Data Source has been initialized!');
})
.catch((err) => {
console.error('Error during Data Source initialization', err);
});
},
},
];
// src/database.modules.ts
import { Module } from '@nestjs/common';
import { databaseProviders } from 'database.providers';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
// src/app.module.ts
import { Module } from '@nestjs/common';
import { BoardsModule } from './boards/boards.module';
import { DatabaseModule } from './database.module';
@Module({
imports: [BoardsModule, DatabaseModule],
})
export class AppModule {}
하지만 설정한 데이터베이스가 존재하지 않는다고 뜬다 .. 이럴 경우 직접 쿼리로 DB를 생성해주거나
워크밴치 프로그램으로 직접 생성 해준다.
정상적으로 스키마가 생성 되었다.
각자 테이블에 맞게 엔티티를 설정한다 엔티티에 관련된 문서는 마찬가지로 공식 홈페이지에 잘 나타나 있다
// src/entities/board.entity.ts
import { BoardStatus } from 'src/boards/boards.model';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Board {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 50 })
title: string;
@Column('text')
description: string;
@Column()
status: BoardStatus;
}
엔티티를 작성했다면 아까 만들었던 DataSource
의 entities
란에 작성한 엔티티를 추가 해준다.
그런 다음 서버를 실행하면
정상적으로 테이블이 추가 되었다.
끝