프레임워크/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씩 올라가는 형태로)
이러면 에러가 해결되었을 것이다.
테이블 생성이 잘 되었는지 확인