[TypeORM][TIL] TypeORM 0.3.17로 MySQL DB및 테이블 생성

Trippy·2023년 12월 11일
2

Nest.js

목록 보기
3/15
post-thumbnail

Nest.js를 사용함에 따라 TypeScript를 잘 지원하는 TypeORM을 사용해야 한다.

하지만 현재 3가지의 강의를 다 봤지만 TypeORM은 성장 과도기를 겪는 탓에 버전이 업그레이드 될 때 마다 기능이 확확 변하고 있다. 따라서 1년 지난 강의는 당장 못쓰는 기능이 많다고 느꼈다.
강의 마다 DB연결하는 방법이 다 다르게 나와서 정말....혼란스럽기 짝이 없다.

Sequelieze, Prisma 에 이어서 TypeORM을 사용함에 따라 node.js에서 사용하는 3대장 ORM을 써보는 것이다.

쓰던 것만 쓰면 편하겠지만 안써본 새로운 기술이 있다? 못참는다..

하지만 점점 더 복잡한 쿼리를 위해서는 ORM에 의지하면 안된다고 했다. 나~중에 되어서 고성능의 프로그램을 짜기 위해서는 RAW쿼리도 사용할 줄 알아야 하기 때문에 ORM을 사용한다고 해서 SQL을 소홀히 하지 말자는 배움도 얻었기에 SQL공부도 열심히 해야겠다.


TypeORM은 뭐가 특별한가?

TypeORMNodeJS, React Native, NativeScript, ExpoElectron 플랫폼에서 실행할 수 있고 TypeScriptJavaScript(ES5, ES6, ES7, ES8)와 함께 사용할 수 있는 ORM이다 . 그 목표는 항상 최신 JavaScript 기능을 지원하고 몇 개의 테이블이 있는 소규모 애플리케이션부터 여러 데이터베이스가 있는 대규모 엔터프라이즈 애플리케이션에 이르기까지 데이터베이스를 사용하는 모든 종류의 애플리케이션을 개발하는 데 도움이 되는 추가 기능을 제공한다.

TypeORM은 현재 존재하는 다른 모든 JavaScript ORM과 달리 Active RecordData Mapper패턴을 모두 지원한다. 즉, 느슨하게 결합되고 확장 가능하며 유지 관리 가능한 고품질 애플리케이션을 가장 생산적인 방식으로 작성할 수 있다.

TypeORM은 Hibernate , DoctrineEntity Framework 와 같은 다른 ORM의 영향을 많이 받는다.

출처: TypeORM 공식사이트


TypeORM 설정하기

데이터베이스와의 상호 작용은 DataSource를 통해서 하는데 이전 버전들과는 달라진 점이다.

초기 연결을 설정하려면 인스턴스 DataSourceinitialize메소드를 호출 해야한다.

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를 생성해주거나
워크밴치 프로그램으로 직접 생성 해준다.


정상적으로 스키마가 생성 되었다.


Entity 설정

각자 테이블에 맞게 엔티티를 설정한다 엔티티에 관련된 문서는 마찬가지로 공식 홈페이지에 잘 나타나 있다

// 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;
}

엔티티를 작성했다면 아까 만들었던 DataSourceentities란에 작성한 엔티티를 추가 해준다.

그런 다음 서버를 실행하면

정상적으로 테이블이 추가 되었다.

결과

profile
감금 당하고 개발만 하고 싶어요

0개의 댓글