Nodejs

Postgresql TypeORM으로 마이그레이션 하기

_HelloWorld_ 2024. 12. 19. 09:52

마이그레이션 이유

TypeORM은 TypeScript와 완벽하게 호환되어, TypeScript의 장점을 온전히 누릴 수 있다고 공식 문서에 적혀있다... 

 

개발자가 데이터베이스와의 연결을 관리하는 데 필요한 노력을 줄여주는데 SQL 쿼리를 작성하는 대신, TypeORM의 메서드를 사용하면 데이터베이스를 조작할 수 있다.

 

또한, TypeORM은 자동으로 SQL을 생성하므로, 복잡한 쿼리 작성의 부담을 덜어주며, 개발 속도를 크게 향상 시켜주기 때문에 TypeORM을 적용하려고 하고 있다.


TypeORM을 기존 코드에 적용하려면 데이터베이스 연결 설정엔티티 정의를 추가해야 합니다.

# 패키지 설치
npm install typeorm reflect-metadata pg

TypeORM 설정

TypeORM의 데이터 소스를 설정하기 위한 파일, 기존의 pg.Pool 설정을 대체하여 작성

import 'reflect-metadata'; // TypeORM이 필요로 함
import { DataSource } from 'typeorm';
import dotenv from 'dotenv';
dotenv.config();

// 데이터 소스 설정
export const AppDataSource = new DataSource({
  type: 'postgres',
  host: process.env.DB_HOST,
  port: parseInt(process.env.DB_PORT || '5432', 10),
  username: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  synchronize: true, // 개발 환경에서만 true (자동 마이그레이션)
  logging: true, // 쿼리 로그 활성화
  entities: ['./src/entities/*.ts'], // 엔티티 경로
});

데이터베이스 초기화

애플리케이션이 시작되기 전에 데이터베이스 연결을 초기화

최상단 서버를 실행하는 파일에서 import를 무조건 해줘야 함 ( 동작이 안 됨 ) 

import 'reflect-metadata'; // Required for TypeORM

Entity 생성 ( 모델 )

import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';

@Entity('users') // 데이터베이스 테이블 이름
export class User {
  @PrimaryGeneratedColumn()
  id!: number; // 기본 키

  @Column({ type: 'varchar', length: 100 })
  name!: string; // 사용자 이름

  @Column({ type: 'varchar', length: 200, unique: true })
  email!: string; // 이메일 (유니크)

  @Column({ type: 'varchar', length: 255 })
  password!: string; // 비밀번호

  @Column({ type: 'varchar', length: 255, nullable: true })
  avatar?: string; // 프로필 이미지 (nullable)

  @CreateDateColumn()
  createdAt!: Date; // 생성일자 (자동 생성)

  @UpdateDateColumn()
  updatedAt!: Date; // 수정일자 (자동 업데이트)
}

컴파일 에러가 뜬다면 ?

# tsConfig.ts 에 주석을 풀어 true로 변경 

"experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */
"emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */

결과

서버 실행 시에 작성한 엔티티에 맞게 테이블이 생기며 엔티티 코드 변경 시에 자동으로 테이블이 마이그레이션 되는 것도 확인. 

'Nodejs' 카테고리의 다른 글

NodeJS typeORM 단방향 참조  (1) 2024.12.22
Nodejs PostgreSQL 연동  (1) 2024.12.18
JWT, Bcrypt 예제  (0) 2024.12.18
Nodejs 개발환경 셋팅  (0) 2024.12.18