프레임워크/Nest.js

NestJS TypeORM 테이블 생성 with PostgreSQL

muyeon 2023. 12. 14. 11:04

선행작업

https://muyeon95.tistory.com/311

 

 

TypeORM을 사용해 클래스기반 자동 테이블 생성을 진행해본다.

이는 TypeORM 의 기능이다.

 

// src/posts/entities/posts.entity.ts

import { Column, Entity } from 'typeorm';

@Entity()
export class PostsModel {
  @Column()
  id: number;

  @Column()
  author: string;

  @Column()
  title: string;

  @Column()
  content: string;

  @Column()
  likeCount: number;

  @Column()
  commentCount: number;
}

 

엔티티 추가

TypeOrmModule.forRoot({
      type: 'postgres', // 데이터베이스 타입
      host: '127.0.0.1',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'postgres',
      entities: [PostsModel], // 나중에 생성할 모델들을 넣는다.
      synchronize: true, // NestJS에서 작성하는 TypeORM 코드와 데이터베이스의 싱크를 자동으로 맞출건지, production 에서는 false
 }),

 

하지만 이상태로 실행해보면 아래처럼 에러가 날 것이다.

 

MissingPrimaryColumnError: Entity "PostsModel" does not have a primary column. Primary column is required to have in all your entities. Use @PrimaryColumn decorator to add a primary column to your entity.
    at EntityMetadataValidator.validate (/Users/yunmun-yeol/Documents/nestjs/sns-project/src/metadata-builder/EntityMetadataValidator.ts:59:19)
    at /Users/yunmun-yeol/Documents/nestjs/sns-project/src/metadata-builder/EntityMetadataValidator.ts:43:18
    at Array.forEach (<anonymous>)
    at EntityMetadataValidator.validateMany (/Users/yunmun-yeol/Documents/nestjs/sns-project/src/metadata-builder/EntityMetadataValidator.ts:42:25)
    at DataSource.buildMetadatas (/Users/yunmun-yeol/Documents/nestjs/sns-project/src/data-source/DataSource.ts:724:33)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at DataSource.initialize (/Users/yunmun-yeol/Documents/nestjs/sns-project/src/data-source/DataSource.ts:259:13)

 

모든 SQL 테이블에는 가장 절대적으로 유일무이한 컬럼이 하나 있어야한다.

왜냐하면 특정 row를 찾을 때 이 값을 갖고서 데이터를 찾는다면 이 값에 해당하는 row는 단 한개밖에 없다는 것이 보장되어야 하기 때문에 즉 정확한 row를 찾기 위해 id 가 필요하다.

 

// ... 중략

@Entity()
export class PostsModel {
  @PrimaryGeneratedColumn()
  id: number;

// ... 중략

}

 

PrimaryGeneratedColumn 은 자동으로 id 값을 배정해준다. (1씩 올라가는 형태로)

 

이러면 에러가 해결되었을 것이다. 

 

테이블 생성이 잘 되었는지 확인