엔티티(Entity)

2025. 5. 4. 14:50·TypeORM

엔티티(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
'TypeORM' 카테고리의 다른 글
  • 관계(Relation)
  • 저장소(Repository)
  • TypeORM 환경 설정
  • TypeORM
남느
남느
  • 남느
    남느
    남느
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • 프로그래밍 (15)
      • 웹 기초 지식 (2)
      • Node.js 기초 (1)
      • 알고리즘(Node.js) (1)
      • NestJS (20)
        • NestJS 문서화 (14)
        • NestJS 레시피 (2)
        • NestJS 게시판 API 프로젝트 (4)
      • TypeORM (5)
      • 자바 (1)
      • Spring (0)
        • Spring 문서화 (0)
      • 우분투 적응기 (8)
      • 리눅스 답은 하모니카다 (4)
      • 살다보니 드는 생각들 (2)
      • 도커 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머
    웹
    신입
    백엔드
    취업
    개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
남느
엔티티(Entity)
상단으로

티스토리툴바