엔티티(Entity)
엔티티는 데이터베이스의 테이블을 정의하는 클래스입니다.
데이터베이스에 동일한 이름의 테이블이 없다면 엔티티를 이용해 테이블을 생성하고,
테이블과 Entity의 정보가 다르면 Entity를 기준으로 테이블을 수정합니다.
엔티티 작성 예시
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';
// 엔티티 선언. 파라미터에 값을 전달하지 않으면 클래스명과 동일한 테이블 생성
@Entity({ name: 'posts' })
// title에 대한 인덱스 이름 지정
@Index('IDX_POST_TITLE', ['title'])
// title과 authorId의 복합 유니크 인덱스 이름 지정
@Index('IDX_POST_TITLE_AUTHOR_ID', ['title', 'authorId'], { unique: true })
export class Post {
/*
자동 생성되는 PK 컬럼 선언. type의 기본값은 int.
'uuid'를 파라미터로 전달하면 uuid 형식의 컬럼 생성.
이때 컬럼의 자료형은 number가 아니라 string이어야 합니다.
*/
@PrimaryGeneratedColumn()
id: number;
/*
컬럼 선언.
type 미지정시 typescript에 선언한 자료형을 참조하여 컬럼을 생성합니다.
name 미지정시 프로퍼티명과 동일한 컬럼을 생성합니다.
*/
@Column({
type: 'varchar',
length: 255,
nullable: false,
})
title: string;
@Column({
type: 'text',
nullable: false,
})
content: string;
@Column({
type: 'int',
name: 'author_id',
nullable: false,
})
authorId: number;
}
엔티티 사용 예시(NestJS)
module.ts 파일에 entity를 추가합니다.
imports: [TypeOrmModule.forFeature([PostModel])],
service.ts 파일에 의존성을 추가합니다.
constructor(
@InjectRepository(PostModel)
private readonly postRepository: Repository<PostModel>,
) {}
컬럼 데코레이터
데코레이터 | 설명 |
@PrimaryColumn() | PK |
@PrimaryGeneratedColumn() | auto increament PK (number 타입) |
@PrimaryGeneratedColumn(’uuid’) | uuid를 사용하는 PK (string 타입) |
@Column() @Column("int") @Column({ type: "int" }) @Column("varchar", { length: 200 }) |
컬럼 DB 별 지원 자료형은 https://typeorm.io/entities#column-types에서 확인 |
@CreateDateColumn() | 데이터 생성 시간 |
@UpdateDateColumn() | 데이터를 가장 마지막에 수정한 시간 |
@DeleteDateColumn() | 데이터 삭제 시간 |
@VersionColumn() | save() 함수 호출 시 1씩 올라가는 컬럼 |
@Column() @Generated(’increament’) |
PK가 아니지만 auto increament를 사용하는 컬럼 |
컬럼 속성
DB는 스네이크 케이스, 자바스크립트는 카멜 케이스가 관례입니다.
TypeORM 컬럼 기본 옵션이 'nullable: false'이기 때문에 자주 사용하게 될 것 같습니다.
속성명 | 설명 |
name | DB에서 사용할 컬럼명. 미지정 시 속성명을 그대로 사용 |
type | 컬럼의 자료형은 기본적으로 typescript의 타입 힌트를 사용합니다. bigint을 지정해도 DB에서는 string 컬럼을 생성한다라고 문서에는 작성되어 있는데 PostgresQL에서는 bigint 컬럼이 생성됩니다. |
length | varchar 컬럼의 길이 |
scale | 소수점 아래의 길이 |
nullable | 컬럼의 빈 값 허용. true 혹은 false. 기본값은 false입니다. |
default | 컬럼의 기본 값 |
unique | 유니크 컬럼인지 여부 |
enum | 참조할 enum 객체 |
update | 기본값 true. false 지정 시 입력(insert)은 가능하지만, 수정(update)은 불가능합니다. |
select | 기본값 true. false 지정 시 find() 함수에 컬럼을 명시해야 조회 가능합니다. |
엔티티에 로직 추가하기(Entity Listeners)
엔티티에 메서드를 추가한 다음 데코레이터를 사용하면 추가적인 로직을 사용할 수 있습니다.
보통 트리거나 로그에 사용합니다.
데코레이터 | 설명 |
@AfterLoad | 엔티티가 로딩될 때마다 실행 |
@BeforeInsert, @BeforeUpdate, @BeforeRemove, @BeforeSoftRemove, @BeforeRecover |
Before 뒤에 붙은 작업이 실행되기 전에 실행 |
@AfterInsert, @AfterUpdate, @AfterRemove, @AfterSoftRemove, @AfterRecover |
After 뒤에 붙은 작업이 실행되기 전에 실행 |
Enum 컬럼 예시
enum 선언
export enum Role {
USER = 'user',
ADMIN = 'admin',
}
컬럼 선언
@Column({
type: 'enum',
enum: Role,
default: Role.USER,
})
role: Role;
공통 컬럼 선언 및 사용 방법
공통 컬럼을 선언하고 사용하는 방법에는 두 가지 방법이 있습니다.
임베디드 엔티티(Embedded Entities)
엔티티 상속(Entity Inheritance)
임베디드 엔티티
공통 컬럼을 선언한 클래스
import { Column } from "typeorm"
export class Name {
@Column()
first: string
@Column()
last: string
}
공통 컬럼을 사용한 클래스
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
import { Name } from "./Name"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: string
@Column(() => Name)
name: Name
@Column()
isActive: boolean
}
엔티티 상속
엔티티 상속은 두 가지 형태가 있습니다.
구체적인 테이블 상속(Concrete Table Inheritance): 임베디드 엔티티와 동일
단일 테이블 상속(Single Table Inheritance): 엔티티 클래스는 여러 개지만, 데이터베이스는 동일한 테이블에 저장
구체적인 테이블 상속은 비즈니스 관점에서 공통 로직(생성일시, 수정일시, 삭제 등 공통적으로 사용하는 것들)이 있을 때 사용하고,
단일 테이블 상속은 하나의 테이블에 공통 컬럼 + json 컬럼으로 관리할 때 사용할 것 같습니다.
구체적인 테이블 상속
부모 엔티티(TypeORM 속성에 엔티티 등록 X)
export abstract class Content {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
}
자식 엔티티
@Entity()
export class Photo extends Content {
@Column()
size: string
}
단일 테이블 상속
부모 엔티티 (TypeORM 속성에 엔티티 등록 O)
@Entity()
@TableInheritance({ column: { type: "varchar", name: "type" } })
export class Content {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
}
자식 엔티티
@ChildEntity()
export class Photo extends Content {
@Column()
size: string
}
'TypeORM' 카테고리의 다른 글
관계(Relation) (0) | 2025.05.07 |
---|---|
저장소(Repository) (0) | 2025.05.04 |
TypeORM 환경 설정 (0) | 2025.05.04 |
TypeORM (0) | 2025.05.03 |